source: trunk-3.0/source/python/py_conv.c@ 102

Last change on this file since 102 was 1, checked in by Paul Smedley, 18 years ago

Initial code import

File size: 4.5 KB
Line 
1/*
2 Python wrappers for DCERPC/SMB client routines.
3
4 Copyright (C) Tim Potter, 2002
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#include "py_conv.h"
22
23/* Helper for rpcstr_pull() function */
24
25static void fstr_pull(fstring str, UNISTR *uni)
26{
27 rpcstr_pull(str, uni->buffer, sizeof(fstring), -1, STR_TERMINATE);
28}
29
30static void fstr_pull2(fstring str, UNISTR2 *uni)
31{
32 rpcstr_pull(str, uni->buffer, sizeof(fstring), -1, STR_TERMINATE);
33}
34
35/* Convert a structure to a Python dict */
36
37PyObject *from_struct(void *s, struct pyconv *conv)
38{
39 PyObject *obj, *item;
40 int i;
41
42 obj = PyDict_New();
43
44 for (i = 0; conv[i].name; i++) {
45 switch (conv[i].type) {
46 case PY_UNISTR: {
47 UNISTR *u = (UNISTR *)((char *)s + conv[i].offset);
48 fstring str = "";
49
50 if (u->buffer)
51 fstr_pull(str, u);
52
53 item = PyString_FromString(str);
54 PyDict_SetItemString(obj, conv[i].name, item);
55
56 break;
57 }
58 case PY_UNISTR2: {
59 UNISTR2 *u = (UNISTR2 *)((char *)s + conv[i].offset);
60 fstring str = "";
61
62 if (u->buffer)
63 fstr_pull2(str, u);
64
65 item = PyString_FromString(str);
66 PyDict_SetItemString(obj, conv[i].name, item);
67
68 break;
69 }
70 case PY_UINT32: {
71 uint32 *u = (uint32 *)((char *)s + conv[i].offset);
72
73 item = PyInt_FromLong(*u);
74 PyDict_SetItemString(obj, conv[i].name, item);
75
76 break;
77 }
78 case PY_UINT16: {
79 uint16 *u = (uint16 *)((char *)s + conv[i].offset);
80
81 item = PyInt_FromLong(*u);
82 PyDict_SetItemString(obj, conv[i].name, item);
83
84 break;
85 }
86 case PY_STRING: {
87 char *str = (char *)s + conv[i].offset;
88
89 item = PyString_FromString(str);
90 PyDict_SetItemString(obj, conv[i].name, item);
91
92 break;
93 }
94 case PY_UID: {
95 uid_t *uid = (uid_t *)((char *)s + conv[i].offset);
96
97 item = PyInt_FromLong(*uid);
98 PyDict_SetItemString(obj, conv[i].name, item);
99
100 break;
101 }
102 case PY_GID: {
103 gid_t *gid = (gid_t *)((char *)s + conv[i].offset);
104
105 item = PyInt_FromLong(*gid);
106 PyDict_SetItemString(obj, conv[i].name, item);
107
108 break;
109 }
110 default:
111
112 break;
113 }
114 }
115
116 return obj;
117}
118
119/* Convert a Python dict to a structure */
120
121BOOL to_struct(void *s, PyObject *dict, struct pyconv *conv)
122{
123 PyObject *visited, *key, *value;
124 BOOL result = False;
125 int i;
126
127 visited = PyDict_New();
128
129 for (i = 0; conv[i].name; i++) {
130 PyObject *obj;
131
132 obj = PyDict_GetItemString(dict, conv[i].name);
133
134 if (!obj)
135 goto done;
136
137 switch (conv[i].type) {
138 case PY_UNISTR: {
139 UNISTR *u = (UNISTR *)((char *)s + conv[i].offset);
140 char *str = "";
141
142 if (!PyString_Check(obj))
143 goto done;
144
145 str = PyString_AsString(obj);
146 init_unistr(u, str);
147
148 break;
149 }
150 case PY_UINT32: {
151 uint32 *u = (uint32 *)((char *)s + conv[i].offset);
152
153 if (!PyInt_Check(obj))
154 goto done;
155
156 *u = PyInt_AsLong(obj);
157
158 break;
159 }
160 case PY_UINT16: {
161 uint16 *u = (uint16 *)((char *)s + conv[i].offset);
162
163 if (!PyInt_Check(obj))
164 goto done;
165
166 *u = PyInt_AsLong(obj);
167 break;
168 }
169 default:
170 break;
171 }
172
173 /* Mark as visited */
174
175 PyDict_SetItemString(visited, conv[i].name,
176 PyInt_FromLong(1));
177 }
178
179 /* Iterate over each item in the input dictionary and see if it was
180 visited. If it wasn't then the user has added some extra crap
181 to the dictionary. */
182
183 i = 0;
184
185 while (PyDict_Next(dict, &i, &key, &value)) {
186 if (!PyDict_GetItem(visited, key))
187 goto done;
188 }
189
190 result = True;
191
192done:
193 /* We must decrement the reference count here or the visited
194 dictionary will not be freed. */
195
196 Py_DECREF(visited);
197
198 return result;
199}
200
201/* Convert a NULL terminated list of NULL terminated unicode strings
202 to a list of (char *) strings */
203
204PyObject *from_unistr_list(uint16 *dependentfiles)
205{
206 PyObject *list;
207 int offset = 0;
208
209 list = PyList_New(0);
210
211 while (*(dependentfiles + offset) != 0) {
212 fstring name;
213 int len;
214
215 len = rpcstr_pull(name, dependentfiles + offset,
216 sizeof(fstring), -1, STR_TERMINATE);
217
218 offset += len / 2;
219 PyList_Append(list, PyString_FromString(name));
220 }
221
222 return list;
223}
Note: See TracBrowser for help on using the repository browser.