1 #include "filewrapper.h"
2 #include "py2py3.h"
3
4 #define FW_self ((FileWrapper*)self)
5
FileWrapper_GetFd(PyObject * self)6 int FileWrapper_GetFd(PyObject *self)
7 {
8 return FW_self->fd;
9 }
10
FileWrapper_Done(PyObject * self)11 void FileWrapper_Done(PyObject *self)
12 {
13 if (FW_self->fd != -1) {
14 PyFile_DecUseCount((PyFileObject*)FW_self->file);
15 }
16 }
17
18 static PyObject*
FileWrapper_New(PyTypeObject * cls,PyObject * args,PyObject * kwargs)19 FileWrapper_New(PyTypeObject* cls, PyObject* args, PyObject* kwargs)
20 {
21 PyObject* file;
22 PyObject* blocksize = NULL;
23
24 if(!PyArg_ParseTuple(args, "O|O:FileWrapper", &file, &blocksize))
25 return NULL;
26
27 Py_INCREF(file);
28 Py_XINCREF(blocksize);
29
30 int fd = PyObject_AsFileDescriptor(file);
31 if (fd == -1) {
32 PyErr_Clear();
33 } else {
34 PyFile_IncUseCount((PyFileObject*)file);
35 }
36
37 FileWrapper* wrapper = PyObject_NEW(FileWrapper, cls);
38 wrapper->file = file;
39 wrapper->blocksize = blocksize;
40 wrapper->fd = fd;
41
42 return (PyObject*)wrapper;
43 }
44
45 static PyObject*
FileWrapper_Iter(PyObject * self)46 FileWrapper_Iter(PyObject* self)
47 {
48 Py_INCREF(self);
49 return self;
50 }
51
52 static PyObject*
FileWrapper_IterNext(PyObject * self)53 FileWrapper_IterNext(PyObject* self)
54 {
55 PyObject* data = PyObject_CallMethodObjArgs(FW_self->file, _read, FW_self->blocksize, NULL);
56 if (data != NULL && PyObject_IsTrue(data)) {
57 return data;
58 } else {
59 return NULL;
60 }
61 }
62
FileWrapper_dealloc(PyObject * self)63 void FileWrapper_dealloc(PyObject* self)
64 {
65 Py_DECREF(FW_self->file);
66 Py_XDECREF(FW_self->blocksize);
67 PyObject_FREE(self);
68 }
69
70 PyTypeObject FileWrapper_Type = {
71 PyVarObject_HEAD_INIT(NULL, 0)
72 "FileWrapper", /* tp_name (__name__) */
73 sizeof(FileWrapper), /* tp_basicsize */
74 0, /* tp_itemsize */
75 (destructor)FileWrapper_dealloc, /* tp_dealloc */
76 };
77
_init_filewrapper(void)78 void _init_filewrapper(void)
79 {
80 FileWrapper_Type.tp_new = FileWrapper_New;
81 FileWrapper_Type.tp_iter = FileWrapper_Iter;
82 FileWrapper_Type.tp_iternext = FileWrapper_IterNext;
83 FileWrapper_Type.tp_flags |= Py_TPFLAGS_DEFAULT;
84 }
85