r25598: Add missing become_root/unbecome_root around calls of add_aliases.
[samba.git] / source / python / py_spoolss_drivers_conv.c
index 9bc84080529eff6a72f717af9814592ae0761681..6d5ed4dc11fbbdc59302b0e8fa83c2bbcc8f5566 100644 (file)
@@ -5,7 +5,7 @@
    
    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
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
@@ -14,8 +14,7 @@
    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.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "python/py_spoolss.h"
@@ -78,9 +77,49 @@ struct pyconv py_DRIVER_DIRECTORY_1[] = {
        { NULL }
 };
 
-static uint16 *to_dependentfiles(PyObject *dict)
+static uint16 *to_dependentfiles(PyObject *list, TALLOC_CTX *mem_ctx)
 {
-       return (uint16 *)"abcd\0";
+       uint32 elements, size=0, pos=0, i;
+       char *str;
+       uint16 *ret = NULL;
+       PyObject *borrowedRef;
+
+       if (!PyList_Check(list)) {
+               goto done;
+       }
+
+       /* calculate size for dependentfiles */
+       elements=PyList_Size(list);
+       for (i = 0; i < elements; i++) {
+               borrowedRef=PyList_GetItem(list, i);
+               if (!PyString_Check(borrowedRef)) 
+                       /* non string found, return error */
+                       goto done;
+               size+=PyString_Size(borrowedRef)+1;
+       }
+
+       if (!(ret = (uint16*)_talloc(mem_ctx,((size+1)*sizeof(uint16)))))
+               goto done;
+
+       /* create null terminated sequence of null terminated strings */
+       for (i = 0; i < elements; i++) {
+               borrowedRef=PyList_GetItem(list, i);
+               str=PyString_AsString(borrowedRef);
+               do {
+                       if (pos >= size) {
+                               /* dependentfiles too small.  miscalculated? */
+                               ret = NULL;
+                               goto done;
+                       }
+                       SSVAL(&ret[pos], 0, str[0]);
+                       pos++;
+               } while (*(str++));
+       }
+       /* final null */
+       ret[pos]='\0';
+
+done:
+       return ret;     
 }
 
 BOOL py_from_DRIVER_INFO_1(PyObject **dict, DRIVER_INFO_1 *info)
@@ -122,16 +161,17 @@ BOOL py_from_DRIVER_INFO_3(PyObject **dict, DRIVER_INFO_3 *info)
        return True;
 }
 
-BOOL py_to_DRIVER_INFO_3(DRIVER_INFO_3 *info, PyObject *dict)
+BOOL py_to_DRIVER_INFO_3(DRIVER_INFO_3 *info, PyObject *dict,
+                        TALLOC_CTX *mem_ctx)
 {
        PyObject *obj, *dict_copy = PyDict_Copy(dict);
        BOOL result = False;
 
-       if (!(obj = PyDict_GetItemString(dict_copy, "dependent_files")) ||
-           !PyList_Check(obj))
+       if (!(obj = PyDict_GetItemString(dict_copy, "dependent_files")))
                goto done;
 
-       info->dependentfiles = to_dependentfiles(obj);
+       if (!(info->dependentfiles = to_dependentfiles(obj, mem_ctx)))
+               goto done;
 
        PyDict_DelItemString(dict_copy, "dependent_files");