/* # $Id$ # Copyright (C) 2004,2008 Igor Belyi # Copyright (C) 2002 John Goerzen # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ %module pygpgme %include "cpointer.i" %include "cstring.i" // Generate doc strings for all methods. %feature("autodoc", "0"); /* Allow use of Unicode objects, bytes, and None for strings. */ %typemap(in) const char * { if ($input == Py_None) $1 = NULL; else if (PyUnicode_Check($input)) $1 = PyUnicode_AsUTF8($input); else if (PyBytes_Check($input)) $1 = PyBytes_AsString($input); else { PyErr_Format(PyExc_TypeError, "arg %d: expected str, bytes, or None, got %s", $argnum, $input->ob_type->tp_name); return NULL; } } %typemap(freearg) const char * ""; /* Likewise for a list of strings. */ %typemap(in) const char *[] { /* Check if is a list */ if (PyList_Check($input)) { size_t i, size = PyList_Size($input); $1 = (char **) malloc((size+1) * sizeof(char *)); for (i = 0; i < size; i++) { PyObject *o = PyList_GetItem($input,i); if (PyUnicode_Check(o)) $1[i] = PyUnicode_AsUTF8(o); else if (PyString_Check(o)) $1[i] = PyString_AsString(o); else { PyErr_Format(PyExc_TypeError, "arg %d: list must contain only str or bytes, got %s " "at position %d", $argnum, o->ob_type->tp_name, i); free($1); return NULL; } } $1[i] = NULL; } else { PyErr_Format(PyExc_TypeError, "arg %d: expected a list of str or bytes, got %s", $argnum, $input->ob_type->tp_name); return NULL; } } %typemap(freearg) const char *[] { free((char *) $1); } // Release returned buffers as necessary. %typemap(newfree) char * "free($1);"; %newobject gpgme_data_release_and_get_mem; %{ /* Convert object to a pointer to gpgme type */ PyObject* object_to_gpgme_t(PyObject* input, const char* objtype, int argnum) { PyObject *pyname = NULL, *pypointer = NULL; pyname = PyObject_CallMethod(input, "_getctype", NULL); if (pyname && PyUnicode_Check(pyname)) { if (strcmp(PyUnicode_AsUTF8(pyname), objtype) != 0) { PyErr_Format(PyExc_TypeError, "arg %d: Expected value of type %s, but got %s", argnum, objtype, PyUnicode_AsUTF8(pyname)); Py_DECREF(pyname); return NULL; } } else { PyErr_Format(PyExc_TypeError, "Protocol violation: Expected an instance of type str " "from _getctype, but got %s", pyname == NULL ? "NULL" : (pyname == Py_None ? "None" : pyname->ob_type->tp_name)); return NULL; } Py_DECREF(pyname); pypointer = PyObject_GetAttrString(input, "wrapped"); if (pypointer == NULL) { PyErr_Format(PyExc_TypeError, "arg %d: Use of uninitialized Python object %s", argnum, objtype); return NULL; } return pypointer; } %} %typemap(arginit) gpgme_key_t [] { $1 = NULL; } %typemap(in) gpgme_key_t [] { int i, numb = 0; if (!PySequence_Check($input)) { PyErr_Format(PyExc_ValueError, "arg %d: Expected a list of gpgme_key_t", $argnum); return NULL; } if((numb = PySequence_Length($input)) != 0) { $1 = (gpgme_key_t*)malloc((numb+1)*sizeof(gpgme_key_t)); for(i=0; iob_type->tp_name); return NULL; } } %typemap(freearg) (const void *buffer, size_t size) ""; // Make types containing 'next' field to be lists %ignore next; %typemap(out) gpgme_sig_notation_t, gpgme_engine_info_t, gpgme_subkey_t, gpgme_key_sig_t, gpgme_user_id_t, gpgme_invalid_key_t, gpgme_recipient_t, gpgme_new_signature_t, gpgme_signature_t, gpgme_import_status_t, gpgme_conf_arg_t, gpgme_conf_opt_t, gpgme_conf_comp_t { int i; int size = 0; $1_ltype curr; for (curr = $1; curr != NULL; curr = curr->next) { size++; } $result = PyList_New(size); for (i=0,curr=$1; inext) { PyObject *o = SWIG_NewPointerObj(SWIG_as_voidptr(curr), $1_descriptor, %newpointer_flags); PyList_SetItem($result, i, o); } } // Include mapper for edit callbacks %typemap(in) (gpgme_edit_cb_t fnc, void *fnc_value) { $1 = (gpgme_edit_cb_t) pyEditCb; if ($input == Py_None) $2 = NULL; else $2 = $input; } // Include the header file both for cc (first) and for swig (second) // Include for swig locally since we need to fix 'class' usage there. %{ #include %} %include "gpgme.h" %constant long EOF = GPG_ERR_EOF; // Generating and handling pointers-to-pointers. %pointer_functions(gpgme_ctx_t, gpgme_ctx_t_p); %pointer_functions(gpgme_data_t, gpgme_data_t_p); %pointer_functions(gpgme_key_t, gpgme_key_t_p); %pointer_functions(gpgme_error_t, gpgme_error_t_p); %pointer_functions(gpgme_trust_item_t, gpgme_trust_item_t_p); %pointer_functions(gpgme_engine_info_t, gpgme_engine_info_t_p); %pointer_functions(PyObject *, PyObject_p_p); %pointer_functions(void *, void_p_p); // Helper functions. %{ #include %} FILE *fdopen(int fildes, const char *mode); %{ #include "helpers.h" %} %include "helpers.h" %{ gpgme_error_t pyEditCb(void *opaque, gpgme_status_code_t status, const char *args, int fd) { PyObject *func = NULL, *dataarg = NULL, *pyargs = NULL, *retval = NULL; PyObject *pyopaque = (PyObject *) opaque; gpgme_error_t err_status = 0; pygpgme_exception_init(); if (PyTuple_Check(pyopaque)) { func = PyTuple_GetItem(pyopaque, 0); dataarg = PyTuple_GetItem(pyopaque, 1); pyargs = PyTuple_New(3); } else { func = pyopaque; pyargs = PyTuple_New(2); } PyTuple_SetItem(pyargs, 0, PyLong_FromLong((long) status)); PyTuple_SetItem(pyargs, 1, PyUnicode_FromString(args)); if (dataarg) { Py_INCREF(dataarg); /* Because GetItem doesn't give a ref but SetItem taketh away */ PyTuple_SetItem(pyargs, 2, dataarg); } retval = PyObject_CallObject(func, pyargs); Py_DECREF(pyargs); if (PyErr_Occurred()) { err_status = pygpgme_exception2code(); } else { if (fd>=0 && retval && PyUnicode_Check(retval)) { const char *buffer; Py_ssize_t size; buffer = PyUnicode_AsUTF8AndSize(retval, &size); write(fd, buffer, size); write(fd, "\n", 1); } } Py_XDECREF(retval); return err_status; } %}