Mercurial > pidgin.yaz
annotate plugins/tcl/tcl_cmds.c @ 13844:597beb5c9de1
[gaim-migrate @ 16300]
Etan points out that this is a bad copy-and-paste (see r16299)
committer: Tailor Script <tailor@pidgin.im>
author | Ethan Blanton <elb@pidgin.im> |
---|---|
date | Wed, 21 Jun 2006 04:10:47 +0000 |
parents | 475aed3aacfc |
children | d0ff520f87da |
rev | line source |
---|---|
6694 | 1 /** |
2 * @file tcl_cmds.c Commands for the Gaim Tcl plugin bindings | |
3 * | |
4 * gaim | |
5 * | |
6 * Copyright (C) 2003 Ethan Blanton <eblanton@cs.purdue.edu> | |
7 * | |
8 * This program is free software; you can redistribute it and/or modify | |
9 * it under the terms of the GNU General Public License as published by | |
10 * the Free Software Foundation; either version 2 of the License, or | |
11 * (at your option) any later version. | |
12 * | |
13 * This program is distributed in the hope that it will be useful, | |
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 * GNU General Public License for more details. | |
17 * | |
18 * You should have received a copy of the GNU General Public License | |
19 * along with this program; if not, write to the Free Software | |
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
21 */ | |
22 | |
23 #include <tcl.h> | |
24 | |
25 #include "internal.h" | |
26 #include "conversation.h" | |
27 #include "connection.h" | |
28 #include "account.h" | |
29 #include "server.h" | |
30 #include "notify.h" | |
6700 | 31 #include "blist.h" |
6694 | 32 #include "debug.h" |
33 #include "prefs.h" | |
34 #include "core.h" | |
35 | |
36 #include "tcl_gaim.h" | |
37 | |
13810 | 38 static GaimAccount *tcl_validate_account(Tcl_Obj *obj, Tcl_Interp *interp); |
39 static GaimConversation *tcl_validate_conversation(Tcl_Obj *obj, Tcl_Interp *interp); | |
13815 | 40 static GaimConnection *tcl_validate_gc(Tcl_Obj *obj, Tcl_Interp *interp); |
6694 | 41 |
13810 | 42 static GaimAccount *tcl_validate_account(Tcl_Obj *obj, Tcl_Interp *interp) |
6694 | 43 { |
13810 | 44 GaimAccount *account; |
6694 | 45 GList *cur; |
13810 | 46 |
47 account = gaim_tcl_ref_get(interp, obj, GaimTclRefAccount); | |
48 | |
49 if (account == NULL) | |
50 return NULL; | |
51 | |
6694 | 52 for (cur = gaim_accounts_get_all(); cur != NULL; cur = g_list_next(cur)) { |
53 if (account == cur->data) | |
13810 | 54 return account; |
6694 | 55 } |
56 if (interp != NULL) | |
57 Tcl_SetStringObj(Tcl_GetObjResult(interp), "invalid account", -1); | |
13810 | 58 return NULL; |
6694 | 59 } |
60 | |
13810 | 61 static GaimConversation *tcl_validate_conversation(Tcl_Obj *obj, Tcl_Interp *interp) |
6694 | 62 { |
13810 | 63 GaimConversation *convo; |
6694 | 64 GList *cur; |
65 | |
13810 | 66 convo = gaim_tcl_ref_get(interp, obj, GaimTclRefConversation); |
67 | |
68 if (convo == NULL) | |
69 return NULL; | |
70 | |
6694 | 71 for (cur = gaim_get_conversations(); cur != NULL; cur = g_list_next(cur)) { |
72 if (convo == cur->data) | |
13810 | 73 return convo; |
6694 | 74 } |
75 if (interp != NULL) | |
13844 | 76 Tcl_SetStringObj(Tcl_GetObjResult(interp), "invalid conversation", -1); |
13810 | 77 return NULL; |
6694 | 78 } |
79 | |
13815 | 80 static GaimConnection *tcl_validate_gc(Tcl_Obj *obj, Tcl_Interp *interp) |
6694 | 81 { |
13815 | 82 GaimConnection *gc; |
6694 | 83 GList *cur; |
13815 | 84 |
85 gc = gaim_tcl_ref_get(interp, obj, GaimTclRefConnection); | |
86 | |
87 if (gc == NULL) | |
88 return NULL; | |
89 | |
6694 | 90 for (cur = gaim_connections_get_all(); cur != NULL; cur = g_list_next(cur)) { |
91 if (gc == cur->data) | |
13815 | 92 return gc; |
6694 | 93 } |
13815 | 94 return NULL; |
6694 | 95 } |
96 | |
97 int tcl_cmd_account(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) | |
98 { | |
99 Tcl_Obj *result = Tcl_GetObjResult(interp), *list, *elem; | |
13826 | 100 const char *cmds[] = { "alias", "connect", "connection", "disconnect", |
101 "enabled", "find", "handle", "isconnected", | |
102 "list", "presence", "protocol", "status", | |
103 "status_type", "status_types", "username", | |
104 NULL }; | |
105 enum { CMD_ACCOUNT_ALIAS, | |
13810 | 106 CMD_ACCOUNT_CONNECT, CMD_ACCOUNT_CONNECTION, |
107 CMD_ACCOUNT_DISCONNECT, CMD_ACCOUNT_ENABLED, CMD_ACCOUNT_FIND, | |
108 CMD_ACCOUNT_HANDLE, CMD_ACCOUNT_ISCONNECTED, CMD_ACCOUNT_LIST, | |
13826 | 109 CMD_ACCOUNT_PRESENCE, CMD_ACCOUNT_PROTOCOL, CMD_ACCOUNT_STATUS, |
110 CMD_ACCOUNT_STATUS_TYPE, CMD_ACCOUNT_STATUS_TYPES, | |
111 CMD_ACCOUNT_USERNAME } cmd; | |
10339 | 112 const char *listopts[] = { "-all", "-online", NULL }; |
6694 | 113 enum { CMD_ACCOUNTLIST_ALL, CMD_ACCOUNTLIST_ONLINE } listopt; |
8834 | 114 const char *alias; |
13810 | 115 const GList *cur; |
6694 | 116 GaimAccount *account; |
13826 | 117 GaimStatus *status; |
13810 | 118 GaimStatusType *status_type; |
13826 | 119 GaimValue *value; |
120 char *attr_id; | |
6694 | 121 int error; |
13826 | 122 int b, i; |
6694 | 123 |
124 if (objc < 2) { | |
125 Tcl_WrongNumArgs(interp, 1, objv, "subcommand ?args?"); | |
126 return TCL_ERROR; | |
127 } | |
128 | |
129 if ((error = Tcl_GetIndexFromObj(interp, objv[1], cmds, "subcommand", 0, (int *)&cmd)) != TCL_OK) | |
130 return error; | |
131 | |
132 switch (cmd) { | |
133 case CMD_ACCOUNT_ALIAS: | |
134 if (objc != 3) { | |
135 Tcl_WrongNumArgs(interp, 2, objv, "account"); | |
136 return TCL_ERROR; | |
137 } | |
13810 | 138 if ((account = tcl_validate_account(objv[2], interp)) == NULL) |
6694 | 139 return TCL_ERROR; |
140 alias = gaim_account_get_alias(account); | |
141 Tcl_SetStringObj(result, alias ? (char *)alias : "", -1); | |
142 break; | |
143 case CMD_ACCOUNT_CONNECT: | |
144 if (objc != 3) { | |
145 Tcl_WrongNumArgs(interp, 2, objv, "account"); | |
146 return TCL_ERROR; | |
147 } | |
13810 | 148 if ((account = tcl_validate_account(objv[2], interp)) == NULL) |
6694 | 149 return TCL_ERROR; |
10740 | 150 if (!gaim_account_is_connected(account)) |
151 gaim_account_connect(account); | |
13815 | 152 Tcl_SetObjResult(interp, |
153 gaim_tcl_ref_new(GaimTclRefConnection, | |
154 gaim_account_get_connection(account))); | |
6694 | 155 break; |
156 case CMD_ACCOUNT_CONNECTION: | |
157 if (objc != 3) { | |
158 Tcl_WrongNumArgs(interp, 2, objv, "account"); | |
159 return TCL_ERROR; | |
160 } | |
13810 | 161 |
162 if ((account = tcl_validate_account(objv[2], interp)) == NULL) | |
6694 | 163 return TCL_ERROR; |
13815 | 164 Tcl_SetObjResult(interp, |
165 gaim_tcl_ref_new(GaimTclRefConnection, | |
166 gaim_account_get_connection(account))); | |
6694 | 167 break; |
168 case CMD_ACCOUNT_DISCONNECT: | |
169 if (objc != 3) { | |
170 Tcl_WrongNumArgs(interp, 2, objv, "account"); | |
171 return TCL_ERROR; | |
172 } | |
13810 | 173 if ((account = tcl_validate_account(objv[2], interp)) == NULL) |
6694 | 174 return TCL_ERROR; |
175 gaim_account_disconnect(account); | |
176 break; | |
13810 | 177 case CMD_ACCOUNT_ENABLED: |
178 if (objc != 3 && objc != 4) { | |
179 Tcl_WrongNumArgs(interp, 2, objv, "account ?enabled?"); | |
180 return TCL_ERROR; | |
181 } | |
182 if ((account = tcl_validate_account(objv[2], interp)) == NULL) | |
183 return TCL_ERROR; | |
184 if (objc == 3) { | |
185 Tcl_SetBooleanObj(result, | |
186 gaim_account_get_enabled(account, | |
187 gaim_core_get_ui())); | |
188 } else { | |
189 if ((error = Tcl_GetBooleanFromObj(interp, objv[3], &b)) != TCL_OK) | |
190 return TCL_ERROR; | |
191 gaim_account_set_enabled(account, gaim_core_get_ui(), b); | |
192 } | |
193 break; | |
6694 | 194 case CMD_ACCOUNT_FIND: |
195 if (objc != 4) { | |
196 Tcl_WrongNumArgs(interp, 2, objv, "username protocol"); | |
197 return TCL_ERROR; | |
198 } | |
13815 | 199 account = gaim_accounts_find(Tcl_GetString(objv[2]), |
200 Tcl_GetString(objv[3])); | |
201 Tcl_SetObjResult(interp, | |
202 gaim_tcl_ref_new(GaimTclRefAccount, account)); | |
6694 | 203 break; |
204 case CMD_ACCOUNT_HANDLE: | |
205 if (objc != 2) { | |
206 Tcl_WrongNumArgs(interp, 2, objv, ""); | |
207 return TCL_ERROR; | |
208 } | |
209 Tcl_SetIntObj(result, (int)gaim_accounts_get_handle()); | |
210 break; | |
211 case CMD_ACCOUNT_ISCONNECTED: | |
212 if (objc != 3) { | |
213 Tcl_WrongNumArgs(interp, 2, objv, "account"); | |
214 return TCL_ERROR; | |
215 } | |
13810 | 216 if ((account = tcl_validate_account(objv[2], interp)) == NULL) |
6694 | 217 return TCL_ERROR; |
218 Tcl_SetBooleanObj(result, gaim_account_is_connected(account)); | |
219 break; | |
220 case CMD_ACCOUNT_LIST: | |
221 listopt = CMD_ACCOUNTLIST_ALL; | |
222 if (objc > 3) { | |
223 Tcl_WrongNumArgs(interp, 2, objv, "?option?"); | |
224 return TCL_ERROR; | |
225 } | |
226 if (objc == 3) { | |
227 if ((error = Tcl_GetIndexFromObj(interp, objv[2], listopts, "option", 0, (int *)&listopt)) != TCL_OK) | |
228 return error; | |
229 } | |
230 list = Tcl_NewListObj(0, NULL); | |
231 for (cur = gaim_accounts_get_all(); cur != NULL; cur = g_list_next(cur)) { | |
232 account = cur->data; | |
233 if (listopt == CMD_ACCOUNTLIST_ONLINE && !gaim_account_is_connected(account)) | |
234 continue; | |
13810 | 235 elem = gaim_tcl_ref_new(GaimTclRefAccount, account); |
6694 | 236 Tcl_ListObjAppendElement(interp, list, elem); |
237 } | |
238 Tcl_SetObjResult(interp, list); | |
239 break; | |
13821 | 240 case CMD_ACCOUNT_PRESENCE: |
241 if (objc != 3) { | |
242 Tcl_WrongNumArgs(interp, 2, objv, "account"); | |
243 return TCL_ERROR; | |
244 } | |
245 if ((account = tcl_validate_account(objv[2], interp)) == NULL) | |
246 return TCL_ERROR; | |
13824 | 247 Tcl_SetObjResult(interp, gaim_tcl_ref_new(GaimTclRefPresence, |
13821 | 248 gaim_account_get_presence(account))); |
249 break; | |
6694 | 250 case CMD_ACCOUNT_PROTOCOL: |
251 if (objc != 3) { | |
252 Tcl_WrongNumArgs(interp, 2, objv, "account"); | |
253 return TCL_ERROR; | |
254 } | |
13810 | 255 if ((account = tcl_validate_account(objv[2], interp)) == NULL) |
6694 | 256 return TCL_ERROR; |
257 Tcl_SetStringObj(result, (char *)gaim_account_get_protocol_id(account), -1); | |
258 break; | |
13826 | 259 case CMD_ACCOUNT_STATUS: |
260 if (objc < 3) { | |
261 Tcl_WrongNumArgs(interp, 2, objv, "account ?status_id name value ...?"); | |
262 return TCL_ERROR; | |
263 } | |
264 if ((account = tcl_validate_account(objv[2], interp)) == NULL) | |
265 return TCL_ERROR; | |
266 if (objc == 3) { | |
267 Tcl_SetObjResult(interp, | |
268 gaim_tcl_ref_new(GaimTclRefStatus, | |
269 gaim_account_get_active_status(account))); | |
270 } else { | |
271 GList *l = NULL; | |
272 if (objc % 2) { | |
273 Tcl_SetStringObj(result, "name without value setting status", -1); | |
274 return TCL_ERROR; | |
275 } | |
276 status = gaim_account_get_status(account, Tcl_GetString(objv[3])); | |
277 if (status == NULL) { | |
278 Tcl_SetStringObj(result, "invalid status for account", -1); | |
279 return TCL_ERROR; | |
280 } | |
281 for (i = 4; i < objc; i += 2) { | |
282 attr_id = Tcl_GetString(objv[i]); | |
283 value = gaim_status_get_attr_value(status, attr_id); | |
284 if (value == NULL) { | |
285 Tcl_SetStringObj(result, "invalid attribute for account", -1); | |
286 return TCL_ERROR; | |
287 } | |
288 switch (gaim_value_get_type(value)) { | |
289 case GAIM_TYPE_BOOLEAN: | |
290 error = Tcl_GetBooleanFromObj(interp, objv[i + 1], &b); | |
291 if (error != TCL_OK) | |
292 return error; | |
293 l = g_list_append(l, attr_id); | |
294 l = g_list_append(l, GINT_TO_POINTER(b)); | |
295 break; | |
296 case GAIM_TYPE_INT: | |
297 error = Tcl_GetIntFromObj(interp, objv[i + 1], &b); | |
298 if (error != TCL_OK) | |
299 return error; | |
300 l = g_list_append(l, attr_id); | |
301 l = g_list_append(l, GINT_TO_POINTER(b)); | |
302 break; | |
303 case GAIM_TYPE_STRING: | |
304 l = g_list_append(l, attr_id); | |
305 l = g_list_append(l, Tcl_GetString(objv[i + 1])); | |
306 break; | |
307 default: | |
308 Tcl_SetStringObj(result, "unknown GaimValue type", -1); | |
309 return TCL_ERROR; | |
310 } | |
311 } | |
312 gaim_account_set_status_list(account, Tcl_GetString(objv[3]), TRUE, l); | |
313 g_list_free(l); | |
314 } | |
315 break; | |
13810 | 316 case CMD_ACCOUNT_STATUS_TYPE: |
317 if (objc != 4 && objc != 5) { | |
318 Tcl_WrongNumArgs(interp, 2, objv, "account ?statustype? ?-primitive primitive?"); | |
319 return TCL_ERROR; | |
320 } | |
321 if ((account = tcl_validate_account(objv[2], interp)) == NULL) | |
322 return TCL_ERROR; | |
323 if (objc == 4) { | |
324 status_type = gaim_account_get_status_type(account, | |
325 Tcl_GetString(objv[3])); | |
326 } else { | |
327 GaimStatusPrimitive primitive; | |
328 if (strcmp(Tcl_GetString(objv[3]), "-primitive")) { | |
329 Tcl_SetStringObj(result, "bad option \"", -1); | |
330 Tcl_AppendObjToObj(result, objv[3]); | |
331 Tcl_AppendToObj(result, | |
332 "\": should be -primitive", -1); | |
333 return TCL_ERROR; | |
334 } | |
335 primitive = gaim_primitive_get_type_from_id(Tcl_GetString(objv[4])); | |
336 status_type = gaim_account_get_status_type_with_primitive(account, | |
337 primitive); | |
338 } | |
339 if (status_type == NULL) { | |
340 Tcl_SetStringObj(result, "status type not found", -1); | |
341 return TCL_ERROR; | |
342 } | |
343 Tcl_SetObjResult(interp, | |
344 gaim_tcl_ref_new(GaimTclRefStatusType, | |
345 status_type)); | |
346 break; | |
347 case CMD_ACCOUNT_STATUS_TYPES: | |
348 if (objc != 3) { | |
349 Tcl_WrongNumArgs(interp, 2, objv, "account"); | |
350 return TCL_ERROR; | |
351 } | |
352 if ((account = tcl_validate_account(objv[2], interp)) == NULL) | |
353 return TCL_ERROR; | |
354 list = Tcl_NewListObj(0, NULL); | |
355 for (cur = gaim_account_get_status_types(account); cur != NULL; | |
356 cur = g_list_next(cur)) { | |
357 Tcl_ListObjAppendElement(interp, list, | |
358 gaim_tcl_ref_new(GaimTclRefStatusType, | |
359 cur->data)); | |
360 } | |
361 Tcl_SetObjResult(interp, list); | |
362 break; | |
6694 | 363 case CMD_ACCOUNT_USERNAME: |
364 if (objc != 3) { | |
365 Tcl_WrongNumArgs(interp, 2, objv, "account"); | |
366 return TCL_ERROR; | |
367 } | |
13810 | 368 if ((account = tcl_validate_account(objv[2], interp)) == NULL) |
6694 | 369 return TCL_ERROR; |
370 Tcl_SetStringObj(result, (char *)gaim_account_get_username(account), -1); | |
371 break; | |
372 } | |
373 | |
374 return TCL_OK; | |
375 } | |
376 | |
377 static GaimBlistNode *tcl_list_to_buddy(Tcl_Interp *interp, int count, Tcl_Obj **elems) | |
378 { | |
379 GaimBlistNode *node = NULL; | |
380 GaimAccount *account; | |
381 char *name; | |
382 char *type; | |
383 | |
384 if (count < 3) { | |
385 Tcl_SetStringObj(Tcl_GetObjResult(interp), "list too short", -1); | |
386 return NULL; | |
387 } | |
388 | |
389 type = Tcl_GetString(elems[0]); | |
390 name = Tcl_GetString(elems[1]); | |
13810 | 391 if ((account = tcl_validate_account(elems[2], interp)) == NULL) |
6694 | 392 return NULL; |
393 | |
394 if (!strcmp(type, "buddy")) { | |
395 node = (GaimBlistNode *)gaim_find_buddy(account, name); | |
396 } else if (!strcmp(type, "group")) { | |
397 node = (GaimBlistNode *)gaim_blist_find_chat(account, name); | |
398 } | |
399 | |
400 return node; | |
401 } | |
402 | |
403 int tcl_cmd_buddy(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) | |
404 { | |
6746 | 405 Tcl_Obj *list, *tclgroup, *tclgrouplist, *tclcontact, *tclcontactlist, *tclbud, **elems, *result; |
10339 | 406 const char *cmds[] = { "alias", "handle", "info", "list", NULL }; |
6694 | 407 enum { CMD_BUDDY_ALIAS, CMD_BUDDY_HANDLE, CMD_BUDDY_INFO, CMD_BUDDY_LIST } cmd; |
7100
abdc55ffadba
[gaim-migrate @ 7665]
Christian Hammond <chipx86@chipx86.com>
parents:
6982
diff
changeset
|
408 GaimBuddyList *blist; |
6746 | 409 GaimBlistNode *node, *gnode, *bnode; |
6694 | 410 GaimAccount *account; |
6746 | 411 GaimBuddy *bud; |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7100
diff
changeset
|
412 GaimChat *cnode; |
6694 | 413 int error, all = 0, count; |
414 | |
415 if (objc < 2) { | |
416 Tcl_WrongNumArgs(interp, 1, objv, "subcommand ?args?"); | |
417 return TCL_ERROR; | |
418 } | |
419 if ((error = Tcl_GetIndexFromObj(interp, objv[1], cmds, "subcommand", 0, (int *)&cmd)) != TCL_OK) | |
420 return error; | |
421 | |
422 result = Tcl_GetObjResult(interp); | |
423 | |
424 switch (cmd) { | |
425 case CMD_BUDDY_ALIAS: | |
426 if (objc != 3) { | |
427 Tcl_WrongNumArgs(interp, 2, objv, "buddy"); | |
428 return TCL_ERROR; | |
429 } | |
430 if ((error = Tcl_ListObjGetElements(interp, objv[2], &count, &elems)) != TCL_OK) | |
431 return error; | |
432 if ((node = tcl_list_to_buddy(interp, count, elems)) == NULL) | |
433 return TCL_ERROR; | |
434 if (node->type == GAIM_BLIST_CHAT_NODE) | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7100
diff
changeset
|
435 Tcl_SetStringObj(result, ((GaimChat *)node)->alias, -1); |
6694 | 436 else if (node->type == GAIM_BLIST_BUDDY_NODE) |
9620 | 437 Tcl_SetStringObj(result, (char *)gaim_buddy_get_alias((GaimBuddy *)node), -1); |
6694 | 438 return TCL_OK; |
439 break; | |
440 case CMD_BUDDY_HANDLE: | |
441 if (objc != 2) { | |
442 Tcl_WrongNumArgs(interp, 2, objv, ""); | |
443 return TCL_ERROR; | |
444 } | |
445 Tcl_SetIntObj(result, (int)gaim_blist_get_handle()); | |
446 break; | |
447 case CMD_BUDDY_INFO: | |
448 if (objc != 3 && objc != 4) { | |
449 Tcl_WrongNumArgs(interp, 2, objv, "( buddy | account username )"); | |
450 return TCL_ERROR; | |
451 } | |
452 if (objc == 3) { | |
453 if ((error = Tcl_ListObjGetElements(interp, objv[2], &count, &elems)) != TCL_OK) | |
454 return error; | |
455 if (count < 3) { | |
456 Tcl_SetStringObj(result, "buddy too short", -1); | |
457 return TCL_ERROR; | |
458 } | |
459 if (strcmp("buddy", Tcl_GetString(elems[0]))) { | |
460 Tcl_SetStringObj(result, "invalid buddy", -1); | |
461 return TCL_ERROR; | |
462 } | |
13810 | 463 if ((account = tcl_validate_account(elems[2], interp)) == NULL) |
6694 | 464 return TCL_ERROR; |
465 serv_get_info(gaim_account_get_connection(account), Tcl_GetString(elems[1])); | |
466 } else { | |
13810 | 467 if ((account = tcl_validate_account(objv[2], interp)) == NULL) |
6694 | 468 return TCL_ERROR; |
469 serv_get_info(gaim_account_get_connection(account), Tcl_GetString(objv[3])); | |
470 } | |
471 break; | |
472 case CMD_BUDDY_LIST: | |
473 if (objc == 3) { | |
474 if (!strcmp("-all", Tcl_GetString(objv[2]))) { | |
475 all = 1; | |
476 } else { | |
477 Tcl_SetStringObj(result, "", -1); | |
478 Tcl_AppendStringsToObj(result, "unknown option: ", Tcl_GetString(objv[2]), NULL); | |
479 return TCL_ERROR; | |
480 } | |
481 } | |
482 list = Tcl_NewListObj(0, NULL); | |
483 blist = gaim_get_blist(); | |
484 for (gnode = blist->root; gnode != NULL; gnode = gnode->next) { | |
485 tclgroup = Tcl_NewListObj(0, NULL); | |
486 Tcl_ListObjAppendElement(interp, tclgroup, Tcl_NewStringObj("group", -1)); | |
487 Tcl_ListObjAppendElement(interp, tclgroup, | |
6700 | 488 Tcl_NewStringObj(((GaimGroup *)gnode)->name, -1)); |
6694 | 489 tclgrouplist = Tcl_NewListObj(0, NULL); |
490 for (node = gnode->child; node != NULL; node = node->next) { | |
491 switch (node->type) { | |
6746 | 492 case GAIM_BLIST_CONTACT_NODE: |
493 tclcontact = Tcl_NewListObj(0, NULL); | |
494 Tcl_IncrRefCount(tclcontact); | |
495 Tcl_ListObjAppendElement(interp, tclcontact, Tcl_NewStringObj("contact", -1)); | |
496 tclcontactlist = Tcl_NewListObj(0, NULL); | |
497 Tcl_IncrRefCount(tclcontactlist); | |
498 count = 0; | |
499 for (bnode = node->child; bnode != NULL; bnode = bnode ->next) { | |
500 if (bnode->type != GAIM_BLIST_BUDDY_NODE) | |
501 continue; | |
502 bud = (GaimBuddy *)bnode; | |
503 if (!all && !gaim_account_is_connected(bud->account)) | |
504 continue; | |
505 count++; | |
506 tclbud = Tcl_NewListObj(0, NULL); | |
507 Tcl_ListObjAppendElement(interp, tclbud, Tcl_NewStringObj("buddy", -1)); | |
508 Tcl_ListObjAppendElement(interp, tclbud, Tcl_NewStringObj(bud->name, -1)); | |
13810 | 509 Tcl_ListObjAppendElement(interp, tclbud, gaim_tcl_ref_new(GaimTclRefAccount, bud->account)); |
6746 | 510 Tcl_ListObjAppendElement(interp, tclcontactlist, tclbud); |
511 } | |
512 if (count) { | |
513 Tcl_ListObjAppendElement(interp, tclcontact, tclcontactlist); | |
514 Tcl_ListObjAppendElement(interp, tclgrouplist, tclcontact); | |
515 } | |
516 Tcl_DecrRefCount(tclcontact); | |
517 Tcl_DecrRefCount(tclcontactlist); | |
6694 | 518 break; |
519 case GAIM_BLIST_CHAT_NODE: | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7100
diff
changeset
|
520 cnode = (GaimChat *)node; |
6694 | 521 if (!all && !gaim_account_is_connected(cnode->account)) |
522 continue; | |
523 tclbud = Tcl_NewListObj(0, NULL); | |
524 Tcl_ListObjAppendElement(interp, tclbud, Tcl_NewStringObj("chat", -1)); | |
525 Tcl_ListObjAppendElement(interp, tclbud, Tcl_NewStringObj(cnode->alias, -1)); | |
13810 | 526 Tcl_ListObjAppendElement(interp, tclbud, gaim_tcl_ref_new(GaimTclRefAccount, cnode->account)); |
6746 | 527 Tcl_ListObjAppendElement(interp, tclgrouplist, tclbud); |
6694 | 528 break; |
529 default: | |
6746 | 530 gaim_debug(GAIM_DEBUG_WARNING, "tcl", "Unexpected buddy type %d", node->type); |
6694 | 531 continue; |
532 } | |
533 } | |
534 Tcl_ListObjAppendElement(interp, tclgroup, tclgrouplist); | |
535 Tcl_ListObjAppendElement(interp, list, tclgroup); | |
536 } | |
537 Tcl_SetObjResult(interp, list); | |
538 break; | |
539 } | |
540 | |
541 return TCL_OK; | |
542 } | |
543 | |
544 int tcl_cmd_connection(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) | |
545 { | |
546 Tcl_Obj *result = Tcl_GetObjResult(interp), *list, *elem; | |
10339 | 547 const char *cmds[] = { "account", "displayname", "handle", "list", NULL }; |
7713 | 548 enum { CMD_CONN_ACCOUNT, CMD_CONN_DISPLAYNAME, CMD_CONN_HANDLE, CMD_CONN_LIST } cmd; |
6694 | 549 int error; |
550 GList *cur; | |
551 GaimConnection *gc; | |
552 | |
553 if (objc < 2) { | |
554 Tcl_WrongNumArgs(interp, 1, objv, "subcommand ?args?"); | |
555 return TCL_ERROR; | |
556 } | |
557 | |
558 if ((error = Tcl_GetIndexFromObj(interp, objv[1], cmds, "subcommand", 0, (int *)&cmd)) != TCL_OK) | |
559 return error; | |
560 | |
561 switch (cmd) { | |
562 case CMD_CONN_ACCOUNT: | |
563 if (objc != 3) { | |
6864 | 564 Tcl_WrongNumArgs(interp, 2, objv, "gc"); |
6694 | 565 return TCL_ERROR; |
566 } | |
13815 | 567 if ((gc = tcl_validate_gc(objv[2], interp)) == NULL) |
6694 | 568 return TCL_ERROR; |
13815 | 569 Tcl_SetObjResult(interp, |
570 gaim_tcl_ref_new(GaimTclRefAccount, | |
571 gaim_connection_get_account(gc))); | |
6694 | 572 break; |
7713 | 573 case CMD_CONN_DISPLAYNAME: |
574 if (objc != 3) { | |
575 Tcl_WrongNumArgs(interp, 2, objv, "gc"); | |
576 return TCL_ERROR; | |
577 } | |
13815 | 578 if ((gc = tcl_validate_gc(objv[2], interp)) == NULL) |
7713 | 579 return TCL_ERROR; |
580 Tcl_SetStringObj(result, (char *)gaim_connection_get_display_name(gc), -1); | |
581 break; | |
6694 | 582 case CMD_CONN_HANDLE: |
583 if (objc != 2) { | |
584 Tcl_WrongNumArgs(interp, 2, objv, ""); | |
585 return TCL_ERROR; | |
586 } | |
587 Tcl_SetIntObj(result, (int)gaim_connections_get_handle()); | |
588 break; | |
589 case CMD_CONN_LIST: | |
590 if (objc != 2) { | |
591 Tcl_WrongNumArgs(interp, 2, objv, ""); | |
592 return TCL_ERROR; | |
593 } | |
594 list = Tcl_NewListObj(0, NULL); | |
595 for (cur = gaim_connections_get_all(); cur != NULL; cur = g_list_next(cur)) { | |
13815 | 596 elem = gaim_tcl_ref_new(GaimTclRefConnection, cur->data); |
6694 | 597 Tcl_ListObjAppendElement(interp, list, elem); |
598 } | |
599 Tcl_SetObjResult(interp, list); | |
600 break; | |
601 } | |
602 | |
603 return TCL_OK; | |
604 } | |
605 | |
606 int tcl_cmd_conversation(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) | |
607 { | |
608 Tcl_Obj *list, *elem, *result = Tcl_GetObjResult(interp); | |
10339 | 609 const char *cmds[] = { "find", "handle", "list", "new", "write", NULL }; |
6694 | 610 enum { CMD_CONV_FIND, CMD_CONV_HANDLE, CMD_CONV_LIST, CMD_CONV_NEW, CMD_CONV_WRITE } cmd; |
10339 | 611 const char *styles[] = { "send", "recv", "system", NULL }; |
6694 | 612 enum { CMD_CONV_WRITE_SEND, CMD_CONV_WRITE_RECV, CMD_CONV_WRITE_SYSTEM } style; |
10339 | 613 const char *newopts[] = { "-chat", "-im" }; |
6694 | 614 enum { CMD_CONV_NEW_CHAT, CMD_CONV_NEW_IM } newopt; |
615 GaimConversation *convo; | |
616 GaimAccount *account; | |
617 GaimConversationType type; | |
618 GList *cur; | |
619 char *opt, *from, *what; | |
7156 | 620 int error, argsused, flags = 0; |
6694 | 621 |
622 if (objc < 2) { | |
623 Tcl_WrongNumArgs(interp, 1, objv, "subcommand ?args?"); | |
624 return TCL_ERROR; | |
625 } | |
626 | |
627 if ((error = Tcl_GetIndexFromObj(interp, objv[1], cmds, "subcommand", 0, (int *)&cmd)) != TCL_OK) | |
628 return error; | |
629 | |
630 switch (cmd) { | |
631 case CMD_CONV_FIND: | |
10829 | 632 if (objc != 4) { |
633 Tcl_WrongNumArgs(interp, 2, objv, "account name"); | |
6694 | 634 return TCL_ERROR; |
635 } | |
636 account = NULL; | |
13810 | 637 if ((account = tcl_validate_account(objv[2], interp)) == NULL) |
10829 | 638 return TCL_ERROR; |
11338 | 639 convo = gaim_find_conversation_with_account(GAIM_CONV_TYPE_ANY, |
10829 | 640 Tcl_GetString(objv[3]), |
641 account); | |
13815 | 642 Tcl_SetObjResult(interp, gaim_tcl_ref_new(GaimTclRefConversation, convo)); |
6694 | 643 break; |
644 case CMD_CONV_HANDLE: | |
645 if (objc != 2) { | |
646 Tcl_WrongNumArgs(interp, 2, objv, ""); | |
647 return TCL_ERROR; | |
648 } | |
649 Tcl_SetIntObj(result, (int)gaim_conversations_get_handle()); | |
650 break; | |
651 case CMD_CONV_LIST: | |
652 list = Tcl_NewListObj(0, NULL); | |
653 for (cur = gaim_get_conversations(); cur != NULL; cur = g_list_next(cur)) { | |
13815 | 654 elem = gaim_tcl_ref_new(GaimTclRefConversation, cur->data); |
6694 | 655 Tcl_ListObjAppendElement(interp, list, elem); |
656 } | |
657 Tcl_SetObjResult(interp, list); | |
658 break; | |
659 case CMD_CONV_NEW: | |
660 if (objc < 4) { | |
661 Tcl_WrongNumArgs(interp, 2, objv, "?options? account name"); | |
662 return TCL_ERROR; | |
663 } | |
664 argsused = 2; | |
11338 | 665 type = GAIM_CONV_TYPE_IM; |
6694 | 666 while (argsused < objc) { |
667 opt = Tcl_GetString(objv[argsused]); | |
668 if (*opt == '-') { | |
669 if ((error = Tcl_GetIndexFromObj(interp, objv[argsused], newopts, | |
670 "option", 0, (int *)&newopt)) != TCL_OK) | |
671 return error; | |
672 argsused++; | |
673 switch (newopt) { | |
674 case CMD_CONV_NEW_CHAT: | |
11338 | 675 type = GAIM_CONV_TYPE_CHAT; |
6694 | 676 break; |
677 case CMD_CONV_NEW_IM: | |
11338 | 678 type = GAIM_CONV_TYPE_IM; |
6694 | 679 break; |
680 } | |
681 } else { | |
682 break; | |
683 } | |
684 } | |
685 if (objc - argsused != 2) { | |
686 Tcl_WrongNumArgs(interp, 2, objv, "?options? account name"); | |
687 return TCL_ERROR; | |
688 } | |
13810 | 689 if ((account = tcl_validate_account(objv[argsused++], interp)) == NULL) |
6694 | 690 return TCL_ERROR; |
691 convo = gaim_conversation_new(type, account, Tcl_GetString(objv[argsused])); | |
13815 | 692 Tcl_SetObjResult(interp, gaim_tcl_ref_new(GaimTclRefConversation, convo)); |
6694 | 693 break; |
694 case CMD_CONV_WRITE: | |
695 if (objc != 6) { | |
696 Tcl_WrongNumArgs(interp, 2, objv, "conversation style from what"); | |
697 return TCL_ERROR; | |
698 } | |
13810 | 699 if ((convo = tcl_validate_conversation(objv[2], interp)) == NULL) |
700 return TCL_ERROR; | |
6694 | 701 if ((error = Tcl_GetIndexFromObj(interp, objv[3], styles, "style", 0, (int *)&style)) != TCL_OK) |
702 return error; | |
703 from = Tcl_GetString(objv[4]); | |
704 what = Tcl_GetString(objv[5]); | |
705 | |
706 switch (style) { | |
707 case CMD_CONV_WRITE_SEND: | |
708 flags = GAIM_MESSAGE_SEND; | |
709 break; | |
710 case CMD_CONV_WRITE_RECV: | |
711 flags = GAIM_MESSAGE_RECV; | |
712 break; | |
713 case CMD_CONV_WRITE_SYSTEM: | |
714 flags = GAIM_MESSAGE_SYSTEM; | |
715 break; | |
716 } | |
11338 | 717 if (gaim_conversation_get_type(convo) == GAIM_CONV_TYPE_CHAT) |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7100
diff
changeset
|
718 gaim_conv_chat_write(GAIM_CONV_CHAT(convo), from, what, flags, time(NULL)); |
6694 | 719 else |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7100
diff
changeset
|
720 gaim_conv_im_write(GAIM_CONV_IM(convo), from, what, flags, time(NULL)); |
6694 | 721 break; |
722 } | |
723 | |
724 return TCL_OK; | |
725 } | |
726 | |
727 int tcl_cmd_core(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) | |
728 { | |
729 Tcl_Obj *result = Tcl_GetObjResult(interp); | |
10339 | 730 const char *cmds[] = { "handle", "quit", NULL }; |
6694 | 731 enum { CMD_CORE_HANDLE, CMD_CORE_QUIT } cmd; |
732 int error; | |
733 | |
734 if (objc < 2) { | |
735 Tcl_WrongNumArgs(interp, 1, objv, "subcommand ?args?"); | |
736 return TCL_ERROR; | |
737 } | |
738 | |
739 if ((error = Tcl_GetIndexFromObj(interp, objv[1], cmds, "subcommand", 0, (int *)&cmd)) != TCL_OK) | |
740 return error; | |
741 | |
742 switch (cmd) { | |
743 case CMD_CORE_HANDLE: | |
744 if (objc != 2) { | |
745 Tcl_WrongNumArgs(interp, 2, objv, ""); | |
746 return TCL_ERROR; | |
747 } | |
748 Tcl_SetIntObj(result, (int)gaim_get_core()); | |
749 break; | |
750 case CMD_CORE_QUIT: | |
751 if (objc != 2) { | |
752 Tcl_WrongNumArgs(interp, 2, objv, ""); | |
753 return TCL_ERROR; | |
754 } | |
755 gaim_core_quit(); | |
756 break; | |
757 } | |
758 | |
759 return TCL_OK; | |
760 } | |
761 | |
762 int tcl_cmd_debug(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) | |
763 { | |
764 char *category, *message; | |
765 int lev; | |
10339 | 766 const char *levels[] = { "-misc", "-info", "-warning", "-error", NULL }; |
6694 | 767 GaimDebugLevel levelind[] = { GAIM_DEBUG_MISC, GAIM_DEBUG_INFO, GAIM_DEBUG_WARNING, GAIM_DEBUG_ERROR }; |
768 int error; | |
769 | |
770 if (objc != 4) { | |
771 Tcl_WrongNumArgs(interp, 1, objv, "level category message"); | |
772 return TCL_ERROR; | |
773 } | |
774 | |
775 error = Tcl_GetIndexFromObj(interp, objv[1], levels, "debug level", 0, &lev); | |
776 if (error != TCL_OK) | |
777 return error; | |
778 | |
779 category = Tcl_GetString(objv[2]); | |
780 message = Tcl_GetString(objv[3]); | |
781 | |
782 gaim_debug(levelind[lev], category, "%s\n", message); | |
783 | |
784 return TCL_OK; | |
785 } | |
786 | |
787 int tcl_cmd_notify(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) | |
788 { | |
789 int error, type; | |
10339 | 790 const char *opts[] = { "-error", "-warning", "-info", NULL }; |
6694 | 791 GaimNotifyMsgType optind[] = { GAIM_NOTIFY_MSG_ERROR, GAIM_NOTIFY_MSG_WARNING, GAIM_NOTIFY_MSG_INFO }; |
792 char *title, *msg1, *msg2; | |
793 | |
794 if (objc < 4 || objc > 5) { | |
795 Tcl_WrongNumArgs(interp, 1, objv, "?type? title primary secondary"); | |
796 return TCL_ERROR; | |
797 } | |
798 | |
799 if (objc == 4) { | |
13423 | 800 type = 1; /* Default to warning */ |
6694 | 801 title = Tcl_GetString(objv[1]); |
802 msg1 = Tcl_GetString(objv[2]); | |
803 msg2 = Tcl_GetString(objv[3]); | |
804 } else { | |
805 error = Tcl_GetIndexFromObj(interp, objv[1], opts, "message type", 0, &type); | |
806 if (error != TCL_OK) | |
807 return error; | |
808 title = Tcl_GetString(objv[2]); | |
809 msg1 = Tcl_GetString(objv[3]); | |
810 msg2 = Tcl_GetString(objv[4]); | |
811 } | |
812 | |
813 gaim_notify_message(_tcl_plugin, optind[type], title, msg1, msg2, NULL, NULL); | |
814 | |
815 return TCL_OK; | |
816 } | |
817 | |
818 int tcl_cmd_prefs(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) | |
819 { | |
820 Tcl_Obj *result, *list, *elem, **elems; | |
10339 | 821 const char *cmds[] = { "get", "set", "type", NULL }; |
6694 | 822 enum { CMD_PREFS_GET, CMD_PREFS_SET, CMD_PREFS_TYPE } cmd; |
823 /* char *types[] = { "none", "boolean", "int", "string", "stringlist", NULL }; */ | |
824 /* enum { TCL_PREFS_NONE, TCL_PREFS_BOOL, TCL_PREFS_INT, TCL_PREFS_STRING, TCL_PREFS_STRINGLIST } type; */ | |
825 GaimPrefType preftype; | |
826 GList *cur; | |
827 int error, intval, nelem, i; | |
828 | |
829 if (objc < 2) { | |
830 Tcl_WrongNumArgs(interp, 1, objv, "subcommand ?args?"); | |
831 return TCL_ERROR; | |
832 } | |
833 | |
834 if ((error = Tcl_GetIndexFromObj(interp, objv[1], cmds, "subcommand", 0, (int *)&cmd)) != TCL_OK) | |
835 return error; | |
836 | |
837 result = Tcl_GetObjResult(interp); | |
838 switch (cmd) { | |
839 case CMD_PREFS_GET: | |
840 if (objc != 3) { | |
841 Tcl_WrongNumArgs(interp, 1, objv, "path"); | |
842 return TCL_ERROR; | |
843 } | |
844 preftype = gaim_prefs_get_type(Tcl_GetString(objv[2])); | |
845 switch (preftype) { | |
846 case GAIM_PREF_NONE: | |
847 Tcl_SetStringObj(result, "pref type none", -1); | |
848 return TCL_ERROR; | |
849 break; | |
850 case GAIM_PREF_BOOLEAN: | |
851 Tcl_SetBooleanObj(result, gaim_prefs_get_bool(Tcl_GetString(objv[2]))); | |
852 break; | |
853 case GAIM_PREF_INT: | |
854 Tcl_SetIntObj(result, gaim_prefs_get_int(Tcl_GetString(objv[2]))); | |
855 break; | |
856 case GAIM_PREF_STRING: | |
857 Tcl_SetStringObj(result, (char *)gaim_prefs_get_string(Tcl_GetString(objv[2])), -1); | |
858 break; | |
859 case GAIM_PREF_STRING_LIST: | |
860 cur = gaim_prefs_get_string_list(Tcl_GetString(objv[2])); | |
861 list = Tcl_NewListObj(0, NULL); | |
862 while (cur != NULL) { | |
863 elem = Tcl_NewStringObj((char *)cur->data, -1); | |
864 Tcl_ListObjAppendElement(interp, list, elem); | |
865 cur = g_list_next(cur); | |
866 } | |
867 Tcl_SetObjResult(interp, list); | |
868 break; | |
869 default: | |
870 gaim_debug(GAIM_DEBUG_ERROR, "tcl", "tcl does not know about pref type %d\n", preftype); | |
871 Tcl_SetStringObj(result, "unknown pref type", -1); | |
872 return TCL_ERROR; | |
873 } | |
874 break; | |
875 case CMD_PREFS_SET: | |
876 if (objc != 4) { | |
877 Tcl_WrongNumArgs(interp, 1, objv, "path value"); | |
878 return TCL_ERROR; | |
879 } | |
880 preftype = gaim_prefs_get_type(Tcl_GetString(objv[2])); | |
881 switch (preftype) { | |
882 case GAIM_PREF_NONE: | |
883 Tcl_SetStringObj(result, "bad path or pref type none", -1); | |
884 return TCL_ERROR; | |
885 break; | |
886 case GAIM_PREF_BOOLEAN: | |
887 if ((error = Tcl_GetBooleanFromObj(interp, objv[3], &intval)) != TCL_OK) | |
888 return error; | |
889 gaim_prefs_set_bool(Tcl_GetString(objv[2]), intval); | |
890 break; | |
891 case GAIM_PREF_INT: | |
892 if ((error = Tcl_GetIntFromObj(interp, objv[3], &intval)) != TCL_OK) | |
893 return error; | |
894 gaim_prefs_set_int(Tcl_GetString(objv[2]), intval); | |
895 break; | |
896 case GAIM_PREF_STRING: | |
897 gaim_prefs_set_string(Tcl_GetString(objv[2]), Tcl_GetString(objv[3])); | |
898 break; | |
899 case GAIM_PREF_STRING_LIST: | |
900 if ((error = Tcl_ListObjGetElements(interp, objv[3], &nelem, &elems)) != TCL_OK) | |
901 return error; | |
902 cur = NULL; | |
903 for (i = 0; i < nelem; i++) { | |
904 cur = g_list_append(cur, (gpointer)Tcl_GetString(elems[i])); | |
905 } | |
906 gaim_prefs_set_string_list(Tcl_GetString(objv[2]), cur); | |
907 g_list_free(cur); | |
908 break; | |
909 default: | |
910 gaim_debug(GAIM_DEBUG_ERROR, "tcl", "tcl does not know about pref type %d\n", preftype); | |
911 return TCL_ERROR; | |
912 } | |
913 break; | |
914 case CMD_PREFS_TYPE: | |
915 if (objc != 3) { | |
916 Tcl_WrongNumArgs(interp, 1, objv, "path"); | |
917 return TCL_ERROR; | |
918 } | |
919 preftype = gaim_prefs_get_type(Tcl_GetString(objv[2])); | |
920 switch (preftype) { | |
921 case GAIM_PREF_NONE: | |
922 Tcl_SetStringObj(result, "none", -1); | |
923 break; | |
924 case GAIM_PREF_BOOLEAN: | |
925 Tcl_SetStringObj(result, "boolean", -1); | |
926 break; | |
927 case GAIM_PREF_INT: | |
928 Tcl_SetStringObj(result, "int", -1); | |
929 break; | |
930 case GAIM_PREF_STRING: | |
931 Tcl_SetStringObj(result, "string", -1); | |
932 break; | |
933 case GAIM_PREF_STRING_LIST: | |
934 Tcl_SetStringObj(result, "stringlist", -1); | |
935 break; | |
936 default: | |
937 gaim_debug(GAIM_DEBUG_ERROR, "tcl", "tcl does not know about pref type %d\n", preftype); | |
938 Tcl_SetStringObj(result, "unknown", -1); | |
939 } | |
940 break; | |
941 } | |
942 | |
943 return TCL_OK; | |
944 } | |
945 | |
13821 | 946 int tcl_cmd_presence(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) |
947 { | |
948 const char *cmds[] = { "account", "active_status", "available", | |
949 "chat_user", "context", "conversation", "idle", | |
950 "login", "online", "status", "statuses", NULL }; | |
951 enum { CMD_PRESENCE_ACCOUNT, CMD_PRESENCE_ACTIVE_STATUS, | |
952 CMD_PRESENCE_AVAILABLE, CMD_PRESENCE_CHAT_USER, | |
953 CMD_PRESENCE_CONTEXT, CMD_PRESENCE_CONVERSATION, | |
954 CMD_PRESENCE_IDLE, CMD_PRESENCE_LOGIN, CMD_PRESENCE_ONLINE, | |
955 CMD_PRESENCE_STATUS, CMD_PRESENCE_STATUSES } cmd; | |
956 Tcl_Obj *result = Tcl_GetObjResult(interp); | |
957 Tcl_Obj *list, *elem; | |
958 GaimPresence *presence; | |
959 const GList *cur; | |
960 int error, idle, idle_time, login_time; | |
961 | |
962 if (objc < 2) { | |
963 Tcl_WrongNumArgs(interp, 1, objv, "subcommand ?args?"); | |
964 return TCL_ERROR; | |
965 } | |
966 | |
967 if ((error = Tcl_GetIndexFromObj(interp, objv[1], cmds, "subcommand", 0, (int *)&cmd)) != TCL_OK) | |
968 return error; | |
969 | |
970 switch (cmd) { | |
971 case CMD_PRESENCE_ACCOUNT: | |
972 if (objc != 3) { | |
973 Tcl_WrongNumArgs(interp, 2, objv, "presence"); | |
974 return TCL_ERROR; | |
975 } | |
976 if ((presence = gaim_tcl_ref_get(interp, objv[2], GaimTclRefPresence)) == NULL) | |
977 return TCL_ERROR; | |
978 Tcl_SetObjResult(interp, gaim_tcl_ref_new(GaimTclRefAccount, | |
979 gaim_presence_get_account(presence))); | |
980 break; | |
981 case CMD_PRESENCE_ACTIVE_STATUS: | |
982 if (objc != 3 && objc != 4 && objc != 5) { | |
983 Tcl_WrongNumArgs(interp, 2, objv, "presence [?status_id? | ?-primitive primitive?]"); | |
984 return TCL_ERROR; | |
985 } | |
986 if ((presence = gaim_tcl_ref_get(interp, objv[2], GaimTclRefPresence)) == NULL) | |
987 return TCL_ERROR; | |
988 if (objc == 3) { | |
989 Tcl_SetObjResult(interp, | |
990 gaim_tcl_ref_new(GaimTclRefStatus, | |
991 gaim_presence_get_active_status(presence))); | |
992 } else if (objc == 4) { | |
993 Tcl_SetBooleanObj(result, | |
994 gaim_presence_is_status_active(presence, | |
995 Tcl_GetString(objv[3]))); | |
996 } else { | |
997 GaimStatusPrimitive primitive; | |
998 if (strcmp(Tcl_GetString(objv[3]), "-primitive")) { | |
999 Tcl_SetStringObj(result, "bad option \"", -1); | |
1000 Tcl_AppendObjToObj(result, objv[3]); | |
1001 Tcl_AppendToObj(result, | |
1002 "\": should be -primitive", -1); | |
1003 return TCL_ERROR; | |
1004 } | |
1005 primitive = gaim_primitive_get_type_from_id(Tcl_GetString(objv[4])); | |
1006 if (primitive == GAIM_STATUS_UNSET) { | |
1007 Tcl_SetStringObj(result, "invalid primitive ", -1); | |
1008 Tcl_AppendObjToObj(result, objv[4]); | |
1009 return TCL_ERROR; | |
1010 } | |
1011 Tcl_SetBooleanObj(result, gaim_presence_is_status_primitive_active(presence, primitive)); | |
1012 break; | |
1013 } | |
1014 break; | |
1015 case CMD_PRESENCE_AVAILABLE: | |
1016 if (objc != 3) { | |
1017 Tcl_WrongNumArgs(interp, 2, objv, "presence"); | |
1018 return TCL_ERROR; | |
1019 } | |
1020 if ((presence = gaim_tcl_ref_get(interp, objv[2], GaimTclRefPresence)) == NULL) | |
1021 return TCL_ERROR; | |
1022 Tcl_SetBooleanObj(result, gaim_presence_is_available(presence)); | |
1023 break; | |
1024 case CMD_PRESENCE_CHAT_USER: | |
1025 if (objc != 3) { | |
1026 Tcl_WrongNumArgs(interp, 2, objv, "presence"); | |
1027 return TCL_ERROR; | |
1028 } | |
1029 if ((presence = gaim_tcl_ref_get(interp, objv[2], GaimTclRefPresence)) == NULL) | |
1030 return TCL_ERROR; | |
1031 Tcl_SetStringObj(result, gaim_presence_get_chat_user(presence), -1); | |
1032 break; | |
1033 case CMD_PRESENCE_CONTEXT: | |
1034 if (objc != 3) { | |
1035 Tcl_WrongNumArgs(interp, 2, objv, "presence"); | |
1036 return TCL_ERROR; | |
1037 } | |
1038 if ((presence = gaim_tcl_ref_get(interp, objv[2], GaimTclRefPresence)) == NULL) | |
1039 return TCL_ERROR; | |
1040 switch (gaim_presence_get_context(presence)) { | |
1041 case GAIM_PRESENCE_CONTEXT_UNSET: | |
1042 Tcl_SetStringObj(result, "unset", -1); | |
1043 break; | |
1044 case GAIM_PRESENCE_CONTEXT_ACCOUNT: | |
1045 Tcl_SetStringObj(result, "account", -1); | |
1046 break; | |
1047 case GAIM_PRESENCE_CONTEXT_CONV: | |
1048 Tcl_SetStringObj(result, "conversation", -1); | |
1049 break; | |
1050 case GAIM_PRESENCE_CONTEXT_BUDDY: | |
1051 Tcl_SetStringObj(result, "buddy", -1); | |
1052 break; | |
1053 } | |
1054 break; | |
1055 case CMD_PRESENCE_CONVERSATION: | |
1056 if (objc != 3) { | |
1057 Tcl_WrongNumArgs(interp, 2, objv, "presence"); | |
1058 return TCL_ERROR; | |
1059 } | |
1060 if ((presence = gaim_tcl_ref_get(interp, objv[2], GaimTclRefPresence)) == NULL) | |
1061 return TCL_ERROR; | |
1062 Tcl_SetObjResult(interp, gaim_tcl_ref_new(GaimTclRefConversation, | |
1063 gaim_presence_get_conversation(presence))); | |
1064 break; | |
1065 case CMD_PRESENCE_IDLE: | |
1066 if (objc < 3 || objc > 5) { | |
1067 Tcl_WrongNumArgs(interp, 2, objv, "presence ?idle? ?time?"); | |
1068 return TCL_ERROR; | |
1069 } | |
1070 if ((presence = gaim_tcl_ref_get(interp, objv[2], GaimTclRefPresence)) == NULL) | |
1071 return TCL_ERROR; | |
1072 if (objc == 3) { | |
1073 if (gaim_presence_is_idle(presence)) { | |
1074 idle_time = gaim_presence_get_idle_time (presence); | |
1075 Tcl_SetIntObj(result, idle_time); | |
1076 } else { | |
1077 result = Tcl_NewListObj(0, NULL); | |
1078 Tcl_SetObjResult(interp, result); | |
1079 } | |
1080 break; | |
1081 } | |
1082 if ((error = Tcl_GetBooleanFromObj(interp, objv[3], &idle)) != TCL_OK) | |
1083 return TCL_ERROR; | |
1084 if (objc == 4) { | |
1085 gaim_presence_set_idle(presence, idle, time(NULL)); | |
1086 } else if (objc == 5) { | |
1087 if ((error = Tcl_GetIntFromObj(interp, | |
1088 objv[4], | |
1089 &idle_time)) != TCL_OK) | |
1090 return TCL_ERROR; | |
1091 gaim_presence_set_idle(presence, idle, idle_time); | |
1092 } | |
1093 break; | |
1094 case CMD_PRESENCE_LOGIN: | |
1095 if (objc != 3 && objc != 4) { | |
1096 Tcl_WrongNumArgs(interp, 2, objv, "presence ?time?"); | |
1097 return TCL_ERROR; | |
1098 } | |
1099 if ((presence = gaim_tcl_ref_get(interp, objv[2], GaimTclRefPresence)) == NULL) | |
1100 return TCL_ERROR; | |
1101 if (objc == 3) { | |
1102 Tcl_SetIntObj(result, gaim_presence_get_login_time(presence)); | |
1103 } else { | |
1104 if ((error == Tcl_GetIntFromObj(interp, | |
1105 objv[3], | |
1106 &login_time)) != TCL_OK) | |
1107 return TCL_ERROR; | |
1108 gaim_presence_set_login_time(presence, login_time); | |
1109 } | |
1110 break; | |
1111 case CMD_PRESENCE_ONLINE: | |
1112 if (objc != 3) { | |
1113 Tcl_WrongNumArgs(interp, 2, objv, "presence"); | |
1114 return TCL_ERROR; | |
1115 } | |
1116 if ((presence = gaim_tcl_ref_get(interp, objv[2], GaimTclRefPresence)) == NULL) | |
1117 return TCL_ERROR; | |
1118 Tcl_SetBooleanObj(result, gaim_presence_is_online(presence)); | |
1119 break; | |
1120 case CMD_PRESENCE_STATUS: | |
1121 if (objc != 4) { | |
1122 Tcl_WrongNumArgs(interp, 2, objv, "presence status_id"); | |
1123 return TCL_ERROR; | |
1124 } | |
1125 if ((presence = gaim_tcl_ref_get(interp, objv[2], GaimTclRefPresence)) == NULL) | |
1126 return TCL_ERROR; | |
1127 Tcl_SetObjResult(interp, | |
1128 gaim_tcl_ref_new(GaimTclRefStatus, | |
1129 gaim_presence_get_status(presence, | |
1130 Tcl_GetString(objv[3])))); | |
1131 break; | |
1132 case CMD_PRESENCE_STATUSES: | |
1133 if (objc != 3) { | |
1134 Tcl_WrongNumArgs(interp, 2, objv, "presence"); | |
1135 return TCL_ERROR; | |
1136 } | |
1137 if ((presence = gaim_tcl_ref_get(interp, objv[2], GaimTclRefPresence)) == NULL) | |
1138 return TCL_ERROR; | |
1139 list = Tcl_NewListObj(0, NULL); | |
1140 for (cur = gaim_presence_get_statuses(presence); cur != NULL; | |
1141 cur = g_list_next(cur)) { | |
1142 elem = gaim_tcl_ref_new(GaimTclRefStatus, cur->data); | |
1143 Tcl_ListObjAppendElement(interp, list, elem); | |
1144 } | |
1145 Tcl_SetObjResult(interp, list); | |
1146 break; | |
1147 } | |
1148 | |
1149 return TCL_OK; | |
1150 } | |
1151 | |
6694 | 1152 int tcl_cmd_send_im(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) |
1153 { | |
1154 GaimConnection *gc; | |
1155 char *who, *text; | |
1156 | |
1157 if (objc != 4) { | |
1158 Tcl_WrongNumArgs(interp, 1, objv, "gc who text"); | |
1159 return TCL_ERROR; | |
1160 } | |
1161 | |
13815 | 1162 if ((gc = tcl_validate_gc(objv[1], interp)) == NULL) |
6694 | 1163 return TCL_ERROR; |
1164 | |
1165 who = Tcl_GetString(objv[2]); | |
1166 text = Tcl_GetString(objv[3]); | |
1167 | |
6982 | 1168 serv_send_im(gc, who, text, 0); |
6694 | 1169 |
1170 return TCL_OK; | |
1171 } | |
1172 | |
1173 int tcl_cmd_signal(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) | |
1174 { | |
10339 | 1175 const char *cmds[] = { "connect", "disconnect", NULL }; |
6694 | 1176 enum { CMD_SIGNAL_CONNECT, CMD_SIGNAL_DISCONNECT } cmd; |
1177 struct tcl_signal_handler *handler; | |
10597 | 1178 Tcl_Obj *result = Tcl_GetObjResult(interp); |
6694 | 1179 void *instance; |
10597 | 1180 int error; |
6694 | 1181 |
1182 if (objc < 2) { | |
1183 Tcl_WrongNumArgs(interp, 1, objv, "subcommand ?args?"); | |
1184 return TCL_ERROR; | |
1185 } | |
1186 | |
1187 if ((error = Tcl_GetIndexFromObj(interp, objv[1], cmds, "subcommand", 0, (int *)&cmd)) != TCL_OK) | |
1188 return error; | |
1189 | |
1190 switch (cmd) { | |
1191 case CMD_SIGNAL_CONNECT: | |
1192 if (objc != 6) { | |
1193 Tcl_WrongNumArgs(interp, 2, objv, "instance signal args proc"); | |
1194 return TCL_ERROR; | |
1195 } | |
1196 handler = g_new0(struct tcl_signal_handler, 1); | |
1197 if ((error = Tcl_GetIntFromObj(interp, objv[2], (int *)&handler->instance)) != TCL_OK) { | |
1198 g_free(handler); | |
1199 return error; | |
1200 } | |
10597 | 1201 handler->signal = objv[3]; |
13810 | 1202 Tcl_IncrRefCount(handler->signal); |
10597 | 1203 handler->args = objv[4]; |
1204 handler->proc = objv[5]; | |
6694 | 1205 handler->interp = interp; |
1206 if (!tcl_signal_connect(handler)) { | |
1207 tcl_signal_handler_free(handler); | |
1208 Tcl_SetIntObj(result, 1); | |
1209 } else { | |
1210 Tcl_SetIntObj(result, 0); | |
1211 } | |
1212 break; | |
1213 case CMD_SIGNAL_DISCONNECT: | |
1214 if (objc != 4) { | |
13810 | 1215 Tcl_WrongNumArgs(interp, 2, objv, "instance signal"); |
6694 | 1216 return TCL_ERROR; |
1217 } | |
1218 if ((error = Tcl_GetIntFromObj(interp, objv[2], (int *)&instance)) != TCL_OK) | |
1219 return error; | |
1220 tcl_signal_disconnect(instance, Tcl_GetString(objv[3]), interp); | |
1221 break; | |
1222 } | |
1223 | |
1224 return TCL_OK; | |
1225 } | |
1226 | |
13810 | 1227 int tcl_cmd_status(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) |
1228 { | |
13826 | 1229 const char *cmds[] = { "attr", "type", NULL }; |
13810 | 1230 enum { CMD_STATUS_ATTR, CMD_STATUS_TYPE } cmd; |
1231 Tcl_Obj *result = Tcl_GetObjResult(interp); | |
1232 GaimStatus *status; | |
1233 GaimStatusType *status_type; | |
1234 GaimValue *value; | |
13824 | 1235 const char *attr; |
1236 int error, v; | |
13810 | 1237 |
1238 if (objc < 2) { | |
1239 Tcl_WrongNumArgs(interp, 1, objv, "subcommand ?args?"); | |
1240 return TCL_ERROR; | |
1241 } | |
1242 | |
1243 if ((error = Tcl_GetIndexFromObj(interp, objv[1], cmds, "subcommand", 0, (int *)&cmd)) != TCL_OK) | |
1244 return error; | |
1245 | |
1246 switch (cmd) { | |
1247 case CMD_STATUS_ATTR: | |
13824 | 1248 if (objc != 4 && objc != 5) { |
1249 Tcl_WrongNumArgs(interp, 2, objv, "status attr_id ?value?"); | |
13810 | 1250 return TCL_ERROR; |
1251 } | |
1252 if ((status = gaim_tcl_ref_get(interp, objv[2], GaimTclRefStatus)) == NULL) | |
1253 return TCL_ERROR; | |
13824 | 1254 attr = Tcl_GetString(objv[3]); |
1255 value = gaim_status_get_attr_value(status, attr); | |
13810 | 1256 if (value == NULL) { |
1257 Tcl_SetStringObj(result, "no such attribute", -1); | |
1258 return TCL_ERROR; | |
1259 } | |
1260 switch (gaim_value_get_type(value)) { | |
1261 case GAIM_TYPE_BOOLEAN: | |
13824 | 1262 if (objc == 4) { |
1263 Tcl_SetBooleanObj(result, gaim_value_get_boolean(value)); | |
1264 } else { | |
1265 if ((error = Tcl_GetBooleanFromObj(interp, objv[4], &v)) != TCL_OK) | |
1266 return error; | |
1267 gaim_status_set_attr_boolean(status, attr, v); | |
1268 } | |
13810 | 1269 break; |
1270 case GAIM_TYPE_INT: | |
13824 | 1271 if (objc == 4) { |
1272 Tcl_SetIntObj(result, gaim_value_get_int(value)); | |
1273 } else { | |
1274 if ((error = Tcl_GetIntFromObj(interp, objv[4], &v)) != TCL_OK) | |
1275 return error; | |
1276 gaim_status_set_attr_int(status, attr, v ); | |
1277 } | |
13810 | 1278 break; |
1279 case GAIM_TYPE_STRING: | |
13824 | 1280 if (objc == 4) |
1281 Tcl_SetStringObj(result, gaim_value_get_string(value), -1); | |
1282 else | |
1283 gaim_status_set_attr_string(status, attr, Tcl_GetString(objv[4])); | |
13810 | 1284 break; |
1285 default: | |
1286 Tcl_SetStringObj(result, "attribute has unknown type", -1); | |
1287 return TCL_ERROR; | |
1288 } | |
1289 break; | |
1290 case CMD_STATUS_TYPE: | |
1291 if (objc != 3) { | |
1292 Tcl_WrongNumArgs(interp, 2, objv, "status"); | |
1293 return TCL_ERROR; | |
1294 } | |
1295 if ((status = gaim_tcl_ref_get(interp, objv[2], GaimTclRefStatus)) == NULL) | |
1296 return TCL_ERROR; | |
1297 status_type = gaim_status_get_type(status); | |
1298 Tcl_SetObjResult(interp, gaim_tcl_ref_new(GaimTclRefStatusType, | |
1299 status_type)); | |
1300 break; | |
1301 } | |
1302 | |
1303 return TCL_OK; | |
1304 } | |
1305 | |
1306 int tcl_cmd_status_attr(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) | |
1307 { | |
1308 const char *cmds[] = { "id", "name", NULL }; | |
1309 enum { CMD_STATUS_ATTR_ID, CMD_STATUS_ATTR_NAME } cmd; | |
1310 Tcl_Obj *result = Tcl_GetObjResult(interp); | |
1311 GaimStatusAttr *attr; | |
1312 int error; | |
1313 | |
1314 if (objc < 2) { | |
1315 Tcl_WrongNumArgs(interp, 1, objv, "subcommand ?args?"); | |
1316 return TCL_ERROR; | |
1317 } | |
1318 | |
1319 if ((error = Tcl_GetIndexFromObj(interp, objv[1], cmds, "subcommand", 0, (int *)&cmd)) != TCL_OK) | |
1320 return error; | |
1321 | |
1322 switch (cmd) { | |
1323 case CMD_STATUS_ATTR_ID: | |
1324 if (objc != 3) { | |
1325 Tcl_WrongNumArgs(interp, 2, objv, "attr"); | |
1326 return TCL_ERROR; | |
1327 } | |
1328 if ((attr = gaim_tcl_ref_get(interp, objv[2], GaimTclRefStatusAttr)) == NULL) | |
1329 return TCL_ERROR; | |
1330 Tcl_SetStringObj(result, gaim_status_attr_get_id(attr), -1); | |
1331 break; | |
1332 case CMD_STATUS_ATTR_NAME: | |
1333 if (objc != 3) { | |
1334 Tcl_WrongNumArgs(interp, 2, objv, "attr"); | |
1335 return TCL_ERROR; | |
1336 } | |
1337 if ((attr = gaim_tcl_ref_get(interp, objv[2], GaimTclRefStatusAttr)) == NULL) | |
1338 return TCL_ERROR; | |
1339 Tcl_SetStringObj(result, gaim_status_attr_get_name(attr), -1); | |
1340 break; | |
1341 } | |
1342 | |
1343 return TCL_OK; | |
1344 } | |
1345 | |
1346 int tcl_cmd_status_type(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) | |
1347 { | |
1348 const char *cmds[] = { "attr", "attrs", "available", "exclusive", "id", | |
1349 "independent", "name", "primary_attr", | |
1350 "primitive", "saveable", "user_settable", | |
1351 NULL }; | |
1352 enum { CMD_STATUS_TYPE_ATTR, CMD_STATUS_TYPE_ATTRS, | |
1353 CMD_STATUS_TYPE_AVAILABLE, CMD_STATUS_TYPE_EXCLUSIVE, | |
1354 CMD_STATUS_TYPE_ID, CMD_STATUS_TYPE_INDEPENDENT, | |
1355 CMD_STATUS_TYPE_NAME, CMD_STATUS_TYPE_PRIMARY_ATTR, | |
1356 CMD_STATUS_TYPE_PRIMITIVE, CMD_STATUS_TYPE_SAVEABLE, | |
1357 CMD_STATUS_TYPE_USER_SETTABLE } cmd; | |
1358 Tcl_Obj *result = Tcl_GetObjResult(interp); | |
1359 GaimStatusType *status_type; | |
1360 Tcl_Obj *list, *elem; | |
1361 const GList *cur; | |
1362 int error; | |
1363 | |
1364 if (objc < 2) { | |
1365 Tcl_WrongNumArgs(interp, 1, objv, "subcommand ?args?"); | |
1366 return TCL_ERROR; | |
1367 } | |
1368 | |
1369 if ((error = Tcl_GetIndexFromObj(interp, objv[1], cmds, "subcommand", 0, (int *)&cmd)) != TCL_OK) | |
1370 return error; | |
1371 | |
1372 switch (cmd) { | |
1373 case CMD_STATUS_TYPE_AVAILABLE: | |
1374 if (objc != 3) { | |
1375 Tcl_WrongNumArgs(interp, 2, objv, "statustype"); | |
1376 return TCL_ERROR; | |
1377 } | |
1378 if ((status_type = gaim_tcl_ref_get(interp, objv[2], GaimTclRefStatusType)) == NULL) | |
1379 return TCL_ERROR; | |
1380 Tcl_SetBooleanObj(result, gaim_status_type_is_available(status_type)); | |
1381 break; | |
1382 case CMD_STATUS_TYPE_ATTR: | |
1383 if (objc != 4) { | |
1384 Tcl_WrongNumArgs(interp, 2, objv, "statustype attr"); | |
1385 return TCL_ERROR; | |
1386 } | |
1387 if ((status_type = gaim_tcl_ref_get(interp, objv[2], GaimTclRefStatusType)) == NULL) | |
1388 return TCL_ERROR; | |
1389 Tcl_SetObjResult(interp, | |
1390 gaim_tcl_ref_new(GaimTclRefStatusAttr, | |
1391 gaim_status_type_get_attr(status_type, | |
1392 Tcl_GetStringFromObj(objv[3], NULL)))); | |
1393 break; | |
1394 case CMD_STATUS_TYPE_ATTRS: | |
1395 if (objc != 3) { | |
1396 Tcl_WrongNumArgs(interp, 2, objv, "statustype"); | |
1397 return TCL_ERROR; | |
1398 } | |
1399 if ((status_type = gaim_tcl_ref_get(interp, objv[2], GaimTclRefStatusType)) == NULL) | |
1400 return TCL_ERROR; | |
1401 list = Tcl_NewListObj(0, NULL); | |
1402 for (cur = gaim_status_type_get_attrs(status_type); | |
1403 cur != NULL; cur = g_list_next(cur)) { | |
1404 elem = gaim_tcl_ref_new(GaimTclRefStatusAttr, cur->data); | |
1405 Tcl_ListObjAppendElement(interp, list, elem); | |
1406 } | |
1407 Tcl_SetObjResult(interp, list); | |
1408 break; | |
1409 case CMD_STATUS_TYPE_EXCLUSIVE: | |
1410 if (objc != 3) { | |
1411 Tcl_WrongNumArgs(interp, 2, objv, "statustype"); | |
1412 return TCL_ERROR; | |
1413 } | |
1414 if ((status_type = gaim_tcl_ref_get(interp, objv[2], GaimTclRefStatusType)) == NULL) | |
1415 return TCL_ERROR; | |
1416 Tcl_SetBooleanObj(result, gaim_status_type_is_exclusive(status_type)); | |
1417 break; | |
1418 case CMD_STATUS_TYPE_ID: | |
1419 if (objc != 3) { | |
1420 Tcl_WrongNumArgs(interp, 2, objv, "statustype"); | |
1421 return TCL_ERROR; | |
1422 } | |
1423 if ((status_type = gaim_tcl_ref_get(interp, objv[2], GaimTclRefStatusType)) == NULL) | |
1424 return TCL_ERROR; | |
1425 Tcl_SetStringObj(result, gaim_status_type_get_id(status_type), -1); | |
1426 break; | |
1427 case CMD_STATUS_TYPE_INDEPENDENT: | |
1428 if (objc != 3) { | |
1429 Tcl_WrongNumArgs(interp, 2, objv, "statustype"); | |
1430 return TCL_ERROR; | |
1431 } | |
1432 if ((status_type = gaim_tcl_ref_get(interp, objv[2], GaimTclRefStatusType)) == NULL) | |
1433 return TCL_ERROR; | |
1434 Tcl_SetBooleanObj(result, gaim_status_type_is_independent(status_type)); | |
1435 break; | |
1436 case CMD_STATUS_TYPE_NAME: | |
1437 if (objc != 3) { | |
1438 Tcl_WrongNumArgs(interp, 2, objv, "statustype"); | |
1439 return TCL_ERROR; | |
1440 } | |
1441 if ((status_type = gaim_tcl_ref_get(interp, objv[2], GaimTclRefStatusType)) == NULL) | |
1442 return TCL_ERROR; | |
1443 Tcl_SetStringObj(result, gaim_status_type_get_name(status_type), -1); | |
1444 break; | |
1445 case CMD_STATUS_TYPE_PRIMITIVE: | |
1446 if (objc != 3) { | |
1447 Tcl_WrongNumArgs(interp, 2, objv, "statustype"); | |
1448 return TCL_ERROR; | |
1449 } | |
1450 if ((status_type = gaim_tcl_ref_get(interp, objv[2], GaimTclRefStatusType)) == NULL) | |
1451 return TCL_ERROR; | |
1452 Tcl_SetStringObj(result, gaim_primitive_get_id_from_type(gaim_status_type_get_primitive(status_type)), -1); | |
1453 break; | |
1454 case CMD_STATUS_TYPE_PRIMARY_ATTR: | |
1455 if (objc != 3) { | |
1456 Tcl_WrongNumArgs(interp, 2, objv, "statustype"); | |
1457 return TCL_ERROR; | |
1458 } | |
1459 if ((status_type = gaim_tcl_ref_get(interp, objv[2], GaimTclRefStatusType)) == NULL) | |
1460 return TCL_ERROR; | |
1461 Tcl_SetStringObj(result, gaim_status_type_get_primary_attr(status_type), -1); | |
1462 break; | |
1463 case CMD_STATUS_TYPE_SAVEABLE: | |
1464 if (objc != 3) { | |
1465 Tcl_WrongNumArgs(interp, 2, objv, "statustype"); | |
1466 return TCL_ERROR; | |
1467 } | |
1468 if ((status_type = gaim_tcl_ref_get(interp, objv[2], GaimTclRefStatusType)) == NULL) | |
1469 return TCL_ERROR; | |
1470 Tcl_SetBooleanObj(result, gaim_status_type_is_saveable(status_type)); | |
1471 break; | |
1472 case CMD_STATUS_TYPE_USER_SETTABLE: | |
1473 if (objc != 3) { | |
1474 Tcl_WrongNumArgs(interp, 2, objv, "statustype"); | |
1475 return TCL_ERROR; | |
1476 } | |
1477 if ((status_type = gaim_tcl_ref_get(interp, objv[2], GaimTclRefStatusType)) == NULL) | |
1478 return TCL_ERROR; | |
1479 Tcl_SetBooleanObj(result, gaim_status_type_is_user_settable(status_type)); | |
1480 break; | |
1481 } | |
1482 | |
1483 return TCL_OK; | |
1484 } | |
1485 | |
6694 | 1486 static gboolean unload_self(gpointer data) |
1487 { | |
1488 GaimPlugin *plugin = data; | |
1489 gaim_plugin_unload(plugin); | |
1490 return FALSE; | |
1491 } | |
1492 | |
1493 int tcl_cmd_unload(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) | |
1494 { | |
1495 GaimPlugin *plugin; | |
1496 if (objc != 1) { | |
1497 Tcl_WrongNumArgs(interp, 1, objv, ""); | |
1498 return TCL_ERROR; | |
1499 } | |
1500 | |
1501 if ((plugin = tcl_interp_get_plugin(interp)) == NULL) { | |
1502 /* This isn't exactly OK, but heh. What do you do? */ | |
1503 return TCL_OK; | |
1504 } | |
1505 /* We can't unload immediately, but we can unload at the first | |
1506 * known safe opportunity. */ | |
1507 g_idle_add(unload_self, (gpointer)plugin); | |
1508 | |
1509 return TCL_OK; | |
1510 } |