// -*- mode: cpp; mode: fold -*- // Description /*{{{*/ // $Id: pkgrecords.cc,v 1.3 2002/02/26 01:36:15 mdz Exp $ /* ###################################################################### Package Records - Wrapper for the package records functions ##################################################################### */ /*}}}*/ // Include Files /*{{{*/ #include "generic.h" #include "apt_pkgmodule.h" #include "pkgrecords.h" #include /*}}}*/ // PkgRecords Class /*{{{*/ // --------------------------------------------------------------------- static PyObject *PkgRecordsLookup(PyObject *Self,PyObject *Args) { PkgRecordsStruct &Struct = GetCpp(Self); PyObject *PkgFObj; long int Index; if (PyArg_ParseTuple(Args,"(O!l)",&PyPackageFile_Type,&PkgFObj,&Index) == 0) return 0; // Get the index and check to make sure it is reasonable pkgCache::PkgFileIterator &PkgF = GetCpp(PkgFObj); pkgCache *Cache = PkgF.Cache(); if (Cache->DataEnd() <= Cache->VerFileP + Index + 1 || Cache->VerFileP[Index].File != PkgF.MapPointer()) { PyErr_SetNone(PyExc_IndexError); return 0; } // Do the lookup Struct.Last = &Struct.Records.Lookup(pkgCache::VerFileIterator(*Cache,Cache->VerFileP+Index)); // always return true (to make it consistent with the pkgsrcrecords object return PyBool_FromLong(1); } static PyMethodDef PkgRecordsMethods[] = { {"lookup",PkgRecordsLookup,METH_VARARGS, "lookup((packagefile: apt_pkg.PackageFile, index: int)) -> bool\n\n" "Changes to a new package"}, {} }; /** * Get the PkgSrcRecordsStruct from a PyObject. If no package has been looked * up, set an AttributeError using the given name. */ static inline PkgRecordsStruct &GetStruct(PyObject *Self,char *name) { PkgRecordsStruct &Struct = GetCpp(Self); if (Struct.Last == 0) PyErr_SetString(PyExc_AttributeError,name); return Struct; } static PyObject *PkgRecordsGetFileName(PyObject *Self,void*) { PkgRecordsStruct &Struct = GetStruct(Self,"FileName"); return (Struct.Last != 0) ? CppPyPath(Struct.Last->FileName()) : 0; } static PyObject *PkgRecordsGetHashes(PyObject *Self,void*) { PkgRecordsStruct &Struct = GetStruct(Self,"Hashes"); if (Struct.Last == 0) return 0; auto py = CppPyObject_NEW (nullptr, &PyHashStringList_Type); py->Object = Struct.Last->Hashes(); return py; } static PyObject *PkgRecordsGetMD5Hash(PyObject *Self,void*) { PkgRecordsStruct &Struct = GetStruct(Self,"MD5Hash"); if (Struct.Last == NULL) return 0; auto hashes = Struct.Last->Hashes(); auto hash = hashes.find("md5sum"); if (hash == NULL) return 0; return CppPyString(hash->HashValue()); } static PyObject *PkgRecordsGetSHA1Hash(PyObject *Self,void*) { PkgRecordsStruct &Struct = GetStruct(Self,"SHA1Hash"); if (Struct.Last == NULL) return 0; auto hashes = Struct.Last->Hashes(); auto hash = hashes.find("sha1"); if (hash == NULL) return 0; return CppPyString(hash->HashValue()); } static PyObject *PkgRecordsGetSHA256Hash(PyObject *Self,void*) { PkgRecordsStruct &Struct = GetStruct(Self,"SHA256Hash"); if (Struct.Last == NULL) return 0; auto hashes = Struct.Last->Hashes(); auto hash = hashes.find("sha256"); if (hash == NULL) return 0; return CppPyString(hash->HashValue()); } static PyObject *PkgRecordsGetSourcePkg(PyObject *Self,void*) { PkgRecordsStruct &Struct = GetStruct(Self,"SourcePkg"); return (Struct.Last != 0) ? CppPyString(Struct.Last->SourcePkg()) : 0; } static PyObject *PkgRecordsGetSourceVer(PyObject *Self,void*) { PkgRecordsStruct &Struct = GetStruct(Self,"SourceVer"); return (Struct.Last != 0) ? CppPyString(Struct.Last->SourceVer()) : 0; } static PyObject *PkgRecordsGetMaintainer(PyObject *Self,void*) { PkgRecordsStruct &Struct = GetStruct(Self,"Maintainer"); return (Struct.Last != 0) ? CppPyString(Struct.Last->Maintainer()) : 0; } static PyObject *PkgRecordsGetShortDesc(PyObject *Self,void*) { PkgRecordsStruct &Struct = GetStruct(Self,"ShortDesc"); return (Struct.Last != 0) ? CppPyLocaleString(Struct.Last->ShortDesc()) : 0; } static PyObject *PkgRecordsGetLongDesc(PyObject *Self,void*) { PkgRecordsStruct &Struct = GetStruct(Self,"LongDesc"); return (Struct.Last != 0) ? CppPyLocaleString(Struct.Last->LongDesc()) : 0; } static PyObject *PkgRecordsGetName(PyObject *Self,void*) { PkgRecordsStruct &Struct = GetStruct(Self,"Name"); return (Struct.Last != 0) ? CppPyString(Struct.Last->Name()) : 0; } static PyObject *PkgRecordsGetHomepage(PyObject *Self,void*) { PkgRecordsStruct &Struct = GetStruct(Self,"Homepage"); return (Struct.Last != 0) ? CppPyString(Struct.Last->Homepage()) : 0; } static PyObject *PkgRecordsGetRecord(PyObject *Self,void*) { const char *start, *stop; PkgRecordsStruct &Struct = GetStruct(Self,"Record"); if (Struct.Last == 0) return 0; Struct.Last->GetRec(start, stop); return PyString_FromStringAndSize(start,stop-start); } static PyGetSetDef PkgRecordsGetSet[] = { {"filename",PkgRecordsGetFileName,0, "The filename of the package, as stored in the 'Filename' field."}, {"homepage",PkgRecordsGetHomepage,0, "The homepage of the package, as stored in the 'Homepage' field."}, {"long_desc",PkgRecordsGetLongDesc,0, "The long description of the packages; i.e. all lines in the\n" "'Description' field except for the first one."}, {"hashes",PkgRecordsGetHashes,0, "The hashes of the packages, as a HashStringList"}, {"md5_hash",PkgRecordsGetMD5Hash,0, "The MD5 hash value of the package, as stored in the 'MD5Sum' field."}, {"maintainer",PkgRecordsGetMaintainer,0, "The maintainer of the package, as stored in the 'Maintainer' field."}, {"name",PkgRecordsGetName,0, "The name of the package, as stored in the 'Package' field."}, {"record",PkgRecordsGetRecord,0, "The raw record, suitable for parsing by apt_pkg.TagSection."}, {"sha1_hash",PkgRecordsGetSHA1Hash,0, "The SHA1 hash value, as stored in the 'SHA1' field."}, {"sha256_hash",PkgRecordsGetSHA256Hash,0, "The SHA256 hash value, as stored in the 'SHA256' field."}, {"short_desc",PkgRecordsGetShortDesc,0, "The short description of the package, i.e. the first line of the\n" "'Description' field."}, {"source_pkg",PkgRecordsGetSourcePkg,0, "The name of the source package, if different from the name of the\n" "binary package. This information is retrieved from the 'Source' field."}, {"source_ver",PkgRecordsGetSourceVer,0, "The version of the source package, if it differs from the version\n" "of the binary package. Just like 'source_pkg', this information\n" "is retrieved from the 'Source' field."}, {} }; static int PkgRecordsContains(PyObject *Self,PyObject *Arg) { PkgRecordsStruct &Struct = GetStruct(Self,"__contains__"); if (Struct.Last == nullptr) return -1; const char *Name = PyObject_AsString(Arg); if (Name == nullptr) return -1; return !Struct.Last->RecordField(Name).empty(); } static PyObject *PkgRecordsMap(PyObject *Self,PyObject *Arg) { PkgRecordsStruct &Struct = GetStruct(Self,"__contains__"); if (Struct.Last == nullptr) return nullptr; const char *Name = PyObject_AsString(Arg); if (Name == nullptr) return nullptr; return CppPyString(Struct.Last->RecordField(Name)); } PySequenceMethods PkgRecordsSeqMeth = {0,0,0,0,0,0,0,PkgRecordsContains,0,0}; PyMappingMethods PkgRecordsMapMeth = {0,PkgRecordsMap,0}; static PyObject *PkgRecordsNew(PyTypeObject *type,PyObject *Args,PyObject *kwds) { PyObject *Owner; char *kwlist[] = {"cache",0}; if (PyArg_ParseTupleAndKeywords(Args,kwds,"O!",kwlist,&PyCache_Type, &Owner) == 0) return 0; return HandleErrors(CppPyObject_NEW(Owner,type, GetCpp(Owner))); } static const char *packagerecords_doc = "PackageRecords(cache: apt_pkg.Cache)\n\n" "Package Records contain information about packages. Those objects\n" "can be used to retrieve information such as maintainer or filename\n" "of a package. They can also be used to retrieve the raw records\n" "of the packages (i.e. those stanzas stored in Packages files)."; PyTypeObject PyPackageRecords_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) "apt_pkg.PackageRecords", // tp_name sizeof(CppPyObject), // tp_basicsize 0, // tp_itemsize // Methods CppDealloc, // tp_dealloc 0, // tp_print 0, // tp_getattr 0, // tp_setattr 0, // tp_compare 0, // tp_repr 0, // tp_as_number &PkgRecordsSeqMeth, // tp_as_sequence &PkgRecordsMapMeth, // tp_as_mapping 0, // tp_hash 0, // tp_call 0, // tp_str _PyAptObject_getattro, // tp_getattro 0, // tp_setattro 0, // tp_as_buffer (Py_TPFLAGS_DEFAULT | // tp_flags Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC), packagerecords_doc, // tp_doc CppTraverse, // tp_traverse CppClear, // tp_clear 0, // tp_richcompare 0, // tp_weaklistoffset 0, // tp_iter 0, // tp_iternext PkgRecordsMethods, // tp_methods 0, // tp_members PkgRecordsGetSet, // tp_getset 0, // tp_base 0, // tp_dict 0, // tp_descr_get 0, // tp_descr_set 0, // tp_dictoffset 0, // tp_init 0, // tp_alloc PkgRecordsNew, // tp_new }; /*}}}*/