libpurple/plugins/tcl/tcl_signals.c

Sat, 17 May 2014 12:40:29 +0200

author
Tomasz Wasilczyk <twasilczyk@pidgin.im>
date
Sat, 17 May 2014 12:40:29 +0200
changeset 36050
136469c94e3c
parent 35989
2b5a26ddbb69
permissions
-rw-r--r--

Coverity: missing break in tcl plugin

6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
1 /**
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2 * @file tcl_signals.c Purple Tcl signal API
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
3 *
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
4 * purple
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
5 *
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
6 * Copyright (C) 2003 Ethan Blanton <eblanton@cs.purdue.edu>
31294
73607ab89c6f Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents: 30626
diff changeset
7 *
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
8 * This program is free software; you can redistribute it and/or modify
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
9 * it under the terms of the GNU General Public License as published by
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
10 * the Free Software Foundation; either version 2 of the License, or
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
11 * (at your option) any later version.
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
12 *
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
13 * This program is distributed in the hope that it will be useful,
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
16 * GNU General Public License for more details.
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
17 *
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
18 * You should have received a copy of the GNU General Public License
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
19 * along with this program; if not, write to the Free Software
19859
71d37b57eff2 The FSF changed its address a while ago; our files were out of date.
John Bailey <rekkanoryo@rekkanoryo.org>
parents: 17463
diff changeset
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
21 */
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
22 #include <tcl.h>
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
23 #include <stdarg.h>
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
24
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
25 #include "tcl_purple.h"
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
26
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
27 #include "internal.h"
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
28 #include "connection.h"
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
29 #include "conversation.h"
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
30 #include "signals.h"
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
31 #include "debug.h"
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
32 #include "core.h"
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
33
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
34 static GList *tcl_callbacks;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
35
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
36 static void *tcl_signal_callback(va_list args, struct tcl_signal_handler *handler);
12397
aa64ec827fdf [gaim-migrate @ 14704]
Richard Laager <rlaager@pidgin.im>
parents: 10625
diff changeset
37 static Tcl_Obj *new_cb_namespace (void);
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
38
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
39 void tcl_signal_init()
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
40 {
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
41 tcl_callbacks = NULL;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
42 }
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
43
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
44 void tcl_signal_handler_free(struct tcl_signal_handler *handler)
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
45 {
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
46 if (handler == NULL)
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
47 return;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
48
10597
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
49 Tcl_DecrRefCount(handler->signal);
13812
a10499942a3c [gaim-migrate @ 16240]
Ethan Blanton <elb@pidgin.im>
parents: 13220
diff changeset
50 if (handler->namespace)
17463
5be75bf3b58b Another change from o_sukhodolsky
Richard Laager <rlaager@pidgin.im>
parents: 15884
diff changeset
51 {
13812
a10499942a3c [gaim-migrate @ 16240]
Ethan Blanton <elb@pidgin.im>
parents: 13220
diff changeset
52 Tcl_DecrRefCount(handler->namespace);
17463
5be75bf3b58b Another change from o_sukhodolsky
Richard Laager <rlaager@pidgin.im>
parents: 15884
diff changeset
53 }
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
54 g_free(handler);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
55 }
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
56
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
57 void tcl_signal_cleanup(Tcl_Interp *interp)
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
58 {
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
59 GList *cur;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
60 struct tcl_signal_handler *handler;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
61
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
62 for (cur = tcl_callbacks; cur != NULL; cur = g_list_next(cur)) {
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
63 handler = cur->data;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
64 if (handler->interp == interp) {
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
65 tcl_signal_handler_free(handler);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
66 cur->data = NULL;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
67 }
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
68 }
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
69 tcl_callbacks = g_list_remove_all(tcl_callbacks, NULL);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
70 }
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
71
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
72 gboolean tcl_signal_connect(struct tcl_signal_handler *handler)
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
73 {
10597
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
74 GString *proc;
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
75
34806
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
76 purple_signal_get_types(handler->instance,
10597
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
77 Tcl_GetString(handler->signal),
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
78 &handler->returntype, &handler->nargs,
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
79 &handler->argtypes);
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
80
10597
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
81 tcl_signal_disconnect(handler->interp, Tcl_GetString(handler->signal),
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
82 handler->interp);
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
83
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
84 if (!purple_signal_connect_vargs(handler->instance,
10597
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
85 Tcl_GetString(handler->signal),
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
86 (void *)handler->interp,
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
87 PURPLE_CALLBACK(tcl_signal_callback),
10597
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
88 (void *)handler))
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
89 return FALSE;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
90
10597
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
91 handler->namespace = new_cb_namespace ();
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
92 Tcl_IncrRefCount(handler->namespace);
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
93 proc = g_string_new("");
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
94 g_string_append_printf(proc, "namespace eval %s { proc cb { %s } { %s } }",
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
95 Tcl_GetString(handler->namespace),
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
96 Tcl_GetString(handler->args),
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
97 Tcl_GetString(handler->proc));
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
98 if (Tcl_Eval(handler->interp, proc->str) != TCL_OK) {
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
99 Tcl_DecrRefCount(handler->namespace);
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
100 g_string_free(proc, TRUE);
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
101 return FALSE;
10597
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
102 }
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
103 g_string_free(proc, TRUE);
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
104
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
105 tcl_callbacks = g_list_append(tcl_callbacks, (gpointer)handler);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
106
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
107 return TRUE;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
108 }
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
109
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
110 void tcl_signal_disconnect(void *instance, const char *signal, Tcl_Interp *interp)
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
111 {
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
112 GList *cur;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
113 struct tcl_signal_handler *handler;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
114 gboolean found = FALSE;
10597
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
115 GString *cmd;
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
116
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
117 for (cur = tcl_callbacks; cur != NULL; cur = g_list_next(cur)) {
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
118 handler = cur->data;
31294
73607ab89c6f Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents: 30626
diff changeset
119 if (handler->interp == interp && handler->instance == instance
10597
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
120 && !strcmp(signal, Tcl_GetString(handler->signal))) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
121 purple_signal_disconnect(instance, signal, handler->interp,
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
122 PURPLE_CALLBACK(tcl_signal_callback));
10597
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
123 cmd = g_string_sized_new(64);
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
124 g_string_printf(cmd, "namespace delete %s",
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
125 Tcl_GetString(handler->namespace));
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
126 Tcl_EvalEx(interp, cmd->str, -1, TCL_EVAL_GLOBAL);
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
127 tcl_signal_handler_free(handler);
10597
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
128 g_string_free(cmd, TRUE);
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
129 cur->data = NULL;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
130 found = TRUE;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
131 break;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
132 }
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
133 }
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
134 if (found)
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
135 tcl_callbacks = g_list_remove_all(tcl_callbacks, NULL);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
136 }
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
137
34806
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
138 static PurpleStringref *ref_purple_type(GType type)
13817
ba01c6caad7d [gaim-migrate @ 16247]
Ethan Blanton <elb@pidgin.im>
parents: 13812
diff changeset
139 {
34806
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
140 if (type == PURPLE_TYPE_ACCOUNT)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
141 return PurpleTclRefAccount;
34806
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
142 else if (type == PURPLE_TYPE_CONNECTION)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
143 return PurpleTclRefConnection;
34806
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
144 else if (type == PURPLE_TYPE_CONVERSATION)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
145 return PurpleTclRefConversation;
34806
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
146 else if (type == PURPLE_TYPE_PLUGIN)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
147 return PurpleTclRefPlugin;
34806
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
148 else if (type == PURPLE_TYPE_STATUS)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
149 return PurpleTclRefStatus;
34806
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
150 else if (type == PURPLE_TYPE_XFER)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
151 return PurpleTclRefXfer;
34806
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
152 else
13817
ba01c6caad7d [gaim-migrate @ 16247]
Ethan Blanton <elb@pidgin.im>
parents: 13812
diff changeset
153 return NULL;
ba01c6caad7d [gaim-migrate @ 16247]
Ethan Blanton <elb@pidgin.im>
parents: 13812
diff changeset
154 }
ba01c6caad7d [gaim-migrate @ 16247]
Ethan Blanton <elb@pidgin.im>
parents: 13812
diff changeset
155
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
156 static void *tcl_signal_callback(va_list args, struct tcl_signal_handler *handler)
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
157 {
10597
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
158 GString *name, *val;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
159 PurpleBlistNode *node;
30626
bec413ce77c7 Fix some "Dead nested assignment"s and then kill off some useless
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 24556
diff changeset
160 int i;
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
161 void *retval = NULL;
10597
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
162 Tcl_Obj *cmd, *arg, *result;
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
163 void **vals; /* Used for inout parameters */
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
164 char ***strs;
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
165
10597
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
166 vals = g_new0(void *, handler->nargs);
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
167 strs = g_new0(char **, handler->nargs);
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
168 name = g_string_sized_new(32);
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
169 val = g_string_sized_new(32);
10597
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
170
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
171 cmd = Tcl_NewListObj(0, NULL);
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
172 Tcl_IncrRefCount(cmd);
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
173
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
174 arg = Tcl_DuplicateObj(handler->namespace);
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
175 Tcl_AppendStringsToObj(arg, "::cb", NULL);
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
176 Tcl_ListObjAppendElement(handler->interp, cmd, arg);
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
177
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
178 for (i = 0; i < handler->nargs; i++) {
34806
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
179 #if 0
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
180 if (purple_value_is_outgoing(handler->argtypes[i]))
10597
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
181 g_string_printf(name, "%s::arg%d",
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
182 Tcl_GetString(handler->namespace), i);
34806
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
183 #endif
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
184 switch(handler->argtypes[i]) {
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
185 case G_TYPE_POINTER:
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
186 #if 0
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
187 case G_TYPE_OBJECT:
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
188 case G_TYPE_BOXED:
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
189 /* These are all "pointer" types to us */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
190 if (purple_value_is_outgoing(handler->argtypes[i]))
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
191 purple_debug_error("tcl", "pointer types do not currently support outgoing arguments\n");
34806
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
192 #endif
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
193 arg = purple_tcl_ref_new(PurpleTclRefPointer, va_arg(args, void *));
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
194 break;
34806
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
195 case G_TYPE_BOOLEAN:
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
196 #if 0
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
197 if (purple_value_is_outgoing(handler->argtypes[i])) {
10597
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
198 vals[i] = va_arg(args, gboolean *);
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
199 Tcl_LinkVar(handler->interp, name->str,
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
200 (char *)&vals[i], TCL_LINK_BOOLEAN);
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
201 arg = Tcl_NewStringObj(name->str, -1);
34806
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
202 } else
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
203 #endif
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
204 arg = Tcl_NewBooleanObj(va_arg(args, gboolean));
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
205 break;
34806
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
206 case G_TYPE_CHAR:
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
207 case G_TYPE_UCHAR:
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
208 case G_TYPE_INT:
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
209 case G_TYPE_UINT:
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
210 case G_TYPE_LONG:
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
211 case G_TYPE_ULONG:
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
212 /* I should really cast these individually to
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
213 * preserve as much information as possible ...
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
214 * but heh */
34806
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
215 #if 0
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
216 if (purple_value_is_outgoing(handler->argtypes[i])) {
10597
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
217 vals[i] = va_arg(args, int *);
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
218 Tcl_LinkVar(handler->interp, name->str,
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
219 vals[i], TCL_LINK_INT);
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
220 arg = Tcl_NewStringObj(name->str, -1);
34806
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
221 } else
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
222 #endif
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
223 arg = Tcl_NewIntObj(va_arg(args, int));
14515
01706cff6faf [gaim-migrate @ 17167]
Ethan Blanton <elb@pidgin.im>
parents: 14254
diff changeset
224 break;
34806
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
225 case G_TYPE_INT64:
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
226 case G_TYPE_UINT64:
10625
1ea4af762084 [gaim-migrate @ 12099]
Ethan Blanton <elb@pidgin.im>
parents: 10597
diff changeset
227 /* Tcl < 8.4 doesn't have wide ints, so we have ugly
1ea4af762084 [gaim-migrate @ 12099]
Ethan Blanton <elb@pidgin.im>
parents: 10597
diff changeset
228 * ifdefs in here */
34806
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
229 #if 0
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
230 if (purple_value_is_outgoing(handler->argtypes[i])) {
10625
1ea4af762084 [gaim-migrate @ 12099]
Ethan Blanton <elb@pidgin.im>
parents: 10597
diff changeset
231 vals[i] = (void *)va_arg(args, gint64 *);
1ea4af762084 [gaim-migrate @ 12099]
Ethan Blanton <elb@pidgin.im>
parents: 10597
diff changeset
232 #if (TCL_MAJOR_VERSION >= 8 && TCL_MINOR_VERSION >= 4)
10597
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
233 Tcl_LinkVar(handler->interp, name->str,
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
234 vals[i], TCL_LINK_WIDE_INT);
10625
1ea4af762084 [gaim-migrate @ 12099]
Ethan Blanton <elb@pidgin.im>
parents: 10597
diff changeset
235 #else
1ea4af762084 [gaim-migrate @ 12099]
Ethan Blanton <elb@pidgin.im>
parents: 10597
diff changeset
236 /* This is going to cause weirdness at best,
1ea4af762084 [gaim-migrate @ 12099]
Ethan Blanton <elb@pidgin.im>
parents: 10597
diff changeset
237 * but what do you want ... we're losing
1ea4af762084 [gaim-migrate @ 12099]
Ethan Blanton <elb@pidgin.im>
parents: 10597
diff changeset
238 * precision */
1ea4af762084 [gaim-migrate @ 12099]
Ethan Blanton <elb@pidgin.im>
parents: 10597
diff changeset
239 Tcl_LinkVar(handler->interp, name->str,
1ea4af762084 [gaim-migrate @ 12099]
Ethan Blanton <elb@pidgin.im>
parents: 10597
diff changeset
240 vals[i], TCL_LINK_INT);
1ea4af762084 [gaim-migrate @ 12099]
Ethan Blanton <elb@pidgin.im>
parents: 10597
diff changeset
241 #endif /* Tcl >= 8.4 */
10597
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
242 arg = Tcl_NewStringObj(name->str, -1);
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
243 } else {
34806
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
244 #endif
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
245 #if (TCL_MAJOR_VERSION >= 8 && TCL_MINOR_VERSION >= 4)
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
246 arg = Tcl_NewWideIntObj(va_arg(args, gint64));
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
247 #else
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
248 arg = Tcl_NewIntObj((int)va_arg(args, int));
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
249 #endif /* Tcl >= 8.4 */
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
250 break;
34806
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
251 case G_TYPE_STRING:
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
252 #if 0
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
253 if (purple_value_is_outgoing(handler->argtypes[i])) {
10597
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
254 strs[i] = va_arg(args, char **);
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
255 if (strs[i] == NULL || *strs[i] == NULL) {
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
256 vals[i] = ckalloc(1);
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
257 *(char *)vals[i] = '\0';
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
258 } else {
31956
f2b6b7f5631b Fix up several Tcl loader string copies to use g_strlcpy().
Ethan Blanton <elb@pidgin.im>
parents: 31294
diff changeset
259 size_t len = strlen(*strs[i]) + 1;
f2b6b7f5631b Fix up several Tcl loader string copies to use g_strlcpy().
Ethan Blanton <elb@pidgin.im>
parents: 31294
diff changeset
260 vals[i] = ckalloc(len);
f2b6b7f5631b Fix up several Tcl loader string copies to use g_strlcpy().
Ethan Blanton <elb@pidgin.im>
parents: 31294
diff changeset
261 g_strlcpy(vals[i], *strs[i], len);
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
262 }
10597
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
263 Tcl_LinkVar(handler->interp, name->str,
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
264 (char *)&vals[i], TCL_LINK_STRING);
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
265 arg = Tcl_NewStringObj(name->str, -1);
34806
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
266 } else
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
267 #endif
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
268 arg = Tcl_NewStringObj(va_arg(args, char *), -1);
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
269 break;
34806
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
270 default:
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
271 if (handler->argtypes[i] == PURPLE_TYPE_ACCOUNT ||
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
272 handler->argtypes[i] == PURPLE_TYPE_CONNECTION ||
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
273 handler->argtypes[i] == PURPLE_TYPE_CONVERSATION ||
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
274 handler->argtypes[i] == PURPLE_TYPE_STATUS ||
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
275 handler->argtypes[i] == PURPLE_TYPE_PLUGIN ||
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
276 handler->argtypes[i] == PURPLE_TYPE_XFER )
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
277 {
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
278 #if 0
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
279 if (purple_value_is_outgoing(handler->argtypes[i]))
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
280 purple_debug_error("tcl", "pointer subtypes do not currently support outgoing arguments\n");
34806
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
281 #endif
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
282 arg = purple_tcl_ref_new(ref_purple_type(handler->argtypes[i]), va_arg(args, void *));
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
283 }
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
284 else
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
285 if (handler->argtypes[i] == PURPLE_TYPE_CONTACT ||
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
286 handler->argtypes[i] == PURPLE_TYPE_BUDDY ||
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
287 handler->argtypes[i] == PURPLE_TYPE_GROUP ||
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
288 handler->argtypes[i] == PURPLE_TYPE_CHAT )
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
289 {
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
290 /* We're going to switch again for code-deduping */
34806
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
291 #if 0
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
292 if (purple_value_is_outgoing(handler->argtypes[i]))
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
293 node = *va_arg(args, PurpleBlistNode **);
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
294 else
34806
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
295 #endif
34864
0e292d8887de Renamed PurpleBListNode back to PurpleBlistNode
Ankit Vani <a@nevitus.org>
parents: 34823
diff changeset
296 node = va_arg(args, PurpleBlistNode *);
34695
60a278f1365b Refactored libpurple plugins with initial GObject blist API
Ankit Vani <a@nevitus.org>
parents: 31956
diff changeset
297
60a278f1365b Refactored libpurple plugins with initial GObject blist API
Ankit Vani <a@nevitus.org>
parents: 31956
diff changeset
298 if (PURPLE_IS_GROUP(node)) {
13812
a10499942a3c [gaim-migrate @ 16240]
Ethan Blanton <elb@pidgin.im>
parents: 13220
diff changeset
299 arg = Tcl_NewListObj(0, NULL);
a10499942a3c [gaim-migrate @ 16240]
Ethan Blanton <elb@pidgin.im>
parents: 13220
diff changeset
300 Tcl_ListObjAppendElement(handler->interp, arg,
a10499942a3c [gaim-migrate @ 16240]
Ethan Blanton <elb@pidgin.im>
parents: 13220
diff changeset
301 Tcl_NewStringObj("group", -1));
a10499942a3c [gaim-migrate @ 16240]
Ethan Blanton <elb@pidgin.im>
parents: 13220
diff changeset
302 Tcl_ListObjAppendElement(handler->interp, arg,
34740
9401f9b1ca68 Used GObject-style casts in plugins.
Ankit Vani <a@nevitus.org>
parents: 34699
diff changeset
303 Tcl_NewStringObj(purple_group_get_name(PURPLE_GROUP(node)), -1));
34695
60a278f1365b Refactored libpurple plugins with initial GObject blist API
Ankit Vani <a@nevitus.org>
parents: 31956
diff changeset
304 } else if (PURPLE_IS_CONTACT(node)) {
6735
a8c70aeddbe7 [gaim-migrate @ 7267]
Mark Doliner <markdoliner@pidgin.im>
parents: 6700
diff changeset
305 /* g_string_printf(val, "contact {%s}", Contact Name? ); */
13812
a10499942a3c [gaim-migrate @ 16240]
Ethan Blanton <elb@pidgin.im>
parents: 13220
diff changeset
306 arg = Tcl_NewStringObj("contact", -1);
34695
60a278f1365b Refactored libpurple plugins with initial GObject blist API
Ankit Vani <a@nevitus.org>
parents: 31956
diff changeset
307 } else if (PURPLE_IS_BUDDY(node)) {
13812
a10499942a3c [gaim-migrate @ 16240]
Ethan Blanton <elb@pidgin.im>
parents: 13220
diff changeset
308 arg = Tcl_NewListObj(0, NULL);
a10499942a3c [gaim-migrate @ 16240]
Ethan Blanton <elb@pidgin.im>
parents: 13220
diff changeset
309 Tcl_ListObjAppendElement(handler->interp, arg,
a10499942a3c [gaim-migrate @ 16240]
Ethan Blanton <elb@pidgin.im>
parents: 13220
diff changeset
310 Tcl_NewStringObj("buddy", -1));
a10499942a3c [gaim-migrate @ 16240]
Ethan Blanton <elb@pidgin.im>
parents: 13220
diff changeset
311 Tcl_ListObjAppendElement(handler->interp, arg,
34740
9401f9b1ca68 Used GObject-style casts in plugins.
Ankit Vani <a@nevitus.org>
parents: 34699
diff changeset
312 Tcl_NewStringObj(purple_buddy_get_name(PURPLE_BUDDY(node)), -1));
13812
a10499942a3c [gaim-migrate @ 16240]
Ethan Blanton <elb@pidgin.im>
parents: 13220
diff changeset
313 Tcl_ListObjAppendElement(handler->interp, arg,
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
314 purple_tcl_ref_new(PurpleTclRefAccount,
34740
9401f9b1ca68 Used GObject-style casts in plugins.
Ankit Vani <a@nevitus.org>
parents: 34699
diff changeset
315 purple_buddy_get_account(PURPLE_BUDDY(node))));
34695
60a278f1365b Refactored libpurple plugins with initial GObject blist API
Ankit Vani <a@nevitus.org>
parents: 31956
diff changeset
316 } else if (PURPLE_IS_CHAT(node)) {
13812
a10499942a3c [gaim-migrate @ 16240]
Ethan Blanton <elb@pidgin.im>
parents: 13220
diff changeset
317 arg = Tcl_NewListObj(0, NULL);
a10499942a3c [gaim-migrate @ 16240]
Ethan Blanton <elb@pidgin.im>
parents: 13220
diff changeset
318 Tcl_ListObjAppendElement(handler->interp, arg,
a10499942a3c [gaim-migrate @ 16240]
Ethan Blanton <elb@pidgin.im>
parents: 13220
diff changeset
319 Tcl_NewStringObj("chat", -1));
a10499942a3c [gaim-migrate @ 16240]
Ethan Blanton <elb@pidgin.im>
parents: 13220
diff changeset
320 Tcl_ListObjAppendElement(handler->interp, arg,
34740
9401f9b1ca68 Used GObject-style casts in plugins.
Ankit Vani <a@nevitus.org>
parents: 34699
diff changeset
321 Tcl_NewStringObj(purple_chat_get_name(PURPLE_CHAT(node)), -1));
13812
a10499942a3c [gaim-migrate @ 16240]
Ethan Blanton <elb@pidgin.im>
parents: 13220
diff changeset
322 Tcl_ListObjAppendElement(handler->interp, arg,
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
323 purple_tcl_ref_new(PurpleTclRefAccount,
34740
9401f9b1ca68 Used GObject-style casts in plugins.
Ankit Vani <a@nevitus.org>
parents: 34699
diff changeset
324 purple_chat_get_account(PURPLE_CHAT(node))));
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
325 }
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
326 }
34823
eb33b477148d Added a case for enum types in tcl_signals.c
Ankit Vani <a@nevitus.org>
parents: 34806
diff changeset
327 else if (G_TYPE_IS_ENUM(handler->argtypes[i]))
eb33b477148d Added a case for enum types in tcl_signals.c
Ankit Vani <a@nevitus.org>
parents: 34806
diff changeset
328 {
eb33b477148d Added a case for enum types in tcl_signals.c
Ankit Vani <a@nevitus.org>
parents: 34806
diff changeset
329 arg = Tcl_NewIntObj(va_arg(args, int));
eb33b477148d Added a case for enum types in tcl_signals.c
Ankit Vani <a@nevitus.org>
parents: 34806
diff changeset
330 }
34806
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
331 else
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
332 {
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
333 /* What? I guess just pass the word ... */
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
334 /* treat this as a pointer, but complain first */
34977
42e9e59fbf0f win32: fix build problems
Ankit Vani <a@nevitus.org>
parents: 34864
diff changeset
335 purple_debug(PURPLE_DEBUG_ERROR, "tcl", "unknown type %s\n",
42e9e59fbf0f win32: fix build problems
Ankit Vani <a@nevitus.org>
parents: 34864
diff changeset
336 g_type_name(handler->argtypes[i]));
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
337 }
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
338 }
10597
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
339 Tcl_ListObjAppendElement(handler->interp, cmd, arg);
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
340 }
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
341
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
342 /* Call the friggin' procedure already */
30626
bec413ce77c7 Fix some "Dead nested assignment"s and then kill off some useless
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 24556
diff changeset
343 if (Tcl_EvalObjEx(handler->interp, cmd, TCL_EVAL_GLOBAL) != TCL_OK) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
344 purple_debug(PURPLE_DEBUG_ERROR, "tcl", "error evaluating callback: %s\n",
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
345 Tcl_GetString(Tcl_GetObjResult(handler->interp)));
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
346 } else {
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
347 result = Tcl_GetObjResult(handler->interp);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
348 /* handle return values -- strings and words only */
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
349 if (handler->returntype) {
34806
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
350 if (handler->returntype == G_TYPE_STRING) {
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
351 retval = (void *)g_strdup(Tcl_GetString(result));
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
352 } else {
30626
bec413ce77c7 Fix some "Dead nested assignment"s and then kill off some useless
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 24556
diff changeset
353 if (Tcl_GetIntFromObj(handler->interp, result, (int *)&retval) != TCL_OK) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
354 purple_debug(PURPLE_DEBUG_ERROR, "tcl", "Error retrieving procedure result: %s\n",
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
355 Tcl_GetString(Tcl_GetObjResult(handler->interp)));
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
356 retval = NULL;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
357 }
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
358 }
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
359 }
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
360 }
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
361
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
362 /* And finally clean up */
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
363 for (i = 0; i < handler->nargs; i++) {
10597
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
364 g_string_printf(name, "%s::arg%d",
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
365 Tcl_GetString(handler->namespace), i);
34806
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
366 #if 0
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
367 if (purple_value_is_outgoing(handler->argtypes[i])
34806
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
368 && purple_value_get_type(handler->argtypes[i]) != G_TYPE_SUBTYPE)
10597
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
369 Tcl_UnlinkVar(handler->interp, name->str);
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
370 /* We basically only have to deal with strings on the
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
371 * way out */
34806
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
372 switch (handler->argtypes[i]) {
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
373 case G_TYPE_STRING:
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
374 if (purple_value_is_outgoing(handler->argtypes[i])) {
10597
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
375 if (vals[i] != NULL && *(char **)vals[i] != NULL) {
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
376 g_free(*strs[i]);
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
377 *strs[i] = g_strdup(vals[i]);
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
378 }
10597
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
379 ckfree(vals[i]);
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
380 }
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
381 break;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
382 default:
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
383 /* nothing */
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
384 ;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
385 }
34806
182a4df77539 Refactored tcl plugins to use GType instead of PurpleValue.
Ankit Vani <a@nevitus.org>
parents: 34800
diff changeset
386 #endif
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
387 }
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
388
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
389 g_string_free(name, TRUE);
10504
eae130eefbfe [gaim-migrate @ 11796]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 7118
diff changeset
390 g_string_free(val, TRUE);
10597
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
391 g_free(vals);
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
392 g_free(strs);
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
393
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
394 return retval;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
395 }
10597
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
396
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
397 static Tcl_Obj *new_cb_namespace ()
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
398 {
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
399 static int cbnum;
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
400 char name[32];
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
401
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
402 g_snprintf (name, sizeof(name), "::purple::_callback::cb_%d", cbnum++);
10597
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
403 return Tcl_NewStringObj (name, -1);
41d2db9fefd5 [gaim-migrate @ 12012]
Ethan Blanton <elb@pidgin.im>
parents: 10519
diff changeset
404 }

mercurial