comparison libpurple/plugins/tcl/tcl_cmds.c @ 20165:506f0f7f4f21

Another fabulous patch to our Tcl loader from venks on irc.freenode.net. This one makes the 'handle' commands 64-bit safe, by moving away from Tcl integer objects, and using PurpleTclRefs instead.
author Ethan Blanton <elb@pidgin.im>
date Wed, 19 Sep 2007 02:33:08 +0000
parents 44b4e8bd759b
children 3287445c05a8
comparison
equal deleted inserted replaced
20164:7d9391b94b1c 20165:506f0f7f4f21
205 case CMD_ACCOUNT_HANDLE: 205 case CMD_ACCOUNT_HANDLE:
206 if (objc != 2) { 206 if (objc != 2) {
207 Tcl_WrongNumArgs(interp, 2, objv, ""); 207 Tcl_WrongNumArgs(interp, 2, objv, "");
208 return TCL_ERROR; 208 return TCL_ERROR;
209 } 209 }
210 Tcl_SetIntObj(result, (int)purple_accounts_get_handle()); 210 Tcl_SetObjResult(interp,
211 purple_tcl_ref_new(PurpleTclRefHandle,
212 purple_accounts_get_handle()));
211 break; 213 break;
212 case CMD_ACCOUNT_ISCONNECTED: 214 case CMD_ACCOUNT_ISCONNECTED:
213 if (objc != 3) { 215 if (objc != 3) {
214 Tcl_WrongNumArgs(interp, 2, objv, "account"); 216 Tcl_WrongNumArgs(interp, 2, objv, "account");
215 return TCL_ERROR; 217 return TCL_ERROR;
441 case CMD_BUDDY_HANDLE: 443 case CMD_BUDDY_HANDLE:
442 if (objc != 2) { 444 if (objc != 2) {
443 Tcl_WrongNumArgs(interp, 2, objv, ""); 445 Tcl_WrongNumArgs(interp, 2, objv, "");
444 return TCL_ERROR; 446 return TCL_ERROR;
445 } 447 }
446 Tcl_SetIntObj(result, (int)purple_blist_get_handle()); 448 Tcl_SetObjResult(interp,
449 purple_tcl_ref_new(PurpleTclRefHandle,
450 purple_blist_get_handle()));
447 break; 451 break;
448 case CMD_BUDDY_INFO: 452 case CMD_BUDDY_INFO:
449 if (objc != 3 && objc != 4) { 453 if (objc != 3 && objc != 4) {
450 Tcl_WrongNumArgs(interp, 2, objv, "( buddy | account username )"); 454 Tcl_WrongNumArgs(interp, 2, objv, "( buddy | account username )");
451 return TCL_ERROR; 455 return TCL_ERROR;
702 case CMD_CONN_HANDLE: 706 case CMD_CONN_HANDLE:
703 if (objc != 2) { 707 if (objc != 2) {
704 Tcl_WrongNumArgs(interp, 2, objv, ""); 708 Tcl_WrongNumArgs(interp, 2, objv, "");
705 return TCL_ERROR; 709 return TCL_ERROR;
706 } 710 }
707 Tcl_SetIntObj(result, (int)purple_connections_get_handle()); 711 Tcl_SetObjResult(interp, purple_tcl_ref_new(PurpleTclRefHandle,
712 purple_connections_get_handle()));
708 break; 713 break;
709 case CMD_CONN_LIST: 714 case CMD_CONN_LIST:
710 if (objc != 2) { 715 if (objc != 2) {
711 Tcl_WrongNumArgs(interp, 2, objv, ""); 716 Tcl_WrongNumArgs(interp, 2, objv, "");
712 return TCL_ERROR; 717 return TCL_ERROR;
764 case CMD_CONV_HANDLE: 769 case CMD_CONV_HANDLE:
765 if (objc != 2) { 770 if (objc != 2) {
766 Tcl_WrongNumArgs(interp, 2, objv, ""); 771 Tcl_WrongNumArgs(interp, 2, objv, "");
767 return TCL_ERROR; 772 return TCL_ERROR;
768 } 773 }
769 Tcl_SetIntObj(result, (int)purple_conversations_get_handle()); 774 Tcl_SetObjResult(interp,
775 purple_tcl_ref_new(PurpleTclRefHandle,
776 purple_conversations_get_handle()));
770 break; 777 break;
771 case CMD_CONV_LIST: 778 case CMD_CONV_LIST:
772 list = Tcl_NewListObj(0, NULL); 779 list = Tcl_NewListObj(0, NULL);
773 for (cur = purple_get_conversations(); cur != NULL; cur = g_list_next(cur)) { 780 for (cur = purple_get_conversations(); cur != NULL; cur = g_list_next(cur)) {
774 elem = purple_tcl_ref_new(PurpleTclRefConversation, cur->data); 781 elem = purple_tcl_ref_new(PurpleTclRefConversation, cur->data);
877 return TCL_OK; 884 return TCL_OK;
878 } 885 }
879 886
880 int tcl_cmd_core(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) 887 int tcl_cmd_core(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
881 { 888 {
882 Tcl_Obj *result = Tcl_GetObjResult(interp);
883 const char *cmds[] = { "handle", "quit", NULL }; 889 const char *cmds[] = { "handle", "quit", NULL };
884 enum { CMD_CORE_HANDLE, CMD_CORE_QUIT } cmd; 890 enum { CMD_CORE_HANDLE, CMD_CORE_QUIT } cmd;
885 int error; 891 int error;
886 892
887 if (objc < 2) { 893 if (objc < 2) {
896 case CMD_CORE_HANDLE: 902 case CMD_CORE_HANDLE:
897 if (objc != 2) { 903 if (objc != 2) {
898 Tcl_WrongNumArgs(interp, 2, objv, ""); 904 Tcl_WrongNumArgs(interp, 2, objv, "");
899 return TCL_ERROR; 905 return TCL_ERROR;
900 } 906 }
901 Tcl_SetIntObj(result, (int)purple_get_core()); 907 Tcl_SetObjResult(interp,
908 purple_tcl_ref_new(PurpleTclRefHandle,
909 purple_get_core()));
902 break; 910 break;
903 case CMD_CORE_QUIT: 911 case CMD_CORE_QUIT:
904 if (objc != 2) { 912 if (objc != 2) {
905 Tcl_WrongNumArgs(interp, 2, objv, ""); 913 Tcl_WrongNumArgs(interp, 2, objv, "");
906 return TCL_ERROR; 914 return TCL_ERROR;
968 return TCL_OK; 976 return TCL_OK;
969 } 977 }
970 978
971 int tcl_cmd_plugins(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) 979 int tcl_cmd_plugins(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
972 { 980 {
973 Tcl_Obj *result = Tcl_GetObjResult(interp);
974 const char *cmds[] = { "handle", NULL }; 981 const char *cmds[] = { "handle", NULL };
975 enum { CMD_PLUGINS_HANDLE } cmd; 982 enum { CMD_PLUGINS_HANDLE } cmd;
976 int error; 983 int error;
977 984
978 if (objc < 2) { 985 if (objc < 2) {
987 case CMD_PLUGINS_HANDLE: 994 case CMD_PLUGINS_HANDLE:
988 if (objc != 2) { 995 if (objc != 2) {
989 Tcl_WrongNumArgs(interp, 2, objv, ""); 996 Tcl_WrongNumArgs(interp, 2, objv, "");
990 return TCL_ERROR; 997 return TCL_ERROR;
991 } 998 }
992 Tcl_SetIntObj(result, (int)purple_plugins_get_handle()); 999 Tcl_SetObjResult(interp,
1000 purple_tcl_ref_new(PurpleTclRefHandle,
1001 purple_plugins_get_handle()));
993 break; 1002 break;
994 } 1003 }
995 1004
996 return TCL_OK; 1005 return TCL_OK;
997 } 1006 }
1361 case CMD_SAVEDSTATUS_HANDLE: 1370 case CMD_SAVEDSTATUS_HANDLE:
1362 if (objc != 2) { 1371 if (objc != 2) {
1363 Tcl_WrongNumArgs(interp, 2, objv, ""); 1372 Tcl_WrongNumArgs(interp, 2, objv, "");
1364 return TCL_ERROR; 1373 return TCL_ERROR;
1365 } 1374 }
1366 Tcl_SetIntObj(result, (int)purple_savedstatuses_get_handle()); 1375 Tcl_SetObjResult(interp,
1376 purple_tcl_ref_new(PurpleTclRefHandle,
1377 purple_savedstatuses_get_handle()));
1367 break; 1378 break;
1368 } 1379 }
1369 1380
1370 return TCL_OK; 1381 return TCL_OK;
1371 } 1382 }
1413 if (objc != 6) { 1424 if (objc != 6) {
1414 Tcl_WrongNumArgs(interp, 2, objv, "instance signal args proc"); 1425 Tcl_WrongNumArgs(interp, 2, objv, "instance signal args proc");
1415 return TCL_ERROR; 1426 return TCL_ERROR;
1416 } 1427 }
1417 handler = g_new0(struct tcl_signal_handler, 1); 1428 handler = g_new0(struct tcl_signal_handler, 1);
1418 if ((error = Tcl_GetIntFromObj(interp, objv[2], (int *)&handler->instance)) != TCL_OK) { 1429 if ((handler->instance = purple_tcl_ref_get(interp, objv[2],PurpleTclRefHandle)) == NULL) {
1419 g_free(handler); 1430 g_free(handler);
1420 return error; 1431 return error;
1421 } 1432 }
1422 handler->signal = objv[3]; 1433 handler->signal = objv[3];
1423 Tcl_IncrRefCount(handler->signal); 1434 Tcl_IncrRefCount(handler->signal);
1434 case CMD_SIGNAL_DISCONNECT: 1445 case CMD_SIGNAL_DISCONNECT:
1435 if (objc != 4) { 1446 if (objc != 4) {
1436 Tcl_WrongNumArgs(interp, 2, objv, "instance signal"); 1447 Tcl_WrongNumArgs(interp, 2, objv, "instance signal");
1437 return TCL_ERROR; 1448 return TCL_ERROR;
1438 } 1449 }
1439 if ((error = Tcl_GetIntFromObj(interp, objv[2], (int *)&instance)) != TCL_OK) 1450 if ((instance = purple_tcl_ref_get(interp, objv[2],PurpleTclRefHandle)) == NULL)
1440 return error; 1451 return error;
1441 tcl_signal_disconnect(instance, Tcl_GetString(objv[3]), interp); 1452 tcl_signal_disconnect(instance, Tcl_GetString(objv[3]), interp);
1442 break; 1453 break;
1443 } 1454 }
1444 1455