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