comparison plugins/tcl/tcl_cmds.c @ 13845:d0ff520f87da

[gaim-migrate @ 16301] This is tcl /cmd support. It doesn't currently let tcl plugins return error message (I couldn't ever get that to work). But other than that it works. Ethan please look over this when you get a chance. committer: Tailor Script <tailor@pidgin.im>
author Etan Reisner <pidgin@unreliablesource.net>
date Wed, 21 Jun 2006 04:57:27 +0000
parents 597beb5c9de1
children
comparison
equal deleted inserted replaced
13844:597beb5c9de1 13845:d0ff520f87da
539 } 539 }
540 540
541 return TCL_OK; 541 return TCL_OK;
542 } 542 }
543 543
544 int tcl_cmd_cmd(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
545 {
546 const char *cmds[] = { "register", "unregister", NULL };
547 enum { CMD_CMD_REGISTER, CMD_CMD_UNREGISTER } cmd;
548 struct tcl_cmd_handler *handler;
549 Tcl_Obj *result = Tcl_GetObjResult(interp);
550 GaimCmdId id;
551 int error;
552
553 if (objc < 2) {
554 Tcl_WrongNumArgs(interp, 1, objv, "subcommand ?args?");
555 return TCL_ERROR;
556 }
557
558 if ((error = Tcl_GetIndexFromObj(interp, objv[1], cmds, "subcommand", 0, (int *)&cmd)) != TCL_OK)
559 return error;
560
561 switch (cmd) {
562 case CMD_CMD_REGISTER:
563 if (objc != 9) {
564 Tcl_WrongNumArgs(interp, 2, objv, "cmd arglist priority flags prpl_id proc helpstr");
565 return TCL_ERROR;
566 }
567 handler = g_new0(struct tcl_cmd_handler, 1);
568 handler->cmd = objv[2];
569 handler->args = Tcl_GetString(objv[3]);
570 handler->nargs = strlen(handler->args);
571 if ((error = Tcl_GetIntFromObj(interp, objv[4],
572 &handler->priority)) != TCL_OK) {
573 g_free(handler);
574 return error;
575 }
576 if ((error = Tcl_GetIntFromObj(interp, objv[5],
577 &handler->flags)) != TCL_OK) {
578 g_free(handler);
579 return error;
580 }
581 handler->prpl_id = Tcl_GetString(objv[6]);
582 handler->proc = objv[7];
583 handler->helpstr = Tcl_GetString(objv[8]);
584 handler->interp = interp;
585 if ((id = tcl_cmd_register(handler)) == 0) {
586 tcl_cmd_handler_free(handler);
587 Tcl_SetIntObj(result, 0);
588 } else {
589 handler->id = id;
590 Tcl_SetIntObj(result, id);
591 }
592 break;
593 case CMD_CMD_UNREGISTER:
594 if (objc != 3) {
595 Tcl_WrongNumArgs(interp, 2, objv, "id");
596 return TCL_ERROR;
597 }
598 if ((error = Tcl_GetIntFromObj(interp, objv[2],
599 (int *)&id)) != TCL_OK)
600 return error;
601 tcl_cmd_unregister(id, interp);
602 break;
603 }
604
605 return TCL_OK;
606 }
607
544 int tcl_cmd_connection(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) 608 int tcl_cmd_connection(ClientData unused, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
545 { 609 {
546 Tcl_Obj *result = Tcl_GetObjResult(interp), *list, *elem; 610 Tcl_Obj *result = Tcl_GetObjResult(interp), *list, *elem;
547 const char *cmds[] = { "account", "displayname", "handle", "list", NULL }; 611 const char *cmds[] = { "account", "displayname", "handle", "list", NULL };
548 enum { CMD_CONN_ACCOUNT, CMD_CONN_DISPLAYNAME, CMD_CONN_HANDLE, CMD_CONN_LIST } cmd; 612 enum { CMD_CONN_ACCOUNT, CMD_CONN_DISPLAYNAME, CMD_CONN_HANDLE, CMD_CONN_LIST } cmd;