1 /*#############################################################################
3 # Pakfire - The IPFire package management system #
4 # Copyright (C) 2022 Pakfire development team #
6 # This program is free software: you can redistribute it and/or modify #
7 # it under the terms of the GNU General Public License as published by #
8 # the Free Software Foundation, either version 3 of the License, or #
9 # (at your option) any later version. #
11 # This program is distributed in the hope that it will be useful, #
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of #
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
14 # GNU General Public License for more details. #
16 # You should have received a copy of the GNU General Public License #
17 # along with this program. If not, see <http://www.gnu.org/licenses/>. #
19 #############################################################################*/
24 #include <pakfire/digest.h>
25 #include <pakfire/file.h>
31 PyObject
* new_file(struct pakfire_file
* file
) {
32 PyTypeObject
* type
= &FileType
;
34 FileObject
* self
= (FileObject
*)type
->tp_alloc(type
, 0);
37 self
->file
= pakfire_file_ref(file
);
42 return (PyObject
*)self
;
45 static PyObject
* File_new(PyTypeObject
* type
, PyObject
* args
, PyObject
* kwds
) {
46 return new_file(NULL
);
49 static void File_dealloc(FileObject
* self
) {
51 pakfire_file_unref(self
->file
);
53 Py_TYPE(self
)->tp_free((PyObject
*)self
);
56 static int File_init(FileObject
* self
, PyObject
* args
, PyObject
* kwds
) {
57 PakfireObject
* pakfire
= NULL
;
59 if (!PyArg_ParseTuple(args
, "O!", &PakfireType
, &pakfire
))
62 // Create a new File object
63 int r
= pakfire_file_create(&self
->file
, pakfire
->pakfire
);
70 static PyObject
* File_repr(FileObject
* self
) {
71 const char* path
= pakfire_file_get_path(self
->file
);
73 return PyUnicode_FromFormat("<_pakfire.Problem %s>", path
);
76 static PyObject
* File_get_path(FileObject
* self
) {
77 const char* path
= pakfire_file_get_path(self
->file
);
79 return PyUnicode_FromString(path
);
82 static int File_set_path(FileObject
* self
, PyObject
* value
) {
83 const char* path
= PyUnicode_AsUTF8(value
);
87 pakfire_file_set_path(self
->file
, path
);
91 static PyObject
* File_get_size(FileObject
* self
) {
92 const size_t size
= pakfire_file_get_size(self
->file
);
94 return PyLong_FromSize_t(size
);
97 static int File_set_size(FileObject
* self
, PyObject
* value
) {
98 long size
= PyLong_AsLong(value
);
102 pakfire_file_set_size(self
->file
, size
);
106 static PyObject
* File_get_type(FileObject
* self
) {
107 int type
= pakfire_file_get_type(self
->file
);
109 return PyLong_FromLong(type
);
112 static PyObject
* File_get_uname(FileObject
* self
) {
113 const char* uname
= pakfire_file_get_uname(self
->file
);
115 return PyUnicode_FromString(uname
);
118 static int File_set_uname(FileObject
* self
, PyObject
* value
) {
119 const char* uname
= PyUnicode_AsUTF8(value
);
123 pakfire_file_set_uname(self
->file
, uname
);
127 static PyObject
* File_get_gname(FileObject
* self
) {
128 const char* gname
= pakfire_file_get_gname(self
->file
);
130 return PyUnicode_FromString(gname
);
133 static int File_set_gname(FileObject
* self
, PyObject
* value
) {
134 const char* gname
= PyUnicode_AsUTF8(value
);
138 pakfire_file_set_gname(self
->file
, gname
);
142 static PyObject
* File_get_mode(FileObject
* self
) {
143 const mode_t mode
= pakfire_file_get_mode(self
->file
);
145 return PyLong_FromLong(mode
);
148 static int File_set_mode(FileObject
* self
, PyObject
* value
) {
149 const mode_t mode
= PyLong_AsLong(value
);
151 pakfire_file_set_mode(self
->file
, mode
);
155 static time_t PyDateTime_AsTime_t(PyObject
* value
) {
156 if (!PyDateTime_Check(value
))
161 // Convert from datetime to struct tm
163 .tm_year
= PyDateTime_GET_YEAR(value
) - 1900,
164 .tm_mon
= PyDateTime_GET_MONTH(value
) - 1,
165 .tm_mday
= PyDateTime_GET_DAY(value
),
166 .tm_hour
= PyDateTime_DATE_GET_HOUR(value
),
167 .tm_min
= PyDateTime_DATE_GET_MINUTE(value
),
168 .tm_sec
= PyDateTime_DATE_GET_SECOND(value
),
172 // Convert into time_t
173 const time_t t
= mktime(&tm
);
175 PyErr_SetFromErrno(PyExc_OSError
);
182 static PyObject
* File_get_ctime(FileObject
* self
) {
183 const time_t t
= pakfire_file_get_ctime(self
->file
);
185 return PyDateTime_FromTime_t(&t
);
188 static int File_set_ctime(FileObject
* self
, PyObject
* value
) {
189 const time_t t
= PyDateTime_AsTime_t(value
);
193 pakfire_file_set_ctime(self
->file
, t
);
197 static PyObject
* File_get_mtime(FileObject
* self
) {
198 const time_t t
= pakfire_file_get_mtime(self
->file
);
200 return PyDateTime_FromTime_t(&t
);
203 static int File_set_mtime(FileObject
* self
, PyObject
* value
) {
204 const time_t t
= PyDateTime_AsTime_t(value
);
208 pakfire_file_set_mtime(self
->file
, t
);
212 static PyObject
* File_digest(FileObject
* self
, PyObject
* args
) {
213 const char* name
= NULL
;
215 if (!PyArg_ParseTuple(args
, "s", &name
))
219 const enum pakfire_digest_types type
= pakfire_digest_get_by_name(name
);
221 // Raise ValueError if we could not find the type
223 PyErr_Format(PyExc_ValueError
, "Unknown digest type: %s", name
);
230 const unsigned char* digest
= pakfire_file_get_digest(self
->file
, type
, &length
);
234 return PyBytes_FromStringAndSize((const char*)digest
, length
);
237 static PyObject
* File_get_mimetype(FileObject
* self
) {
238 const char* mimetype
= pakfire_file_get_mimetype(self
->file
);
240 return PyUnicode_FromString(mimetype
);
243 static int File_set_mimetype(FileObject
* self
, PyObject
* value
) {
246 // Read the MIME type
247 const char* mimetype
= PyUnicode_AsUTF8(value
);
252 r
= pakfire_file_set_mimetype(self
->file
, mimetype
);
254 PyErr_SetFromErrno(PyExc_OSError
);
261 static PyObject
* File_get_capabilities(FileObject
* self
) {
262 PyObject
* result
= NULL
;
266 if (!pakfire_file_has_caps(self
->file
))
269 // Fetch capabilities
270 caps
= pakfire_file_get_caps(self
->file
);
272 PyErr_SetFromErrno(PyExc_OSError
);
276 // Convert to Python string object
277 result
= PyUnicode_FromString(caps
);
286 static struct PyMethodDef File_methods
[] = {
289 (PyCFunction
)File_digest
,
296 static struct PyGetSetDef File_getsetters
[] = {
299 (getter
)File_get_capabilities
,
306 (getter
)File_get_ctime
,
307 (setter
)File_set_ctime
,
313 (getter
)File_get_gname
,
314 (setter
)File_set_gname
,
320 (getter
)File_get_mimetype
,
321 (setter
)File_set_mimetype
,
327 (getter
)File_get_mode
,
328 (setter
)File_set_mode
,
334 (getter
)File_get_mtime
,
335 (setter
)File_set_mtime
,
341 (getter
)File_get_path
,
342 (setter
)File_set_path
,
348 (getter
)File_get_size
,
349 (setter
)File_set_size
,
355 (getter
)File_get_type
,
362 (getter
)File_get_uname
,
363 (setter
)File_set_uname
,
370 PyTypeObject FileType
= {
371 PyVarObject_HEAD_INIT(NULL
, 0)
372 tp_name
: "_pakfire.File",
373 tp_basicsize
: sizeof(FileObject
),
374 tp_flags
: Py_TPFLAGS_DEFAULT
|Py_TPFLAGS_BASETYPE
,
376 tp_dealloc
: (destructor
)File_dealloc
,
377 tp_init
: (initproc
)File_init
,
378 tp_doc
: "File object",
379 tp_methods
: File_methods
,
380 tp_getset
: File_getsetters
,
381 tp_repr
: (reprfunc
)File_repr
,
382 tp_str
: (reprfunc
)File_get_path
,