Mercurial > pidgin
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 |
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 } |