comparison libpurple/plugins/tcl/tcl_cmds.c @ 20166:3287445c05a8

The second in a series of Tcl-fixing patches from venks on irc.freenode.net. This replaces erroneous result returns (which used Tcl_Set*Obj on the result retrieved by Tcl_GetObjResult) with Tcl_SetObjResult and new objects.
author Ethan Blanton <elb@pidgin.im>
date Wed, 19 Sep 2007 02:38:09 +0000
parents 506f0f7f4f21
children 5b6d6ea542b8
comparison
equal deleted inserted replaced
20165:506f0f7f4f21 20166:3287445c05a8
53 for (cur = purple_accounts_get_all(); cur != NULL; cur = g_list_next(cur)) { 53 for (cur = purple_accounts_get_all(); cur != NULL; cur = g_list_next(cur)) {
54 if (account == cur->data) 54 if (account == cur->data)
55 return account; 55 return account;
56 } 56 }
57 if (interp != NULL) 57 if (interp != NULL)
58 Tcl_SetStringObj(Tcl_GetObjResult(interp), "invalid account", -1); 58 Tcl_SetObjResult(interp, Tcl_NewStringObj("invalid account", -1));
59 return NULL; 59 return NULL;
60 } 60 }
61 61
62 static PurpleConversation *tcl_validate_conversation(Tcl_Obj *obj, Tcl_Interp *interp) 62 static PurpleConversation *tcl_validate_conversation(Tcl_Obj *obj, Tcl_Interp *interp)
63 { 63 {
72 for (cur = purple_get_conversations(); cur != NULL; cur = g_list_next(cur)) { 72 for (cur = purple_get_conversations(); cur != NULL; cur = g_list_next(cur)) {
73 if (convo == cur->data) 73 if (convo == cur->data)
74 return convo; 74 return convo;
75 } 75 }
76 if (interp != NULL) 76 if (interp != NULL)
77 Tcl_SetStringObj(Tcl_GetObjResult(interp), "invalid conversation", -1); 77 Tcl_SetObjResult(interp, Tcl_NewStringObj("invalid conversation", -1));
78 return NULL; 78 return NULL;
79 } 79 }
80 80
81 static PurpleConnection *tcl_validate_gc(Tcl_Obj *obj, Tcl_Interp *interp) 81 static PurpleConnection *tcl_validate_gc(Tcl_Obj *obj, Tcl_Interp *interp)
82 { 82 {
95 return NULL; 95 return NULL;
96 } 96 }
97 97
98 int tcl_cmd_account(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) 98 int tcl_cmd_account(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
99 { 99 {
100 Tcl_Obj *result = Tcl_GetObjResult(interp), *list, *elem; 100 Tcl_Obj *result, *list, *elem;
101 const char *cmds[] = { "alias", "connect", "connection", "disconnect", 101 const char *cmds[] = { "alias", "connect", "connection", "disconnect",
102 "enabled", "find", "handle", "isconnected", 102 "enabled", "find", "handle", "isconnected",
103 "list", "presence", "protocol", "status", 103 "list", "presence", "protocol", "status",
104 "status_type", "status_types", "username", 104 "status_type", "status_types", "username",
105 NULL }; 105 NULL };
137 return TCL_ERROR; 137 return TCL_ERROR;
138 } 138 }
139 if ((account = tcl_validate_account(objv[2], interp)) == NULL) 139 if ((account = tcl_validate_account(objv[2], interp)) == NULL)
140 return TCL_ERROR; 140 return TCL_ERROR;
141 alias = purple_account_get_alias(account); 141 alias = purple_account_get_alias(account);
142 Tcl_SetStringObj(result, alias ? (char *)alias : "", -1); 142 Tcl_SetObjResult(interp, Tcl_NewStringObj(alias ? (char *)alias : "", -1));
143 break; 143 break;
144 case CMD_ACCOUNT_CONNECT: 144 case CMD_ACCOUNT_CONNECT:
145 if (objc != 3) { 145 if (objc != 3) {
146 Tcl_WrongNumArgs(interp, 2, objv, "account"); 146 Tcl_WrongNumArgs(interp, 2, objv, "account");
147 return TCL_ERROR; 147 return TCL_ERROR;
162 162
163 if ((account = tcl_validate_account(objv[2], interp)) == NULL) 163 if ((account = tcl_validate_account(objv[2], interp)) == NULL)
164 return TCL_ERROR; 164 return TCL_ERROR;
165 Tcl_SetObjResult(interp, 165 Tcl_SetObjResult(interp,
166 purple_tcl_ref_new(PurpleTclRefConnection, 166 purple_tcl_ref_new(PurpleTclRefConnection,
167 purple_account_get_connection(account))); 167 purple_account_get_connection(account)));
168 break; 168 break;
169 case CMD_ACCOUNT_DISCONNECT: 169 case CMD_ACCOUNT_DISCONNECT:
170 if (objc != 3) { 170 if (objc != 3) {
171 Tcl_WrongNumArgs(interp, 2, objv, "account"); 171 Tcl_WrongNumArgs(interp, 2, objv, "account");
172 return TCL_ERROR; 172 return TCL_ERROR;
181 return TCL_ERROR; 181 return TCL_ERROR;
182 } 182 }
183 if ((account = tcl_validate_account(objv[2], interp)) == NULL) 183 if ((account = tcl_validate_account(objv[2], interp)) == NULL)
184 return TCL_ERROR; 184 return TCL_ERROR;
185 if (objc == 3) { 185 if (objc == 3) {
186 Tcl_SetBooleanObj(result, 186 Tcl_SetObjResult(interp,
187 purple_account_get_enabled(account, 187 Tcl_NewBooleanObj(
188 purple_core_get_ui())); 188 purple_account_get_enabled(account,
189 purple_core_get_ui())));
189 } else { 190 } else {
190 if ((error = Tcl_GetBooleanFromObj(interp, objv[3], &b)) != TCL_OK) 191 if ((error = Tcl_GetBooleanFromObj(interp, objv[3], &b)) != TCL_OK)
191 return TCL_ERROR; 192 return TCL_ERROR;
192 purple_account_set_enabled(account, purple_core_get_ui(), b); 193 purple_account_set_enabled(account, purple_core_get_ui(), b);
193 } 194 }
216 Tcl_WrongNumArgs(interp, 2, objv, "account"); 217 Tcl_WrongNumArgs(interp, 2, objv, "account");
217 return TCL_ERROR; 218 return TCL_ERROR;
218 } 219 }
219 if ((account = tcl_validate_account(objv[2], interp)) == NULL) 220 if ((account = tcl_validate_account(objv[2], interp)) == NULL)
220 return TCL_ERROR; 221 return TCL_ERROR;
221 Tcl_SetBooleanObj(result, purple_account_is_connected(account)); 222 Tcl_SetObjResult(interp,
223 Tcl_NewBooleanObj(
224 purple_account_is_connected(account)));
222 break; 225 break;
223 case CMD_ACCOUNT_LIST: 226 case CMD_ACCOUNT_LIST:
224 listopt = CMD_ACCOUNTLIST_ALL; 227 listopt = CMD_ACCOUNTLIST_ALL;
225 if (objc > 3) { 228 if (objc > 3) {
226 Tcl_WrongNumArgs(interp, 2, objv, "?option?"); 229 Tcl_WrongNumArgs(interp, 2, objv, "?option?");
255 Tcl_WrongNumArgs(interp, 2, objv, "account"); 258 Tcl_WrongNumArgs(interp, 2, objv, "account");
256 return TCL_ERROR; 259 return TCL_ERROR;
257 } 260 }
258 if ((account = tcl_validate_account(objv[2], interp)) == NULL) 261 if ((account = tcl_validate_account(objv[2], interp)) == NULL)
259 return TCL_ERROR; 262 return TCL_ERROR;
260 Tcl_SetStringObj(result, (char *)purple_account_get_protocol_id(account), -1); 263 Tcl_SetObjResult(interp, Tcl_NewStringObj((char *)purple_account_get_protocol_id(account), -1));
261 break; 264 break;
262 case CMD_ACCOUNT_STATUS: 265 case CMD_ACCOUNT_STATUS:
263 if (objc < 3) { 266 if (objc < 3) {
264 Tcl_WrongNumArgs(interp, 2, objv, "account ?status_id name value ...?"); 267 Tcl_WrongNumArgs(interp, 2, objv, "account ?status_id name value ...?");
265 return TCL_ERROR; 268 return TCL_ERROR;
271 purple_tcl_ref_new(PurpleTclRefStatus, 274 purple_tcl_ref_new(PurpleTclRefStatus,
272 purple_account_get_active_status(account))); 275 purple_account_get_active_status(account)));
273 } else { 276 } else {
274 GList *l = NULL; 277 GList *l = NULL;
275 if (objc % 2) { 278 if (objc % 2) {
276 Tcl_SetStringObj(result, "name without value setting status", -1); 279 Tcl_SetObjResult(interp, Tcl_NewStringObj("name without value setting status", -1));
277 return TCL_ERROR; 280 return TCL_ERROR;
278 } 281 }
279 status = purple_account_get_status(account, Tcl_GetString(objv[3])); 282 status = purple_account_get_status(account, Tcl_GetString(objv[3]));
280 if (status == NULL) { 283 if (status == NULL) {
281 Tcl_SetStringObj(result, "invalid status for account", -1); 284 Tcl_SetObjResult(interp, Tcl_NewStringObj("invalid status for account", -1));
282 return TCL_ERROR; 285 return TCL_ERROR;
283 } 286 }
284 for (i = 4; i < objc; i += 2) { 287 for (i = 4; i < objc; i += 2) {
285 attr_id = Tcl_GetString(objv[i]); 288 attr_id = Tcl_GetString(objv[i]);
286 value = purple_status_get_attr_value(status, attr_id); 289 value = purple_status_get_attr_value(status, attr_id);
287 if (value == NULL) { 290 if (value == NULL) {
288 Tcl_SetStringObj(result, "invalid attribute for account", -1); 291 Tcl_SetObjResult(interp, Tcl_NewStringObj("invalid attribute for account", -1));
289 return TCL_ERROR; 292 return TCL_ERROR;
290 } 293 }
291 switch (purple_value_get_type(value)) { 294 switch (purple_value_get_type(value)) {
292 case PURPLE_TYPE_BOOLEAN: 295 case PURPLE_TYPE_BOOLEAN:
293 error = Tcl_GetBooleanFromObj(interp, objv[i + 1], &b); 296 error = Tcl_GetBooleanFromObj(interp, objv[i + 1], &b);
306 case PURPLE_TYPE_STRING: 309 case PURPLE_TYPE_STRING:
307 l = g_list_append(l, attr_id); 310 l = g_list_append(l, attr_id);
308 l = g_list_append(l, Tcl_GetString(objv[i + 1])); 311 l = g_list_append(l, Tcl_GetString(objv[i + 1]));
309 break; 312 break;
310 default: 313 default:
311 Tcl_SetStringObj(result, "unknown PurpleValue type", -1); 314 Tcl_SetObjResult(interp, Tcl_NewStringObj("unknown PurpleValue type", -1));
312 return TCL_ERROR; 315 return TCL_ERROR;
313 } 316 }
314 } 317 }
315 purple_account_set_status_list(account, Tcl_GetString(objv[3]), TRUE, l); 318 purple_account_set_status_list(account, Tcl_GetString(objv[3]), TRUE, l);
316 g_list_free(l); 319 g_list_free(l);
327 status_type = purple_account_get_status_type(account, 330 status_type = purple_account_get_status_type(account,
328 Tcl_GetString(objv[3])); 331 Tcl_GetString(objv[3]));
329 } else { 332 } else {
330 PurpleStatusPrimitive primitive; 333 PurpleStatusPrimitive primitive;
331 if (strcmp(Tcl_GetString(objv[3]), "-primitive")) { 334 if (strcmp(Tcl_GetString(objv[3]), "-primitive")) {
332 Tcl_SetStringObj(result, "bad option \"", -1); 335 result = Tcl_NewStringObj("bad option \"", -1);
333 Tcl_AppendObjToObj(result, objv[3]); 336 Tcl_AppendObjToObj(result, objv[3]);
334 Tcl_AppendToObj(result, 337 Tcl_AppendToObj(result, "\": should be -primitive", -1);
335 "\": should be -primitive", -1); 338 Tcl_SetObjResult(interp,result);
336 return TCL_ERROR; 339 return TCL_ERROR;
337 } 340 }
338 primitive = purple_primitive_get_type_from_id(Tcl_GetString(objv[4])); 341 primitive = purple_primitive_get_type_from_id(Tcl_GetString(objv[4]));
339 status_type = purple_account_get_status_type_with_primitive(account, 342 status_type = purple_account_get_status_type_with_primitive(account,
340 primitive); 343 primitive);
341 } 344 }
342 if (status_type == NULL) { 345 if (status_type == NULL) {
343 Tcl_SetStringObj(result, "status type not found", -1); 346 Tcl_SetObjResult(interp, Tcl_NewStringObj("status type not found", -1));
344 return TCL_ERROR; 347 return TCL_ERROR;
345 } 348 }
346 Tcl_SetObjResult(interp, 349 Tcl_SetObjResult(interp,
347 purple_tcl_ref_new(PurpleTclRefStatusType, 350 purple_tcl_ref_new(PurpleTclRefStatusType,
348 status_type)); 351 status_type));
368 Tcl_WrongNumArgs(interp, 2, objv, "account"); 371 Tcl_WrongNumArgs(interp, 2, objv, "account");
369 return TCL_ERROR; 372 return TCL_ERROR;
370 } 373 }
371 if ((account = tcl_validate_account(objv[2], interp)) == NULL) 374 if ((account = tcl_validate_account(objv[2], interp)) == NULL)
372 return TCL_ERROR; 375 return TCL_ERROR;
373 Tcl_SetStringObj(result, (char *)purple_account_get_username(account), -1); 376 Tcl_SetObjResult(interp,
377 Tcl_NewStringObj((char *)purple_account_get_username(account), -1));
374 break; 378 break;
375 } 379 }
376 380
377 return TCL_OK; 381 return TCL_OK;
378 } 382 }
383 PurpleAccount *account; 387 PurpleAccount *account;
384 char *name; 388 char *name;
385 char *type; 389 char *type;
386 390
387 if (count < 3) { 391 if (count < 3) {
388 Tcl_SetStringObj(Tcl_GetObjResult(interp), "list too short", -1); 392 Tcl_SetObjResult(interp,
393 Tcl_NewStringObj("list too short", -1));
389 return NULL; 394 return NULL;
390 } 395 }
391 396
392 type = Tcl_GetString(elems[0]); 397 type = Tcl_GetString(elems[0]);
393 name = Tcl_GetString(elems[1]); 398 name = Tcl_GetString(elems[1]);
420 return TCL_ERROR; 425 return TCL_ERROR;
421 } 426 }
422 if ((error = Tcl_GetIndexFromObj(interp, objv[1], cmds, "subcommand", 0, (int *)&cmd)) != TCL_OK) 427 if ((error = Tcl_GetIndexFromObj(interp, objv[1], cmds, "subcommand", 0, (int *)&cmd)) != TCL_OK)
423 return error; 428 return error;
424 429
425 result = Tcl_GetObjResult(interp);
426
427 switch (cmd) { 430 switch (cmd) {
428 case CMD_BUDDY_ALIAS: 431 case CMD_BUDDY_ALIAS:
429 if (objc != 3) { 432 if (objc != 3) {
430 Tcl_WrongNumArgs(interp, 2, objv, "buddy"); 433 Tcl_WrongNumArgs(interp, 2, objv, "buddy");
431 return TCL_ERROR; 434 return TCL_ERROR;
433 if ((error = Tcl_ListObjGetElements(interp, objv[2], &count, &elems)) != TCL_OK) 436 if ((error = Tcl_ListObjGetElements(interp, objv[2], &count, &elems)) != TCL_OK)
434 return error; 437 return error;
435 if ((node = tcl_list_to_buddy(interp, count, elems)) == NULL) 438 if ((node = tcl_list_to_buddy(interp, count, elems)) == NULL)
436 return TCL_ERROR; 439 return TCL_ERROR;
437 if (node->type == PURPLE_BLIST_CHAT_NODE) 440 if (node->type == PURPLE_BLIST_CHAT_NODE)
438 Tcl_SetStringObj(result, ((PurpleChat *)node)->alias, -1); 441 Tcl_SetObjResult(interp,
442 Tcl_NewStringObj(((PurpleChat *)node)->alias, -1));
439 else if (node->type == PURPLE_BLIST_BUDDY_NODE) 443 else if (node->type == PURPLE_BLIST_BUDDY_NODE)
440 Tcl_SetStringObj(result, (char *)purple_buddy_get_alias((PurpleBuddy *)node), -1); 444 Tcl_SetObjResult(interp,
445 Tcl_NewStringObj((char *)purple_buddy_get_alias((PurpleBuddy *)node), -1));
441 return TCL_OK; 446 return TCL_OK;
442 break; 447 break;
443 case CMD_BUDDY_HANDLE: 448 case CMD_BUDDY_HANDLE:
444 if (objc != 2) { 449 if (objc != 2) {
445 Tcl_WrongNumArgs(interp, 2, objv, ""); 450 Tcl_WrongNumArgs(interp, 2, objv, "");
456 } 461 }
457 if (objc == 3) { 462 if (objc == 3) {
458 if ((error = Tcl_ListObjGetElements(interp, objv[2], &count, &elems)) != TCL_OK) 463 if ((error = Tcl_ListObjGetElements(interp, objv[2], &count, &elems)) != TCL_OK)
459 return error; 464 return error;
460 if (count < 3) { 465 if (count < 3) {
461 Tcl_SetStringObj(result, "buddy too short", -1); 466 Tcl_SetObjResult(interp,
467 Tcl_NewStringObj("buddy too short", -1));
462 return TCL_ERROR; 468 return TCL_ERROR;
463 } 469 }
464 if (strcmp("buddy", Tcl_GetString(elems[0]))) { 470 if (strcmp("buddy", Tcl_GetString(elems[0]))) {
465 Tcl_SetStringObj(result, "invalid buddy", -1); 471 Tcl_SetObjResult(interp,
472 Tcl_NewStringObj("invalid buddy", -1));
466 return TCL_ERROR; 473 return TCL_ERROR;
467 } 474 }
468 if ((account = tcl_validate_account(elems[2], interp)) == NULL) 475 if ((account = tcl_validate_account(elems[2], interp)) == NULL)
469 return TCL_ERROR; 476 return TCL_ERROR;
470 serv_get_info(purple_account_get_connection(account), Tcl_GetString(elems[1])); 477 serv_get_info(purple_account_get_connection(account), Tcl_GetString(elems[1]));
477 case CMD_BUDDY_LIST: 484 case CMD_BUDDY_LIST:
478 if (objc == 3) { 485 if (objc == 3) {
479 if (!strcmp("-all", Tcl_GetString(objv[2]))) { 486 if (!strcmp("-all", Tcl_GetString(objv[2]))) {
480 all = 1; 487 all = 1;
481 } else { 488 } else {
482 Tcl_SetStringObj(result, "", -1); 489 result = Tcl_NewStringObj("",-1);
483 Tcl_AppendStringsToObj(result, "unknown option: ", Tcl_GetString(objv[2]), NULL); 490 Tcl_AppendStringsToObj(result, "unknown option: ", Tcl_GetString(objv[2]), NULL);
491 Tcl_SetObjResult(interp,result);
484 return TCL_ERROR; 492 return TCL_ERROR;
485 } 493 }
486 } 494 }
487 list = Tcl_NewListObj(0, NULL); 495 list = Tcl_NewListObj(0, NULL);
488 blist = purple_get_blist(); 496 blist = purple_get_blist();
549 int tcl_cmd_cmd(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) 557 int tcl_cmd_cmd(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
550 { 558 {
551 const char *cmds[] = { "do", "help", "list", "register", "unregister", NULL }; 559 const char *cmds[] = { "do", "help", "list", "register", "unregister", NULL };
552 enum { CMD_CMD_DO, CMD_CMD_HELP, CMD_CMD_LIST, CMD_CMD_REGISTER, CMD_CMD_UNREGISTER } cmd; 560 enum { CMD_CMD_DO, CMD_CMD_HELP, CMD_CMD_LIST, CMD_CMD_REGISTER, CMD_CMD_UNREGISTER } cmd;
553 struct tcl_cmd_handler *handler; 561 struct tcl_cmd_handler *handler;
554 Tcl_Obj *list, *elem, *result = Tcl_GetObjResult(interp); 562 Tcl_Obj *list, *elem;
555 PurpleConversation *convo; 563 PurpleConversation *convo;
556 PurpleCmdId id; 564 PurpleCmdId id;
557 PurpleCmdStatus status; 565 PurpleCmdStatus status;
558 int error; 566 int error;
559 GList *l, *cur; 567 GList *l, *cur;
577 return TCL_ERROR; 585 return TCL_ERROR;
578 escaped = g_markup_escape_text(Tcl_GetString(objv[3]), -1); 586 escaped = g_markup_escape_text(Tcl_GetString(objv[3]), -1);
579 status = purple_cmd_do_command(convo, Tcl_GetString(objv[3]), 587 status = purple_cmd_do_command(convo, Tcl_GetString(objv[3]),
580 escaped, &errstr); 588 escaped, &errstr);
581 g_free(escaped); 589 g_free(escaped);
582 Tcl_SetStringObj(result, errstr ? (char *)errstr : "", -1); 590 Tcl_SetObjResult(interp,
591 Tcl_NewStringObj(errstr ? (char *)errstr : "", -1));
583 g_free(errstr); 592 g_free(errstr);
584 if (status != PURPLE_CMD_STATUS_OK) { 593 if (status != PURPLE_CMD_STATUS_OK) {
585 return TCL_ERROR; 594 return TCL_ERROR;
586 } 595 }
587 break; 596 break;
642 handler->proc = objv[7]; 651 handler->proc = objv[7];
643 handler->helpstr = Tcl_GetString(objv[8]); 652 handler->helpstr = Tcl_GetString(objv[8]);
644 handler->interp = interp; 653 handler->interp = interp;
645 if ((id = tcl_cmd_register(handler)) == 0) { 654 if ((id = tcl_cmd_register(handler)) == 0) {
646 tcl_cmd_handler_free(handler); 655 tcl_cmd_handler_free(handler);
647 Tcl_SetIntObj(result, 0); 656 Tcl_SetObjResult(interp, Tcl_NewIntObj(0));
648 } else { 657 } else {
649 handler->id = id; 658 handler->id = id;
650 Tcl_SetIntObj(result, id); 659 Tcl_SetObjResult(interp, Tcl_NewIntObj(id));
651 } 660 }
652 break; 661 break;
653 case CMD_CMD_UNREGISTER: 662 case CMD_CMD_UNREGISTER:
654 if (objc != 3) { 663 if (objc != 3) {
655 Tcl_WrongNumArgs(interp, 2, objv, "id"); 664 Tcl_WrongNumArgs(interp, 2, objv, "id");
665 return TCL_OK; 674 return TCL_OK;
666 } 675 }
667 676
668 int tcl_cmd_connection(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) 677 int tcl_cmd_connection(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
669 { 678 {
670 Tcl_Obj *result = Tcl_GetObjResult(interp), *list, *elem; 679 Tcl_Obj *list, *elem;
671 const char *cmds[] = { "account", "displayname", "handle", "list", NULL }; 680 const char *cmds[] = { "account", "displayname", "handle", "list", NULL };
672 enum { CMD_CONN_ACCOUNT, CMD_CONN_DISPLAYNAME, CMD_CONN_HANDLE, CMD_CONN_LIST } cmd; 681 enum { CMD_CONN_ACCOUNT, CMD_CONN_DISPLAYNAME, CMD_CONN_HANDLE, CMD_CONN_LIST } cmd;
673 int error; 682 int error;
674 GList *cur; 683 GList *cur;
675 PurpleConnection *gc; 684 PurpleConnection *gc;
699 Tcl_WrongNumArgs(interp, 2, objv, "gc"); 708 Tcl_WrongNumArgs(interp, 2, objv, "gc");
700 return TCL_ERROR; 709 return TCL_ERROR;
701 } 710 }
702 if ((gc = tcl_validate_gc(objv[2], interp)) == NULL) 711 if ((gc = tcl_validate_gc(objv[2], interp)) == NULL)
703 return TCL_ERROR; 712 return TCL_ERROR;
704 Tcl_SetStringObj(result, (char *)purple_connection_get_display_name(gc), -1); 713 Tcl_SetObjResult(interp,
714 Tcl_NewStringObj(purple_connection_get_display_name(gc), -1));
705 break; 715 break;
706 case CMD_CONN_HANDLE: 716 case CMD_CONN_HANDLE:
707 if (objc != 2) { 717 if (objc != 2) {
708 Tcl_WrongNumArgs(interp, 2, objv, ""); 718 Tcl_WrongNumArgs(interp, 2, objv, "");
709 return TCL_ERROR; 719 return TCL_ERROR;
728 return TCL_OK; 738 return TCL_OK;
729 } 739 }
730 740
731 int tcl_cmd_conversation(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) 741 int tcl_cmd_conversation(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
732 { 742 {
733 Tcl_Obj *list, *elem, *result = Tcl_GetObjResult(interp); 743 Tcl_Obj *list, *elem;
734 const char *cmds[] = { "find", "handle", "list", "new", "write", "name", "title", "send", NULL }; 744 const char *cmds[] = { "find", "handle", "list", "new", "write", "name", "title", "send", NULL };
735 enum { CMD_CONV_FIND, CMD_CONV_HANDLE, CMD_CONV_LIST, CMD_CONV_NEW, CMD_CONV_WRITE , CMD_CONV_NAME, CMD_CONV_TITLE, CMD_CONV_SEND } cmd; 745 enum { CMD_CONV_FIND, CMD_CONV_HANDLE, CMD_CONV_LIST, CMD_CONV_NEW, CMD_CONV_WRITE , CMD_CONV_NAME, CMD_CONV_TITLE, CMD_CONV_SEND } cmd;
736 const char *styles[] = { "send", "recv", "system", NULL }; 746 const char *styles[] = { "send", "recv", "system", NULL };
737 enum { CMD_CONV_WRITE_SEND, CMD_CONV_WRITE_RECV, CMD_CONV_WRITE_SYSTEM } style; 747 enum { CMD_CONV_WRITE_SEND, CMD_CONV_WRITE_RECV, CMD_CONV_WRITE_SYSTEM } style;
738 const char *newopts[] = { "-chat", "-im" }; 748 const char *newopts[] = { "-chat", "-im" };
852 return TCL_ERROR; 862 return TCL_ERROR;
853 } 863 }
854 864
855 if ((convo = tcl_validate_conversation(objv[2], interp)) == NULL) 865 if ((convo = tcl_validate_conversation(objv[2], interp)) == NULL)
856 return TCL_ERROR; 866 return TCL_ERROR;
857 Tcl_SetStringObj(result, (char *)purple_conversation_get_name(convo), -1); 867 Tcl_SetObjResult(interp,
868 Tcl_NewStringObj((char *)purple_conversation_get_name(convo), -1));
858 break; 869 break;
859 case CMD_CONV_TITLE: 870 case CMD_CONV_TITLE:
860 if (objc != 3) { 871 if (objc != 3) {
861 Tcl_WrongNumArgs(interp, 2, objv, "conversation"); 872 Tcl_WrongNumArgs(interp, 2, objv, "conversation");
862 return TCL_ERROR; 873 return TCL_ERROR;
863 } 874 }
864 875
865 if ((convo = tcl_validate_conversation(objv[2], interp)) == NULL) 876 if ((convo = tcl_validate_conversation(objv[2], interp)) == NULL)
866 return TCL_ERROR; 877 return TCL_ERROR;
867 Tcl_SetStringObj(result, (char *)purple_conversation_get_title(convo), -1); 878 Tcl_SetObjResult(interp,
879 Tcl_NewStringObj((char *)purple_conversation_get_title(convo), -1));
868 break; 880 break;
869 case CMD_CONV_SEND: 881 case CMD_CONV_SEND:
870 if (objc != 4) { 882 if (objc != 4) {
871 Tcl_WrongNumArgs(interp, 2, objv, "conversation message"); 883 Tcl_WrongNumArgs(interp, 2, objv, "conversation message");
872 return TCL_ERROR; 884 return TCL_ERROR;
1005 return TCL_OK; 1017 return TCL_OK;
1006 } 1018 }
1007 1019
1008 int tcl_cmd_prefs(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) 1020 int tcl_cmd_prefs(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
1009 { 1021 {
1010 Tcl_Obj *result, *list, *elem, **elems; 1022 Tcl_Obj *list, *elem, **elems;
1011 const char *cmds[] = { "get", "set", "type", NULL }; 1023 const char *cmds[] = { "get", "set", "type", NULL };
1012 enum { CMD_PREFS_GET, CMD_PREFS_SET, CMD_PREFS_TYPE } cmd; 1024 enum { CMD_PREFS_GET, CMD_PREFS_SET, CMD_PREFS_TYPE } cmd;
1013 /* char *types[] = { "none", "boolean", "int", "string", "stringlist", NULL }; */ 1025 /* char *types[] = { "none", "boolean", "int", "string", "stringlist", NULL }; */
1014 /* enum { TCL_PREFS_NONE, TCL_PREFS_BOOL, TCL_PREFS_INT, TCL_PREFS_STRING, TCL_PREFS_STRINGLIST } type; */ 1026 /* enum { TCL_PREFS_NONE, TCL_PREFS_BOOL, TCL_PREFS_INT, TCL_PREFS_STRING, TCL_PREFS_STRINGLIST } type; */
1015 PurplePrefType preftype; 1027 PurplePrefType preftype;
1022 } 1034 }
1023 1035
1024 if ((error = Tcl_GetIndexFromObj(interp, objv[1], cmds, "subcommand", 0, (int *)&cmd)) != TCL_OK) 1036 if ((error = Tcl_GetIndexFromObj(interp, objv[1], cmds, "subcommand", 0, (int *)&cmd)) != TCL_OK)
1025 return error; 1037 return error;
1026 1038
1027 result = Tcl_GetObjResult(interp);
1028 switch (cmd) { 1039 switch (cmd) {
1029 case CMD_PREFS_GET: 1040 case CMD_PREFS_GET:
1030 if (objc != 3) { 1041 if (objc != 3) {
1031 Tcl_WrongNumArgs(interp, 1, objv, "path"); 1042 Tcl_WrongNumArgs(interp, 1, objv, "path");
1032 return TCL_ERROR; 1043 return TCL_ERROR;
1033 } 1044 }
1034 preftype = purple_prefs_get_type(Tcl_GetString(objv[2])); 1045 preftype = purple_prefs_get_type(Tcl_GetString(objv[2]));
1035 switch (preftype) { 1046 switch (preftype) {
1036 case PURPLE_PREF_NONE: 1047 case PURPLE_PREF_NONE:
1037 Tcl_SetStringObj(result, "pref type none", -1); 1048 Tcl_SetObjResult(interp,
1049 Tcl_NewStringObj("pref type none", -1));
1038 return TCL_ERROR; 1050 return TCL_ERROR;
1039 break; 1051 break;
1040 case PURPLE_PREF_BOOLEAN: 1052 case PURPLE_PREF_BOOLEAN:
1041 Tcl_SetBooleanObj(result, purple_prefs_get_bool(Tcl_GetString(objv[2]))); 1053 Tcl_SetObjResult(interp,
1054 Tcl_NewBooleanObj(
1055 purple_prefs_get_bool(Tcl_GetString(objv[2]))));
1042 break; 1056 break;
1043 case PURPLE_PREF_INT: 1057 case PURPLE_PREF_INT:
1044 Tcl_SetIntObj(result, purple_prefs_get_int(Tcl_GetString(objv[2]))); 1058 Tcl_SetObjResult(interp, Tcl_NewIntObj(purple_prefs_get_int(Tcl_GetString(objv[2]))));
1045 break; 1059 break;
1046 case PURPLE_PREF_STRING: 1060 case PURPLE_PREF_STRING:
1047 Tcl_SetStringObj(result, (char *)purple_prefs_get_string(Tcl_GetString(objv[2])), -1); 1061 Tcl_SetObjResult(interp,
1062 Tcl_NewStringObj((char *)purple_prefs_get_string(Tcl_GetString(objv[2])), -1));
1048 break; 1063 break;
1049 case PURPLE_PREF_STRING_LIST: 1064 case PURPLE_PREF_STRING_LIST:
1050 cur = purple_prefs_get_string_list(Tcl_GetString(objv[2])); 1065 cur = purple_prefs_get_string_list(Tcl_GetString(objv[2]));
1051 list = Tcl_NewListObj(0, NULL); 1066 list = Tcl_NewListObj(0, NULL);
1052 while (cur != NULL) { 1067 while (cur != NULL) {
1056 } 1071 }
1057 Tcl_SetObjResult(interp, list); 1072 Tcl_SetObjResult(interp, list);
1058 break; 1073 break;
1059 default: 1074 default:
1060 purple_debug(PURPLE_DEBUG_ERROR, "tcl", "tcl does not know about pref type %d\n", preftype); 1075 purple_debug(PURPLE_DEBUG_ERROR, "tcl", "tcl does not know about pref type %d\n", preftype);
1061 Tcl_SetStringObj(result, "unknown pref type", -1); 1076 Tcl_SetObjResult(interp,
1077 Tcl_NewStringObj("unknown pref type", -1));
1062 return TCL_ERROR; 1078 return TCL_ERROR;
1063 } 1079 }
1064 break; 1080 break;
1065 case CMD_PREFS_SET: 1081 case CMD_PREFS_SET:
1066 if (objc != 4) { 1082 if (objc != 4) {
1068 return TCL_ERROR; 1084 return TCL_ERROR;
1069 } 1085 }
1070 preftype = purple_prefs_get_type(Tcl_GetString(objv[2])); 1086 preftype = purple_prefs_get_type(Tcl_GetString(objv[2]));
1071 switch (preftype) { 1087 switch (preftype) {
1072 case PURPLE_PREF_NONE: 1088 case PURPLE_PREF_NONE:
1073 Tcl_SetStringObj(result, "bad path or pref type none", -1); 1089 Tcl_SetObjResult(interp,
1090 Tcl_NewStringObj("bad path or pref type none", -1));
1074 return TCL_ERROR; 1091 return TCL_ERROR;
1075 break; 1092 break;
1076 case PURPLE_PREF_BOOLEAN: 1093 case PURPLE_PREF_BOOLEAN:
1077 if ((error = Tcl_GetBooleanFromObj(interp, objv[3], &intval)) != TCL_OK) 1094 if ((error = Tcl_GetBooleanFromObj(interp, objv[3], &intval)) != TCL_OK)
1078 return error; 1095 return error;
1107 return TCL_ERROR; 1124 return TCL_ERROR;
1108 } 1125 }
1109 preftype = purple_prefs_get_type(Tcl_GetString(objv[2])); 1126 preftype = purple_prefs_get_type(Tcl_GetString(objv[2]));
1110 switch (preftype) { 1127 switch (preftype) {
1111 case PURPLE_PREF_NONE: 1128 case PURPLE_PREF_NONE:
1112 Tcl_SetStringObj(result, "none", -1); 1129 Tcl_SetObjResult(interp, Tcl_NewStringObj("none", -1));
1113 break; 1130 break;
1114 case PURPLE_PREF_BOOLEAN: 1131 case PURPLE_PREF_BOOLEAN:
1115 Tcl_SetStringObj(result, "boolean", -1); 1132 Tcl_SetObjResult(interp, Tcl_NewStringObj("boolean", -1));
1116 break; 1133 break;
1117 case PURPLE_PREF_INT: 1134 case PURPLE_PREF_INT:
1118 Tcl_SetStringObj(result, "int", -1); 1135 Tcl_SetObjResult(interp, Tcl_NewStringObj("int", -1));
1119 break; 1136 break;
1120 case PURPLE_PREF_STRING: 1137 case PURPLE_PREF_STRING:
1121 Tcl_SetStringObj(result, "string", -1); 1138 Tcl_SetObjResult(interp, Tcl_NewStringObj("string", -1));
1122 break; 1139 break;
1123 case PURPLE_PREF_STRING_LIST: 1140 case PURPLE_PREF_STRING_LIST:
1124 Tcl_SetStringObj(result, "stringlist", -1); 1141 Tcl_SetObjResult(interp, Tcl_NewStringObj("stringlist", -1));
1125 break; 1142 break;
1126 default: 1143 default:
1127 purple_debug(PURPLE_DEBUG_ERROR, "tcl", "tcl does not know about pref type %d\n", preftype); 1144 purple_debug(PURPLE_DEBUG_ERROR, "tcl", "tcl does not know about pref type %d\n", preftype);
1128 Tcl_SetStringObj(result, "unknown", -1); 1145 Tcl_SetObjResult(interp, Tcl_NewStringObj("unknown", -1));
1129 } 1146 }
1130 break; 1147 break;
1131 } 1148 }
1132 1149
1133 return TCL_OK; 1150 return TCL_OK;
1141 enum { CMD_PRESENCE_ACCOUNT, CMD_PRESENCE_ACTIVE_STATUS, 1158 enum { CMD_PRESENCE_ACCOUNT, CMD_PRESENCE_ACTIVE_STATUS,
1142 CMD_PRESENCE_AVAILABLE, CMD_PRESENCE_CHAT_USER, 1159 CMD_PRESENCE_AVAILABLE, CMD_PRESENCE_CHAT_USER,
1143 CMD_PRESENCE_CONTEXT, CMD_PRESENCE_CONVERSATION, 1160 CMD_PRESENCE_CONTEXT, CMD_PRESENCE_CONVERSATION,
1144 CMD_PRESENCE_IDLE, CMD_PRESENCE_LOGIN, CMD_PRESENCE_ONLINE, 1161 CMD_PRESENCE_IDLE, CMD_PRESENCE_LOGIN, CMD_PRESENCE_ONLINE,
1145 CMD_PRESENCE_STATUS, CMD_PRESENCE_STATUSES } cmd; 1162 CMD_PRESENCE_STATUS, CMD_PRESENCE_STATUSES } cmd;
1146 Tcl_Obj *result = Tcl_GetObjResult(interp); 1163 Tcl_Obj *result;
1147 Tcl_Obj *list, *elem; 1164 Tcl_Obj *list, *elem;
1148 PurplePresence *presence; 1165 PurplePresence *presence;
1149 GList *cur; 1166 GList *cur;
1150 int error, idle, idle_time, login_time; 1167 int error, idle, idle_time, login_time;
1151 1168
1178 if (objc == 3) { 1195 if (objc == 3) {
1179 Tcl_SetObjResult(interp, 1196 Tcl_SetObjResult(interp,
1180 purple_tcl_ref_new(PurpleTclRefStatus, 1197 purple_tcl_ref_new(PurpleTclRefStatus,
1181 purple_presence_get_active_status(presence))); 1198 purple_presence_get_active_status(presence)));
1182 } else if (objc == 4) { 1199 } else if (objc == 4) {
1183 Tcl_SetBooleanObj(result, 1200 Tcl_SetObjResult(interp,
1184 purple_presence_is_status_active(presence, 1201 Tcl_NewBooleanObj(
1185 Tcl_GetString(objv[3]))); 1202 purple_presence_is_status_active(presence,
1203 Tcl_GetString(objv[3]))));
1186 } else { 1204 } else {
1187 PurpleStatusPrimitive primitive; 1205 PurpleStatusPrimitive primitive;
1188 if (strcmp(Tcl_GetString(objv[3]), "-primitive")) { 1206 if (strcmp(Tcl_GetString(objv[3]), "-primitive")) {
1189 Tcl_SetStringObj(result, "bad option \"", -1); 1207 result = Tcl_NewStringObj("bad option \"", -1);
1190 Tcl_AppendObjToObj(result, objv[3]); 1208 Tcl_AppendObjToObj(result, objv[3]);
1191 Tcl_AppendToObj(result, 1209 Tcl_AppendToObj(result,
1192 "\": should be -primitive", -1); 1210 "\": should be -primitive", -1);
1211 Tcl_SetObjResult(interp,result);
1193 return TCL_ERROR; 1212 return TCL_ERROR;
1194 } 1213 }
1195 primitive = purple_primitive_get_type_from_id(Tcl_GetString(objv[4])); 1214 primitive = purple_primitive_get_type_from_id(Tcl_GetString(objv[4]));
1196 if (primitive == PURPLE_STATUS_UNSET) { 1215 if (primitive == PURPLE_STATUS_UNSET) {
1197 Tcl_SetStringObj(result, "invalid primitive ", -1); 1216 result = Tcl_NewStringObj("invalid primitive ", -1);
1198 Tcl_AppendObjToObj(result, objv[4]); 1217 Tcl_AppendObjToObj(result, objv[4]);
1218 Tcl_SetObjResult(interp,result);
1199 return TCL_ERROR; 1219 return TCL_ERROR;
1200 } 1220 }
1201 Tcl_SetBooleanObj(result, purple_presence_is_status_primitive_active(presence, primitive)); 1221 Tcl_SetObjResult(interp,
1222 Tcl_NewBooleanObj(
1223 purple_presence_is_status_primitive_active(presence, primitive)));
1202 break; 1224 break;
1203 } 1225 }
1204 break; 1226 break;
1205 case CMD_PRESENCE_AVAILABLE: 1227 case CMD_PRESENCE_AVAILABLE:
1206 if (objc != 3) { 1228 if (objc != 3) {
1207 Tcl_WrongNumArgs(interp, 2, objv, "presence"); 1229 Tcl_WrongNumArgs(interp, 2, objv, "presence");
1208 return TCL_ERROR; 1230 return TCL_ERROR;
1209 } 1231 }
1210 if ((presence = purple_tcl_ref_get(interp, objv[2], PurpleTclRefPresence)) == NULL) 1232 if ((presence = purple_tcl_ref_get(interp, objv[2], PurpleTclRefPresence)) == NULL)
1211 return TCL_ERROR; 1233 return TCL_ERROR;
1212 Tcl_SetBooleanObj(result, purple_presence_is_available(presence)); 1234 Tcl_SetObjResult(interp,
1235 Tcl_NewBooleanObj(purple_presence_is_available(presence)));
1213 break; 1236 break;
1214 case CMD_PRESENCE_CHAT_USER: 1237 case CMD_PRESENCE_CHAT_USER:
1215 if (objc != 3) { 1238 if (objc != 3) {
1216 Tcl_WrongNumArgs(interp, 2, objv, "presence"); 1239 Tcl_WrongNumArgs(interp, 2, objv, "presence");
1217 return TCL_ERROR; 1240 return TCL_ERROR;
1218 } 1241 }
1219 if ((presence = purple_tcl_ref_get(interp, objv[2], PurpleTclRefPresence)) == NULL) 1242 if ((presence = purple_tcl_ref_get(interp, objv[2], PurpleTclRefPresence)) == NULL)
1220 return TCL_ERROR; 1243 return TCL_ERROR;
1221 Tcl_SetStringObj(result, purple_presence_get_chat_user(presence), -1); 1244 Tcl_SetObjResult(interp,
1245 Tcl_NewStringObj(purple_presence_get_chat_user(presence), -1));
1222 break; 1246 break;
1223 case CMD_PRESENCE_CONTEXT: 1247 case CMD_PRESENCE_CONTEXT:
1224 if (objc != 3) { 1248 if (objc != 3) {
1225 Tcl_WrongNumArgs(interp, 2, objv, "presence"); 1249 Tcl_WrongNumArgs(interp, 2, objv, "presence");
1226 return TCL_ERROR; 1250 return TCL_ERROR;
1227 } 1251 }
1228 if ((presence = purple_tcl_ref_get(interp, objv[2], PurpleTclRefPresence)) == NULL) 1252 if ((presence = purple_tcl_ref_get(interp, objv[2], PurpleTclRefPresence)) == NULL)
1229 return TCL_ERROR; 1253 return TCL_ERROR;
1230 switch (purple_presence_get_context(presence)) { 1254 switch (purple_presence_get_context(presence)) {
1231 case PURPLE_PRESENCE_CONTEXT_UNSET: 1255 case PURPLE_PRESENCE_CONTEXT_UNSET:
1232 Tcl_SetStringObj(result, "unset", -1); 1256 Tcl_SetObjResult(interp, Tcl_NewStringObj("unset", -1));
1233 break; 1257 break;
1234 case PURPLE_PRESENCE_CONTEXT_ACCOUNT: 1258 case PURPLE_PRESENCE_CONTEXT_ACCOUNT:
1235 Tcl_SetStringObj(result, "account", -1); 1259 Tcl_SetObjResult(interp, Tcl_NewStringObj("account", -1));
1236 break; 1260 break;
1237 case PURPLE_PRESENCE_CONTEXT_CONV: 1261 case PURPLE_PRESENCE_CONTEXT_CONV:
1238 Tcl_SetStringObj(result, "conversation", -1); 1262 Tcl_SetObjResult(interp, Tcl_NewStringObj("conversation", -1));
1239 break; 1263 break;
1240 case PURPLE_PRESENCE_CONTEXT_BUDDY: 1264 case PURPLE_PRESENCE_CONTEXT_BUDDY:
1241 Tcl_SetStringObj(result, "buddy", -1); 1265 Tcl_SetObjResult(interp, Tcl_NewStringObj("buddy", -1));
1242 break; 1266 break;
1243 } 1267 }
1244 break; 1268 break;
1245 case CMD_PRESENCE_CONVERSATION: 1269 case CMD_PRESENCE_CONVERSATION:
1246 if (objc != 3) { 1270 if (objc != 3) {
1260 if ((presence = purple_tcl_ref_get(interp, objv[2], PurpleTclRefPresence)) == NULL) 1284 if ((presence = purple_tcl_ref_get(interp, objv[2], PurpleTclRefPresence)) == NULL)
1261 return TCL_ERROR; 1285 return TCL_ERROR;
1262 if (objc == 3) { 1286 if (objc == 3) {
1263 if (purple_presence_is_idle(presence)) { 1287 if (purple_presence_is_idle(presence)) {
1264 idle_time = purple_presence_get_idle_time (presence); 1288 idle_time = purple_presence_get_idle_time (presence);
1265 Tcl_SetIntObj(result, idle_time); 1289 Tcl_SetObjResult(interp, Tcl_NewIntObj(idle_time));
1266 } else { 1290 } else {
1267 result = Tcl_NewListObj(0, NULL); 1291 result = Tcl_NewListObj(0, NULL);
1268 Tcl_SetObjResult(interp, result); 1292 Tcl_SetObjResult(interp, result);
1269 } 1293 }
1270 break; 1294 break;
1287 return TCL_ERROR; 1311 return TCL_ERROR;
1288 } 1312 }
1289 if ((presence = purple_tcl_ref_get(interp, objv[2], PurpleTclRefPresence)) == NULL) 1313 if ((presence = purple_tcl_ref_get(interp, objv[2], PurpleTclRefPresence)) == NULL)
1290 return TCL_ERROR; 1314 return TCL_ERROR;
1291 if (objc == 3) { 1315 if (objc == 3) {
1292 Tcl_SetIntObj(result, purple_presence_get_login_time(presence)); 1316 Tcl_SetObjResult(interp, Tcl_NewIntObj(purple_presence_get_login_time(presence)));
1293 } else { 1317 } else {
1294 if ((error == Tcl_GetIntFromObj(interp, 1318 if ((error == Tcl_GetIntFromObj(interp,
1295 objv[3], 1319 objv[3],
1296 &login_time)) != TCL_OK) 1320 &login_time)) != TCL_OK)
1297 return TCL_ERROR; 1321 return TCL_ERROR;
1303 Tcl_WrongNumArgs(interp, 2, objv, "presence"); 1327 Tcl_WrongNumArgs(interp, 2, objv, "presence");
1304 return TCL_ERROR; 1328 return TCL_ERROR;
1305 } 1329 }
1306 if ((presence = purple_tcl_ref_get(interp, objv[2], PurpleTclRefPresence)) == NULL) 1330 if ((presence = purple_tcl_ref_get(interp, objv[2], PurpleTclRefPresence)) == NULL)
1307 return TCL_ERROR; 1331 return TCL_ERROR;
1308 Tcl_SetBooleanObj(result, purple_presence_is_online(presence)); 1332 Tcl_SetObjResult(interp,
1333 Tcl_NewBooleanObj(
1334 purple_presence_is_online(presence)));
1309 break; 1335 break;
1310 case CMD_PRESENCE_STATUS: 1336 case CMD_PRESENCE_STATUS:
1311 if (objc != 4) { 1337 if (objc != 4) {
1312 Tcl_WrongNumArgs(interp, 2, objv, "presence status_id"); 1338 Tcl_WrongNumArgs(interp, 2, objv, "presence status_id");
1313 return TCL_ERROR; 1339 return TCL_ERROR;
1339 return TCL_OK; 1365 return TCL_OK;
1340 } 1366 }
1341 1367
1342 int tcl_cmd_savedstatus(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) 1368 int tcl_cmd_savedstatus(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
1343 { 1369 {
1344 Tcl_Obj *result = Tcl_GetObjResult(interp); 1370 Tcl_Obj *result;
1345 const char *cmds[] = { "current", "handle", NULL }; 1371 const char *cmds[] = { "current", "handle", NULL };
1346 enum { CMD_SAVEDSTATUS_CURRENT, CMD_SAVEDSTATUS_HANDLE } cmd; 1372 enum { CMD_SAVEDSTATUS_CURRENT, CMD_SAVEDSTATUS_HANDLE } cmd;
1347 int error; 1373 int error;
1348 PurpleSavedStatus *saved_status; 1374 PurpleSavedStatus *saved_status;
1349 1375
1361 Tcl_WrongNumArgs(interp, 2, objv, ""); 1387 Tcl_WrongNumArgs(interp, 2, objv, "");
1362 return TCL_ERROR; 1388 return TCL_ERROR;
1363 } 1389 }
1364 if ((saved_status = purple_savedstatus_get_current()) == NULL) 1390 if ((saved_status = purple_savedstatus_get_current()) == NULL)
1365 return TCL_ERROR; 1391 return TCL_ERROR;
1392 result = Tcl_NewListObj(0, NULL);
1366 Tcl_ListObjAppendElement(interp, result, Tcl_NewStringObj(purple_savedstatus_get_title(saved_status), -1)); 1393 Tcl_ListObjAppendElement(interp, result, Tcl_NewStringObj(purple_savedstatus_get_title(saved_status), -1));
1367 Tcl_ListObjAppendElement(interp, result, Tcl_NewIntObj(purple_savedstatus_get_type(saved_status))); 1394 Tcl_ListObjAppendElement(interp, result, Tcl_NewIntObj(purple_savedstatus_get_type(saved_status)));
1368 Tcl_ListObjAppendElement(interp, result, Tcl_NewStringObj(purple_savedstatus_get_message(saved_status), -1)); 1395 Tcl_ListObjAppendElement(interp, result, Tcl_NewStringObj(purple_savedstatus_get_message(saved_status), -1));
1396 Tcl_SetObjResult(interp,result);
1369 break; 1397 break;
1370 case CMD_SAVEDSTATUS_HANDLE: 1398 case CMD_SAVEDSTATUS_HANDLE:
1371 if (objc != 2) { 1399 if (objc != 2) {
1372 Tcl_WrongNumArgs(interp, 2, objv, ""); 1400 Tcl_WrongNumArgs(interp, 2, objv, "");
1373 return TCL_ERROR; 1401 return TCL_ERROR;
1405 int tcl_cmd_signal(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) 1433 int tcl_cmd_signal(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
1406 { 1434 {
1407 const char *cmds[] = { "connect", "disconnect", NULL }; 1435 const char *cmds[] = { "connect", "disconnect", NULL };
1408 enum { CMD_SIGNAL_CONNECT, CMD_SIGNAL_DISCONNECT } cmd; 1436 enum { CMD_SIGNAL_CONNECT, CMD_SIGNAL_DISCONNECT } cmd;
1409 struct tcl_signal_handler *handler; 1437 struct tcl_signal_handler *handler;
1410 Tcl_Obj *result = Tcl_GetObjResult(interp);
1411 void *instance; 1438 void *instance;
1412 int error; 1439 int error;
1413 1440
1414 if (objc < 2) { 1441 if (objc < 2) {
1415 Tcl_WrongNumArgs(interp, 1, objv, "subcommand ?args?"); 1442 Tcl_WrongNumArgs(interp, 1, objv, "subcommand ?args?");
1435 handler->args = objv[4]; 1462 handler->args = objv[4];
1436 handler->proc = objv[5]; 1463 handler->proc = objv[5];
1437 handler->interp = interp; 1464 handler->interp = interp;
1438 if (!tcl_signal_connect(handler)) { 1465 if (!tcl_signal_connect(handler)) {
1439 tcl_signal_handler_free(handler); 1466 tcl_signal_handler_free(handler);
1440 Tcl_SetIntObj(result, 1); 1467 Tcl_SetObjResult(interp, Tcl_NewIntObj(1));
1441 } else { 1468 } else {
1442 Tcl_SetIntObj(result, 0); 1469 Tcl_SetObjResult(interp, Tcl_NewIntObj(0));
1443 } 1470 }
1444 break; 1471 break;
1445 case CMD_SIGNAL_DISCONNECT: 1472 case CMD_SIGNAL_DISCONNECT:
1446 if (objc != 4) { 1473 if (objc != 4) {
1447 Tcl_WrongNumArgs(interp, 2, objv, "instance signal"); 1474 Tcl_WrongNumArgs(interp, 2, objv, "instance signal");
1458 1485
1459 int tcl_cmd_status(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) 1486 int tcl_cmd_status(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
1460 { 1487 {
1461 const char *cmds[] = { "attr", "type", NULL }; 1488 const char *cmds[] = { "attr", "type", NULL };
1462 enum { CMD_STATUS_ATTR, CMD_STATUS_TYPE } cmd; 1489 enum { CMD_STATUS_ATTR, CMD_STATUS_TYPE } cmd;
1463 Tcl_Obj *result = Tcl_GetObjResult(interp);
1464 PurpleStatus *status; 1490 PurpleStatus *status;
1465 PurpleStatusType *status_type; 1491 PurpleStatusType *status_type;
1466 PurpleValue *value; 1492 PurpleValue *value;
1467 const char *attr; 1493 const char *attr;
1468 int error, v; 1494 int error, v;
1484 if ((status = purple_tcl_ref_get(interp, objv[2], PurpleTclRefStatus)) == NULL) 1510 if ((status = purple_tcl_ref_get(interp, objv[2], PurpleTclRefStatus)) == NULL)
1485 return TCL_ERROR; 1511 return TCL_ERROR;
1486 attr = Tcl_GetString(objv[3]); 1512 attr = Tcl_GetString(objv[3]);
1487 value = purple_status_get_attr_value(status, attr); 1513 value = purple_status_get_attr_value(status, attr);
1488 if (value == NULL) { 1514 if (value == NULL) {
1489 Tcl_SetStringObj(result, "no such attribute", -1); 1515 Tcl_SetObjResult(interp,
1516 Tcl_NewStringObj("no such attribute", -1));
1490 return TCL_ERROR; 1517 return TCL_ERROR;
1491 } 1518 }
1492 switch (purple_value_get_type(value)) { 1519 switch (purple_value_get_type(value)) {
1493 case PURPLE_TYPE_BOOLEAN: 1520 case PURPLE_TYPE_BOOLEAN:
1494 if (objc == 4) { 1521 if (objc == 4) {
1495 Tcl_SetBooleanObj(result, purple_value_get_boolean(value)); 1522 Tcl_SetObjResult(interp,
1523 Tcl_NewBooleanObj(purple_value_get_boolean(value)));
1496 } else { 1524 } else {
1497 if ((error = Tcl_GetBooleanFromObj(interp, objv[4], &v)) != TCL_OK) 1525 if ((error = Tcl_GetBooleanFromObj(interp, objv[4], &v)) != TCL_OK)
1498 return error; 1526 return error;
1499 purple_status_set_attr_boolean(status, attr, v); 1527 purple_status_set_attr_boolean(status, attr, v);
1500 } 1528 }
1501 break; 1529 break;
1502 case PURPLE_TYPE_INT: 1530 case PURPLE_TYPE_INT:
1503 if (objc == 4) { 1531 if (objc == 4) {
1504 Tcl_SetIntObj(result, purple_value_get_int(value)); 1532 Tcl_SetObjResult(interp, Tcl_NewIntObj(purple_value_get_int(value)));
1505 } else { 1533 } else {
1506 if ((error = Tcl_GetIntFromObj(interp, objv[4], &v)) != TCL_OK) 1534 if ((error = Tcl_GetIntFromObj(interp, objv[4], &v)) != TCL_OK)
1507 return error; 1535 return error;
1508 purple_status_set_attr_int(status, attr, v ); 1536 purple_status_set_attr_int(status, attr, v );
1509 } 1537 }
1510 break; 1538 break;
1511 case PURPLE_TYPE_STRING: 1539 case PURPLE_TYPE_STRING:
1512 if (objc == 4) 1540 if (objc == 4)
1513 Tcl_SetStringObj(result, purple_value_get_string(value), -1); 1541 Tcl_SetObjResult(interp,
1542 Tcl_NewStringObj(purple_value_get_string(value), -1));
1514 else 1543 else
1515 purple_status_set_attr_string(status, attr, Tcl_GetString(objv[4])); 1544 purple_status_set_attr_string(status, attr, Tcl_GetString(objv[4]));
1516 break; 1545 break;
1517 default: 1546 default:
1518 Tcl_SetStringObj(result, "attribute has unknown type", -1); 1547 Tcl_SetObjResult(interp,
1548 Tcl_NewStringObj("attribute has unknown type", -1));
1519 return TCL_ERROR; 1549 return TCL_ERROR;
1520 } 1550 }
1521 break; 1551 break;
1522 case CMD_STATUS_TYPE: 1552 case CMD_STATUS_TYPE:
1523 if (objc != 3) { 1553 if (objc != 3) {
1537 1567
1538 int tcl_cmd_status_attr(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) 1568 int tcl_cmd_status_attr(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
1539 { 1569 {
1540 const char *cmds[] = { "id", "name", NULL }; 1570 const char *cmds[] = { "id", "name", NULL };
1541 enum { CMD_STATUS_ATTR_ID, CMD_STATUS_ATTR_NAME } cmd; 1571 enum { CMD_STATUS_ATTR_ID, CMD_STATUS_ATTR_NAME } cmd;
1542 Tcl_Obj *result = Tcl_GetObjResult(interp);
1543 PurpleStatusAttr *attr; 1572 PurpleStatusAttr *attr;
1544 int error; 1573 int error;
1545 1574
1546 if (objc < 2) { 1575 if (objc < 2) {
1547 Tcl_WrongNumArgs(interp, 1, objv, "subcommand ?args?"); 1576 Tcl_WrongNumArgs(interp, 1, objv, "subcommand ?args?");
1557 Tcl_WrongNumArgs(interp, 2, objv, "attr"); 1586 Tcl_WrongNumArgs(interp, 2, objv, "attr");
1558 return TCL_ERROR; 1587 return TCL_ERROR;
1559 } 1588 }
1560 if ((attr = purple_tcl_ref_get(interp, objv[2], PurpleTclRefStatusAttr)) == NULL) 1589 if ((attr = purple_tcl_ref_get(interp, objv[2], PurpleTclRefStatusAttr)) == NULL)
1561 return TCL_ERROR; 1590 return TCL_ERROR;
1562 Tcl_SetStringObj(result, purple_status_attr_get_id(attr), -1); 1591 Tcl_SetObjResult(interp,
1592 Tcl_NewStringObj(purple_status_attr_get_id(attr), -1));
1563 break; 1593 break;
1564 case CMD_STATUS_ATTR_NAME: 1594 case CMD_STATUS_ATTR_NAME:
1565 if (objc != 3) { 1595 if (objc != 3) {
1566 Tcl_WrongNumArgs(interp, 2, objv, "attr"); 1596 Tcl_WrongNumArgs(interp, 2, objv, "attr");
1567 return TCL_ERROR; 1597 return TCL_ERROR;
1568 } 1598 }
1569 if ((attr = purple_tcl_ref_get(interp, objv[2], PurpleTclRefStatusAttr)) == NULL) 1599 if ((attr = purple_tcl_ref_get(interp, objv[2], PurpleTclRefStatusAttr)) == NULL)
1570 return TCL_ERROR; 1600 return TCL_ERROR;
1571 Tcl_SetStringObj(result, purple_status_attr_get_name(attr), -1); 1601 Tcl_SetObjResult(interp,
1602 Tcl_NewStringObj(purple_status_attr_get_name(attr), -1));
1572 break; 1603 break;
1573 } 1604 }
1574 1605
1575 return TCL_OK; 1606 return TCL_OK;
1576 } 1607 }
1585 CMD_STATUS_TYPE_AVAILABLE, CMD_STATUS_TYPE_EXCLUSIVE, 1616 CMD_STATUS_TYPE_AVAILABLE, CMD_STATUS_TYPE_EXCLUSIVE,
1586 CMD_STATUS_TYPE_ID, CMD_STATUS_TYPE_INDEPENDENT, 1617 CMD_STATUS_TYPE_ID, CMD_STATUS_TYPE_INDEPENDENT,
1587 CMD_STATUS_TYPE_NAME, CMD_STATUS_TYPE_PRIMARY_ATTR, 1618 CMD_STATUS_TYPE_NAME, CMD_STATUS_TYPE_PRIMARY_ATTR,
1588 CMD_STATUS_TYPE_PRIMITIVE, CMD_STATUS_TYPE_SAVEABLE, 1619 CMD_STATUS_TYPE_PRIMITIVE, CMD_STATUS_TYPE_SAVEABLE,
1589 CMD_STATUS_TYPE_USER_SETTABLE } cmd; 1620 CMD_STATUS_TYPE_USER_SETTABLE } cmd;
1590 Tcl_Obj *result = Tcl_GetObjResult(interp);
1591 PurpleStatusType *status_type; 1621 PurpleStatusType *status_type;
1592 Tcl_Obj *list, *elem; 1622 Tcl_Obj *list, *elem;
1593 GList *cur; 1623 GList *cur;
1594 int error; 1624 int error;
1595 1625
1607 Tcl_WrongNumArgs(interp, 2, objv, "statustype"); 1637 Tcl_WrongNumArgs(interp, 2, objv, "statustype");
1608 return TCL_ERROR; 1638 return TCL_ERROR;
1609 } 1639 }
1610 if ((status_type = purple_tcl_ref_get(interp, objv[2], PurpleTclRefStatusType)) == NULL) 1640 if ((status_type = purple_tcl_ref_get(interp, objv[2], PurpleTclRefStatusType)) == NULL)
1611 return TCL_ERROR; 1641 return TCL_ERROR;
1612 Tcl_SetBooleanObj(result, purple_status_type_is_available(status_type)); 1642 Tcl_SetObjResult(interp,
1643 Tcl_NewBooleanObj(purple_status_type_is_available(status_type)));
1613 break; 1644 break;
1614 case CMD_STATUS_TYPE_ATTR: 1645 case CMD_STATUS_TYPE_ATTR:
1615 if (objc != 4) { 1646 if (objc != 4) {
1616 Tcl_WrongNumArgs(interp, 2, objv, "statustype attr"); 1647 Tcl_WrongNumArgs(interp, 2, objv, "statustype attr");
1617 return TCL_ERROR; 1648 return TCL_ERROR;
1643 Tcl_WrongNumArgs(interp, 2, objv, "statustype"); 1674 Tcl_WrongNumArgs(interp, 2, objv, "statustype");
1644 return TCL_ERROR; 1675 return TCL_ERROR;
1645 } 1676 }
1646 if ((status_type = purple_tcl_ref_get(interp, objv[2], PurpleTclRefStatusType)) == NULL) 1677 if ((status_type = purple_tcl_ref_get(interp, objv[2], PurpleTclRefStatusType)) == NULL)
1647 return TCL_ERROR; 1678 return TCL_ERROR;
1648 Tcl_SetBooleanObj(result, purple_status_type_is_exclusive(status_type)); 1679 Tcl_SetObjResult(interp,
1680 Tcl_NewBooleanObj(purple_status_type_is_exclusive(status_type)));
1649 break; 1681 break;
1650 case CMD_STATUS_TYPE_ID: 1682 case CMD_STATUS_TYPE_ID:
1651 if (objc != 3) { 1683 if (objc != 3) {
1652 Tcl_WrongNumArgs(interp, 2, objv, "statustype"); 1684 Tcl_WrongNumArgs(interp, 2, objv, "statustype");
1653 return TCL_ERROR; 1685 return TCL_ERROR;
1654 } 1686 }
1655 if ((status_type = purple_tcl_ref_get(interp, objv[2], PurpleTclRefStatusType)) == NULL) 1687 if ((status_type = purple_tcl_ref_get(interp, objv[2], PurpleTclRefStatusType)) == NULL)
1656 return TCL_ERROR; 1688 return TCL_ERROR;
1657 Tcl_SetStringObj(result, purple_status_type_get_id(status_type), -1); 1689 Tcl_SetObjResult(interp,
1690 Tcl_NewStringObj(purple_status_type_get_id(status_type), -1));
1658 break; 1691 break;
1659 case CMD_STATUS_TYPE_INDEPENDENT: 1692 case CMD_STATUS_TYPE_INDEPENDENT:
1660 if (objc != 3) { 1693 if (objc != 3) {
1661 Tcl_WrongNumArgs(interp, 2, objv, "statustype"); 1694 Tcl_WrongNumArgs(interp, 2, objv, "statustype");
1662 return TCL_ERROR; 1695 return TCL_ERROR;
1663 } 1696 }
1664 if ((status_type = purple_tcl_ref_get(interp, objv[2], PurpleTclRefStatusType)) == NULL) 1697 if ((status_type = purple_tcl_ref_get(interp, objv[2], PurpleTclRefStatusType)) == NULL)
1665 return TCL_ERROR; 1698 return TCL_ERROR;
1666 Tcl_SetBooleanObj(result, purple_status_type_is_independent(status_type)); 1699 Tcl_SetObjResult(interp,
1700 Tcl_NewBooleanObj(purple_status_type_is_independent(status_type)));
1667 break; 1701 break;
1668 case CMD_STATUS_TYPE_NAME: 1702 case CMD_STATUS_TYPE_NAME:
1669 if (objc != 3) { 1703 if (objc != 3) {
1670 Tcl_WrongNumArgs(interp, 2, objv, "statustype"); 1704 Tcl_WrongNumArgs(interp, 2, objv, "statustype");
1671 return TCL_ERROR; 1705 return TCL_ERROR;
1672 } 1706 }
1673 if ((status_type = purple_tcl_ref_get(interp, objv[2], PurpleTclRefStatusType)) == NULL) 1707 if ((status_type = purple_tcl_ref_get(interp, objv[2], PurpleTclRefStatusType)) == NULL)
1674 return TCL_ERROR; 1708 return TCL_ERROR;
1675 Tcl_SetStringObj(result, purple_status_type_get_name(status_type), -1); 1709 Tcl_SetObjResult(interp,
1710 Tcl_NewStringObj(purple_status_type_get_name(status_type), -1));
1676 break; 1711 break;
1677 case CMD_STATUS_TYPE_PRIMITIVE: 1712 case CMD_STATUS_TYPE_PRIMITIVE:
1678 if (objc != 3) { 1713 if (objc != 3) {
1679 Tcl_WrongNumArgs(interp, 2, objv, "statustype"); 1714 Tcl_WrongNumArgs(interp, 2, objv, "statustype");
1680 return TCL_ERROR; 1715 return TCL_ERROR;
1681 } 1716 }
1682 if ((status_type = purple_tcl_ref_get(interp, objv[2], PurpleTclRefStatusType)) == NULL) 1717 if ((status_type = purple_tcl_ref_get(interp, objv[2], PurpleTclRefStatusType)) == NULL)
1683 return TCL_ERROR; 1718 return TCL_ERROR;
1684 Tcl_SetStringObj(result, purple_primitive_get_id_from_type(purple_status_type_get_primitive(status_type)), -1); 1719 Tcl_SetObjResult(interp,
1720 Tcl_NewStringObj(purple_primitive_get_id_from_type
1721 (purple_status_type_get_primitive(status_type)), -1));
1685 break; 1722 break;
1686 case CMD_STATUS_TYPE_PRIMARY_ATTR: 1723 case CMD_STATUS_TYPE_PRIMARY_ATTR:
1687 if (objc != 3) { 1724 if (objc != 3) {
1688 Tcl_WrongNumArgs(interp, 2, objv, "statustype"); 1725 Tcl_WrongNumArgs(interp, 2, objv, "statustype");
1689 return TCL_ERROR; 1726 return TCL_ERROR;
1690 } 1727 }
1691 if ((status_type = purple_tcl_ref_get(interp, objv[2], PurpleTclRefStatusType)) == NULL) 1728 if ((status_type = purple_tcl_ref_get(interp, objv[2], PurpleTclRefStatusType)) == NULL)
1692 return TCL_ERROR; 1729 return TCL_ERROR;
1693 Tcl_SetStringObj(result, purple_status_type_get_primary_attr(status_type), -1); 1730 Tcl_SetObjResult(interp,
1731 Tcl_NewStringObj(purple_status_type_get_primary_attr(status_type), -1));
1694 break; 1732 break;
1695 case CMD_STATUS_TYPE_SAVEABLE: 1733 case CMD_STATUS_TYPE_SAVEABLE:
1696 if (objc != 3) { 1734 if (objc != 3) {
1697 Tcl_WrongNumArgs(interp, 2, objv, "statustype"); 1735 Tcl_WrongNumArgs(interp, 2, objv, "statustype");
1698 return TCL_ERROR; 1736 return TCL_ERROR;
1699 } 1737 }
1700 if ((status_type = purple_tcl_ref_get(interp, objv[2], PurpleTclRefStatusType)) == NULL) 1738 if ((status_type = purple_tcl_ref_get(interp, objv[2], PurpleTclRefStatusType)) == NULL)
1701 return TCL_ERROR; 1739 return TCL_ERROR;
1702 Tcl_SetBooleanObj(result, purple_status_type_is_saveable(status_type)); 1740 Tcl_SetObjResult(interp,
1741 Tcl_NewBooleanObj(
1742 purple_status_type_is_saveable(status_type)));
1703 break; 1743 break;
1704 case CMD_STATUS_TYPE_USER_SETTABLE: 1744 case CMD_STATUS_TYPE_USER_SETTABLE:
1705 if (objc != 3) { 1745 if (objc != 3) {
1706 Tcl_WrongNumArgs(interp, 2, objv, "statustype"); 1746 Tcl_WrongNumArgs(interp, 2, objv, "statustype");
1707 return TCL_ERROR; 1747 return TCL_ERROR;
1708 } 1748 }
1709 if ((status_type = purple_tcl_ref_get(interp, objv[2], PurpleTclRefStatusType)) == NULL) 1749 if ((status_type = purple_tcl_ref_get(interp, objv[2], PurpleTclRefStatusType)) == NULL)
1710 return TCL_ERROR; 1750 return TCL_ERROR;
1711 Tcl_SetBooleanObj(result, purple_status_type_is_user_settable(status_type)); 1751 Tcl_SetObjResult(interp,
1752 Tcl_NewBooleanObj(
1753 purple_status_type_is_user_settable(status_type)));
1712 break; 1754 break;
1713 } 1755 }
1714 1756
1715 return TCL_OK; 1757 return TCL_OK;
1716 } 1758 }