diff options
| author | Justus Winter <[email protected]> | 2016-05-24 13:14:53 +0000 | 
|---|---|---|
| committer | Justus Winter <[email protected]> | 2016-05-24 16:00:16 +0000 | 
| commit | 8b57f06e0c04f5c9b87a3c76618230d757412076 (patch) | |
| tree | e7a0779263eb230b5e82cf2dd6abf2b9188655b3 /lang/python/helpers.c | |
| parent | python: Improve docstring. (diff) | |
| download | gpgme-8b57f06e0c04f5c9b87a3c76618230d757412076.tar.gz gpgme-8b57f06e0c04f5c9b87a3c76618230d757412076.zip | |
python: Support status callbacks.
* lang/python/helpers.c (pyStatusCb): New function.
(pygpgme_set_status_cb): Likewise.
* lang/python/helpers.h (pygpgme_set_status_cb): New prototype.
* lang/python/pyme/core.py (Context.__init__): Initialize
'last_statuscb'.
(Context._free_statuscb): New function.
(Context.set_status_cb): Likewise.
* lang/python/tests/t-callbacks.py: Test status callbacks.
Signed-off-by: Justus Winter <[email protected]>
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 d0c1f3b6..ec7264aa 100644 --- a/lang/python/helpers.c +++ b/lang/python/helpers.c @@ -272,7 +272,72 @@ void pygpgme_set_progress_cb(gpgme_ctx_t ctx, PyObject *cb, PyObject **freelater    *freelater = cb;    gpgme_set_progress_cb(ctx, (gpgme_progress_cb_t) pyProgressCb, (void *) cb);  } + +/* Status callbacks.  */ +static gpgme_error_t pyStatusCb(void *hook, const char *keyword, +                                const char *args) { +  gpgme_error_t err = 0; +  PyObject *pyhook = (PyObject *) hook; +  PyObject *self = NULL; +  PyObject *func = NULL; +  PyObject *dataarg = NULL; +  PyObject *pyargs = NULL; +  PyObject *retval = NULL; + +  assert (PyTuple_Check(pyhook)); +  assert (PyTuple_Size(pyhook) == 2 || PyTuple_Size(pyhook) == 3); +  self = PyTuple_GetItem(pyhook, 0); +  func = PyTuple_GetItem(pyhook, 1); +  if (PyTuple_Size(pyhook) == 3) { +    dataarg = PyTuple_GetItem(pyhook, 2); +    pyargs = PyTuple_New(3); +  } else { +    pyargs = PyTuple_New(2); +  } + +  if (keyword) +    PyTuple_SetItem(pyargs, 0, PyUnicode_DecodeUTF8(keyword, strlen (keyword), +                                                    "strict")); +  else +    { +      Py_INCREF(Py_None); +      PyTuple_SetItem(pyargs, 0, Py_None); +    } +  PyTuple_SetItem(pyargs, 1, PyUnicode_DecodeUTF8(args, strlen (args), +                                                "strict")); +  if (PyErr_Occurred()) { +    err = gpg_error(GPG_ERR_GENERAL); +    Py_DECREF(pyargs); +    goto leave; +  } + +  if (dataarg) { +    Py_INCREF(dataarg); +    PyTuple_SetItem(pyargs, 2, dataarg); +  } + +  retval = PyObject_CallObject(func, pyargs); +  if (PyErr_Occurred()) +    err = pygpgme_exception2code(); +  Py_DECREF(pyargs); +  Py_XDECREF(retval); + + leave: +  if (err) +    pygpgme_stash_callback_exception(self); +  return err; +} +void pygpgme_set_status_cb(gpgme_ctx_t ctx, PyObject *cb, +                           PyObject **freelater) { +  if (cb == Py_None) { +    gpgme_set_status_cb(ctx, NULL, NULL); +    return; +  } +  Py_INCREF(cb); +  *freelater = cb; +  gpgme_set_status_cb(ctx, (gpgme_status_cb_t) pyStatusCb, (void *) cb); +}  /* Edit callbacks.  */  gpgme_error_t pyEditCb(void *opaque, gpgme_status_code_t status, | 
