|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include "generic.h" |
|
#include "apt_pkgmodule.h" |
|
#include "pkgrecords.h" |
|
|
|
|
|
#include <Python.h> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static PyObject *PkgRecordsLookup(PyObject *Self,PyObject *Args) |
|
{ |
|
PkgRecordsStruct &Struct = GetCpp<PkgRecordsStruct>(Self); |
|
|
|
PyObject *PkgFObj; |
|
long int Index; |
|
if (PyArg_ParseTuple(Args,"(O!l)",&PyPackageFile_Type,&PkgFObj,&Index) == 0) |
|
return 0; |
|
|
|
|
|
pkgCache::PkgFileIterator &PkgF = GetCpp<pkgCache::PkgFileIterator>(PkgFObj); |
|
pkgCache *Cache = PkgF.Cache(); |
|
if (Cache->DataEnd() <= Cache->VerFileP + Index + 1 || |
|
Cache->VerFileP[Index].File != PkgF.MapPointer()) |
|
{ |
|
PyErr_SetNone(PyExc_IndexError); |
|
return 0; |
|
} |
|
|
|
|
|
Struct.Last = &Struct.Records.Lookup(pkgCache::VerFileIterator(*Cache,Cache->VerFileP+Index)); |
|
|
|
|
|
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"}, |
|
{} |
|
}; |
|
|
|
|
|
|
|
|
|
|
|
static inline PkgRecordsStruct &GetStruct(PyObject *Self,char *name) { |
|
PkgRecordsStruct &Struct = GetCpp<PkgRecordsStruct>(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<HashStringList> (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<PkgRecordsStruct>(Owner,type, |
|
GetCpp<pkgCache *>(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", |
|
sizeof(CppPyObject<PkgRecordsStruct>), |
|
0, |
|
|
|
CppDealloc<PkgRecordsStruct>, |
|
0, |
|
0, |
|
0, |
|
0, |
|
0, |
|
0, |
|
&PkgRecordsSeqMeth, |
|
&PkgRecordsMapMeth, |
|
0, |
|
0, |
|
0, |
|
_PyAptObject_getattro, |
|
0, |
|
0, |
|
(Py_TPFLAGS_DEFAULT | |
|
Py_TPFLAGS_BASETYPE | |
|
Py_TPFLAGS_HAVE_GC), |
|
packagerecords_doc, |
|
CppTraverse<PkgRecordsStruct>, |
|
CppClear<PkgRecordsStruct>, |
|
0, |
|
0, |
|
0, |
|
0, |
|
PkgRecordsMethods, |
|
0, |
|
PkgRecordsGetSet, |
|
0, |
|
0, |
|
0, |
|
0, |
|
0, |
|
0, |
|
0, |
|
PkgRecordsNew, |
|
}; |
|
|
|
|
|
|
|
|
|
|