2 * \file python/rpmfi-py.c
7 #include <rpm/rpmtag.h>
15 rpmfi_Debug(rpmfiObject * s, PyObject * args, PyObject * kwds)
17 char * kwlist[] = {"debugLevel", NULL};
19 if (!PyArg_ParseTupleAndKeywords(args, kwds, "i", kwlist, &_rpmfi_debug))
27 rpmfi_FC(rpmfiObject * s)
29 return Py_BuildValue("i", rpmfiFC(s->fi));
33 rpmfi_FX(rpmfiObject * s)
35 return Py_BuildValue("i", rpmfiFX(s->fi));
39 rpmfi_DC(rpmfiObject * s)
41 return Py_BuildValue("i", rpmfiDC(s->fi));
45 rpmfi_DX(rpmfiObject * s)
47 return Py_BuildValue("i", rpmfiDX(s->fi));
51 rpmfi_BN(rpmfiObject * s)
53 return Py_BuildValue("s", xstrdup(rpmfiBN(s->fi)));
57 rpmfi_DN(rpmfiObject * s)
59 return Py_BuildValue("s", xstrdup(rpmfiDN(s->fi)));
63 rpmfi_FN(rpmfiObject * s)
65 return Py_BuildValue("s", xstrdup(rpmfiFN(s->fi)));
69 rpmfi_FFlags(rpmfiObject * s)
71 return Py_BuildValue("i", rpmfiFFlags(s->fi));
75 rpmfi_VFlags(rpmfiObject * s)
77 return Py_BuildValue("i", rpmfiVFlags(s->fi));
81 rpmfi_FMode(rpmfiObject * s)
83 return Py_BuildValue("i", rpmfiFMode(s->fi));
87 rpmfi_FState(rpmfiObject * s)
89 return Py_BuildValue("i", rpmfiFState(s->fi));
94 rpmfi_MD5(rpmfiObject * s)
96 const unsigned char * MD5;
101 MD5 = rpmfiMD5(s->fi);
104 for (i = 0; i < 16; i++, t += 2)
105 sprintf(t, "%02x", MD5[i]);
107 return Py_BuildValue("s", xstrdup(fmd5));
111 rpmfi_FLink(rpmfiObject * s)
113 return Py_BuildValue("s", xstrdup(rpmfiFLink(s->fi)));
117 rpmfi_FSize(rpmfiObject * s)
119 return Py_BuildValue("i", rpmfiFSize(s->fi));
123 rpmfi_FRdev(rpmfiObject * s)
125 return Py_BuildValue("i", rpmfiFRdev(s->fi));
129 rpmfi_FMtime(rpmfiObject * s)
131 return Py_BuildValue("i", rpmfiFMtime(s->fi));
135 rpmfi_FUser(rpmfiObject * s)
137 return Py_BuildValue("s", xstrdup(rpmfiFUser(s->fi)));
141 rpmfi_FGroup(rpmfiObject * s)
143 return Py_BuildValue("s", xstrdup(rpmfiFGroup(s->fi)));
147 rpmfi_FColor(rpmfiObject * s)
149 return Py_BuildValue("i", rpmfiFColor(s->fi));
153 rpmfi_FClass(rpmfiObject * s)
157 if ((FClass = rpmfiFClass(s->fi)) == NULL)
159 return Py_BuildValue("s", xstrdup(FClass));
162 #if Py_TPFLAGS_HAVE_ITER
164 rpmfi_iter(rpmfiObject * s)
167 return (PyObject *)s;
172 rpmfi_iternext(rpmfiObject * s)
174 PyObject * result = NULL;
176 /* Reset loop indices on 1st entry. */
178 s->fi = rpmfiInit(s->fi, 0);
182 /* If more to do, return the file tuple. */
183 if (rpmfiNext(s->fi) >= 0) {
184 const char * FN = rpmfiFN(s->fi);
185 int FSize = rpmfiFSize(s->fi);
186 int FMode = rpmfiFMode(s->fi);
187 int FMtime = rpmfiFMtime(s->fi);
188 int FFlags = rpmfiFFlags(s->fi);
189 int FRdev = rpmfiFRdev(s->fi);
190 int FInode = rpmfiFInode(s->fi);
191 int FNlink = rpmfiFNlink(s->fi);
192 int FState = rpmfiFState(s->fi);
193 int VFlags = rpmfiVFlags(s->fi);
194 const char * FUser = rpmfiFUser(s->fi);
195 const char * FGroup = rpmfiFGroup(s->fi);
196 const unsigned char * MD5 = rpmfiMD5(s->fi), *s = MD5;
197 char FMD5[2*16+1], *t = FMD5;
198 static const char hex[] = "0123456789abcdef";
203 for (i = 0; i < 16; i++) {
205 *t++ = hex[ (*s >> 4) & 0xf ];
206 *t++ = hex[ (*s++ ) & 0xf ];
210 result = PyTuple_New(13);
213 PyTuple_SET_ITEM(result, 0, Py_None);
215 PyTuple_SET_ITEM(result, 0, Py_BuildValue("s", FN));
216 PyTuple_SET_ITEM(result, 1, PyInt_FromLong(FSize));
217 PyTuple_SET_ITEM(result, 2, PyInt_FromLong(FMode));
218 PyTuple_SET_ITEM(result, 3, PyInt_FromLong(FMtime));
219 PyTuple_SET_ITEM(result, 4, PyInt_FromLong(FFlags));
220 PyTuple_SET_ITEM(result, 5, PyInt_FromLong(FRdev));
221 PyTuple_SET_ITEM(result, 6, PyInt_FromLong(FInode));
222 PyTuple_SET_ITEM(result, 7, PyInt_FromLong(FNlink));
223 PyTuple_SET_ITEM(result, 8, PyInt_FromLong(FState));
224 PyTuple_SET_ITEM(result, 9, PyInt_FromLong(VFlags));
227 PyTuple_SET_ITEM(result, 10, Py_None);
229 PyTuple_SET_ITEM(result, 10, Py_BuildValue("s", FUser));
230 if (FGroup == NULL) {
232 PyTuple_SET_ITEM(result, 11, Py_None);
234 PyTuple_SET_ITEM(result, 11, Py_BuildValue("s", FGroup));
237 PyTuple_SET_ITEM(result, 12, Py_None);
239 PyTuple_SET_ITEM(result, 12, Py_BuildValue("s", FMD5));
248 rpmfi_Next(rpmfiObject * s)
250 PyObject * result = NULL;
252 result = rpmfi_iternext(s);
254 if (result == NULL) {
264 rpmfi_NextD(rpmfiObject * s)
271 rpmfi_InitD(rpmfiObject * s)
278 static struct PyMethodDef rpmfi_methods[] = {
279 {"Debug", (PyCFunction)rpmfi_Debug, METH_VARARGS|METH_KEYWORDS,
281 {"FC", (PyCFunction)rpmfi_FC, METH_NOARGS,
283 {"FX", (PyCFunction)rpmfi_FX, METH_NOARGS,
285 {"DC", (PyCFunction)rpmfi_DC, METH_NOARGS,
287 {"DX", (PyCFunction)rpmfi_DX, METH_NOARGS,
289 {"BN", (PyCFunction)rpmfi_BN, METH_NOARGS,
291 {"DN", (PyCFunction)rpmfi_DN, METH_NOARGS,
293 {"FN", (PyCFunction)rpmfi_FN, METH_NOARGS,
295 {"FFlags", (PyCFunction)rpmfi_FFlags, METH_NOARGS,
297 {"VFlags", (PyCFunction)rpmfi_VFlags, METH_NOARGS,
299 {"FMode", (PyCFunction)rpmfi_FMode, METH_NOARGS,
301 {"FState", (PyCFunction)rpmfi_FState, METH_NOARGS,
303 {"MD5", (PyCFunction)rpmfi_MD5, METH_NOARGS,
305 {"FLink", (PyCFunction)rpmfi_FLink, METH_NOARGS,
307 {"FSize", (PyCFunction)rpmfi_FSize, METH_NOARGS,
309 {"FRdev", (PyCFunction)rpmfi_FRdev, METH_NOARGS,
311 {"FMtime", (PyCFunction)rpmfi_FMtime, METH_NOARGS,
313 {"FUser", (PyCFunction)rpmfi_FUser, METH_NOARGS,
315 {"FGroup", (PyCFunction)rpmfi_FGroup, METH_NOARGS,
317 {"FColor", (PyCFunction)rpmfi_FColor, METH_NOARGS,
319 {"FClass", (PyCFunction)rpmfi_FClass, METH_NOARGS,
321 {"next", (PyCFunction)rpmfi_Next, METH_NOARGS,
322 "fi.next() -> (FN, FSize, FMode, FMtime, FFlags, FRdev, FInode, FNlink, FState, VFlags, FUser, FGroup, FMD5))\n\
323 - Retrieve next file info tuple.\n" },
325 {"NextD", (PyCFunction)rpmfi_NextD, METH_NOARGS,
327 {"InitD", (PyCFunction)rpmfi_InitD, METH_NOARGS,
330 {NULL, NULL} /* sentinel */
336 rpmfi_dealloc(rpmfiObject * s)
339 s->fi = rpmfiFree(s->fi);
345 rpmfi_print(rpmfiObject * s, FILE * fp, int flags)
350 s->fi = rpmfiInit(s->fi, 0);
351 while (rpmfiNext(s->fi) >= 0)
352 fprintf(fp, "%s\n", rpmfiFN(s->fi));
356 static PyObject * rpmfi_getattro(PyObject * o, PyObject * n)
358 return PyObject_GenericGetAttr(o, n);
361 static int rpmfi_setattro(PyObject * o, PyObject * n, PyObject * v)
363 return PyObject_GenericSetAttr(o, n, v);
367 rpmfi_length(rpmfiObject * s)
369 return rpmfiFC(s->fi);
373 rpmfi_subscript(rpmfiObject * s, PyObject * key)
377 if (!PyInt_Check(key)) {
378 PyErr_SetString(PyExc_TypeError, "integer expected");
382 ix = (int) PyInt_AsLong(key);
383 rpmfiSetFX(s->fi, ix);
384 return Py_BuildValue("s", xstrdup(rpmfiFN(s->fi)));
387 static PyMappingMethods rpmfi_as_mapping = {
388 (lenfunc) rpmfi_length, /* mp_length */
389 (binaryfunc) rpmfi_subscript, /* mp_subscript */
390 (objobjargproc)0, /* mp_ass_subscript */
395 static int rpmfi_init(rpmfiObject * s, PyObject *args, PyObject *kwds)
397 hdrObject * ho = NULL;
398 PyObject * to = NULL;
399 rpmts ts = NULL; /* XXX FIXME: fiFromHeader should be a ts method. */
400 rpm_tag_t tagN = RPMTAG_BASENAMES;
402 char * kwlist[] = {"header", "tag", "flags", NULL};
404 if (_rpmfi_debug < 0)
405 fprintf(stderr, "*** rpmfi_init(%p,%p,%p)\n", s, args, kwds);
407 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!|Oi:rpmfi_init", kwlist,
408 &hdr_Type, &ho, &to, &flags))
412 tagN = tagNumFromPyObject(to);
414 PyErr_SetString(PyExc_KeyError, "unknown header tag");
418 s->fi = rpmfiNew(ts, hdrGetHeader(ho), tagN, flags);
426 static void rpmfi_free(rpmfiObject * s)
429 fprintf(stderr, "%p -- fi %p\n", s, s->fi);
430 s->fi = rpmfiFree(s->fi);
432 PyObject_Del((PyObject *)s);
437 static PyObject * rpmfi_alloc(PyTypeObject * subtype, int nitems)
439 PyObject * s = PyType_GenericAlloc(subtype, nitems);
441 if (_rpmfi_debug < 0)
442 fprintf(stderr, "*** rpmfi_alloc(%p,%d) ret %p\n", subtype, nitems, s);
448 static PyObject * rpmfi_new(PyTypeObject * subtype, PyObject *args, PyObject *kwds)
450 rpmfiObject * s = (void *) PyObject_New(rpmfiObject, subtype);
452 /* Perform additional initialization. */
453 if (rpmfi_init(s, args, kwds) < 0) {
459 fprintf(stderr, "%p ++ fi %p\n", s, s->fi);
461 return (PyObject *)s;
466 static char rpmfi_doc[] =
469 PyTypeObject rpmfi_Type = {
470 PyObject_HEAD_INIT(&PyType_Type)
472 "rpm.fi", /* tp_name */
473 sizeof(rpmfiObject), /* tp_basicsize */
476 (destructor) rpmfi_dealloc, /* tp_dealloc */
477 (printfunc) rpmfi_print, /* tp_print */
478 (getattrfunc)0, /* tp_getattr */
479 (setattrfunc)0, /* tp_setattr */
480 (cmpfunc)0, /* tp_compare */
481 (reprfunc)0, /* tp_repr */
482 0, /* tp_as_number */
483 0, /* tp_as_sequence */
484 &rpmfi_as_mapping, /* tp_as_mapping */
485 (hashfunc)0, /* tp_hash */
486 (ternaryfunc)0, /* tp_call */
487 (reprfunc)0, /* tp_str */
488 (getattrofunc) rpmfi_getattro, /* tp_getattro */
489 (setattrofunc) rpmfi_setattro, /* tp_setattro */
490 0, /* tp_as_buffer */
491 Py_TPFLAGS_DEFAULT, /* tp_flags */
492 rpmfi_doc, /* tp_doc */
493 #if Py_TPFLAGS_HAVE_ITER
496 0, /* tp_richcompare */
497 0, /* tp_weaklistoffset */
498 (getiterfunc) rpmfi_iter, /* tp_iter */
499 (iternextfunc) rpmfi_iternext, /* tp_iternext */
500 rpmfi_methods, /* tp_methods */
505 0, /* tp_descr_get */
506 0, /* tp_descr_set */
507 0, /* tp_dictoffset */
508 (initproc) rpmfi_init, /* tp_init */
509 (allocfunc) rpmfi_alloc, /* tp_alloc */
510 (newfunc) rpmfi_new, /* tp_new */
511 (freefunc) rpmfi_free, /* tp_free */
518 rpmfi fiFromFi(rpmfiObject * s)
526 rpmfiObject *s = PyObject_New(rpmfiObject, &rpmfi_Type);
536 hdr_fiFromHeader(PyObject * s, PyObject * args, PyObject * kwds)
538 hdrObject * ho = (hdrObject *)s;
539 PyObject * to = NULL;
540 rpmts ts = NULL; /* XXX FIXME: fiFromHeader should be a ts method. */
541 rpm_tag_t tagN = RPMTAG_BASENAMES;
543 char * kwlist[] = {"tag", "flags", NULL};
545 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:fiFromHeader", kwlist,
550 tagN = tagNumFromPyObject(to);
552 PyErr_SetString(PyExc_KeyError, "unknown header tag");
556 return rpmfi_Wrap( rpmfiNew(ts, hdrGetHeader(ho), tagN, flags) );