|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include <Python.h> |
|
#include "generic.h" |
|
#include "apt_pkgmodule.h" |
|
#include <apt-pkg/hashes.h> |
|
|
|
static PyObject *hashes_new(PyTypeObject *type,PyObject *args, |
|
PyObject *kwds) |
|
{ |
|
return CppPyObject_NEW<Hashes>(NULL, type); |
|
} |
|
|
|
static int hashes_init(PyObject *self, PyObject *args, PyObject *kwds) |
|
{ |
|
PyObject *object = 0; |
|
int Fd; |
|
char *kwlist[] = {"object", NULL}; |
|
|
|
if (PyArg_ParseTupleAndKeywords(args, kwds, "|O:__init__", kwlist, |
|
&object) == 0) |
|
return -1; |
|
if (object == 0) |
|
return 0; |
|
Hashes &hashes = GetCpp<Hashes>(self); |
|
|
|
if (PyBytes_Check(object) != 0) { |
|
char *s; |
|
Py_ssize_t len; |
|
PyBytes_AsStringAndSize(object, &s, &len); |
|
Py_BEGIN_ALLOW_THREADS |
|
hashes.Add((const unsigned char*)s, len); |
|
Py_END_ALLOW_THREADS |
|
} |
|
else if ((Fd = PyObject_AsFileDescriptor(object)) != -1) { |
|
struct stat St; |
|
bool err = false; |
|
Py_BEGIN_ALLOW_THREADS |
|
err = fstat(Fd, &St) != 0 || hashes.AddFD(Fd, St.st_size) == false; |
|
Py_END_ALLOW_THREADS |
|
if (err) { |
|
PyErr_SetFromErrno(PyAptError); |
|
return -1; |
|
} |
|
} |
|
else { |
|
PyErr_SetString(PyExc_TypeError, |
|
"__init__() only understand bytes and files"); |
|
return -1; |
|
} |
|
return 0; |
|
} |
|
|
|
static PyObject *hashes_get_hashes(PyObject *self, void*) |
|
{ |
|
auto py = CppPyObject_NEW<HashStringList>(nullptr, &PyHashStringList_Type); |
|
|
|
py->Object = GetCpp<Hashes>(self).GetHashStringList(); |
|
return py; |
|
} |
|
|
|
|
|
static PyGetSetDef hashes_getset[] = { |
|
{"hashes",hashes_get_hashes,0, |
|
"A :class:`HashStringList` of all hashes.\n\n" |
|
".. versionadded:: 1.1"}, |
|
{} |
|
}; |
|
|
|
static char *hashes_doc = |
|
"Hashes([object: (bytes, file)])\n\n" |
|
"Calculate hashes for the given object. It can be used to create all\n" |
|
"supported hashes for a file.\n\n" |
|
"The parameter *object* can be a bytestring, an object providing the\n" |
|
"fileno() method, or an integer describing a file descriptor."; |
|
|
|
PyTypeObject PyHashes_Type = { |
|
PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
"apt_pkg.Hashes", |
|
sizeof(CppPyObject<Hashes>), |
|
0, |
|
|
|
CppDealloc<Hashes>, |
|
0, |
|
0, |
|
0, |
|
0, |
|
0, |
|
0, |
|
0, |
|
0, |
|
0, |
|
0, |
|
0, |
|
0, |
|
0, |
|
0, |
|
Py_TPFLAGS_DEFAULT | |
|
Py_TPFLAGS_BASETYPE, |
|
hashes_doc, |
|
0, |
|
0, |
|
0, |
|
0, |
|
0, |
|
0, |
|
0, |
|
0, |
|
hashes_getset, |
|
0, |
|
0, |
|
0, |
|
0, |
|
0, |
|
hashes_init, |
|
0, |
|
hashes_new, |
|
}; |
|
|