rpm/python/rpmps-py.c

137 lines
3.4 KiB
C

#include "rpmsystem-py.h"
#include "rpmps-py.h"
struct rpmProblemObject_s {
PyObject_HEAD
PyObject *md_dict;
rpmProblem prob;
};
static char rpmprob_doc[] =
"";
static PyObject *rpmprob_get_type(rpmProblemObject *s, void *closure)
{
return Py_BuildValue("i", rpmProblemGetType(s->prob));
}
static PyObject *rpmprob_get_pkgnevr(rpmProblemObject *s, void *closure)
{
return utf8FromString(rpmProblemGetPkgNEVR(s->prob));
}
static PyObject *rpmprob_get_altnevr(rpmProblemObject *s, void *closure)
{
return utf8FromString(rpmProblemGetAltNEVR(s->prob));
}
static PyObject *rpmprob_get_key(rpmProblemObject *s, void *closure)
{
fnpyKey key = rpmProblemGetKey(s->prob);
if (key) {
return Py_BuildValue("O", key);
} else {
Py_RETURN_NONE;
}
}
static PyObject *rpmprob_get_str(rpmProblemObject *s, void *closure)
{
return utf8FromString(rpmProblemGetStr(s->prob));
}
static PyObject *rpmprob_get_num(rpmProblemObject *s, void *closure)
{
return Py_BuildValue("L", rpmProblemGetDiskNeed(s->prob));
}
static PyGetSetDef rpmprob_getseters[] = {
{ "type", (getter)rpmprob_get_type, NULL, NULL },
{ "pkgNEVR", (getter)rpmprob_get_pkgnevr, NULL, NULL },
{ "altNEVR", (getter)rpmprob_get_altnevr, NULL, NULL },
{ "key", (getter)rpmprob_get_key, NULL, NULL },
{ "_str", (getter)rpmprob_get_str, NULL, NULL },
{ "_num", (getter)rpmprob_get_num, NULL, NULL },
{ NULL }
};
static PyObject *rpmprob_str(rpmProblemObject *s)
{
char *str = rpmProblemString(s->prob);
PyObject *res = utf8FromString(str);
free(str);
return res;
}
static void rpmprob_dealloc(rpmProblemObject *s)
{
s->prob = rpmProblemFree(s->prob);
freefunc free = PyType_GetSlot(Py_TYPE(s), Py_tp_free);
free(s);
}
static PyObject *disabled_new(PyTypeObject *type,
PyObject *args, PyObject *kwds)
{
PyErr_SetString(PyExc_TypeError,
"TypeError: cannot create 'rpm.prob' instances");
return NULL;
}
static PyType_Slot rpmProblem_Type_Slots[] = {
{Py_tp_new, disabled_new},
{Py_tp_dealloc, rpmprob_dealloc},
{Py_tp_str, rpmprob_str},
{Py_tp_getattro, PyObject_GenericGetAttr},
{Py_tp_setattro, PyObject_GenericSetAttr},
{Py_tp_doc, rpmprob_doc},
{Py_tp_getset, rpmprob_getseters},
{0, NULL},
};
PyTypeObject* rpmProblem_Type;
PyType_Spec rpmProblem_Type_Spec = {
.name = "rpm.prob",
.basicsize = sizeof(rpmProblemObject),
.flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_IMMUTABLETYPE,
.slots = rpmProblem_Type_Slots,
};
PyObject *rpmprob_Wrap(PyTypeObject *subtype, rpmProblem prob)
{
allocfunc subtype_alloc = (allocfunc)PyType_GetSlot(subtype, Py_tp_alloc);
rpmProblemObject *s = (rpmProblemObject *)subtype_alloc(subtype, 0);
if (s == NULL) return NULL;
s->prob = rpmProblemLink(prob);
return (PyObject *) s;
}
PyObject *rpmps_AsList(rpmps ps)
{
PyObject *problems;
rpmpsi psi;
rpmProblem prob;
problems = PyList_New(0);
if (!problems) {
return NULL;
}
psi = rpmpsInitIterator(ps);
while ((prob = rpmpsiNext(psi))) {
PyObject *pyprob = rpmprob_Wrap(rpmProblem_Type, prob);
if (!pyprob) {
Py_DECREF(problems);
rpmpsFreeIterator(psi);
return NULL;
}
PyList_Append(problems, pyprob);
Py_DECREF(pyprob);
}
rpmpsFreeIterator(psi);
return problems;
}