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