2 * \file python/rpmfi-py.c
7 #include <rpm/rpmtypes.h>
8 #include <rpm/rpmpgp.h>
10 #include "header-py.h"
17 rpmfi_Debug(rpmfiObject * s, PyObject * args, PyObject * kwds)
19 char * kwlist[] = {"debugLevel", NULL};
21 if (!PyArg_ParseTupleAndKeywords(args, kwds, "i", kwlist, &_rpmfi_debug))
29 rpmfi_FC(rpmfiObject * s)
31 return Py_BuildValue("i", rpmfiFC(s->fi));
35 rpmfi_FX(rpmfiObject * s)
37 return Py_BuildValue("i", rpmfiFX(s->fi));
41 rpmfi_DC(rpmfiObject * s)
43 return Py_BuildValue("i", rpmfiDC(s->fi));
47 rpmfi_DX(rpmfiObject * s)
49 return Py_BuildValue("i", rpmfiDX(s->fi));
53 rpmfi_BN(rpmfiObject * s)
55 return Py_BuildValue("s", xstrdup(rpmfiBN(s->fi)));
59 rpmfi_DN(rpmfiObject * s)
61 return Py_BuildValue("s", xstrdup(rpmfiDN(s->fi)));
65 rpmfi_FN(rpmfiObject * s)
67 return Py_BuildValue("s", xstrdup(rpmfiFN(s->fi)));
71 rpmfi_FFlags(rpmfiObject * s)
73 return Py_BuildValue("i", rpmfiFFlags(s->fi));
77 rpmfi_VFlags(rpmfiObject * s)
79 return Py_BuildValue("i", rpmfiVFlags(s->fi));
83 rpmfi_FMode(rpmfiObject * s)
85 return Py_BuildValue("i", rpmfiFMode(s->fi));
89 rpmfi_FState(rpmfiObject * s)
91 return Py_BuildValue("i", rpmfiFState(s->fi));
94 /* XXX rpmfiFDigest */
96 rpmfi_Digest(rpmfiObject * s)
98 char *digest = rpmfiFDigestHex(s->fi, NULL);
100 PyObject *dig = Py_BuildValue("s", digest);
109 rpmfi_FLink(rpmfiObject * s)
111 return Py_BuildValue("s", xstrdup(rpmfiFLink(s->fi)));
115 rpmfi_FSize(rpmfiObject * s)
117 return Py_BuildValue("L", rpmfiFSize(s->fi));
121 rpmfi_FRdev(rpmfiObject * s)
123 return Py_BuildValue("i", rpmfiFRdev(s->fi));
127 rpmfi_FMtime(rpmfiObject * s)
129 return Py_BuildValue("i", rpmfiFMtime(s->fi));
133 rpmfi_FUser(rpmfiObject * s)
135 return Py_BuildValue("s", xstrdup(rpmfiFUser(s->fi)));
139 rpmfi_FGroup(rpmfiObject * s)
141 return Py_BuildValue("s", xstrdup(rpmfiFGroup(s->fi)));
145 rpmfi_FColor(rpmfiObject * s)
147 return Py_BuildValue("i", rpmfiFColor(s->fi));
151 rpmfi_FClass(rpmfiObject * s)
155 if ((FClass = rpmfiFClass(s->fi)) == NULL)
157 return Py_BuildValue("s", xstrdup(FClass));
161 rpmfi_iter(rpmfiObject * s)
164 return (PyObject *)s;
168 rpmfi_iternext(rpmfiObject * s)
170 PyObject * result = NULL;
172 /* Reset loop indices on 1st entry. */
174 s->fi = rpmfiInit(s->fi, 0);
178 /* If more to do, return the file tuple. */
179 if (rpmfiNext(s->fi) >= 0) {
180 const char * FN = rpmfiFN(s->fi);
181 rpm_loff_t FSize = rpmfiFSize(s->fi);
182 int FMode = rpmfiFMode(s->fi);
183 int FMtime = rpmfiFMtime(s->fi);
184 int FFlags = rpmfiFFlags(s->fi);
185 int FRdev = rpmfiFRdev(s->fi);
186 int FInode = rpmfiFInode(s->fi);
187 int FNlink = rpmfiFNlink(s->fi);
188 int FState = rpmfiFState(s->fi);
189 int VFlags = rpmfiVFlags(s->fi);
190 const char * FUser = rpmfiFUser(s->fi);
191 const char * FGroup = rpmfiFGroup(s->fi);
193 result = PyTuple_New(13);
196 PyTuple_SET_ITEM(result, 0, Py_None);
198 PyTuple_SET_ITEM(result, 0, Py_BuildValue("s", FN));
199 PyTuple_SET_ITEM(result, 1, PyLong_FromLongLong(FSize));
200 PyTuple_SET_ITEM(result, 2, PyInt_FromLong(FMode));
201 PyTuple_SET_ITEM(result, 3, PyInt_FromLong(FMtime));
202 PyTuple_SET_ITEM(result, 4, PyInt_FromLong(FFlags));
203 PyTuple_SET_ITEM(result, 5, PyInt_FromLong(FRdev));
204 PyTuple_SET_ITEM(result, 6, PyInt_FromLong(FInode));
205 PyTuple_SET_ITEM(result, 7, PyInt_FromLong(FNlink));
206 PyTuple_SET_ITEM(result, 8, PyInt_FromLong(FState));
207 PyTuple_SET_ITEM(result, 9, PyInt_FromLong(VFlags));
210 PyTuple_SET_ITEM(result, 10, Py_None);
212 PyTuple_SET_ITEM(result, 10, Py_BuildValue("s", FUser));
213 if (FGroup == NULL) {
215 PyTuple_SET_ITEM(result, 11, Py_None);
217 PyTuple_SET_ITEM(result, 11, Py_BuildValue("s", FGroup));
218 PyTuple_SET_ITEM(result, 12, rpmfi_Digest(s));
227 rpmfi_Next(rpmfiObject * s)
229 PyObject * result = NULL;
231 result = rpmfi_iternext(s);
233 if (result == NULL) {
243 rpmfi_NextD(rpmfiObject * s)
250 rpmfi_InitD(rpmfiObject * s)
257 static struct PyMethodDef rpmfi_methods[] = {
258 {"Debug", (PyCFunction)rpmfi_Debug, METH_VARARGS|METH_KEYWORDS,
260 {"FC", (PyCFunction)rpmfi_FC, METH_NOARGS,
262 {"FX", (PyCFunction)rpmfi_FX, METH_NOARGS,
264 {"DC", (PyCFunction)rpmfi_DC, METH_NOARGS,
266 {"DX", (PyCFunction)rpmfi_DX, METH_NOARGS,
268 {"BN", (PyCFunction)rpmfi_BN, METH_NOARGS,
270 {"DN", (PyCFunction)rpmfi_DN, METH_NOARGS,
272 {"FN", (PyCFunction)rpmfi_FN, METH_NOARGS,
274 {"FFlags", (PyCFunction)rpmfi_FFlags, METH_NOARGS,
276 {"VFlags", (PyCFunction)rpmfi_VFlags, METH_NOARGS,
278 {"FMode", (PyCFunction)rpmfi_FMode, METH_NOARGS,
280 {"FState", (PyCFunction)rpmfi_FState, METH_NOARGS,
282 {"MD5", (PyCFunction)rpmfi_Digest, METH_NOARGS,
284 {"Digest", (PyCFunction)rpmfi_Digest, METH_NOARGS,
286 {"FLink", (PyCFunction)rpmfi_FLink, METH_NOARGS,
288 {"FSize", (PyCFunction)rpmfi_FSize, METH_NOARGS,
290 {"FRdev", (PyCFunction)rpmfi_FRdev, METH_NOARGS,
292 {"FMtime", (PyCFunction)rpmfi_FMtime, METH_NOARGS,
294 {"FUser", (PyCFunction)rpmfi_FUser, METH_NOARGS,
296 {"FGroup", (PyCFunction)rpmfi_FGroup, METH_NOARGS,
298 {"FColor", (PyCFunction)rpmfi_FColor, METH_NOARGS,
300 {"FClass", (PyCFunction)rpmfi_FClass, METH_NOARGS,
302 {"next", (PyCFunction)rpmfi_Next, METH_NOARGS,
303 "fi.next() -> (FN, FSize, FMode, FMtime, FFlags, FRdev, FInode, FNlink, FState, VFlags, FUser, FGroup, FDigest))\n\
304 - Retrieve next file info tuple.\n" },
306 {"NextD", (PyCFunction)rpmfi_NextD, METH_NOARGS,
308 {"InitD", (PyCFunction)rpmfi_InitD, METH_NOARGS,
311 {NULL, NULL} /* sentinel */
317 rpmfi_dealloc(rpmfiObject * s)
320 s->fi = rpmfiFree(s->fi);
326 rpmfi_print(rpmfiObject * s, FILE * fp, int flags)
331 s->fi = rpmfiInit(s->fi, 0);
332 while (rpmfiNext(s->fi) >= 0)
333 fprintf(fp, "%s\n", rpmfiFN(s->fi));
337 static PyObject * rpmfi_getattro(PyObject * o, PyObject * n)
339 return PyObject_GenericGetAttr(o, n);
342 static int rpmfi_setattro(PyObject * o, PyObject * n, PyObject * v)
344 return PyObject_GenericSetAttr(o, n, v);
348 rpmfi_length(rpmfiObject * s)
350 return rpmfiFC(s->fi);
354 rpmfi_subscript(rpmfiObject * s, PyObject * key)
358 if (!PyInt_Check(key)) {
359 PyErr_SetString(PyExc_TypeError, "integer expected");
363 ix = (int) PyInt_AsLong(key);
364 rpmfiSetFX(s->fi, ix);
365 return Py_BuildValue("s", xstrdup(rpmfiFN(s->fi)));
368 static PyMappingMethods rpmfi_as_mapping = {
369 (lenfunc) rpmfi_length, /* mp_length */
370 (binaryfunc) rpmfi_subscript, /* mp_subscript */
371 (objobjargproc)0, /* mp_ass_subscript */
376 static int rpmfi_init(rpmfiObject * s, PyObject *args, PyObject *kwds)
378 hdrObject * ho = NULL;
379 PyObject * to = NULL;
380 rpmts ts = NULL; /* XXX FIXME: fiFromHeader should be a ts method. */
381 rpmTag tagN = RPMTAG_BASENAMES;
383 char * kwlist[] = {"header", "tag", "flags", NULL};
385 if (_rpmfi_debug < 0)
386 fprintf(stderr, "*** rpmfi_init(%p,%p,%p)\n", s, args, kwds);
388 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!|Oi:rpmfi_init", kwlist,
389 &hdr_Type, &ho, &to, &flags))
393 tagN = tagNumFromPyObject(to);
395 PyErr_SetString(PyExc_KeyError, "unknown header tag");
399 s->fi = rpmfiNew(ts, hdrGetHeader(ho), tagN, flags);
407 static void rpmfi_free(rpmfiObject * s)
410 fprintf(stderr, "%p -- fi %p\n", s, s->fi);
411 s->fi = rpmfiFree(s->fi);
413 PyObject_Del((PyObject *)s);
418 static PyObject * rpmfi_alloc(PyTypeObject * subtype, int nitems)
420 PyObject * s = PyType_GenericAlloc(subtype, nitems);
422 if (_rpmfi_debug < 0)
423 fprintf(stderr, "*** rpmfi_alloc(%p,%d) ret %p\n", subtype, nitems, s);
429 static PyObject * rpmfi_new(PyTypeObject * subtype, PyObject *args, PyObject *kwds)
431 rpmfiObject * s = (void *) PyObject_New(rpmfiObject, subtype);
433 /* Perform additional initialization. */
434 if (rpmfi_init(s, args, kwds) < 0) {
440 fprintf(stderr, "%p ++ fi %p\n", s, s->fi);
442 return (PyObject *)s;
447 static char rpmfi_doc[] =
450 PyTypeObject rpmfi_Type = {
451 PyObject_HEAD_INIT(&PyType_Type)
453 "rpm.fi", /* tp_name */
454 sizeof(rpmfiObject), /* tp_basicsize */
457 (destructor) rpmfi_dealloc, /* tp_dealloc */
458 (printfunc) rpmfi_print, /* tp_print */
459 (getattrfunc)0, /* tp_getattr */
460 (setattrfunc)0, /* tp_setattr */
461 (cmpfunc)0, /* tp_compare */
462 (reprfunc)0, /* tp_repr */
463 0, /* tp_as_number */
464 0, /* tp_as_sequence */
465 &rpmfi_as_mapping, /* tp_as_mapping */
466 (hashfunc)0, /* tp_hash */
467 (ternaryfunc)0, /* tp_call */
468 (reprfunc)0, /* tp_str */
469 (getattrofunc) rpmfi_getattro, /* tp_getattro */
470 (setattrofunc) rpmfi_setattro, /* tp_setattro */
471 0, /* tp_as_buffer */
472 Py_TPFLAGS_DEFAULT, /* tp_flags */
473 rpmfi_doc, /* tp_doc */
476 0, /* tp_richcompare */
477 0, /* tp_weaklistoffset */
478 (getiterfunc) rpmfi_iter, /* tp_iter */
479 (iternextfunc) rpmfi_iternext, /* tp_iternext */
480 rpmfi_methods, /* tp_methods */
485 0, /* tp_descr_get */
486 0, /* tp_descr_set */
487 0, /* tp_dictoffset */
488 (initproc) rpmfi_init, /* tp_init */
489 (allocfunc) rpmfi_alloc, /* tp_alloc */
490 (newfunc) rpmfi_new, /* tp_new */
491 (freefunc) rpmfi_free, /* tp_free */
497 rpmfi fiFromFi(rpmfiObject * s)
505 rpmfiObject *s = PyObject_New(rpmfiObject, &rpmfi_Type);
515 hdr_fiFromHeader(PyObject * s, PyObject * args, PyObject * kwds)
517 hdrObject * ho = (hdrObject *)s;
518 PyObject * to = NULL;
519 rpmts ts = NULL; /* XXX FIXME: fiFromHeader should be a ts method. */
520 rpmTag tagN = RPMTAG_BASENAMES;
522 char * kwlist[] = {"tag", "flags", NULL};
524 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:fiFromHeader", kwlist,
529 tagN = tagNumFromPyObject(to);
531 PyErr_SetString(PyExc_KeyError, "unknown header tag");
535 return rpmfi_Wrap( rpmfiNew(ts, hdrGetHeader(ho), tagN, flags) );