From: Stefan Metzmacher Date: Fri, 10 Mar 2017 16:41:46 +0000 (+0100) Subject: TODO pyrpc_string_array_{from,to}_PyList() X-Git-Url: http://git.samba.org/?p=metze%2Fsamba%2Fwip.git;a=commitdiff_plain;h=b32a178d1cb7af231f897d0a167f65b0e053edc8 TODO pyrpc_string_array_{from,to}_PyList() --- diff --git a/pidl/lib/Parse/Pidl/Samba4/Python.pm b/pidl/lib/Parse/Pidl/Samba4/Python.pm index efa80d7cdd14..6741320fdddf 100644 --- a/pidl/lib/Parse/Pidl/Samba4/Python.pm +++ b/pidl/lib/Parse/Pidl/Samba4/Python.pm @@ -1865,7 +1865,7 @@ sub ConvertObjectFromPythonData($$$$$$;$$) } if ($actual_ctype->{TYPE} eq "SCALAR" and $actual_ctype->{NAME} eq "string_array") { - $self->pidl("$target = pytalloc_get_ptr($cvar);"); + $self->pidl("$target = pyrpc_string_array_from_PyList($mem_ctx, $cvar, \"$target\");"); return; } @@ -2074,7 +2074,7 @@ sub ConvertScalarToPython($$$$) # Not yet supported if ($ctypename eq "string_array") { - return "pytalloc_GenericObject_reference_ex($mem_ctx, $cvar)"; + return "pyrpc_string_array_to_PyList($cvar)"; } if ($ctypename eq "ipv4address") { return "PyString_FromStringOrNULL($cvar)"; } if ($ctypename eq "ipv6address") { return "PyString_FromStringOrNULL($cvar)"; } diff --git a/source4/librpc/rpc/pyrpc_util.c b/source4/librpc/rpc/pyrpc_util.c index 8d5ec45817fd..82d601c5fdc2 100644 --- a/source4/librpc/rpc/pyrpc_util.c +++ b/source4/librpc/rpc/pyrpc_util.c @@ -424,6 +424,58 @@ PyObject *PyString_FromStringOrNULL(const char *str) return PyStr_FromString(str); } +const char **pyrpc_string_array_from_PyList(TALLOC_CTX *mem_ctx, PyObject *list, + const char *debug_name) +{ + const char **ret = NULL; + Py_ssize_t i; + + if (!PyList_Check(list)) { + PyErr_Format(PyExc_TypeError, "%s is not a list", debug_name); + return NULL; + } + + ret = talloc_array(NULL, const char *, PyList_Size(list)+1); + if (ret == NULL) { + PyErr_NoMemory(); + return NULL; + } + + for (i = 0; i < PyList_Size(list); i++) { + const char *str = NULL; + Py_ssize_t size; + PyObject *item = PyList_GetItem(list, i); + if (!PyStr_Check(item)) { + PyErr_Format(PyExc_TypeError, "%s should be strings", + debug_name); + talloc_free(ret); + return NULL; + } + str = PyStr_AsUTF8AndSize(item, &size); + if (str == NULL) { + talloc_free(ret); + return NULL; + } + ret[i] = talloc_strndup(ret, str, size); + if (ret[i] == NULL) { + talloc_free(ret); + PyErr_NoMemory(); + return NULL; + } + } + + ret[i] = NULL; + return ret; +} + +PyObject *pyrpc_string_array_to_PyList(const char **string_array) +{ + /* + * TODO + */ + Py_RETURN_NONE; +} + PyObject *pyrpc_import_union(PyTypeObject *type, TALLOC_CTX *mem_ctx, int level, const void *in, const char *typename) { diff --git a/source4/librpc/rpc/pyrpc_util.h b/source4/librpc/rpc/pyrpc_util.h index 5a5f14de285d..6464b5195684 100644 --- a/source4/librpc/rpc/pyrpc_util.h +++ b/source4/librpc/rpc/pyrpc_util.h @@ -59,6 +59,10 @@ PyObject *py_return_ndr_struct(const char *module_name, const char *type_name, PyObject *PyString_FromStringOrNULL(const char *str); +const char **pyrpc_string_array_from_PyList(TALLOC_CTX *mem_ctx, PyObject *list, + const char *debug_name); +PyObject *pyrpc_string_array_to_PyList(const char **string_array); + PyObject *pyrpc_import_union(PyTypeObject *type, TALLOC_CTX *mem_ctx, int level, const void *in, const char *typename); void *pyrpc_export_union(PyTypeObject *type, TALLOC_CTX *mem_ctx, int level,