diff options
Diffstat (limited to 'lang/python/helpers.c')
| -rw-r--r-- | lang/python/helpers.c | 65 | 
1 files changed, 65 insertions, 0 deletions
| diff --git a/lang/python/helpers.c b/lang/python/helpers.c index 3ecbacc7..7e1c1c34 100644 --- a/lang/python/helpers.c +++ b/lang/python/helpers.c @@ -180,6 +180,71 @@ object_to_gpgme_t(PyObject *input, const char *objtype, int argnum)    return pypointer;  } +/* Convert object to a pointer to gpgme type, version for data +   objects.  Constructs a wrapper Python on the fly e.g. for file-like +   objects with a fileno method, returning it in WRAPPER.  This object +   must be de-referenced when no longer needed.  */ +PyObject * +object_to_gpgme_data_t(PyObject *input, int argnum, PyObject **wrapper) +{ +  static PyObject *Data = NULL; +  PyObject *data = input; +  PyObject *fd; +  PyObject *result; +  *wrapper = NULL; + +  if (Data == NULL) { +    PyObject *core; +    PyObject *from_list = PyList_New(0); +    core = PyImport_ImportModuleLevel("core", PyEval_GetGlobals(), +                                      PyEval_GetLocals(), from_list, 1); +    Py_XDECREF(from_list); +    if (core) { +      Data = PyDict_GetItemString(PyModule_GetDict(core), "Data"); +      Py_XINCREF(Data); +    } +    else +      return NULL; +  } + +  fd = PyObject_CallMethod(input, "fileno", NULL); +  if (fd) { +    /* File-like object with file number.  */ +    PyObject *args = NULL; +    PyObject *kw = NULL; + +    /* We don't need the fd, as we have no constructor accepting file +       descriptors directly.  */ +    Py_DECREF(fd); + +    args = PyTuple_New(0); +    kw = PyDict_New(); +    if (args == NULL || kw == NULL) +      { +      fail: +        Py_XDECREF(args); +        Py_XDECREF(kw); +        return NULL; +      } + +    if (PyDict_SetItemString(kw, "file", input) < 0) +      goto fail; + +    *wrapper = PyObject_Call(Data, args, kw); +    if (*wrapper == NULL) +      goto fail; + +    Py_DECREF(args); +    Py_DECREF(kw); +    data = *wrapper; +  } +  else +    PyErr_Clear(); + +  result = object_to_gpgme_t(data, "gpgme_data_t", argnum); +  return result; +} +  /* Callback support.  */ | 
