annotate plugins/tcl/tcl_cmd.c @ 19799:88b0c434259a

[gaim-migrate @ 16733] change the BL process method continue to debug This is an in progress version,continue to add support for send Yahoo Message committed by Ma Yuan <mayuan2006@gmail.com> committer: Ethan Blanton <elb@pidgin.im>
author Ma Yuan <mayuan2006@gmail.com>
date Sun, 13 Aug 2006 06:09:48 +0000
parents b43971b34053
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
13845
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
1 /**
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
2 * @file tcl_cmd.c Gaim Tcl cmd API
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
3 *
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
4 * gaim
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
5 *
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
6 * Copyright (C) 2006 Etan Reisner <deryni@gmail.com>
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
7 *
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
8 * This program is free software; you can redistribute it and/or modify
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
9 * it under the terms of the GNU General Public License as published by
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
10 * the Free Software Foundation; either version 2 of the License, or
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
11 * (at your option) any later version.
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
12 *
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
13 * This program is distributed in the hope that it will be useful,
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
16 * GNU General Public License for more details.
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
17 *
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
18 * You should have received a copy of the GNU General Public License
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
19 * along with this program; if not, write to the Free Software
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
21 */
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
22 #include <tcl.h>
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
23
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
24 #include "tcl_gaim.h"
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
25
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
26 #include "internal.h"
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
27 #include "cmds.h"
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
28 #include "debug.h"
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
29
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
30 static GList *tcl_cmd_callbacks;
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
31
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
32 static GaimCmdRet tcl_cmd_callback(GaimConversation *conv, const gchar *cmd,
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
33 gchar **args, gchar **errors,
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
34 struct tcl_cmd_handler *handler);
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
35 static Tcl_Obj *new_cmd_cb_namespace(void);
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
36
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
37 void tcl_cmd_init()
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
38 {
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
39 tcl_cmd_callbacks = NULL;
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
40 }
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
41
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
42 void tcl_cmd_handler_free(struct tcl_cmd_handler *handler)
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
43 {
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
44 if (handler == NULL)
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
45 return;
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
46
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
47 Tcl_DecrRefCount(handler->namespace);
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
48 g_free(handler);
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
49 }
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
50
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
51 void tcl_cmd_cleanup(Tcl_Interp *interp)
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
52 {
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
53 GList *cur;
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
54 struct tcl_cmd_handler *handler;
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
55
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
56 for (cur = tcl_cmd_callbacks; cur != NULL; cur = g_list_next(cur)) {
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
57 handler = cur->data;
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
58 if (handler->interp == interp) {
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
59 gaim_cmd_unregister(handler->id);
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
60 tcl_cmd_handler_free(handler);
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
61 cur->data = NULL;
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
62 }
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
63 }
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
64 tcl_cmd_callbacks = g_list_remove_all(tcl_cmd_callbacks, NULL);
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
65 }
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
66
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
67 GaimCmdId tcl_cmd_register(struct tcl_cmd_handler *handler)
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
68 {
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
69 int id;
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
70 GString *proc;
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
71
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
72 if ((id = gaim_cmd_register(Tcl_GetString(handler->cmd),
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
73 handler->args, handler->priority,
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
74 handler->flags, handler->prpl_id,
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
75 GAIM_CMD_FUNC(tcl_cmd_callback),
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
76 handler->helpstr, (void *)handler)) == 0)
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
77 return 0;
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
78
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
79 handler->namespace = new_cmd_cb_namespace ();
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
80 Tcl_IncrRefCount(handler->namespace);
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
81 proc = g_string_new("");
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
82 g_string_append_printf(proc, "namespace eval %s { proc cb { conv cmd arglist } { %s } }",
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
83 Tcl_GetString(handler->namespace),
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
84 Tcl_GetString(handler->proc));
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
85 if (Tcl_Eval(handler->interp, proc->str) != TCL_OK) {
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
86 Tcl_DecrRefCount(handler->namespace);
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
87 g_string_free(proc, TRUE);
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
88 return 0;
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
89 }
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
90 g_string_free(proc, TRUE);
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
91
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
92 tcl_cmd_callbacks = g_list_append(tcl_cmd_callbacks, (gpointer)handler);
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
93
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
94 return id;
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
95 }
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
96
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
97 void tcl_cmd_unregister(GaimCmdId id, Tcl_Interp *interp)
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
98 {
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
99 GList *cur;
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
100 GString *cmd;
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
101 gboolean found = FALSE;
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
102 struct tcl_cmd_handler *handler;
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
103
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
104 for (cur = tcl_cmd_callbacks; cur != NULL; cur = g_list_next(cur)) {
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
105 handler = cur->data;
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
106 if (handler->interp == interp && handler->id == id) {
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
107 gaim_cmd_unregister(id);
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
108 cmd = g_string_sized_new(64);
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
109 g_string_printf(cmd, "namespace delete %s",
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
110 Tcl_GetString(handler->namespace));
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
111 Tcl_EvalEx(interp, cmd->str, -1, TCL_EVAL_GLOBAL);
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
112 tcl_cmd_handler_free(handler);
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
113 g_string_free(cmd, TRUE);
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
114 cur->data = NULL;
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
115 found = TRUE;
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
116 break;
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
117 }
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
118 }
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
119
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
120 if (found)
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
121 tcl_cmd_callbacks = g_list_remove_all(tcl_cmd_callbacks, NULL);
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
122 }
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
123
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
124 static GaimCmdRet tcl_cmd_callback(GaimConversation *conv, const gchar *cmd,
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
125 gchar **args, gchar **errors,
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
126 struct tcl_cmd_handler *handler)
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
127 {
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
128 int retval, error, i;
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
129 Tcl_Obj *command, *arg, *tclargs, *result;
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
130
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
131 command = Tcl_NewListObj(0, NULL);
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
132 Tcl_IncrRefCount(command);
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
133
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
134 /* The callback */
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
135 arg = Tcl_DuplicateObj(handler->namespace);
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
136 Tcl_AppendStringsToObj(arg, "::cb", NULL);
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
137 Tcl_ListObjAppendElement(handler->interp, command, arg);
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
138
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
139 /* The conversation */
13847
6c965941d0e0 [gaim-migrate @ 16303]
Etan Reisner <pidgin@unreliablesource.net>
parents: 13845
diff changeset
140 arg = gaim_tcl_ref_new(GaimTclRefConversation, conv);
13845
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
141 Tcl_ListObjAppendElement(handler->interp, command, arg);
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
142
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
143 /* The command */
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
144 arg = Tcl_NewStringObj(cmd, -1);
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
145 Tcl_ListObjAppendElement(handler->interp, command, arg);
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
146
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
147 /* The args list */
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
148 tclargs = Tcl_NewListObj(0, NULL);
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
149 for (i = 0; i < handler->nargs; i++) {
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
150 arg = Tcl_NewStringObj(args[i], -1);
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
151
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
152 Tcl_ListObjAppendElement(handler->interp, tclargs, arg);
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
153 }
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
154 Tcl_ListObjAppendElement(handler->interp, command, tclargs);
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
155
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
156 if ((error = Tcl_EvalObjEx(handler->interp, command,
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
157 TCL_EVAL_GLOBAL)) != TCL_OK) {
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
158 gchar *errorstr;
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
159
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
160 errorstr = g_strdup_printf("error evaluating callback: %s\n",
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
161 Tcl_GetString(Tcl_GetObjResult(handler->interp)));
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
162 gaim_debug(GAIM_DEBUG_ERROR, "tcl", errorstr);
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
163 *errors = errorstr;
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
164 retval = GAIM_CMD_RET_FAILED;
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
165 } else {
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
166 result = Tcl_GetObjResult(handler->interp);
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
167 if ((error = Tcl_GetIntFromObj(handler->interp, result,
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
168 &retval)) != TCL_OK) {
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
169 gchar *errorstr;
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
170
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
171 errorstr = g_strdup_printf("Error retreiving procedure result: %s\n",
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
172 Tcl_GetString(Tcl_GetObjResult(handler->interp)));
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
173 gaim_debug(GAIM_DEBUG_ERROR, "tcl", errorstr);
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
174 *errors = errorstr;
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
175 retval = GAIM_CMD_RET_FAILED;
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
176 }
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
177 }
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
178
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
179 return retval;
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
180 }
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
181
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
182 static Tcl_Obj *new_cmd_cb_namespace()
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
183 {
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
184 char name[32];
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
185 static int cbnum;
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
186
13848
b43971b34053 [gaim-migrate @ 16304]
Etan Reisner <pidgin@unreliablesource.net>
parents: 13847
diff changeset
187 g_snprintf(name, sizeof(name), "::gaim::_cmd_callback::cb_%d",
b43971b34053 [gaim-migrate @ 16304]
Etan Reisner <pidgin@unreliablesource.net>
parents: 13847
diff changeset
188 cbnum++);
13845
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
189 return Tcl_NewStringObj(name, -1);
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
190 }