Mercurial > pidgin
comparison src/dbus-analyze-functions.py @ 11187:744c0708d11f
[gaim-migrate @ 13303]
gaim-remote.py implements the functionality of standard gaim-remote,
but using DBus. It can also call all gaim functions exported via
DBus.
dbus-analize-function.py can now produce dbus bindings for GHashTable
arguments.
committer: Tailor Script <tailor@pidgin.im>
author | Piotr Zielinski <zielaj> |
---|---|
date | Wed, 03 Aug 2005 23:54:37 +0000 |
parents | 57af14280b5f |
children | 66f872f30e40 |
comparison
equal
deleted
inserted
replaced
11186:bbe84acea03a | 11187:744c0708d11f |
---|---|
37 # "gint" : ("i", None), | 37 # "gint" : ("i", None), |
38 # "guint" : ("u", None), | 38 # "guint" : ("u", None), |
39 # "gboolean" : ("i", "int") | 39 # "gboolean" : ("i", "int") |
40 # } | 40 # } |
41 | 41 |
42 | |
42 simpletypes = ["int", "gint", "guint", "gboolean"] | 43 simpletypes = ["int", "gint", "guint", "gboolean"] |
43 | 44 |
44 # for enum in file("dbus-auto-enums.txt"): | 45 # for enum in file("dbus-auto-enums.txt"): |
45 # simpletypes[enum.strip()] = ("i", "int") | 46 # simpletypes[enum.strip()] = ("i", "int") |
46 | 47 |
47 # functions that shouldn't be exported | 48 # functions that shouldn't be exported |
48 | 49 |
49 excluded = ["gaim_accounts_load", "gaim_account_set_presence", | 50 excluded = ["gaim_accounts_load", "gaim_account_set_presence", |
50 "gaim_conv_placement_get_fnc_id", "gaim_conv_placement_add_fnc"] | 51 "gaim_conv_placement_get_fnc_id", "gaim_conv_placement_add_fnc", |
52 "gaim_presence_add_list"] | |
53 | |
54 stringlists = [] | |
51 | 55 |
52 pointer = "#pointer#" | 56 pointer = "#pointer#" |
53 | 57 |
54 functions = [] | 58 functions = [] |
55 | 59 |
75 print "DBusMessage *reply_DBUS;" | 79 print "DBusMessage *reply_DBUS;" |
76 | 80 |
77 for decl in cdecls: | 81 for decl in cdecls: |
78 print decl | 82 print decl |
79 | 83 |
80 print "dbus_message_get_args(message_DBUS, error_DBUS, ", | 84 print "%s(message_DBUS, error_DBUS, " % argfunc, |
81 for param in cparams: | 85 for param in cparams: |
82 print "DBUS_TYPE_%s, &%s," % param, | 86 print "DBUS_TYPE_%s, &%s," % param, |
83 print "DBUS_TYPE_INVALID);" | 87 print "DBUS_TYPE_INVALID);" |
84 | 88 |
85 print "CHECK_ERROR(error_DBUS);" | 89 print "CHECK_ERROR(error_DBUS);" |
103 print "return reply_DBUS;\n}\n" | 107 print "return reply_DBUS;\n}\n" |
104 | 108 |
105 functions.append((function, dparams)) | 109 functions.append((function, dparams)) |
106 | 110 |
107 def c_clear(): | 111 def c_clear(): |
108 global cparams, cdecls, ccode, cparamsout, ccodeout, dparams | 112 global cparams, cdecls, ccode, cparamsout, ccodeout, dparams, argfunc |
109 dparams = "" | 113 dparams = "" |
110 cparams = [] | 114 cparams = [] |
111 cdecls = [] | 115 cdecls = [] |
112 ccode = [] | 116 ccode = [] |
113 cparamsout = [] | 117 cparamsout = [] |
114 ccodeout = [] | 118 ccodeout = [] |
119 argfunc = "dbus_message_get_args" | |
115 | 120 |
116 | 121 |
117 def addstring(*items): | 122 def addstring(*items): |
118 global dparams | 123 global dparams |
119 for item in items: | 124 for item in items: |
135 print "#define GAIM_DBUS_REGISTER_BINDINGS(handle) gaim_dbus_register_bindings(handle, bindings_DBUS)" | 140 print "#define GAIM_DBUS_REGISTER_BINDINGS(handle) gaim_dbus_register_bindings(handle, bindings_DBUS)" |
136 | 141 |
137 # processing an input parameter | 142 # processing an input parameter |
138 | 143 |
139 def inputvar(mytype, name): | 144 def inputvar(mytype, name): |
140 global ccode, cparams, cdecls | 145 global ccode, cparams, cdecls, ccodeout, argfunc |
141 const = False | 146 const = False |
142 if mytype[0] == "const": | 147 if mytype[0] == "const": |
143 mytype = mytype[1:] | 148 mytype = mytype[1:] |
144 const = True | 149 const = True |
145 | 150 |
146 # simple types (int, gboolean, etc.) and enums | 151 |
147 if (len(mytype) == 1) and \ | 152 |
148 ((mytype[0] in simpletypes) or (mytype[0].startswith("Gaim"))): | 153 |
149 cdecls.append("dbus_int32_t %s;" % name) | 154 if len(mytype) == 1: |
150 cparams.append(("INT32", name)) | 155 # simple types (int, gboolean, etc.) and enums |
151 addintype("i", name) | 156 if (mytype[0] in simpletypes) or (mytype[0].startswith("Gaim")): |
152 return | 157 cdecls.append("dbus_int32_t %s;" % name) |
153 | 158 cparams.append(("INT32", name)) |
154 # pointers ... | 159 addintype("i", name) |
155 | 160 return |
161 | |
162 # va_list, replace by NULL | |
163 if mytype[0] == "va_list": | |
164 cdecls.append("va_list %s;" % name); | |
165 ccode.append("%s = NULL;" % name); | |
166 return | |
167 | |
168 # pointers ... | |
156 if (len(mytype) == 2) and (mytype[1] == pointer): | 169 if (len(mytype) == 2) and (mytype[1] == pointer): |
157 # strings | 170 # strings |
158 if mytype[0] == "char": | 171 if mytype[0] == "char": |
159 if const: | 172 if const: |
160 cdecls.append("const char *%s;" % name) | 173 cdecls.append("const char *%s;" % name) |
163 addintype("s", name) | 176 addintype("s", name) |
164 return | 177 return |
165 else: | 178 else: |
166 raise myexception | 179 raise myexception |
167 | 180 |
181 # memory leak if an error occurs later ... | |
182 elif mytype[0] == "GHashTable": | |
183 argfunc = "gaim_dbus_message_get_args" | |
184 cdecls.append("DBusMessageIter %s_ITER;" % name) | |
185 cdecls.append("GHashTable *%s;" % name) | |
186 cparams.append(("ARRAY", "%s_ITER" % name)) | |
187 ccode.append("%s = gaim_dbus_iter_hash_table(&%s_ITER, error_DBUS);" \ | |
188 % (name, name)) | |
189 ccode.append("CHECK_ERROR(error_DBUS);") | |
190 ccodeout.append("g_hash_table_destroy(%s);" % name) | |
191 addintype("a{ss}", name) | |
192 return | |
193 | |
168 # known object types are transformed to integer handles | 194 # known object types are transformed to integer handles |
169 elif mytype[0].startswith("Gaim"): | 195 elif mytype[0].startswith("Gaim"): |
170 cdecls.append("dbus_int32_t %s_ID;" % name) | 196 cdecls.append("dbus_int32_t %s_ID;" % name) |
171 cdecls.append("%s *%s;" % (mytype[0], name)) | 197 cdecls.append("%s *%s;" % (mytype[0], name)) |
172 cparams.append(("INT32", name + "_ID")) | 198 cparams.append(("INT32", name + "_ID")) |
188 | 214 |
189 | 215 |
190 | 216 |
191 # processing an output parameter | 217 # processing an output parameter |
192 | 218 |
193 def outputvar(mytype, name, call): | 219 def outputvar(mytype, name, call, function): |
194 # the "void" type is simple ... | 220 # the "void" type is simple ... |
195 if mytype == ["void"]: | 221 if mytype == ["void"]: |
196 ccode.append("%s;" % call) # just call the function | 222 ccode.append("%s;" % call) # just call the function |
197 return | 223 return |
198 | 224 |
199 # a constant string | 225 const = False |
200 if mytype == ["const", "char", pointer]: | 226 if mytype[0] == "const": |
227 mytype = mytype[1:] | |
228 const = True | |
229 | |
230 | |
231 # a string | |
232 if mytype == ["char", pointer]: | |
201 cdecls.append("const char *%s;" % name) | 233 cdecls.append("const char *%s;" % name) |
202 ccode.append("%s = null_to_empty(%s);" % (name, call)) | 234 ccode.append("%s = null_to_empty(%s);" % (name, call)) |
203 cparamsout.append(("STRING", name)) | 235 cparamsout.append(("STRING", name)) |
204 addouttype("s", name) | 236 addouttype("s", name) |
237 if not const: | |
238 ccodeout.append("g_free(%s);" % name) | |
205 return | 239 return |
206 | 240 |
207 # simple types (ints, booleans, enums, ...) | 241 # simple types (ints, booleans, enums, ...) |
208 if (len(mytype) == 1) and \ | 242 if (len(mytype) == 1) and \ |
209 ((mytype[0] in simpletypes) or (mytype[0].startswith("Gaim"))): | 243 ((mytype[0] in simpletypes) or (mytype[0].startswith("Gaim"))): |
223 cparamsout.append(("INT32", name)) | 257 cparamsout.append(("INT32", name)) |
224 addouttype("i", name) | 258 addouttype("i", name) |
225 return | 259 return |
226 | 260 |
227 # GList*, GSList*, assume that list is a list of objects | 261 # GList*, GSList*, assume that list is a list of objects |
228 # not a list of strings!!! | 262 |
229 # this does NOT release memory occupied by the list | 263 # fixme: at the moment, we do NOT free the memory occupied by |
264 # the list, we should free it if the list has NOT been declared const | |
265 | |
266 # fixme: we assume that this is a list of objects, not a list | |
267 # of strings | |
268 | |
230 if mytype[0] in ["GList", "GSList"]: | 269 if mytype[0] in ["GList", "GSList"]: |
231 cdecls.append("dbus_int32_t %s_LEN;" % name) | 270 cdecls.append("dbus_int32_t %s_LEN;" % name) |
232 cdecls.append("dbus_int32_t *%s;" % name) | 271 ccodeout.append("g_free(%s);" % name) |
233 ccode.append("%s = gaim_dbusify_%s(%s, FALSE, &%s_LEN);" % \ | 272 |
234 (name, mytype[0], call, name)) | 273 if function in stringlists: |
235 cparamsout.append("DBUS_TYPE_ARRAY, DBUS_TYPE_INT32, &%s, %s_LEN" \ | 274 cdecls.append("char **%s;" % name) |
275 ccode.append("%s = gaim_%s_to_array(%s, FALSE, &%s_LEN);" % \ | |
276 (name, mytype[0], call, name)) | |
277 cparamsout.append("DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, &%s, %s_LEN" \ | |
236 % (name, name)) | 278 % (name, name)) |
237 ccodeout.append("g_free(%s);" % name) | 279 addouttype("as", name) |
238 addouttype("ai", name) | 280 else: |
281 cdecls.append("dbus_int32_t *%s;" % name) | |
282 ccode.append("%s = gaim_dbusify_%s(%s, FALSE, &%s_LEN);" % \ | |
283 (name, mytype[0], call, name)) | |
284 cparamsout.append("DBUS_TYPE_ARRAY, DBUS_TYPE_INT32, &%s, %s_LEN" \ | |
285 % (name, name)) | |
286 addouttype("ai", name) | |
239 return | 287 return |
240 | 288 |
241 raise myexception | 289 raise myexception |
242 | 290 |
243 | 291 |
253 | 301 |
254 origfunction = function | 302 origfunction = function |
255 function = function.lower() | 303 function = function.lower() |
256 | 304 |
257 names = [] | 305 names = [] |
306 unnamed = 0 | |
258 for param in paramlist: | 307 for param in paramlist: |
259 tokens = param.split() | 308 tokens = param.split() |
260 if len(tokens) < 2: | 309 if len(tokens) == 0: |
261 raise myexception | 310 raise myexception |
262 type, name = tokens[:-1], tokens[-1] | 311 if (len(tokens) == 1) or (tokens[-1] == pointer): |
312 unnamed += 1 | |
313 type, name = tokens, "param%i" % unnamed | |
314 else: | |
315 type, name = tokens[:-1], tokens[-1] | |
263 inputvar(type, name) | 316 inputvar(type, name) |
264 names.append(name) | 317 names.append(name) |
265 | 318 |
266 outputvar(functiontype, "RESULT", | 319 outputvar(functiontype, "RESULT", |
267 "%s(%s)" % (origfunction, ", ".join(names))) | 320 "%s(%s)" % (origfunction, ", ".join(names)), function) |
268 | 321 |
269 c_print(function) | 322 c_print(function) |
270 | 323 |
271 | 324 |
272 | 325 |