From 577637b0f984df05d5ce300bffd1776b1cefe990 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Tue, 26 Mar 2002 11:07:45 +0000 Subject: Samba structure <-> Python dictionary helper functions. (This used to be commit 6c8a2ad16774f67f82d95056817ace5c80928893) --- source3/python/py_conv.c | 126 +++++++++++++++++++++++++++++++++++++++++++++++ source3/python/py_conv.h | 35 +++++++++++++ 2 files changed, 161 insertions(+) create mode 100644 source3/python/py_conv.c create mode 100644 source3/python/py_conv.h diff --git a/source3/python/py_conv.c b/source3/python/py_conv.c new file mode 100644 index 0000000000..88068898a4 --- /dev/null +++ b/source3/python/py_conv.c @@ -0,0 +1,126 @@ +/* + Python wrappers for DCERPC/SMB client routines. + + Copyright (C) Tim Potter, 2002 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "includes.h" +#include "Python.h" +#include "py_conv.h" + +/* Helper for rpcstr_pull() function */ + +static void fstr_pull(fstring str, UNISTR *uni) +{ + rpcstr_pull(str, uni->buffer, sizeof(fstring), 0, STR_TERMINATE); +} + +/* Convert a structure to a Python dict */ + +PyObject *from_struct(void *s, struct pyconv *conv) +{ + PyObject *obj, *item; + int i; + + obj = PyDict_New(); + + for (i = 0; conv[i].name; i++) { + switch (conv[i].type) { + case PY_UNISTR: { + UNISTR *u = (UNISTR *)((char *)s + conv[i].offset); + fstring s = ""; + + if (u->buffer) + fstr_pull(s, u); + + item = PyString_FromString(s); + PyDict_SetItemString(obj, conv[i].name, item); + + break; + } + case PY_UINT32: { + uint32 *u = (uint32 *)((char *)s + conv[i].offset); + + item = PyInt_FromLong(*u); + PyDict_SetItemString(obj, conv[i].name, item); + + break; + } + case PY_UINT16: { + uint16 *u = (uint16 *)((char *)s + conv[i].offset); + + item = PyInt_FromLong(*u); + PyDict_SetItemString(obj, conv[i].name, item); + + break; + } + default: + break; + } + } + + return obj; +} + +/* Convert a Python dict to a structure */ + +void to_struct(void *s, PyObject *dict, struct pyconv *conv) +{ + int i; + + for (i = 0; conv[i].name; i++) { + PyObject *obj; + + obj = PyDict_GetItemString(dict, conv[i].name); + + switch (conv[i].type) { + case PY_UNISTR: { + UNISTR *u = (UNISTR *)((char *)s + conv[i].offset); + char *s = ""; + + if (obj && PyString_Check(obj)) + s = PyString_AsString(obj); + + init_unistr(u, s); + + break; + } + case PY_UINT32: { + uint32 *u = (uint32 *)((char *)s + conv[i].offset); + + if (obj && PyInt_Check(obj)) + *u = PyInt_AsLong(obj); + else + *u = 0; + + break; + } + case PY_UINT16: { + uint16 *u = (uint16 *)((char *)s + conv[i].offset); + + if (obj && PyInt_Check(obj)) + *u = PyInt_AsLong(obj); + else + *u = 0; + + break; + } + default: + break; + } + } +} diff --git a/source3/python/py_conv.h b/source3/python/py_conv.h new file mode 100644 index 0000000000..5443dde76e --- /dev/null +++ b/source3/python/py_conv.h @@ -0,0 +1,35 @@ +/* + Python wrappers for DCERPC/SMB client routines. + + Copyright (C) Tim Potter, 2002 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef _PY_SPOOLSS_CONV_H +#define _PY_SPOOLSS_CONV_H + +enum pyconv_types { PY_UNISTR, PY_UINT32, PY_UINT16 }; + +struct pyconv { + char *name; /* Name of member */ + enum pyconv_types type; /* Type */ + size_t offset; /* Offset into structure */ +}; + +PyObject *from_struct(void *s, struct pyconv *conv); +void to_struct(void *s, PyObject *dict, struct pyconv *conv); + +#endif _PY_SPOOLSS_CONV_H -- cgit