annotate plugins/tcl/tcl_cmd.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
children 6c965941d0e0
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 */
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
140 arg = Tcl_NewIntObj((int)conv);
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
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
187 g_snprintf(name, sizeof(name), "::gaim::_callback::cb_%d", cbnum++);
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
188 return Tcl_NewStringObj(name, -1);
d0ff520f87da [gaim-migrate @ 16301]
Etan Reisner <pidgin@unreliablesource.net>
parents:
diff changeset
189 }