plugins/tcl/tcl.c

Sun, 17 Oct 2004 23:55:49 +0000

author
Sean Egan <seanegan@pidgin.im>
date
Sun, 17 Oct 2004 23:55:49 +0000
changeset 10108
0897c42d6cb9
parent 9943
b54a762f60fa
child 10281
eafb8f81f3f6
permissions
-rw-r--r--

[gaim-migrate @ 11141]
Two things:
a. Added Enter as a gtk_binding to GtkIMHtml. This fixes everything.
Input methods now work. The "Enter sends" and "Ctrl-Enter sends" preferences
were removed and defaulted to yes and no respectively, BUT, in a very super-cool
turn of events, you can now add your own bindings to .gtkrc to make WHATEVER
YOU WANT send. Awesome. Someone should use g_signal_accumulator_true_handled
or something to make profiles and away messages able to insert newlines.

b. Removed "Use multi-colored screennames in chats," defaulted to yes, and
wrote a nifty algorithm to automatically adjust the colors to accomodate the
background (see http://gaim.sf.net/sean/porn-chat.png). People should play
around and tweak it a bit. The algorithm takes into consideration the
luminosity of the current background and the base hue to use for the screenname
in generating the new colors. Note that it does this while maintaining the hues.
Someone should optimize this so it skips over the floating point arithmatic when
the background color is white.

6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
1 /**
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
2 * @file tcl.c Gaim Tcl plugin bindings
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
3 *
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
4 * gaim
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>
9943
b54a762f60fa [gaim-migrate @ 10835]
Nathan Walp <nwalp@pidgin.im>
parents: 9775
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
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
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
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
23 #include "config.h"
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
24
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
25 #include <tcl.h>
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 #ifdef HAVE_TK
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
28 #include <tk.h>
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
29 #endif
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
30
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
31 #include <stdio.h>
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
32 #include <sys/types.h>
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
33 #include <sys/stat.h>
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
34 #include <unistd.h>
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
35 #include <string.h>
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
36
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
37 #include "tcl_glib.h"
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
38 #include "tcl_gaim.h"
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
39
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
40 #include "internal.h"
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
41 #include "connection.h"
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
42 #include "plugin.h"
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
43 #include "signals.h"
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
44 #include "debug.h"
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
45 #include "util.h"
9943
b54a762f60fa [gaim-migrate @ 10835]
Nathan Walp <nwalp@pidgin.im>
parents: 9775
diff changeset
46 #include "version.h"
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
47
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
48 struct tcl_plugin_data {
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
49 GaimPlugin *plugin;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
50 Tcl_Interp *interp;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
51 };
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
52
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
53 static GHashTable *tcl_plugins = NULL;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
54
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
55 GaimPlugin *_tcl_plugin;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
56
7831
54076c9af6ad [gaim-migrate @ 8483]
Herman Bloggs <herman@bluedigits.com>
parents: 7828
diff changeset
57 static gboolean tcl_loaded = FALSE;
54076c9af6ad [gaim-migrate @ 8483]
Herman Bloggs <herman@bluedigits.com>
parents: 7828
diff changeset
58
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
59 GaimPlugin *tcl_interp_get_plugin(Tcl_Interp *interp)
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
60 {
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
61 struct tcl_plugin_data *data;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
62
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
63 if (tcl_plugins == NULL)
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
64 return NULL;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
65
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
66 data = g_hash_table_lookup(tcl_plugins, (gpointer)interp);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
67 return data != NULL ? data->plugin : NULL;
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
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
70 static int tcl_init_interp(Tcl_Interp *interp)
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 char *rcfile;
9943
b54a762f60fa [gaim-migrate @ 10835]
Nathan Walp <nwalp@pidgin.im>
parents: 9775
diff changeset
73 char init[] =
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
74 "namespace eval ::gaim {\n"
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
75 " namespace export account buddy connection conversation\n"
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
76 " namespace export core debug notify prefs send_im\n"
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
77 " namespace export signal unload\n"
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
78 " namespace eval _callback { }\n"
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
79 "\n"
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
80 " proc conv_send { account who text } {\n"
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
81 " set gc [gaim::account connection $account]\n"
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
82 " set convo [gaim::conversation new $account $who]\n"
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
83 " set myalias [gaim::account alias $account]\n"
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
84 "\n"
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
85 " if {![string length $myalias]} {\n"
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
86 " set myalias [gaim::account username $account]\n"
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
87 " }\n"
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
88 "\n"
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
89 " gaim::send_im $gc $who $text\n"
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
90 " gaim::conversation write $convo send $myalias $text\n"
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
91 " }\n"
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
92 "}\n"
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
93 "\n"
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
94 "proc bgerror { message } {\n"
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
95 " global errorInfo\n"
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
96 " gaim::notify -error \"Tcl Error\" \"Tcl Error: $message\" \"$errorInfo\"\n"
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
97 "}\n";
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
98
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
99 if (Tcl_EvalEx(interp, init, -1, TCL_EVAL_GLOBAL) != TCL_OK) {
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
100 return 1;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
101 }
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
102
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
103 Tcl_SetVar(interp, "argc", "0", TCL_GLOBAL_ONLY);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
104 Tcl_SetVar(interp, "argv0", "gaim", TCL_GLOBAL_ONLY);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
105 Tcl_SetVar(interp, "tcl_interactive", "0", TCL_GLOBAL_ONLY);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
106 rcfile = g_strdup_printf("%s" G_DIR_SEPARATOR_S "tclrc", gaim_user_dir());
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
107 Tcl_SetVar(interp, "tcl_rcFileName", rcfile, TCL_GLOBAL_ONLY);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
108 g_free(rcfile);
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 Tcl_SetVar(interp, "::gaim::version", VERSION, TCL_GLOBAL_ONLY);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
111 Tcl_SetVar(interp, "::gaim::user_dir", gaim_user_dir(), TCL_GLOBAL_ONLY);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
112 #ifdef HAVE_TK
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
113 Tcl_SetVar(interp, "::gaim::tk_available", "1", TCL_GLOBAL_ONLY);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
114 #else
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
115 Tcl_SetVar(interp, "::gaim::tk_available", "0", TCL_GLOBAL_ONLY);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
116 #endif /* HAVE_TK */
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
117
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
118 Tcl_CreateObjCommand(interp, "::gaim::account", tcl_cmd_account, (ClientData)NULL, NULL);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
119 Tcl_CreateObjCommand(interp, "::gaim::buddy", tcl_cmd_buddy, (ClientData)NULL, NULL);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
120 Tcl_CreateObjCommand(interp, "::gaim::connection", tcl_cmd_connection, (ClientData)NULL, NULL);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
121 Tcl_CreateObjCommand(interp, "::gaim::conversation", tcl_cmd_conversation, (ClientData)NULL, NULL);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
122 Tcl_CreateObjCommand(interp, "::gaim::core", tcl_cmd_core, (ClientData)NULL, NULL);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
123 Tcl_CreateObjCommand(interp, "::gaim::debug", tcl_cmd_debug, (ClientData)NULL, NULL);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
124 Tcl_CreateObjCommand(interp, "::gaim::notify", tcl_cmd_notify, (ClientData)NULL, NULL);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
125 Tcl_CreateObjCommand(interp, "::gaim::prefs", tcl_cmd_prefs, (ClientData)NULL, NULL);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
126 Tcl_CreateObjCommand(interp, "::gaim::send_im", tcl_cmd_send_im, (ClientData)NULL, NULL);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
127 Tcl_CreateObjCommand(interp, "::gaim::signal", tcl_cmd_signal, (ClientData)NULL, NULL);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
128 Tcl_CreateObjCommand(interp, "::gaim::unload", tcl_cmd_unload, (ClientData)NULL, NULL);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
129
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
130 return 0;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
131 }
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 static Tcl_Interp *tcl_create_interp()
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
134 {
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
135 Tcl_Interp *interp;
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 interp = Tcl_CreateInterp();
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
138 if (Tcl_Init(interp) == TCL_ERROR) {
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
139 Tcl_DeleteInterp(interp);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
140 return NULL;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
141 }
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
142
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
143 if (tcl_init_interp(interp)) {
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
144 Tcl_DeleteInterp(interp);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
145 return NULL;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
146 }
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
147 Tcl_StaticPackage(interp, "gaim", tcl_init_interp, NULL);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
148
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
149 return interp;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
150 }
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
151
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
152 static gboolean tcl_probe_plugin(GaimPlugin *plugin)
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
153 {
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
154 GaimPluginInfo *info;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
155 Tcl_Interp *interp;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
156 Tcl_Parse parse;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
157 Tcl_Obj *result, **listitems;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
158 struct stat st;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
159 FILE *fp;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
160 char *buf, *cur;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
161 int len, found = 0, err = 0, nelems;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
162 gboolean status = FALSE;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
163
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
164 if ((fp = fopen(plugin->path, "r")) == NULL)
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
165 return FALSE;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
166 if (fstat(fileno(fp), &st)) {
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
167 fclose(fp);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
168 return FALSE;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
169 }
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
170 len = st.st_size;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
171
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
172 buf = g_malloc(len + 1);
8989
7410046599fc [gaim-migrate @ 9764]
Daniel Atallah <datallah@pidgin.im>
parents: 8761
diff changeset
173
7410046599fc [gaim-migrate @ 9764]
Daniel Atallah <datallah@pidgin.im>
parents: 8761
diff changeset
174 cur = buf;
7410046599fc [gaim-migrate @ 9764]
Daniel Atallah <datallah@pidgin.im>
parents: 8761
diff changeset
175 while (fgets(cur, (int) buf - (buf - cur), fp)) {
7410046599fc [gaim-migrate @ 9764]
Daniel Atallah <datallah@pidgin.im>
parents: 8761
diff changeset
176 cur += strlen(cur);
7410046599fc [gaim-migrate @ 9764]
Daniel Atallah <datallah@pidgin.im>
parents: 8761
diff changeset
177 if (feof(fp))
7410046599fc [gaim-migrate @ 9764]
Daniel Atallah <datallah@pidgin.im>
parents: 8761
diff changeset
178 break;
7410046599fc [gaim-migrate @ 9764]
Daniel Atallah <datallah@pidgin.im>
parents: 8761
diff changeset
179 }
7410046599fc [gaim-migrate @ 9764]
Daniel Atallah <datallah@pidgin.im>
parents: 8761
diff changeset
180
7410046599fc [gaim-migrate @ 9764]
Daniel Atallah <datallah@pidgin.im>
parents: 8761
diff changeset
181 if (ferror(fp)) {
7410046599fc [gaim-migrate @ 9764]
Daniel Atallah <datallah@pidgin.im>
parents: 8761
diff changeset
182 gaim_debug(GAIM_DEBUG_ERROR, "tcl", "error reading %s (%s)\n", plugin->path, strerror(errno));
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
183 g_free(buf);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
184 fclose(fp);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
185 return FALSE;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
186 }
8989
7410046599fc [gaim-migrate @ 9764]
Daniel Atallah <datallah@pidgin.im>
parents: 8761
diff changeset
187
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
188 fclose(fp);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
189
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
190 if ((interp = tcl_create_interp()) == NULL) {
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
191 return FALSE;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
192 }
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
193
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
194 cur = buf;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
195 do {
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
196 if (Tcl_ParseCommand(interp, cur, len, 0, &parse) == TCL_ERROR) {
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
197 gaim_debug(GAIM_DEBUG_ERROR, "tcl", "parse error in %s: %s\n", plugin->path,
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
198 Tcl_GetString(Tcl_GetObjResult(interp)));
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
199 err = 1;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
200 break;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
201 }
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
202 if (parse.tokenPtr[0].type == TCL_TOKEN_SIMPLE_WORD
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
203 && !strncmp(parse.tokenPtr[0].start, "proc", parse.tokenPtr[0].size)) {
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
204 if (!strncmp(parse.tokenPtr[2].start, "plugin_init", parse.tokenPtr[2].size)) {
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
205 if (Tcl_EvalEx(interp, parse.commandStart, parse.commandSize, TCL_EVAL_GLOBAL) != TCL_OK) {
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
206 Tcl_FreeParse(&parse);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
207 break;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
208 }
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
209 found = 1;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
210 /* We'll continue parsing the file, just in case */
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
211 }
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
212 }
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
213 len -= (parse.commandStart + parse.commandSize) - cur;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
214 cur = parse.commandStart + parse.commandSize;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
215 Tcl_FreeParse(&parse);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
216 } while (len);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
217
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
218 if (found && !err) {
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
219 if (Tcl_EvalEx(interp, "plugin_init", -1, TCL_EVAL_GLOBAL) == TCL_OK) {
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
220 result = Tcl_GetObjResult(interp);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
221 if (Tcl_ListObjGetElements(interp, result, &nelems, &listitems) == TCL_OK) {
8117
0df7cb80c56c [gaim-migrate @ 8821]
Ethan Blanton <elb@pidgin.im>
parents: 7831
diff changeset
222 if (nelems == 6) {
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
223 info = g_new0(GaimPluginInfo, 1);
8761
2d596fd60ba8 [gaim-migrate @ 9516]
Mark Doliner <markdoliner@pidgin.im>
parents: 8759
diff changeset
224
9943
b54a762f60fa [gaim-migrate @ 10835]
Nathan Walp <nwalp@pidgin.im>
parents: 9775
diff changeset
225 info->magic = GAIM_PLUGIN_MAGIC;
b54a762f60fa [gaim-migrate @ 10835]
Nathan Walp <nwalp@pidgin.im>
parents: 9775
diff changeset
226 info->major_version = GAIM_MAJOR_VERSION;
b54a762f60fa [gaim-migrate @ 10835]
Nathan Walp <nwalp@pidgin.im>
parents: 9775
diff changeset
227 info->minor_version = GAIM_MINOR_VERSION;
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
228 info->type = GAIM_PLUGIN_STANDARD;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
229 info->dependencies = g_list_append(info->dependencies, "core-tcl");
8761
2d596fd60ba8 [gaim-migrate @ 9516]
Mark Doliner <markdoliner@pidgin.im>
parents: 8759
diff changeset
230
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
231 info->name = g_strdup(Tcl_GetString(listitems[0]));
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
232 info->version = g_strdup(Tcl_GetString(listitems[1]));
8117
0df7cb80c56c [gaim-migrate @ 8821]
Ethan Blanton <elb@pidgin.im>
parents: 7831
diff changeset
233 info->summary = g_strdup(Tcl_GetString(listitems[2]));
9775
e3a3555b0621 [gaim-migrate @ 10643]
Daniel Atallah <datallah@pidgin.im>
parents: 8993
diff changeset
234 info->description = g_strdup(Tcl_GetString(listitems[3]));
8117
0df7cb80c56c [gaim-migrate @ 8821]
Ethan Blanton <elb@pidgin.im>
parents: 7831
diff changeset
235 info->author = g_strdup(Tcl_GetString(listitems[5]));
0df7cb80c56c [gaim-migrate @ 8821]
Ethan Blanton <elb@pidgin.im>
parents: 7831
diff changeset
236 info->homepage = g_strdup(Tcl_GetString(listitems[5]));
8761
2d596fd60ba8 [gaim-migrate @ 9516]
Mark Doliner <markdoliner@pidgin.im>
parents: 8759
diff changeset
237
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
238 plugin->info = info;
8761
2d596fd60ba8 [gaim-migrate @ 9516]
Mark Doliner <markdoliner@pidgin.im>
parents: 8759
diff changeset
239
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
240 if (gaim_plugin_register(plugin))
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
241 status = TRUE;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
242 }
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
243 }
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
244 }
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
245 }
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
246
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
247 Tcl_DeleteInterp(interp);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
248 g_free(buf);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
249 return status;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
250 }
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
251
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
252 static gboolean tcl_load_plugin(GaimPlugin *plugin)
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
253 {
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
254 struct tcl_plugin_data *data;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
255 Tcl_Interp *interp;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
256 Tcl_Obj *result;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
257
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
258 plugin->extra = NULL;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
259
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
260 if ((interp = tcl_create_interp()) == NULL) {
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
261 gaim_debug(GAIM_DEBUG_ERROR, "tcl", "Could not initialize Tcl interpreter\n");
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
262 return FALSE;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
263 }
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
264
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
265 Tcl_SourceRCFile(interp);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
266
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
267 if (Tcl_EvalFile(interp, plugin->path) != TCL_OK) {
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
268 result = Tcl_GetObjResult(interp);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
269 gaim_debug(GAIM_DEBUG_ERROR, "tcl", "Error evaluating %s: %s\n", plugin->path, Tcl_GetString(result));
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
270 Tcl_DeleteInterp(interp);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
271 return FALSE;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
272 }
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
273
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
274 Tcl_Preserve((ClientData)interp);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
275
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
276 data = g_new0(struct tcl_plugin_data, 1);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
277 data->plugin = plugin;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
278 data->interp = interp;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
279 plugin->extra = data;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
280
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
281 g_hash_table_insert(tcl_plugins, (gpointer)interp, (gpointer)data);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
282
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
283 return TRUE;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
284 }
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
285
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
286 static gboolean tcl_unload_plugin(GaimPlugin *plugin)
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
287 {
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
288 struct tcl_plugin_data *data;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
289
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
290 if (plugin == NULL)
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
291 return TRUE;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
292
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
293 data = plugin->extra;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
294
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
295 g_hash_table_remove(tcl_plugins, (gpointer)data);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
296 if (data != NULL) {
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
297 gaim_signals_disconnect_by_handle(data->interp);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
298 tcl_signal_cleanup(data->interp);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
299 Tcl_Release((ClientData)data->interp);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
300 Tcl_DeleteInterp(data->interp);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
301 g_free(data);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
302 }
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
303
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
304 return TRUE;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
305 }
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
306
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
307 static void tcl_destroy_plugin(GaimPlugin *plugin)
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
308 {
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
309 if (plugin->info != NULL) {
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
310 g_free(plugin->info->name);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
311 g_free(plugin->info->version);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
312 g_free(plugin->info->description);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
313 g_free(plugin->info->author);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
314 g_free(plugin->info->homepage);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
315 }
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
316
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
317 return;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
318 }
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
319
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
320 static gboolean tcl_load(GaimPlugin *plugin)
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
321 {
7831
54076c9af6ad [gaim-migrate @ 8483]
Herman Bloggs <herman@bluedigits.com>
parents: 7828
diff changeset
322 if(!tcl_loaded)
54076c9af6ad [gaim-migrate @ 8483]
Herman Bloggs <herman@bluedigits.com>
parents: 7828
diff changeset
323 return FALSE;
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
324 tcl_glib_init();
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
325 tcl_signal_init();
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
326 tcl_plugins = g_hash_table_new(g_direct_hash, g_direct_equal);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
327
7828
b1fd61487270 [gaim-migrate @ 8480]
Ethan Blanton <elb@pidgin.im>
parents: 6735
diff changeset
328 #ifdef HAVE_TK
b1fd61487270 [gaim-migrate @ 8480]
Ethan Blanton <elb@pidgin.im>
parents: 6735
diff changeset
329 Tcl_StaticPackage(NULL, "Tk", Tk_Init, Tk_SafeInit);
b1fd61487270 [gaim-migrate @ 8480]
Ethan Blanton <elb@pidgin.im>
parents: 6735
diff changeset
330 #endif /* HAVE_TK */
b1fd61487270 [gaim-migrate @ 8480]
Ethan Blanton <elb@pidgin.im>
parents: 6735
diff changeset
331
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
332 return TRUE;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
333 }
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
334
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
335 static gboolean tcl_unload(GaimPlugin *plugin)
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
336 {
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
337 g_hash_table_destroy(tcl_plugins);
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
338 tcl_plugins = NULL;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
339
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
340 return TRUE;
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
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
343 static GaimPluginLoaderInfo tcl_loader_info =
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
344 {
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
345 NULL,
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
346 tcl_probe_plugin,
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
347 tcl_load_plugin,
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
348 tcl_unload_plugin,
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
349 tcl_destroy_plugin,
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
350 };
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
351
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
352 static GaimPluginInfo tcl_info =
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
353 {
9943
b54a762f60fa [gaim-migrate @ 10835]
Nathan Walp <nwalp@pidgin.im>
parents: 9775
diff changeset
354 GAIM_PLUGIN_MAGIC,
b54a762f60fa [gaim-migrate @ 10835]
Nathan Walp <nwalp@pidgin.im>
parents: 9775
diff changeset
355 GAIM_MAJOR_VERSION,
b54a762f60fa [gaim-migrate @ 10835]
Nathan Walp <nwalp@pidgin.im>
parents: 9775
diff changeset
356 GAIM_MINOR_VERSION,
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
357 GAIM_PLUGIN_LOADER,
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
358 NULL,
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
359 0,
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
360 NULL,
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
361 GAIM_PRIORITY_DEFAULT,
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
362 "core-tcl",
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
363 N_("Tcl Plugin Loader"),
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
364 VERSION,
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
365 N_("Provides support for loading Tcl plugins"),
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
366 N_("Provides support for loading Tcl plugins"),
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
367 "Ethan Blanton <eblanton@cs.purdue.edu>",
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
368 GAIM_WEBSITE,
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
369 tcl_load,
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
370 tcl_unload,
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
371 NULL,
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
372 NULL,
8993
41f67bceab41 [gaim-migrate @ 9768]
Luke Schierer <lschiere@pidgin.im>
parents: 8989
diff changeset
373 &tcl_loader_info,
41f67bceab41 [gaim-migrate @ 9768]
Luke Schierer <lschiere@pidgin.im>
parents: 8989
diff changeset
374 NULL,
41f67bceab41 [gaim-migrate @ 9768]
Luke Schierer <lschiere@pidgin.im>
parents: 8989
diff changeset
375 NULL
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
376 };
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
377
7831
54076c9af6ad [gaim-migrate @ 8483]
Herman Bloggs <herman@bluedigits.com>
parents: 7828
diff changeset
378 #ifdef _WIN32
54076c9af6ad [gaim-migrate @ 8483]
Herman Bloggs <herman@bluedigits.com>
parents: 7828
diff changeset
379 extern Tcl_Interp* (CALLBACK* wtcl_CreateInterp)();
54076c9af6ad [gaim-migrate @ 8483]
Herman Bloggs <herman@bluedigits.com>
parents: 7828
diff changeset
380 extern void (CALLBACK* wtk_Init)(Tcl_Interp*);
54076c9af6ad [gaim-migrate @ 8483]
Herman Bloggs <herman@bluedigits.com>
parents: 7828
diff changeset
381 #undef Tcl_CreateInterp
54076c9af6ad [gaim-migrate @ 8483]
Herman Bloggs <herman@bluedigits.com>
parents: 7828
diff changeset
382 #define Tcl_CreateInterp wtcl_CreateInterp
54076c9af6ad [gaim-migrate @ 8483]
Herman Bloggs <herman@bluedigits.com>
parents: 7828
diff changeset
383 #undef Tk_Init
54076c9af6ad [gaim-migrate @ 8483]
Herman Bloggs <herman@bluedigits.com>
parents: 7828
diff changeset
384 #define Tk_Init wtk_Init
54076c9af6ad [gaim-migrate @ 8483]
Herman Bloggs <herman@bluedigits.com>
parents: 7828
diff changeset
385 #endif /* _WIN32 */
54076c9af6ad [gaim-migrate @ 8483]
Herman Bloggs <herman@bluedigits.com>
parents: 7828
diff changeset
386
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
387 static void tcl_init_plugin(GaimPlugin *plugin)
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
388 {
7831
54076c9af6ad [gaim-migrate @ 8483]
Herman Bloggs <herman@bluedigits.com>
parents: 7828
diff changeset
389 #ifdef USE_TCL_STUBS
54076c9af6ad [gaim-migrate @ 8483]
Herman Bloggs <herman@bluedigits.com>
parents: 7828
diff changeset
390 Tcl_Interp *interp=NULL;
54076c9af6ad [gaim-migrate @ 8483]
Herman Bloggs <herman@bluedigits.com>
parents: 7828
diff changeset
391 #endif
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
392 _tcl_plugin = plugin;
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
393
7831
54076c9af6ad [gaim-migrate @ 8483]
Herman Bloggs <herman@bluedigits.com>
parents: 7828
diff changeset
394 #ifdef USE_TCL_STUBS
54076c9af6ad [gaim-migrate @ 8483]
Herman Bloggs <herman@bluedigits.com>
parents: 7828
diff changeset
395 if(!(interp=Tcl_CreateInterp()))
54076c9af6ad [gaim-migrate @ 8483]
Herman Bloggs <herman@bluedigits.com>
parents: 7828
diff changeset
396 return;
54076c9af6ad [gaim-migrate @ 8483]
Herman Bloggs <herman@bluedigits.com>
parents: 7828
diff changeset
397
54076c9af6ad [gaim-migrate @ 8483]
Herman Bloggs <herman@bluedigits.com>
parents: 7828
diff changeset
398 if(!Tcl_InitStubs(interp, TCL_VERSION, 0)) {
54076c9af6ad [gaim-migrate @ 8483]
Herman Bloggs <herman@bluedigits.com>
parents: 7828
diff changeset
399 gaim_debug(GAIM_DEBUG_ERROR, "tcl", "Tcl_InitStubs: %s\n", interp->result);
54076c9af6ad [gaim-migrate @ 8483]
Herman Bloggs <herman@bluedigits.com>
parents: 7828
diff changeset
400 return;
54076c9af6ad [gaim-migrate @ 8483]
Herman Bloggs <herman@bluedigits.com>
parents: 7828
diff changeset
401 }
54076c9af6ad [gaim-migrate @ 8483]
Herman Bloggs <herman@bluedigits.com>
parents: 7828
diff changeset
402 #endif
54076c9af6ad [gaim-migrate @ 8483]
Herman Bloggs <herman@bluedigits.com>
parents: 7828
diff changeset
403
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
404 Tcl_FindExecutable("gaim");
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
405
7831
54076c9af6ad [gaim-migrate @ 8483]
Herman Bloggs <herman@bluedigits.com>
parents: 7828
diff changeset
406 #if defined(USE_TK_STUBS) && defined(HAVE_TK)
54076c9af6ad [gaim-migrate @ 8483]
Herman Bloggs <herman@bluedigits.com>
parents: 7828
diff changeset
407 Tk_Init(interp);
54076c9af6ad [gaim-migrate @ 8483]
Herman Bloggs <herman@bluedigits.com>
parents: 7828
diff changeset
408
54076c9af6ad [gaim-migrate @ 8483]
Herman Bloggs <herman@bluedigits.com>
parents: 7828
diff changeset
409 if(!Tk_InitStubs(interp, TK_VERSION, 0)) {
54076c9af6ad [gaim-migrate @ 8483]
Herman Bloggs <herman@bluedigits.com>
parents: 7828
diff changeset
410 gaim_debug(GAIM_DEBUG_ERROR, "tcl", "Error Tk_InitStubs: %s\n", interp->result);
54076c9af6ad [gaim-migrate @ 8483]
Herman Bloggs <herman@bluedigits.com>
parents: 7828
diff changeset
411 Tcl_DeleteInterp(interp);
54076c9af6ad [gaim-migrate @ 8483]
Herman Bloggs <herman@bluedigits.com>
parents: 7828
diff changeset
412 return;
54076c9af6ad [gaim-migrate @ 8483]
Herman Bloggs <herman@bluedigits.com>
parents: 7828
diff changeset
413 }
54076c9af6ad [gaim-migrate @ 8483]
Herman Bloggs <herman@bluedigits.com>
parents: 7828
diff changeset
414 #endif
54076c9af6ad [gaim-migrate @ 8483]
Herman Bloggs <herman@bluedigits.com>
parents: 7828
diff changeset
415 tcl_loaded = TRUE;
54076c9af6ad [gaim-migrate @ 8483]
Herman Bloggs <herman@bluedigits.com>
parents: 7828
diff changeset
416 #ifdef USE_TCL_STUBS
54076c9af6ad [gaim-migrate @ 8483]
Herman Bloggs <herman@bluedigits.com>
parents: 7828
diff changeset
417 Tcl_DeleteInterp(interp);
54076c9af6ad [gaim-migrate @ 8483]
Herman Bloggs <herman@bluedigits.com>
parents: 7828
diff changeset
418 #endif
6694
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
419 tcl_loader_info.exts = g_list_append(tcl_loader_info.exts, "tcl");
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
420 }
2354eced08e8 [gaim-migrate @ 7220]
Ethan Blanton <elb@pidgin.im>
parents:
diff changeset
421
6735
a8c70aeddbe7 [gaim-migrate @ 7267]
Mark Doliner <markdoliner@pidgin.im>
parents: 6694
diff changeset
422 GAIM_INIT_PLUGIN(tcl, tcl_init_plugin, tcl_info)

mercurial