2 * \file python/rpmfi-py.c
7 #include <rpm/rpmtypes.h>
8 #include <rpm/rpmpgp.h>
10 #include "header-py.h"
15 struct rpmfiObject_s {
17 PyObject *md_dict; /*!< to look like PyModuleObject */
23 rpmfi_Debug(rpmfiObject * s, PyObject * args, PyObject * kwds)
25 char * kwlist[] = {"debugLevel", NULL};
27 if (!PyArg_ParseTupleAndKeywords(args, kwds, "i", kwlist, &_rpmfi_debug))
35 rpmfi_FC(rpmfiObject * s)
37 return Py_BuildValue("i", rpmfiFC(s->fi));
41 rpmfi_FX(rpmfiObject * s)
43 return Py_BuildValue("i", rpmfiFX(s->fi));
47 rpmfi_DC(rpmfiObject * s)
49 return Py_BuildValue("i", rpmfiDC(s->fi));
53 rpmfi_DX(rpmfiObject * s)
55 return Py_BuildValue("i", rpmfiDX(s->fi));
59 rpmfi_BN(rpmfiObject * s)
61 return Py_BuildValue("s", xstrdup(rpmfiBN(s->fi)));
65 rpmfi_DN(rpmfiObject * s)
67 return Py_BuildValue("s", xstrdup(rpmfiDN(s->fi)));
71 rpmfi_FN(rpmfiObject * s)
73 return Py_BuildValue("s", xstrdup(rpmfiFN(s->fi)));
77 rpmfi_FFlags(rpmfiObject * s)
79 return Py_BuildValue("i", rpmfiFFlags(s->fi));
83 rpmfi_VFlags(rpmfiObject * s)
85 return Py_BuildValue("i", rpmfiVFlags(s->fi));
89 rpmfi_FMode(rpmfiObject * s)
91 return Py_BuildValue("i", rpmfiFMode(s->fi));
95 rpmfi_FState(rpmfiObject * s)
97 return Py_BuildValue("i", rpmfiFState(s->fi));
100 /* XXX rpmfiFDigest */
102 rpmfi_Digest(rpmfiObject * s)
104 char *digest = rpmfiFDigestHex(s->fi, NULL);
106 PyObject *dig = Py_BuildValue("s", digest);
115 rpmfi_FLink(rpmfiObject * s)
117 return Py_BuildValue("s", xstrdup(rpmfiFLink(s->fi)));
121 rpmfi_FSize(rpmfiObject * s)
123 return Py_BuildValue("L", rpmfiFSize(s->fi));
127 rpmfi_FRdev(rpmfiObject * s)
129 return Py_BuildValue("i", rpmfiFRdev(s->fi));
133 rpmfi_FMtime(rpmfiObject * s)
135 return Py_BuildValue("i", rpmfiFMtime(s->fi));
139 rpmfi_FUser(rpmfiObject * s)
141 return Py_BuildValue("s", xstrdup(rpmfiFUser(s->fi)));
145 rpmfi_FGroup(rpmfiObject * s)
147 return Py_BuildValue("s", xstrdup(rpmfiFGroup(s->fi)));
151 rpmfi_FColor(rpmfiObject * s)
153 return Py_BuildValue("i", rpmfiFColor(s->fi));
157 rpmfi_FClass(rpmfiObject * s)
161 if ((FClass = rpmfiFClass(s->fi)) == NULL)
163 return Py_BuildValue("s", xstrdup(FClass));
167 rpmfi_iter(rpmfiObject * s)
170 return (PyObject *)s;
174 rpmfi_iternext(rpmfiObject * s)
176 PyObject * result = NULL;
178 /* Reset loop indices on 1st entry. */
180 s->fi = rpmfiInit(s->fi, 0);
184 /* If more to do, return the file tuple. */
185 if (rpmfiNext(s->fi) >= 0) {
186 const char * FN = rpmfiFN(s->fi);
187 rpm_loff_t FSize = rpmfiFSize(s->fi);
188 int FMode = rpmfiFMode(s->fi);
189 int FMtime = rpmfiFMtime(s->fi);
190 int FFlags = rpmfiFFlags(s->fi);
191 int FRdev = rpmfiFRdev(s->fi);
192 int FInode = rpmfiFInode(s->fi);
193 int FNlink = rpmfiFNlink(s->fi);
194 int FState = rpmfiFState(s->fi);
195 int VFlags = rpmfiVFlags(s->fi);
196 const char * FUser = rpmfiFUser(s->fi);
197 const char * FGroup = rpmfiFGroup(s->fi);
199 result = PyTuple_New(13);
202 PyTuple_SET_ITEM(result, 0, Py_None);
204 PyTuple_SET_ITEM(result, 0, Py_BuildValue("s", FN));
205 PyTuple_SET_ITEM(result, 1, PyLong_FromLongLong(FSize));
206 PyTuple_SET_ITEM(result, 2, PyInt_FromLong(FMode));
207 PyTuple_SET_ITEM(result, 3, PyInt_FromLong(FMtime));
208 PyTuple_SET_ITEM(result, 4, PyInt_FromLong(FFlags));
209 PyTuple_SET_ITEM(result, 5, PyInt_FromLong(FRdev));
210 PyTuple_SET_ITEM(result, 6, PyInt_FromLong(FInode));
211 PyTuple_SET_ITEM(result, 7, PyInt_FromLong(FNlink));
212 PyTuple_SET_ITEM(result, 8, PyInt_FromLong(FState));
213 PyTuple_SET_ITEM(result, 9, PyInt_FromLong(VFlags));
216 PyTuple_SET_ITEM(result, 10, Py_None);
218 PyTuple_SET_ITEM(result, 10, Py_BuildValue("s", FUser));
219 if (FGroup == NULL) {
221 PyTuple_SET_ITEM(result, 11, Py_None);
223 PyTuple_SET_ITEM(result, 11, Py_BuildValue("s", FGroup));
224 PyTuple_SET_ITEM(result, 12, rpmfi_Digest(s));
233 rpmfi_Next(rpmfiObject * s)
235 PyObject * result = NULL;
237 result = rpmfi_iternext(s);
239 if (result == NULL) {
249 rpmfi_NextD(rpmfiObject * s)
256 rpmfi_InitD(rpmfiObject * s)
263 static struct PyMethodDef rpmfi_methods[] = {
264 {"Debug", (PyCFunction)rpmfi_Debug, METH_VARARGS|METH_KEYWORDS,
266 {"FC", (PyCFunction)rpmfi_FC, METH_NOARGS,
268 {"FX", (PyCFunction)rpmfi_FX, METH_NOARGS,
270 {"DC", (PyCFunction)rpmfi_DC, METH_NOARGS,
272 {"DX", (PyCFunction)rpmfi_DX, METH_NOARGS,
274 {"BN", (PyCFunction)rpmfi_BN, METH_NOARGS,
276 {"DN", (PyCFunction)rpmfi_DN, METH_NOARGS,
278 {"FN", (PyCFunction)rpmfi_FN, METH_NOARGS,
280 {"FFlags", (PyCFunction)rpmfi_FFlags, METH_NOARGS,
282 {"VFlags", (PyCFunction)rpmfi_VFlags, METH_NOARGS,
284 {"FMode", (PyCFunction)rpmfi_FMode, METH_NOARGS,
286 {"FState", (PyCFunction)rpmfi_FState, METH_NOARGS,
288 {"MD5", (PyCFunction)rpmfi_Digest, METH_NOARGS,
290 {"Digest", (PyCFunction)rpmfi_Digest, METH_NOARGS,
292 {"FLink", (PyCFunction)rpmfi_FLink, METH_NOARGS,
294 {"FSize", (PyCFunction)rpmfi_FSize, METH_NOARGS,
296 {"FRdev", (PyCFunction)rpmfi_FRdev, METH_NOARGS,
298 {"FMtime", (PyCFunction)rpmfi_FMtime, METH_NOARGS,
300 {"FUser", (PyCFunction)rpmfi_FUser, METH_NOARGS,
302 {"FGroup", (PyCFunction)rpmfi_FGroup, METH_NOARGS,
304 {"FColor", (PyCFunction)rpmfi_FColor, METH_NOARGS,
306 {"FClass", (PyCFunction)rpmfi_FClass, METH_NOARGS,
308 {"next", (PyCFunction)rpmfi_Next, METH_NOARGS,
309 "fi.next() -> (FN, FSize, FMode, FMtime, FFlags, FRdev, FInode, FNlink, FState, VFlags, FUser, FGroup, FDigest))\n\
310 - Retrieve next file info tuple.\n" },
312 {"NextD", (PyCFunction)rpmfi_NextD, METH_NOARGS,
314 {"InitD", (PyCFunction)rpmfi_InitD, METH_NOARGS,
317 {NULL, NULL} /* sentinel */
323 rpmfi_dealloc(rpmfiObject * s)
326 s->fi = rpmfiFree(s->fi);
332 rpmfi_print(rpmfiObject * s, FILE * fp, int flags)
337 s->fi = rpmfiInit(s->fi, 0);
338 while (rpmfiNext(s->fi) >= 0)
339 fprintf(fp, "%s\n", rpmfiFN(s->fi));
344 rpmfi_length(rpmfiObject * s)
346 return rpmfiFC(s->fi);
350 rpmfi_subscript(rpmfiObject * s, PyObject * key)
354 if (!PyInt_Check(key)) {
355 PyErr_SetString(PyExc_TypeError, "integer expected");
359 ix = (int) PyInt_AsLong(key);
360 rpmfiSetFX(s->fi, ix);
361 return Py_BuildValue("s", xstrdup(rpmfiFN(s->fi)));
364 static PyMappingMethods rpmfi_as_mapping = {
365 (lenfunc) rpmfi_length, /* mp_length */
366 (binaryfunc) rpmfi_subscript, /* mp_subscript */
367 (objobjargproc)0, /* mp_ass_subscript */
372 static int rpmfi_init(rpmfiObject * s, PyObject *args, PyObject *kwds)
374 hdrObject * ho = NULL;
375 PyObject * to = NULL;
376 rpmts ts = NULL; /* XXX FIXME: fiFromHeader should be a ts method. */
377 rpmTag tagN = RPMTAG_BASENAMES;
379 char * kwlist[] = {"header", "tag", "flags", NULL};
381 if (_rpmfi_debug < 0)
382 fprintf(stderr, "*** rpmfi_init(%p,%p,%p)\n", s, args, kwds);
384 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!|Oi:rpmfi_init", kwlist,
385 &hdr_Type, &ho, &to, &flags))
389 tagN = tagNumFromPyObject(to);
391 PyErr_SetString(PyExc_KeyError, "unknown header tag");
395 s->fi = rpmfiNew(ts, hdrGetHeader(ho), tagN, flags);
403 static void rpmfi_free(rpmfiObject * s)
406 fprintf(stderr, "%p -- fi %p\n", s, s->fi);
407 s->fi = rpmfiFree(s->fi);
409 PyObject_Del((PyObject *)s);
414 static PyObject * rpmfi_new(PyTypeObject * subtype, PyObject *args, PyObject *kwds)
416 rpmfiObject * s = (void *) PyObject_New(rpmfiObject, subtype);
418 /* Perform additional initialization. */
419 if (rpmfi_init(s, args, kwds) < 0) {
425 fprintf(stderr, "%p ++ fi %p\n", s, s->fi);
427 return (PyObject *)s;
432 static char rpmfi_doc[] =
435 PyTypeObject rpmfi_Type = {
436 PyObject_HEAD_INIT(&PyType_Type)
438 "rpm.fi", /* tp_name */
439 sizeof(rpmfiObject), /* tp_basicsize */
442 (destructor) rpmfi_dealloc, /* tp_dealloc */
443 (printfunc) rpmfi_print, /* tp_print */
444 (getattrfunc)0, /* tp_getattr */
445 (setattrfunc)0, /* tp_setattr */
446 (cmpfunc)0, /* tp_compare */
447 (reprfunc)0, /* tp_repr */
448 0, /* tp_as_number */
449 0, /* tp_as_sequence */
450 &rpmfi_as_mapping, /* tp_as_mapping */
451 (hashfunc)0, /* tp_hash */
452 (ternaryfunc)0, /* tp_call */
453 (reprfunc)0, /* tp_str */
454 PyObject_GenericGetAttr, /* tp_getattro */
455 PyObject_GenericSetAttr, /* tp_setattro */
456 0, /* tp_as_buffer */
457 Py_TPFLAGS_DEFAULT, /* tp_flags */
458 rpmfi_doc, /* tp_doc */
461 0, /* tp_richcompare */
462 0, /* tp_weaklistoffset */
463 (getiterfunc) rpmfi_iter, /* tp_iter */
464 (iternextfunc) rpmfi_iternext, /* tp_iternext */
465 rpmfi_methods, /* tp_methods */
470 0, /* tp_descr_get */
471 0, /* tp_descr_set */
472 0, /* tp_dictoffset */
473 (initproc) rpmfi_init, /* tp_init */
475 (newfunc) rpmfi_new, /* tp_new */
476 (freefunc) rpmfi_free, /* tp_free */
482 rpmfi fiFromFi(rpmfiObject * s)
490 rpmfiObject *s = PyObject_New(rpmfiObject, &rpmfi_Type);
500 hdr_fiFromHeader(PyObject * s, PyObject * args, PyObject * kwds)
502 hdrObject * ho = (hdrObject *)s;
503 PyObject * to = NULL;
504 rpmts ts = NULL; /* XXX FIXME: fiFromHeader should be a ts method. */
505 rpmTag tagN = RPMTAG_BASENAMES;
507 char * kwlist[] = {"tag", "flags", NULL};
509 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:fiFromHeader", kwlist,
514 tagN = tagNumFromPyObject(to);
516 PyErr_SetString(PyExc_KeyError, "unknown header tag");
520 return rpmfi_Wrap( rpmfiNew(ts, hdrGetHeader(ho), tagN, flags) );