Wed, 18 Jan 2006 18:21:59 +0000
[gaim-migrate @ 15279]
SF Patch #1403656 from Nick Hebner
"This patch makes plugin unloading take into account
plugins that depend on the plugin being unloaded. All
plugins dependent on the plugin in question are
unloaded before this plugin is, so there are not
problems with missing dependencies."
committer: Richard Laager <rlaager@pidgin.im>
| 5205 | 1 | /* |
| 2 | * gaim | |
| 3 | * | |
| 8046 | 4 | * Gaim is the legal property of its developers, whose names are too numerous |
| 5 | * to list here. Please refer to the COPYRIGHT file distributed with this | |
| 6 | * source distribution. | |
| 5205 | 7 | * |
| 8 | * This program is free software; you can redistribute it and/or modify | |
| 9 | * it under the terms of the GNU General Public License as published by | |
| 10 | * the Free Software Foundation; either version 2 of the License, or | |
| 11 | * (at your option) any later version. | |
| 12 | * | |
| 13 | * This program is distributed in the hope that it will be useful, | |
| 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 16 | * GNU General Public License for more details. | |
| 17 | * | |
| 18 | * You should have received a copy of the GNU General Public License | |
| 19 | * along with this program; if not, write to the Free Software | |
| 20 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| 21 | */ | |
|
5872
754c63f29b77
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5840
diff
changeset
|
22 | #include "internal.h" |
| 5205 | 23 | |
|
5638
53e752c88ea1
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5573
diff
changeset
|
24 | #include "accountopt.h" |
|
5872
754c63f29b77
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5840
diff
changeset
|
25 | #include "debug.h" |
|
5436
a0e0bacaa196
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5357
diff
changeset
|
26 | #include "notify.h" |
|
5872
754c63f29b77
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5840
diff
changeset
|
27 | #include "prefs.h" |
|
754c63f29b77
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5840
diff
changeset
|
28 | #include "prpl.h" |
|
754c63f29b77
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5840
diff
changeset
|
29 | #include "request.h" |
|
6485
3c7ba18e32f1
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6432
diff
changeset
|
30 | #include "signals.h" |
|
12695
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
31 | #include "util.h" |
| 9943 | 32 | #include "version.h" |
| 5205 | 33 | |
|
6822
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
34 | typedef struct |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
35 | { |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
36 | GHashTable *commands; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
37 | size_t command_count; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
38 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
39 | } GaimPluginIpcInfo; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
40 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
41 | typedef struct |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
42 | { |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
43 | GaimCallback func; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
44 | GaimSignalMarshalFunc marshal; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
45 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
46 | int num_params; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
47 | GaimValue **params; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
48 | GaimValue *ret_value; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
49 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
50 | } GaimPluginIpcCommand; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
51 | |
|
10447
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
52 | static GList *search_paths = NULL; |
|
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
53 | static GList *plugins = NULL; |
|
11950
a522c2da66e5
[gaim-migrate @ 14241]
Evan Schoenberg <evands@pidgin.im>
parents:
11772
diff
changeset
|
54 | static GList *loaded_plugins = NULL; |
|
a522c2da66e5
[gaim-migrate @ 14241]
Evan Schoenberg <evands@pidgin.im>
parents:
11772
diff
changeset
|
55 | static GList *protocol_plugins = NULL; |
|
a522c2da66e5
[gaim-migrate @ 14241]
Evan Schoenberg <evands@pidgin.im>
parents:
11772
diff
changeset
|
56 | #ifdef GAIM_PLUGINS |
|
10447
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
57 | static GList *load_queue = NULL; |
|
6981
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
58 | static GList *plugin_loaders = NULL; |
|
11950
a522c2da66e5
[gaim-migrate @ 14241]
Evan Schoenberg <evands@pidgin.im>
parents:
11772
diff
changeset
|
59 | #endif |
| 5205 | 60 | |
|
11963
3af2d2a60564
[gaim-migrate @ 14254]
Mark Doliner <markdoliner@pidgin.im>
parents:
11950
diff
changeset
|
61 | /* |
|
3af2d2a60564
[gaim-migrate @ 14254]
Mark Doliner <markdoliner@pidgin.im>
parents:
11950
diff
changeset
|
62 | * TODO: I think the intention was to allow multiple load and unload |
|
3af2d2a60564
[gaim-migrate @ 14254]
Mark Doliner <markdoliner@pidgin.im>
parents:
11950
diff
changeset
|
63 | * callback functions. Perhaps using a GList instead of a |
|
3af2d2a60564
[gaim-migrate @ 14254]
Mark Doliner <markdoliner@pidgin.im>
parents:
11950
diff
changeset
|
64 | * pointer to a single function. |
|
3af2d2a60564
[gaim-migrate @ 14254]
Mark Doliner <markdoliner@pidgin.im>
parents:
11950
diff
changeset
|
65 | */ |
| 5205 | 66 | static void (*probe_cb)(void *) = NULL; |
| 67 | static void *probe_cb_data = NULL; | |
| 68 | static void (*load_cb)(GaimPlugin *, void *) = NULL; | |
| 69 | static void *load_cb_data = NULL; | |
| 70 | static void (*unload_cb)(GaimPlugin *, void *) = NULL; | |
| 71 | static void *unload_cb_data = NULL; | |
| 72 | ||
| 73 | #ifdef GAIM_PLUGINS | |
|
11950
a522c2da66e5
[gaim-migrate @ 14241]
Evan Schoenberg <evands@pidgin.im>
parents:
11772
diff
changeset
|
74 | |
|
10447
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
75 | static gboolean |
|
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
76 | has_file_extension(const char *filename, const char *ext) |
| 5205 | 77 | { |
| 78 | int len, extlen; | |
| 79 | ||
| 80 | if (filename == NULL || *filename == '\0' || ext == NULL) | |
| 81 | return 0; | |
| 82 | ||
| 83 | extlen = strlen(ext); | |
| 84 | len = strlen(filename) - extlen; | |
| 85 | ||
| 86 | if (len < 0) | |
| 87 | return 0; | |
| 88 | ||
|
10447
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
89 | return (strncmp(filename + len, ext, extlen) == 0); |
| 5205 | 90 | } |
| 91 | ||
| 92 | static gboolean | |
|
10682
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
93 | is_native(const char *filename) |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
94 | { |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
95 | const char *last_period; |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
96 | |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
97 | last_period = strrchr(filename, '.'); |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
98 | if (last_period == NULL) |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
99 | return FALSE; |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
100 | |
|
12077
484da2b29933
[gaim-migrate @ 14374]
Mark Doliner <markdoliner@pidgin.im>
parents:
12066
diff
changeset
|
101 | return !(strcmp(last_period, ".dll") & |
|
484da2b29933
[gaim-migrate @ 14374]
Mark Doliner <markdoliner@pidgin.im>
parents:
12066
diff
changeset
|
102 | strcmp(last_period, ".sl") & |
|
484da2b29933
[gaim-migrate @ 14374]
Mark Doliner <markdoliner@pidgin.im>
parents:
12066
diff
changeset
|
103 | strcmp(last_period, ".so")); |
|
10682
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
104 | } |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
105 | |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
106 | static char * |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
107 | gaim_plugin_get_basename(const char *filename) |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
108 | { |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
109 | const char *basename; |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
110 | const char *last_period; |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
111 | |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
112 | basename = strrchr(filename, G_DIR_SEPARATOR); |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
113 | if (basename != NULL) |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
114 | basename++; |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
115 | else |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
116 | basename = filename; |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
117 | |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
118 | if (is_native(basename) && |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
119 | ((last_period = strrchr(basename, '.')) != NULL)) |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
120 | return g_strndup(basename, (last_period - basename)); |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
121 | |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
122 | return g_strdup(basename); |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
123 | } |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
124 | |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
125 | static gboolean |
|
5794
ebdbb7dc6658
[gaim-migrate @ 6219]
Christian Hammond <chipx86@chipx86.com>
parents:
5646
diff
changeset
|
126 | loader_supports_file(GaimPlugin *loader, const char *filename) |
| 5205 | 127 | { |
| 6432 | 128 | GList *exts; |
| 5205 | 129 | |
| 6432 | 130 | for (exts = GAIM_PLUGIN_LOADER_INFO(loader)->exts; exts != NULL; exts = exts->next) { |
|
10447
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
131 | if (has_file_extension(filename, (char *)exts->data)) { |
| 6432 | 132 | return TRUE; |
| 5205 | 133 | } |
| 134 | } | |
| 135 | ||
| 136 | return FALSE; | |
| 137 | } | |
| 138 | ||
| 139 | static GaimPlugin * | |
|
5794
ebdbb7dc6658
[gaim-migrate @ 6219]
Christian Hammond <chipx86@chipx86.com>
parents:
5646
diff
changeset
|
140 | find_loader_for_plugin(const GaimPlugin *plugin) |
| 5205 | 141 | { |
| 142 | GaimPlugin *loader; | |
| 143 | GList *l; | |
| 144 | ||
| 145 | if (plugin->path == NULL) | |
| 146 | return NULL; | |
| 147 | ||
| 148 | for (l = gaim_plugins_get_loaded(); l != NULL; l = l->next) { | |
| 149 | loader = l->data; | |
| 150 | ||
| 151 | if (loader->info->type == GAIM_PLUGIN_LOADER && | |
|
5794
ebdbb7dc6658
[gaim-migrate @ 6219]
Christian Hammond <chipx86@chipx86.com>
parents:
5646
diff
changeset
|
152 | loader_supports_file(loader, plugin->path)) { |
| 5205 | 153 | |
| 154 | return loader; | |
| 155 | } | |
| 156 | ||
| 157 | loader = NULL; | |
| 158 | } | |
| 159 | ||
| 160 | return NULL; | |
| 161 | } | |
| 162 | ||
|
5449
4c350eb7d4a0
[gaim-migrate @ 5836]
Decklin Foster <decklin@red-bean.com>
parents:
5443
diff
changeset
|
163 | #endif /* GAIM_PLUGINS */ |
|
4c350eb7d4a0
[gaim-migrate @ 5836]
Decklin Foster <decklin@red-bean.com>
parents:
5443
diff
changeset
|
164 | |
|
10447
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
165 | /** |
|
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
166 | * Negative if a before b, 0 if equal, positive if a after b. |
|
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
167 | */ |
| 5205 | 168 | static gint |
| 169 | compare_prpl(GaimPlugin *a, GaimPlugin *b) | |
| 170 | { | |
| 7956 | 171 | if(GAIM_IS_PROTOCOL_PLUGIN(a)) { |
| 172 | if(GAIM_IS_PROTOCOL_PLUGIN(b)) | |
| 173 | return strcmp(a->info->name, b->info->name); | |
| 174 | else | |
| 175 | return -1; | |
| 176 | } else { | |
| 177 | if(GAIM_IS_PROTOCOL_PLUGIN(b)) | |
| 178 | return 1; | |
| 179 | else | |
| 180 | return 0; | |
| 181 | } | |
| 5205 | 182 | } |
| 183 | ||
| 184 | GaimPlugin * | |
| 185 | gaim_plugin_new(gboolean native, const char *path) | |
| 186 | { | |
| 187 | GaimPlugin *plugin; | |
| 188 | ||
| 189 | plugin = g_new0(GaimPlugin, 1); | |
| 190 | ||
| 191 | plugin->native_plugin = native; | |
| 192 | plugin->path = (path == NULL ? NULL : g_strdup(path)); | |
| 193 | ||
| 194 | return plugin; | |
| 195 | } | |
| 196 | ||
| 197 | GaimPlugin * | |
| 198 | gaim_plugin_probe(const char *filename) | |
| 199 | { | |
| 200 | #ifdef GAIM_PLUGINS | |
| 201 | GaimPlugin *plugin = NULL; | |
| 202 | GaimPlugin *loader; | |
| 10124 | 203 | gpointer unpunned; |
|
12342
da61b726d595
[gaim-migrate @ 14646]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
12332
diff
changeset
|
204 | gchar *basename = NULL; |
| 5205 | 205 | gboolean (*gaim_init_plugin)(GaimPlugin *); |
| 206 | ||
|
6981
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
207 | gaim_debug_misc("plugins", "probing %s\n", filename); |
| 5205 | 208 | g_return_val_if_fail(filename != NULL, NULL); |
| 209 | ||
|
5973
adc75f0fcaa3
[gaim-migrate @ 6420]
Mark Doliner <markdoliner@pidgin.im>
parents:
5949
diff
changeset
|
210 | if (!g_file_test(filename, G_FILE_TEST_EXISTS)) |
|
adc75f0fcaa3
[gaim-migrate @ 6420]
Mark Doliner <markdoliner@pidgin.im>
parents:
5949
diff
changeset
|
211 | return NULL; |
|
adc75f0fcaa3
[gaim-migrate @ 6420]
Mark Doliner <markdoliner@pidgin.im>
parents:
5949
diff
changeset
|
212 | |
|
10447
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
213 | /* If this plugin has already been probed then exit */ |
|
12342
da61b726d595
[gaim-migrate @ 14646]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
12332
diff
changeset
|
214 | basename = gaim_plugin_get_basename(filename); |
|
da61b726d595
[gaim-migrate @ 14646]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
12332
diff
changeset
|
215 | plugin = gaim_plugins_find_with_basename(basename); |
|
da61b726d595
[gaim-migrate @ 14646]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
12332
diff
changeset
|
216 | g_free(basename); |
| 5205 | 217 | if (plugin != NULL) |
|
12342
da61b726d595
[gaim-migrate @ 14646]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
12332
diff
changeset
|
218 | { |
|
12695
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
219 | if (!strcmp(filename, plugin->path)) |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
220 | return plugin; |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
221 | else if (!gaim_plugin_is_unloadable(plugin)) |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
222 | { |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
223 | gaim_debug_info("plugins", "Not loading %s. " |
|
12342
da61b726d595
[gaim-migrate @ 14646]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
12332
diff
changeset
|
224 | "Another plugin with the same name (%s) has already been loaded.\n", |
|
da61b726d595
[gaim-migrate @ 14646]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
12332
diff
changeset
|
225 | filename, plugin->path); |
|
12695
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
226 | return plugin; |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
227 | } |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
228 | else |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
229 | { |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
230 | /* The old plugin was a different file and it was unloadable. |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
231 | * There's no guarantee that this new file with the same name |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
232 | * will be loadable, but unless it fails in one of the silent |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
233 | * ways and the first one didn't, it's not any worse. The user |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
234 | * will still see a greyed-out plugin, which is what we want. */ |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
235 | gaim_plugin_destroy(plugin); |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
236 | } |
|
12342
da61b726d595
[gaim-migrate @ 14646]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
12332
diff
changeset
|
237 | } |
| 5205 | 238 | |
|
12066
58ee6aa007c8
[gaim-migrate @ 14361]
Mark Doliner <markdoliner@pidgin.im>
parents:
11963
diff
changeset
|
239 | plugin = gaim_plugin_new(has_file_extension(filename, G_MODULE_SUFFIX), filename); |
| 5205 | 240 | |
|
12699
81611fa7a208
[gaim-migrate @ 15042]
Richard Laager <rlaager@pidgin.im>
parents:
12696
diff
changeset
|
241 | if (plugin->native_plugin) { |
|
81611fa7a208
[gaim-migrate @ 15042]
Richard Laager <rlaager@pidgin.im>
parents:
12696
diff
changeset
|
242 | const char *error; |
|
12623
4f1fe7e1f808
[gaim-migrate @ 14959]
Daniel Atallah <datallah@pidgin.im>
parents:
12342
diff
changeset
|
243 | #ifdef _WIN32 |
|
4f1fe7e1f808
[gaim-migrate @ 14959]
Daniel Atallah <datallah@pidgin.im>
parents:
12342
diff
changeset
|
244 | /* Suppress error popups for failing to load plugins */ |
|
4f1fe7e1f808
[gaim-migrate @ 14959]
Daniel Atallah <datallah@pidgin.im>
parents:
12342
diff
changeset
|
245 | UINT old_error_mode = SetErrorMode(SEM_FAILCRITICALERRORS); |
|
4f1fe7e1f808
[gaim-migrate @ 14959]
Daniel Atallah <datallah@pidgin.im>
parents:
12342
diff
changeset
|
246 | #endif |
| 12696 | 247 | |
|
10737
c7759d698996
[gaim-migrate @ 12339]
Mark Doliner <markdoliner@pidgin.im>
parents:
10682
diff
changeset
|
248 | /* |
|
10950
72a6cc0fc7a8
[gaim-migrate @ 12750]
Richard Laager <rlaager@pidgin.im>
parents:
10884
diff
changeset
|
249 | * We pass G_MODULE_BIND_LOCAL here to prevent symbols from |
|
72a6cc0fc7a8
[gaim-migrate @ 12750]
Richard Laager <rlaager@pidgin.im>
parents:
10884
diff
changeset
|
250 | * plugins being added to the global name space. |
|
11378
5857f76fb6b2
[gaim-migrate @ 13604]
Mark Doliner <markdoliner@pidgin.im>
parents:
11256
diff
changeset
|
251 | * |
|
5857f76fb6b2
[gaim-migrate @ 13604]
Mark Doliner <markdoliner@pidgin.im>
parents:
11256
diff
changeset
|
252 | * G_MODULE_BIND_LOCAL was added in glib 2.3.3. |
|
11950
a522c2da66e5
[gaim-migrate @ 14241]
Evan Schoenberg <evands@pidgin.im>
parents:
11772
diff
changeset
|
253 | * TODO: I guess there's nothing we can do about that? |
|
10737
c7759d698996
[gaim-migrate @ 12339]
Mark Doliner <markdoliner@pidgin.im>
parents:
10682
diff
changeset
|
254 | */ |
|
11378
5857f76fb6b2
[gaim-migrate @ 13604]
Mark Doliner <markdoliner@pidgin.im>
parents:
11256
diff
changeset
|
255 | #if GLIB_CHECK_VERSION(2,3,3) |
|
10884
672f44600655
[gaim-migrate @ 12582]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
10737
diff
changeset
|
256 | plugin->handle = g_module_open(filename, G_MODULE_BIND_LOCAL); |
|
11378
5857f76fb6b2
[gaim-migrate @ 13604]
Mark Doliner <markdoliner@pidgin.im>
parents:
11256
diff
changeset
|
257 | #else |
|
5857f76fb6b2
[gaim-migrate @ 13604]
Mark Doliner <markdoliner@pidgin.im>
parents:
11256
diff
changeset
|
258 | plugin->handle = g_module_open(filename, 0); |
|
5857f76fb6b2
[gaim-migrate @ 13604]
Mark Doliner <markdoliner@pidgin.im>
parents:
11256
diff
changeset
|
259 | #endif |
| 5205 | 260 | |
|
10447
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
261 | if (plugin->handle == NULL) |
|
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
262 | { |
|
12695
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
263 | const char *error = g_module_error(); |
|
12704
f4cbb5550f67
[gaim-migrate @ 15047]
Richard Laager <rlaager@pidgin.im>
parents:
12703
diff
changeset
|
264 | if (error != NULL && gaim_str_has_prefix(error, filename)) |
|
12695
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
265 | { |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
266 | error = error + strlen(filename); |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
267 | |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
268 | /* These are just so we don't crash. If we |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
269 | * got this far, they should always be true. */ |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
270 | if (*error == ':') |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
271 | error++; |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
272 | if (*error == ' ') |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
273 | error++; |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
274 | } |
| 5205 | 275 | |
|
12704
f4cbb5550f67
[gaim-migrate @ 15047]
Richard Laager <rlaager@pidgin.im>
parents:
12703
diff
changeset
|
276 | if (error == NULL || !*error) |
|
f4cbb5550f67
[gaim-migrate @ 15047]
Richard Laager <rlaager@pidgin.im>
parents:
12703
diff
changeset
|
277 | { |
|
f4cbb5550f67
[gaim-migrate @ 15047]
Richard Laager <rlaager@pidgin.im>
parents:
12703
diff
changeset
|
278 | plugin->error = g_strdup(_("Unknown error")); |
|
f4cbb5550f67
[gaim-migrate @ 15047]
Richard Laager <rlaager@pidgin.im>
parents:
12703
diff
changeset
|
279 | gaim_debug_error("plugins", "%s is unloadable: Unknown error\n", |
|
f4cbb5550f67
[gaim-migrate @ 15047]
Richard Laager <rlaager@pidgin.im>
parents:
12703
diff
changeset
|
280 | plugin->path); |
|
f4cbb5550f67
[gaim-migrate @ 15047]
Richard Laager <rlaager@pidgin.im>
parents:
12703
diff
changeset
|
281 | } |
|
f4cbb5550f67
[gaim-migrate @ 15047]
Richard Laager <rlaager@pidgin.im>
parents:
12703
diff
changeset
|
282 | else |
|
f4cbb5550f67
[gaim-migrate @ 15047]
Richard Laager <rlaager@pidgin.im>
parents:
12703
diff
changeset
|
283 | { |
|
f4cbb5550f67
[gaim-migrate @ 15047]
Richard Laager <rlaager@pidgin.im>
parents:
12703
diff
changeset
|
284 | plugin->error = g_strdup(error); |
|
f4cbb5550f67
[gaim-migrate @ 15047]
Richard Laager <rlaager@pidgin.im>
parents:
12703
diff
changeset
|
285 | gaim_debug_error("plugins", "%s is unloadable: %s\n", |
|
f4cbb5550f67
[gaim-migrate @ 15047]
Richard Laager <rlaager@pidgin.im>
parents:
12703
diff
changeset
|
286 | plugin->path, plugin->error); |
|
f4cbb5550f67
[gaim-migrate @ 15047]
Richard Laager <rlaager@pidgin.im>
parents:
12703
diff
changeset
|
287 | } |
|
12695
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
288 | #if GLIB_CHECK_VERSION(2,3,3) |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
289 | plugin->handle = g_module_open(filename, G_MODULE_BIND_LAZY | G_MODULE_BIND_LOCAL); |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
290 | #else |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
291 | plugin->handle = g_module_open(filename, G_MODULE_BIND_LAZY); |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
292 | #endif |
|
5269
a318feccd844
[gaim-migrate @ 5641]
Christian Hammond <chipx86@chipx86.com>
parents:
5268
diff
changeset
|
293 | |
|
12695
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
294 | if (plugin->handle == NULL) |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
295 | { |
|
12699
81611fa7a208
[gaim-migrate @ 15042]
Richard Laager <rlaager@pidgin.im>
parents:
12696
diff
changeset
|
296 | #ifdef _WIN32 |
|
81611fa7a208
[gaim-migrate @ 15042]
Richard Laager <rlaager@pidgin.im>
parents:
12696
diff
changeset
|
297 | /* Restore the original error mode */ |
|
81611fa7a208
[gaim-migrate @ 15042]
Richard Laager <rlaager@pidgin.im>
parents:
12696
diff
changeset
|
298 | SetErrorMode(old_error_mode); |
|
81611fa7a208
[gaim-migrate @ 15042]
Richard Laager <rlaager@pidgin.im>
parents:
12696
diff
changeset
|
299 | #endif |
|
12695
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
300 | gaim_plugin_destroy(plugin); |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
301 | return NULL; |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
302 | } |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
303 | else |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
304 | { |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
305 | /* We were able to load the plugin with lazy symbol binding. |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
306 | * This means we're missing some symbol. Mark it as |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
307 | * unloadable and keep going so we get the info to display |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
308 | * to the user so they know to rebuild this plugin. */ |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
309 | plugin->unloadable = TRUE; |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
310 | } |
| 5205 | 311 | } |
| 312 | ||
| 313 | if (!g_module_symbol(plugin->handle, "gaim_init_plugin", | |
|
10447
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
314 | &unpunned)) |
|
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
315 | { |
|
11950
a522c2da66e5
[gaim-migrate @ 14241]
Evan Schoenberg <evands@pidgin.im>
parents:
11772
diff
changeset
|
316 | gaim_debug_error("plugins", "%s is not usable because the " |
|
a522c2da66e5
[gaim-migrate @ 14241]
Evan Schoenberg <evands@pidgin.im>
parents:
11772
diff
changeset
|
317 | "'gaim_init_plugin' symbol could not be " |
|
a522c2da66e5
[gaim-migrate @ 14241]
Evan Schoenberg <evands@pidgin.im>
parents:
11772
diff
changeset
|
318 | "found. Does the plugin call the " |
|
a522c2da66e5
[gaim-migrate @ 14241]
Evan Schoenberg <evands@pidgin.im>
parents:
11772
diff
changeset
|
319 | "GAIM_INIT_PLUGIN() macro?\n", plugin->path); |
| 5205 | 320 | |
|
11950
a522c2da66e5
[gaim-migrate @ 14241]
Evan Schoenberg <evands@pidgin.im>
parents:
11772
diff
changeset
|
321 | g_module_close(plugin->handle); |
| 5443 | 322 | error = g_module_error(); |
|
11950
a522c2da66e5
[gaim-migrate @ 14241]
Evan Schoenberg <evands@pidgin.im>
parents:
11772
diff
changeset
|
323 | if (error != NULL) |
|
a522c2da66e5
[gaim-migrate @ 14241]
Evan Schoenberg <evands@pidgin.im>
parents:
11772
diff
changeset
|
324 | gaim_debug_error("plugins", "Error closing module %s: %s\n", |
|
a522c2da66e5
[gaim-migrate @ 14241]
Evan Schoenberg <evands@pidgin.im>
parents:
11772
diff
changeset
|
325 | plugin->path, error); |
|
a522c2da66e5
[gaim-migrate @ 14241]
Evan Schoenberg <evands@pidgin.im>
parents:
11772
diff
changeset
|
326 | plugin->handle = NULL; |
| 5205 | 327 | |
|
12699
81611fa7a208
[gaim-migrate @ 15042]
Richard Laager <rlaager@pidgin.im>
parents:
12696
diff
changeset
|
328 | #ifdef _WIN32 |
|
81611fa7a208
[gaim-migrate @ 15042]
Richard Laager <rlaager@pidgin.im>
parents:
12696
diff
changeset
|
329 | /* Restore the original error mode */ |
|
81611fa7a208
[gaim-migrate @ 15042]
Richard Laager <rlaager@pidgin.im>
parents:
12696
diff
changeset
|
330 | SetErrorMode(old_error_mode); |
|
81611fa7a208
[gaim-migrate @ 15042]
Richard Laager <rlaager@pidgin.im>
parents:
12696
diff
changeset
|
331 | #endif |
| 5205 | 332 | gaim_plugin_destroy(plugin); |
| 333 | return NULL; | |
| 334 | } | |
| 10124 | 335 | gaim_init_plugin = unpunned; |
|
12699
81611fa7a208
[gaim-migrate @ 15042]
Richard Laager <rlaager@pidgin.im>
parents:
12696
diff
changeset
|
336 | |
|
81611fa7a208
[gaim-migrate @ 15042]
Richard Laager <rlaager@pidgin.im>
parents:
12696
diff
changeset
|
337 | #ifdef _WIN32 |
|
81611fa7a208
[gaim-migrate @ 15042]
Richard Laager <rlaager@pidgin.im>
parents:
12696
diff
changeset
|
338 | /* Restore the original error mode */ |
|
81611fa7a208
[gaim-migrate @ 15042]
Richard Laager <rlaager@pidgin.im>
parents:
12696
diff
changeset
|
339 | SetErrorMode(old_error_mode); |
|
81611fa7a208
[gaim-migrate @ 15042]
Richard Laager <rlaager@pidgin.im>
parents:
12696
diff
changeset
|
340 | #endif |
| 5205 | 341 | } |
| 342 | else { | |
|
5794
ebdbb7dc6658
[gaim-migrate @ 6219]
Christian Hammond <chipx86@chipx86.com>
parents:
5646
diff
changeset
|
343 | loader = find_loader_for_plugin(plugin); |
| 5205 | 344 | |
| 345 | if (loader == NULL) { | |
| 346 | gaim_plugin_destroy(plugin); | |
| 347 | return NULL; | |
| 348 | } | |
| 349 | ||
| 350 | gaim_init_plugin = GAIM_PLUGIN_LOADER_INFO(loader)->probe; | |
| 351 | } | |
| 352 | ||
|
12695
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
353 | if (!gaim_init_plugin(plugin) || plugin->info == NULL) |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
354 | { |
| 5205 | 355 | gaim_plugin_destroy(plugin); |
| 356 | return NULL; | |
| 357 | } | |
| 358 | ||
|
12703
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
359 | /* Really old plugins. */ |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
360 | if (plugin->info->magic != GAIM_PLUGIN_MAGIC) |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
361 | { |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
362 | if (plugin->info->magic >= 2 && plugin->info->magic <= 4) |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
363 | { |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
364 | struct _GaimPluginInfo2 |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
365 | { |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
366 | unsigned int api_version; |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
367 | GaimPluginType type; |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
368 | char *ui_requirement; |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
369 | unsigned long flags; |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
370 | GList *dependencies; |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
371 | GaimPluginPriority priority; |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
372 | |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
373 | char *id; |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
374 | char *name; |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
375 | char *version; |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
376 | char *summary; |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
377 | char *description; |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
378 | char *author; |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
379 | char *homepage; |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
380 | |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
381 | gboolean (*load)(GaimPlugin *plugin); |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
382 | gboolean (*unload)(GaimPlugin *plugin); |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
383 | void (*destroy)(GaimPlugin *plugin); |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
384 | |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
385 | void *ui_info; |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
386 | void *extra_info; |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
387 | GaimPluginUiInfo *prefs_info; |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
388 | GList *(*actions)(GaimPlugin *plugin, gpointer context); |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
389 | } *info2 = (struct _GaimPluginInfo2 *)plugin->info; |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
390 | |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
391 | /* This leaks... but only for ancient plugins, so deal with it. */ |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
392 | plugin->info = g_new0(GaimPluginInfo, 1); |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
393 | |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
394 | /* We don't really need all these to display the plugin info, but |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
395 | * I'm copying them all for good measure. */ |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
396 | plugin->info->magic = info2->api_version; |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
397 | plugin->info->type = info2->type; |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
398 | plugin->info->ui_requirement = info2->ui_requirement; |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
399 | plugin->info->flags = info2->flags; |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
400 | plugin->info->dependencies = info2->dependencies; |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
401 | plugin->info->id = info2->id; |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
402 | plugin->info->name = info2->name; |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
403 | plugin->info->version = info2->version; |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
404 | plugin->info->summary = info2->summary; |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
405 | plugin->info->description = info2->description; |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
406 | plugin->info->author = info2->author; |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
407 | plugin->info->homepage = info2->homepage; |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
408 | plugin->info->load = info2->load; |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
409 | plugin->info->unload = info2->unload; |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
410 | plugin->info->destroy = info2->destroy; |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
411 | plugin->info->ui_info = info2->ui_info; |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
412 | plugin->info->extra_info = info2->extra_info; |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
413 | |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
414 | if (info2->api_version >= 3) |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
415 | plugin->info->prefs_info = info2->prefs_info; |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
416 | |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
417 | if (info2->api_version >= 4) |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
418 | plugin->info->actions = info2->actions; |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
419 | |
|
12704
f4cbb5550f67
[gaim-migrate @ 15047]
Richard Laager <rlaager@pidgin.im>
parents:
12703
diff
changeset
|
420 | |
|
f4cbb5550f67
[gaim-migrate @ 15047]
Richard Laager <rlaager@pidgin.im>
parents:
12703
diff
changeset
|
421 | plugin->error = g_strdup_printf(_("Plugin magic mismatch %d (need %d)"), |
|
f4cbb5550f67
[gaim-migrate @ 15047]
Richard Laager <rlaager@pidgin.im>
parents:
12703
diff
changeset
|
422 | plugin->info->magic, GAIM_PLUGIN_MAGIC); |
|
f4cbb5550f67
[gaim-migrate @ 15047]
Richard Laager <rlaager@pidgin.im>
parents:
12703
diff
changeset
|
423 | gaim_debug_error("plugins", "%s is unloadable: Plugin magic mismatch %d (need %d)\n", |
|
f4cbb5550f67
[gaim-migrate @ 15047]
Richard Laager <rlaager@pidgin.im>
parents:
12703
diff
changeset
|
424 | plugin->path, plugin->info->magic, GAIM_PLUGIN_MAGIC); |
|
12703
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
425 | plugin->unloadable = TRUE; |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
426 | return plugin; |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
427 | } |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
428 | |
|
12704
f4cbb5550f67
[gaim-migrate @ 15047]
Richard Laager <rlaager@pidgin.im>
parents:
12703
diff
changeset
|
429 | gaim_debug_error("plugins", "%s is unloadable: Plugin magic mismatch %d (need %d)\n", |
|
f4cbb5550f67
[gaim-migrate @ 15047]
Richard Laager <rlaager@pidgin.im>
parents:
12703
diff
changeset
|
430 | plugin->path, plugin->info->magic, GAIM_PLUGIN_MAGIC); |
|
12703
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
431 | gaim_plugin_destroy(plugin); |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
432 | return NULL; |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
433 | } |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
434 | |
|
77b2e8d93ab8
[gaim-migrate @ 15046]
Richard Laager <rlaager@pidgin.im>
parents:
12699
diff
changeset
|
435 | if (plugin->info->major_version != GAIM_MAJOR_VERSION || |
| 9943 | 436 | plugin->info->minor_version > GAIM_MINOR_VERSION) |
|
8749
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
437 | { |
|
12704
f4cbb5550f67
[gaim-migrate @ 15047]
Richard Laager <rlaager@pidgin.im>
parents:
12703
diff
changeset
|
438 | plugin->error = g_strdup_printf(_("ABI version mismatch %d.%d.x (need %d.%d.x)"), |
|
12695
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
439 | plugin->info->major_version, plugin->info->minor_version, |
|
10156
463aca04c29a
[gaim-migrate @ 11236]
Mark Doliner <markdoliner@pidgin.im>
parents:
10145
diff
changeset
|
440 | GAIM_MAJOR_VERSION, GAIM_MINOR_VERSION); |
|
12704
f4cbb5550f67
[gaim-migrate @ 15047]
Richard Laager <rlaager@pidgin.im>
parents:
12703
diff
changeset
|
441 | gaim_debug_error("plugins", "%s is unloadable: ABI version mismatch %d.%d.x (need %d.%d.x)\n", |
|
f4cbb5550f67
[gaim-migrate @ 15047]
Richard Laager <rlaager@pidgin.im>
parents:
12703
diff
changeset
|
442 | plugin->path, plugin->info->major_version, plugin->info->minor_version, |
|
f4cbb5550f67
[gaim-migrate @ 15047]
Richard Laager <rlaager@pidgin.im>
parents:
12703
diff
changeset
|
443 | GAIM_MAJOR_VERSION, GAIM_MINOR_VERSION); |
|
12695
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
444 | plugin->unloadable = TRUE; |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
445 | return plugin; |
|
10156
463aca04c29a
[gaim-migrate @ 11236]
Mark Doliner <markdoliner@pidgin.im>
parents:
10145
diff
changeset
|
446 | } |
|
463aca04c29a
[gaim-migrate @ 11236]
Mark Doliner <markdoliner@pidgin.im>
parents:
10145
diff
changeset
|
447 | |
|
463aca04c29a
[gaim-migrate @ 11236]
Mark Doliner <markdoliner@pidgin.im>
parents:
10145
diff
changeset
|
448 | /* If plugin is a PRPL, make sure it implements the required functions */ |
|
463aca04c29a
[gaim-migrate @ 11236]
Mark Doliner <markdoliner@pidgin.im>
parents:
10145
diff
changeset
|
449 | if ((plugin->info->type == GAIM_PLUGIN_PROTOCOL) && ( |
|
463aca04c29a
[gaim-migrate @ 11236]
Mark Doliner <markdoliner@pidgin.im>
parents:
10145
diff
changeset
|
450 | (GAIM_PLUGIN_PROTOCOL_INFO(plugin)->list_icon == NULL) || |
|
463aca04c29a
[gaim-migrate @ 11236]
Mark Doliner <markdoliner@pidgin.im>
parents:
10145
diff
changeset
|
451 | (GAIM_PLUGIN_PROTOCOL_INFO(plugin)->login == NULL) || |
|
463aca04c29a
[gaim-migrate @ 11236]
Mark Doliner <markdoliner@pidgin.im>
parents:
10145
diff
changeset
|
452 | (GAIM_PLUGIN_PROTOCOL_INFO(plugin)->close == NULL))) |
|
463aca04c29a
[gaim-migrate @ 11236]
Mark Doliner <markdoliner@pidgin.im>
parents:
10145
diff
changeset
|
453 | { |
|
12704
f4cbb5550f67
[gaim-migrate @ 15047]
Richard Laager <rlaager@pidgin.im>
parents:
12703
diff
changeset
|
454 | plugin->error = g_strdup(_("Plugin does not implement all required functions")); |
|
f4cbb5550f67
[gaim-migrate @ 15047]
Richard Laager <rlaager@pidgin.im>
parents:
12703
diff
changeset
|
455 | gaim_debug_error("plugins", "%s is unloadable: Plugin does not implement all required functions\n", |
|
f4cbb5550f67
[gaim-migrate @ 15047]
Richard Laager <rlaager@pidgin.im>
parents:
12703
diff
changeset
|
456 | plugin->path); |
|
12695
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
457 | plugin->unloadable = TRUE; |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
458 | return plugin; |
|
8749
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
459 | } |
|
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
460 | |
| 5205 | 461 | return plugin; |
| 462 | #else | |
| 463 | return NULL; | |
| 464 | #endif /* !GAIM_PLUGINS */ | |
| 465 | } | |
| 466 | ||
|
12332
9841e312051d
[gaim-migrate @ 14636]
Mark Doliner <markdoliner@pidgin.im>
parents:
12117
diff
changeset
|
467 | static gint |
|
9841e312051d
[gaim-migrate @ 14636]
Mark Doliner <markdoliner@pidgin.im>
parents:
12117
diff
changeset
|
468 | compare_plugins(gconstpointer a, gconstpointer b) |
|
9841e312051d
[gaim-migrate @ 14636]
Mark Doliner <markdoliner@pidgin.im>
parents:
12117
diff
changeset
|
469 | { |
|
9841e312051d
[gaim-migrate @ 14636]
Mark Doliner <markdoliner@pidgin.im>
parents:
12117
diff
changeset
|
470 | const GaimPlugin *plugina = a; |
|
9841e312051d
[gaim-migrate @ 14636]
Mark Doliner <markdoliner@pidgin.im>
parents:
12117
diff
changeset
|
471 | const GaimPlugin *pluginb = b; |
|
9841e312051d
[gaim-migrate @ 14636]
Mark Doliner <markdoliner@pidgin.im>
parents:
12117
diff
changeset
|
472 | |
|
9841e312051d
[gaim-migrate @ 14636]
Mark Doliner <markdoliner@pidgin.im>
parents:
12117
diff
changeset
|
473 | return strcmp(plugina->info->name, pluginb->info->name); |
|
9841e312051d
[gaim-migrate @ 14636]
Mark Doliner <markdoliner@pidgin.im>
parents:
12117
diff
changeset
|
474 | } |
|
9841e312051d
[gaim-migrate @ 14636]
Mark Doliner <markdoliner@pidgin.im>
parents:
12117
diff
changeset
|
475 | |
| 5205 | 476 | gboolean |
| 477 | gaim_plugin_load(GaimPlugin *plugin) | |
| 478 | { | |
| 479 | #ifdef GAIM_PLUGINS | |
|
6486
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
480 | GList *dep_list = NULL; |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
481 | GList *l; |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
482 | |
| 5205 | 483 | g_return_val_if_fail(plugin != NULL, FALSE); |
| 484 | ||
| 485 | if (gaim_plugin_is_loaded(plugin)) | |
| 486 | return TRUE; | |
| 487 | ||
|
12695
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
488 | if (gaim_plugin_is_unloadable(plugin)) |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
489 | return FALSE; |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
490 | |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
491 | g_return_val_if_fail(plugin->error == NULL, FALSE); |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
492 | |
|
6486
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
493 | /* |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
494 | * Go through the list of the plugin's dependencies. |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
495 | * |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
496 | * First pass: Make sure all the plugins needed are probed. |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
497 | */ |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
498 | for (l = plugin->info->dependencies; l != NULL; l = l->next) |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
499 | { |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
500 | const char *dep_name = (const char *)l->data; |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
501 | GaimPlugin *dep_plugin; |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
502 | |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
503 | dep_plugin = gaim_plugins_find_with_id(dep_name); |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
504 | |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
505 | if (dep_plugin == NULL) |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
506 | { |
| 12926 | 507 | char *tmp; |
|
6486
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
508 | |
| 12926 | 509 | tmp = g_strdup_printf( |
| 510 | _("The required plugin %s was not found. " | |
| 511 | "Please install this plugin and try again."), | |
| 512 | dep_name); | |
|
6486
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
513 | |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
514 | gaim_notify_error(NULL, NULL, |
| 12926 | 515 | _("Gaim encountered errors loading the plugin."), tmp); |
| 516 | g_free(tmp); | |
|
6486
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
517 | |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
518 | if (dep_list != NULL) |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
519 | g_list_free(dep_list); |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
520 | |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
521 | return FALSE; |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
522 | } |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
523 | |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
524 | dep_list = g_list_append(dep_list, dep_plugin); |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
525 | } |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
526 | |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
527 | /* Second pass: load all the required plugins. */ |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
528 | for (l = dep_list; l != NULL; l = l->next) |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
529 | { |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
530 | GaimPlugin *dep_plugin = (GaimPlugin *)l->data; |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
531 | |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
532 | if (!gaim_plugin_is_loaded(dep_plugin)) |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
533 | { |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
534 | if (!gaim_plugin_load(dep_plugin)) |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
535 | { |
| 12926 | 536 | char *tmp; |
|
6486
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
537 | |
| 12926 | 538 | tmp = g_strdup_printf(_("The required plugin %s was unable to load."), |
| 539 | plugin->info->name); | |
|
6486
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
540 | |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
541 | gaim_notify_error(NULL, NULL, |
| 12926 | 542 | _("Gaim was unable to load your plugin."), tmp); |
| 543 | g_free(tmp); | |
|
6486
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
544 | |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
545 | if (dep_list != NULL) |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
546 | g_list_free(dep_list); |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
547 | |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
548 | return FALSE; |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
549 | } |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
550 | } |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
551 | } |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
552 | |
| 12926 | 553 | /* Third pass: note that other plugins are dependencies of this plugin. |
| 554 | * This is done separately in case we had to bail out earlier. */ | |
| 555 | for (l = dep_list; l != NULL; l = l->next) | |
| 556 | { | |
| 557 | GaimPlugin *dep_plugin = (GaimPlugin *)l->data; | |
| 558 | dep_plugin->dependent_plugins = g_list_prepend(dep_plugin->dependent_plugins, plugin->info->id); | |
| 559 | } | |
| 560 | ||
|
6486
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
561 | if (dep_list != NULL) |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
562 | g_list_free(dep_list); |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
563 | |
|
6981
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
564 | if (plugin->native_plugin) |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
565 | { |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
566 | if (plugin->info != NULL && plugin->info->load != NULL) |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
567 | { |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
568 | if (!plugin->info->load(plugin)) |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
569 | return FALSE; |
|
5357
1fa9e57df50c
[gaim-migrate @ 5733]
Christian Hammond <chipx86@chipx86.com>
parents:
5270
diff
changeset
|
570 | } |
| 5205 | 571 | } |
| 572 | else { | |
| 573 | GaimPlugin *loader; | |
| 574 | GaimPluginLoaderInfo *loader_info; | |
| 575 | ||
|
5794
ebdbb7dc6658
[gaim-migrate @ 6219]
Christian Hammond <chipx86@chipx86.com>
parents:
5646
diff
changeset
|
576 | loader = find_loader_for_plugin(plugin); |
| 5205 | 577 | |
| 578 | if (loader == NULL) | |
| 579 | return FALSE; | |
| 580 | ||
| 581 | loader_info = GAIM_PLUGIN_LOADER_INFO(loader); | |
| 582 | ||
| 583 | if (loader_info->load != NULL) | |
|
6981
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
584 | { |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
585 | if (!loader_info->load(plugin)) |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
586 | return FALSE; |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
587 | } |
| 5205 | 588 | } |
| 589 | ||
|
12332
9841e312051d
[gaim-migrate @ 14636]
Mark Doliner <markdoliner@pidgin.im>
parents:
12117
diff
changeset
|
590 | loaded_plugins = g_list_insert_sorted(loaded_plugins, plugin, compare_plugins); |
| 5205 | 591 | |
| 592 | plugin->loaded = TRUE; | |
| 593 | ||
| 594 | /* TODO */ | |
| 595 | if (load_cb != NULL) | |
| 596 | load_cb(plugin, load_cb_data); | |
| 597 | ||
| 8993 | 598 | gaim_signal_emit(gaim_plugins_get_handle(), "plugin-load", plugin); |
|
8986
30ba617356bb
[gaim-migrate @ 9761]
Christopher O'Brien <siege@pidgin.im>
parents:
8759
diff
changeset
|
599 | |
| 5205 | 600 | return TRUE; |
| 601 | ||
| 602 | #else | |
|
5449
4c350eb7d4a0
[gaim-migrate @ 5836]
Decklin Foster <decklin@red-bean.com>
parents:
5443
diff
changeset
|
603 | return TRUE; |
| 5205 | 604 | #endif /* !GAIM_PLUGINS */ |
| 605 | } | |
| 606 | ||
| 607 | gboolean | |
| 608 | gaim_plugin_unload(GaimPlugin *plugin) | |
| 609 | { | |
| 610 | #ifdef GAIM_PLUGINS | |
| 12926 | 611 | GList *l; |
| 612 | ||
| 5205 | 613 | g_return_val_if_fail(plugin != NULL, FALSE); |
| 614 | ||
| 615 | loaded_plugins = g_list_remove(loaded_plugins, plugin); | |
|
11950
a522c2da66e5
[gaim-migrate @ 14241]
Evan Schoenberg <evands@pidgin.im>
parents:
11772
diff
changeset
|
616 | if ((plugin->info != NULL) && GAIM_IS_PROTOCOL_PLUGIN(plugin)) |
|
a522c2da66e5
[gaim-migrate @ 14241]
Evan Schoenberg <evands@pidgin.im>
parents:
11772
diff
changeset
|
617 | protocol_plugins = g_list_remove(protocol_plugins, plugin); |
| 5205 | 618 | |
| 619 | g_return_val_if_fail(gaim_plugin_is_loaded(plugin), FALSE); | |
| 620 | ||
|
10447
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
621 | gaim_debug_info("plugins", "Unloading plugin %s\n", plugin->info->name); |
| 5205 | 622 | |
| 623 | /* cancel any pending dialogs the plugin has */ | |
|
5498
01eec144d71b
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5450
diff
changeset
|
624 | gaim_request_close_with_handle(plugin); |
|
01eec144d71b
[gaim-migrate @ 5894]
Christian Hammond <chipx86@chipx86.com>
parents:
5450
diff
changeset
|
625 | gaim_notify_close_with_handle(plugin); |
| 5205 | 626 | |
| 627 | plugin->loaded = FALSE; | |
| 628 | ||
| 12926 | 629 | /* Unload all plugins that depend on this plugin. */ |
| 630 | for (l = plugin->dependent_plugins; l != NULL; l = l->next) | |
| 631 | { | |
| 632 | const char * dep_name = (const char *)l->data; | |
| 633 | GaimPlugin *dep_plugin; | |
| 634 | ||
| 635 | dep_plugin = gaim_plugins_find_with_id(dep_name); | |
| 636 | ||
| 637 | if (dep_plugin != NULL && gaim_plugin_is_loaded(dep_plugin)) | |
| 638 | { | |
| 639 | if (!gaim_plugin_unload(dep_plugin)) | |
| 640 | { | |
| 641 | char *translated_name = g_strdup(_(dep_plugin->info->name)); | |
| 642 | char *tmp; | |
| 643 | ||
| 644 | tmp = g_strdup_printf(_("The dependent plugin %s failed to unload."), | |
| 645 | translated_name); | |
| 646 | g_free(translated_name); | |
| 647 | ||
| 648 | gaim_notify_error(NULL, NULL, | |
| 649 | _("Gaim encountered errors unloading the plugin."), tmp); | |
| 650 | g_free(tmp); | |
| 651 | } | |
| 652 | } | |
| 653 | } | |
| 654 | ||
| 655 | /* Remove this plugin from each dependency's dependent_plugins list. */ | |
| 656 | for (l = plugin->info->dependencies; l != NULL; l = l->next) | |
| 657 | { | |
| 658 | const char *dep_name = (const char *)l->data; | |
| 659 | GaimPlugin *dependency; | |
| 660 | ||
| 661 | dependency = gaim_plugins_find_with_id(dep_name); | |
| 662 | ||
| 663 | dependency->dependent_plugins = g_list_remove(dependency->dependent_plugins, plugin->info->id); | |
| 664 | } | |
| 665 | ||
| 5205 | 666 | if (plugin->native_plugin) { |
| 667 | if (plugin->info->unload != NULL) | |
| 668 | plugin->info->unload(plugin); | |
| 669 | ||
| 670 | if (plugin->info->type == GAIM_PLUGIN_PROTOCOL) { | |
| 671 | GaimPluginProtocolInfo *prpl_info; | |
| 672 | GList *l; | |
| 673 | ||
| 674 | prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(plugin); | |
| 675 | ||
|
5638
53e752c88ea1
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5573
diff
changeset
|
676 | for (l = prpl_info->user_splits; l != NULL; l = l->next) |
|
53e752c88ea1
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5573
diff
changeset
|
677 | gaim_account_user_split_destroy(l->data); |
| 5205 | 678 | |
|
5638
53e752c88ea1
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5573
diff
changeset
|
679 | for (l = prpl_info->protocol_options; l != NULL; l = l->next) |
|
53e752c88ea1
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5573
diff
changeset
|
680 | gaim_account_option_destroy(l->data); |
| 5205 | 681 | |
| 12117 | 682 | if (prpl_info->user_splits != NULL) { |
|
5646
0aa637549d87
[gaim-migrate @ 6060]
Christian Hammond <chipx86@chipx86.com>
parents:
5638
diff
changeset
|
683 | g_list_free(prpl_info->user_splits); |
| 12117 | 684 | prpl_info->user_splits = NULL; |
| 685 | } | |
|
5646
0aa637549d87
[gaim-migrate @ 6060]
Christian Hammond <chipx86@chipx86.com>
parents:
5638
diff
changeset
|
686 | |
| 12117 | 687 | if (prpl_info->protocol_options != NULL) { |
|
5646
0aa637549d87
[gaim-migrate @ 6060]
Christian Hammond <chipx86@chipx86.com>
parents:
5638
diff
changeset
|
688 | g_list_free(prpl_info->protocol_options); |
| 12117 | 689 | prpl_info->protocol_options = NULL; |
| 690 | } | |
| 5205 | 691 | } |
| 692 | } | |
| 693 | else { | |
| 694 | GaimPlugin *loader; | |
| 695 | GaimPluginLoaderInfo *loader_info; | |
| 696 | ||
|
5794
ebdbb7dc6658
[gaim-migrate @ 6219]
Christian Hammond <chipx86@chipx86.com>
parents:
5646
diff
changeset
|
697 | loader = find_loader_for_plugin(plugin); |
| 5205 | 698 | |
| 699 | if (loader == NULL) | |
| 700 | return FALSE; | |
| 701 | ||
| 702 | loader_info = GAIM_PLUGIN_LOADER_INFO(loader); | |
| 703 | ||
|
9697
9f014c2d2538
[gaim-migrate @ 10556]
Christian Hammond <chipx86@chipx86.com>
parents:
9667
diff
changeset
|
704 | if (loader_info->unload != NULL) |
| 5205 | 705 | loader_info->unload(plugin); |
| 706 | } | |
| 707 | ||
| 708 | gaim_signals_disconnect_by_handle(plugin); | |
|
6822
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
709 | gaim_plugin_ipc_unregister_all(plugin); |
| 5205 | 710 | |
| 711 | /* TODO */ | |
| 712 | if (unload_cb != NULL) | |
| 713 | unload_cb(plugin, unload_cb_data); | |
| 714 | ||
|
8986
30ba617356bb
[gaim-migrate @ 9761]
Christopher O'Brien <siege@pidgin.im>
parents:
8759
diff
changeset
|
715 | gaim_signal_emit(gaim_plugins_get_handle(), "plugin-unload", plugin); |
|
30ba617356bb
[gaim-migrate @ 9761]
Christopher O'Brien <siege@pidgin.im>
parents:
8759
diff
changeset
|
716 | |
|
10087
e5b80a38939d
[gaim-migrate @ 11098]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9943
diff
changeset
|
717 | gaim_prefs_disconnect_by_handle(plugin); |
|
e5b80a38939d
[gaim-migrate @ 11098]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9943
diff
changeset
|
718 | |
| 5205 | 719 | return TRUE; |
|
5449
4c350eb7d4a0
[gaim-migrate @ 5836]
Decklin Foster <decklin@red-bean.com>
parents:
5443
diff
changeset
|
720 | #else |
|
4c350eb7d4a0
[gaim-migrate @ 5836]
Decklin Foster <decklin@red-bean.com>
parents:
5443
diff
changeset
|
721 | return TRUE; |
| 5205 | 722 | #endif /* GAIM_PLUGINS */ |
| 723 | } | |
| 724 | ||
| 725 | gboolean | |
| 726 | gaim_plugin_reload(GaimPlugin *plugin) | |
| 727 | { | |
| 728 | #ifdef GAIM_PLUGINS | |
| 729 | g_return_val_if_fail(plugin != NULL, FALSE); | |
| 730 | g_return_val_if_fail(gaim_plugin_is_loaded(plugin), FALSE); | |
| 731 | ||
| 732 | if (!gaim_plugin_unload(plugin)) | |
| 733 | return FALSE; | |
| 734 | ||
| 735 | if (!gaim_plugin_load(plugin)) | |
| 736 | return FALSE; | |
| 737 | ||
| 738 | return TRUE; | |
| 739 | #else | |
|
5449
4c350eb7d4a0
[gaim-migrate @ 5836]
Decklin Foster <decklin@red-bean.com>
parents:
5443
diff
changeset
|
740 | return TRUE; |
| 5205 | 741 | #endif /* !GAIM_PLUGINS */ |
| 742 | } | |
| 743 | ||
| 744 | void | |
| 745 | gaim_plugin_destroy(GaimPlugin *plugin) | |
| 746 | { | |
|
5449
4c350eb7d4a0
[gaim-migrate @ 5836]
Decklin Foster <decklin@red-bean.com>
parents:
5443
diff
changeset
|
747 | #ifdef GAIM_PLUGINS |
| 5205 | 748 | g_return_if_fail(plugin != NULL); |
| 749 | ||
| 750 | if (gaim_plugin_is_loaded(plugin)) | |
| 751 | gaim_plugin_unload(plugin); | |
| 752 | ||
| 753 | plugins = g_list_remove(plugins, plugin); | |
| 754 | ||
|
6981
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
755 | if (load_queue != NULL) |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
756 | load_queue = g_list_remove(load_queue, plugin); |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
757 | |
| 9943 | 758 | /* true, this may leak a little memory if there is a major version |
| 759 | * mismatch, but it's a lot better than trying to free something | |
| 760 | * we shouldn't, and crashing while trying to load an old plugin */ | |
| 761 | if(plugin->info == NULL || plugin->info->magic != GAIM_PLUGIN_MAGIC || | |
| 762 | plugin->info->major_version != GAIM_MAJOR_VERSION) { | |
| 763 | if(plugin->handle) | |
| 764 | g_module_close(plugin->handle); | |
| 765 | g_free(plugin); | |
| 766 | return; | |
| 767 | } | |
| 768 | ||
|
5243
e8d35a430c6d
[gaim-migrate @ 5614]
Christian Hammond <chipx86@chipx86.com>
parents:
5242
diff
changeset
|
769 | if (plugin->info != NULL && plugin->info->dependencies != NULL) |
|
e8d35a430c6d
[gaim-migrate @ 5614]
Christian Hammond <chipx86@chipx86.com>
parents:
5242
diff
changeset
|
770 | g_list_free(plugin->info->dependencies); |
| 5205 | 771 | |
|
8749
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
772 | if (plugin->native_plugin) |
|
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
773 | { |
|
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
774 | if (plugin->info != NULL && plugin->info->type == GAIM_PLUGIN_LOADER) |
|
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
775 | { |
|
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
776 | GaimPluginLoaderInfo *loader_info; |
| 5205 | 777 | GList *exts, *l, *next_l; |
| 778 | GaimPlugin *p2; | |
| 779 | ||
|
8749
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
780 | loader_info = GAIM_PLUGIN_LOADER_INFO(plugin); |
| 5205 | 781 | |
| 9943 | 782 | if (loader_info != NULL && loader_info->exts != NULL) |
|
8749
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
783 | { |
|
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
784 | for (exts = GAIM_PLUGIN_LOADER_INFO(plugin)->exts; |
|
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
785 | exts != NULL; |
|
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
786 | exts = exts->next) { |
|
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
787 | |
|
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
788 | for (l = gaim_plugins_get_all(); l != NULL; l = next_l) |
|
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
789 | { |
|
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
790 | next_l = l->next; |
| 5205 | 791 | |
|
8749
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
792 | p2 = l->data; |
| 5205 | 793 | |
|
8749
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
794 | if (p2->path != NULL && |
|
10447
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
795 | has_file_extension(p2->path, exts->data)) |
|
8749
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
796 | { |
|
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
797 | gaim_plugin_destroy(p2); |
|
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
798 | } |
|
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
799 | } |
| 5205 | 800 | } |
|
8749
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
801 | |
|
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
802 | g_list_free(loader_info->exts); |
| 5205 | 803 | } |
| 804 | ||
| 805 | plugin_loaders = g_list_remove(plugin_loaders, plugin); | |
| 806 | } | |
| 807 | ||
| 808 | if (plugin->info != NULL && plugin->info->destroy != NULL) | |
| 809 | plugin->info->destroy(plugin); | |
| 810 | ||
| 811 | if (plugin->handle != NULL) | |
| 812 | g_module_close(plugin->handle); | |
| 813 | } | |
|
8749
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
814 | else |
|
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
815 | { |
| 5205 | 816 | GaimPlugin *loader; |
| 817 | GaimPluginLoaderInfo *loader_info; | |
| 818 | ||
|
5794
ebdbb7dc6658
[gaim-migrate @ 6219]
Christian Hammond <chipx86@chipx86.com>
parents:
5646
diff
changeset
|
819 | loader = find_loader_for_plugin(plugin); |
| 5205 | 820 | |
|
8749
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
821 | if (loader != NULL) |
|
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
822 | { |
|
5941
46e136a842b8
[gaim-migrate @ 6381]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
823 | loader_info = GAIM_PLUGIN_LOADER_INFO(loader); |
| 5205 | 824 | |
|
5941
46e136a842b8
[gaim-migrate @ 6381]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
825 | if (loader_info->destroy != NULL) |
|
46e136a842b8
[gaim-migrate @ 6381]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
826 | loader_info->destroy(plugin); |
|
46e136a842b8
[gaim-migrate @ 6381]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
827 | } |
| 5205 | 828 | } |
| 829 | ||
| 830 | if (plugin->path != NULL) g_free(plugin->path); | |
| 831 | if (plugin->error != NULL) g_free(plugin->error); | |
| 832 | ||
| 833 | g_free(plugin); | |
|
5449
4c350eb7d4a0
[gaim-migrate @ 5836]
Decklin Foster <decklin@red-bean.com>
parents:
5443
diff
changeset
|
834 | #endif /* !GAIM_PLUGINS */ |
| 5205 | 835 | } |
| 836 | ||
| 837 | gboolean | |
| 838 | gaim_plugin_is_loaded(const GaimPlugin *plugin) | |
| 839 | { | |
| 840 | g_return_val_if_fail(plugin != NULL, FALSE); | |
| 841 | ||
| 842 | return plugin->loaded; | |
| 843 | } | |
| 844 | ||
|
12695
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
845 | gboolean |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
846 | gaim_plugin_is_unloadable(const GaimPlugin *plugin) |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
847 | { |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
848 | g_return_val_if_fail(plugin != NULL, FALSE); |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
849 | |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
850 | return plugin->unloadable; |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
851 | } |
|
0c93a42b7ee2
[gaim-migrate @ 15038]
Richard Laager <rlaager@pidgin.im>
parents:
12623
diff
changeset
|
852 | |
|
11772
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
853 | const gchar * |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
854 | gaim_plugin_get_id(const GaimPlugin *plugin) { |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
855 | g_return_val_if_fail(plugin, NULL); |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
856 | g_return_val_if_fail(plugin->info, NULL); |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
857 | |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
858 | return plugin->info->id; |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
859 | } |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
860 | |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
861 | const gchar * |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
862 | gaim_plugin_get_name(const GaimPlugin *plugin) { |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
863 | g_return_val_if_fail(plugin, NULL); |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
864 | g_return_val_if_fail(plugin->info, NULL); |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
865 | |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
866 | return plugin->info->name; |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
867 | } |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
868 | |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
869 | const gchar * |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
870 | gaim_plugin_get_version(const GaimPlugin *plugin) { |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
871 | g_return_val_if_fail(plugin, NULL); |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
872 | g_return_val_if_fail(plugin->info, NULL); |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
873 | |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
874 | return plugin->info->version; |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
875 | } |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
876 | |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
877 | const gchar * |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
878 | gaim_plugin_get_summary(const GaimPlugin *plugin) { |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
879 | g_return_val_if_fail(plugin, NULL); |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
880 | g_return_val_if_fail(plugin->info, NULL); |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
881 | |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
882 | return plugin->info->summary; |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
883 | } |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
884 | |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
885 | const gchar * |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
886 | gaim_plugin_get_description(const GaimPlugin *plugin) { |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
887 | g_return_val_if_fail(plugin, NULL); |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
888 | g_return_val_if_fail(plugin->info, NULL); |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
889 | |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
890 | return plugin->info->description; |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
891 | } |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
892 | |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
893 | const gchar * |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
894 | gaim_plugin_get_author(const GaimPlugin *plugin) { |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
895 | g_return_val_if_fail(plugin, NULL); |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
896 | g_return_val_if_fail(plugin->info, NULL); |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
897 | |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
898 | return plugin->info->author; |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
899 | } |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
900 | |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
901 | const gchar * |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
902 | gaim_plugin_get_homepage(const GaimPlugin *plugin) { |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
903 | g_return_val_if_fail(plugin, NULL); |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
904 | g_return_val_if_fail(plugin->info, NULL); |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
905 | |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
906 | return plugin->info->homepage; |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
907 | } |
|
0124b31e896a
[gaim-migrate @ 14063]
Gary Kramlich <grim@reaperworld.com>
parents:
11378
diff
changeset
|
908 | |
|
6822
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
909 | /************************************************************************** |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
910 | * Plugin IPC |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
911 | **************************************************************************/ |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
912 | static void |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
913 | destroy_ipc_info(void *data) |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
914 | { |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
915 | GaimPluginIpcCommand *ipc_command = (GaimPluginIpcCommand *)data; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
916 | int i; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
917 | |
|
9667
f66efc2631b3
[gaim-migrate @ 10519]
Christian Hammond <chipx86@chipx86.com>
parents:
9018
diff
changeset
|
918 | if (ipc_command->params != NULL) |
|
f66efc2631b3
[gaim-migrate @ 10519]
Christian Hammond <chipx86@chipx86.com>
parents:
9018
diff
changeset
|
919 | { |
|
f66efc2631b3
[gaim-migrate @ 10519]
Christian Hammond <chipx86@chipx86.com>
parents:
9018
diff
changeset
|
920 | for (i = 0; i < ipc_command->num_params; i++) |
|
f66efc2631b3
[gaim-migrate @ 10519]
Christian Hammond <chipx86@chipx86.com>
parents:
9018
diff
changeset
|
921 | gaim_value_destroy(ipc_command->params[i]); |
|
f66efc2631b3
[gaim-migrate @ 10519]
Christian Hammond <chipx86@chipx86.com>
parents:
9018
diff
changeset
|
922 | |
|
f66efc2631b3
[gaim-migrate @ 10519]
Christian Hammond <chipx86@chipx86.com>
parents:
9018
diff
changeset
|
923 | g_free(ipc_command->params); |
|
f66efc2631b3
[gaim-migrate @ 10519]
Christian Hammond <chipx86@chipx86.com>
parents:
9018
diff
changeset
|
924 | } |
|
6822
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
925 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
926 | if (ipc_command->ret_value != NULL) |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
927 | gaim_value_destroy(ipc_command->ret_value); |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
928 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
929 | g_free(ipc_command); |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
930 | } |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
931 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
932 | gboolean |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
933 | gaim_plugin_ipc_register(GaimPlugin *plugin, const char *command, |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
934 | GaimCallback func, GaimSignalMarshalFunc marshal, |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
935 | GaimValue *ret_value, int num_params, ...) |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
936 | { |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
937 | GaimPluginIpcInfo *ipc_info; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
938 | GaimPluginIpcCommand *ipc_command; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
939 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
940 | g_return_val_if_fail(plugin != NULL, FALSE); |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
941 | g_return_val_if_fail(command != NULL, FALSE); |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
942 | g_return_val_if_fail(func != NULL, FALSE); |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
943 | g_return_val_if_fail(marshal != NULL, FALSE); |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
944 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
945 | if (plugin->ipc_data == NULL) |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
946 | { |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
947 | ipc_info = plugin->ipc_data = g_new0(GaimPluginIpcInfo, 1); |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
948 | ipc_info->commands = g_hash_table_new_full(g_str_hash, g_str_equal, |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
949 | g_free, destroy_ipc_info); |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
950 | } |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
951 | else |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
952 | ipc_info = (GaimPluginIpcInfo *)plugin->ipc_data; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
953 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
954 | ipc_command = g_new0(GaimPluginIpcCommand, 1); |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
955 | ipc_command->func = func; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
956 | ipc_command->marshal = marshal; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
957 | ipc_command->num_params = num_params; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
958 | ipc_command->ret_value = ret_value; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
959 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
960 | if (num_params > 0) |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
961 | { |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
962 | va_list args; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
963 | int i; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
964 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
965 | ipc_command->params = g_new0(GaimValue *, num_params); |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
966 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
967 | va_start(args, num_params); |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
968 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
969 | for (i = 0; i < num_params; i++) |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
970 | ipc_command->params[i] = va_arg(args, GaimValue *); |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
971 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
972 | va_end(args); |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
973 | } |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
974 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
975 | g_hash_table_replace(ipc_info->commands, g_strdup(command), ipc_command); |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
976 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
977 | ipc_info->command_count++; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
978 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
979 | return TRUE; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
980 | } |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
981 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
982 | void |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
983 | gaim_plugin_ipc_unregister(GaimPlugin *plugin, const char *command) |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
984 | { |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
985 | GaimPluginIpcInfo *ipc_info; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
986 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
987 | g_return_if_fail(plugin != NULL); |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
988 | g_return_if_fail(command != NULL); |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
989 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
990 | ipc_info = (GaimPluginIpcInfo *)plugin->ipc_data; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
991 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
992 | if (ipc_info == NULL || |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
993 | g_hash_table_lookup(ipc_info->commands, command) == NULL) |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
994 | { |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
995 | gaim_debug_error("plugins", |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
996 | "IPC command '%s' was not registered for plugin %s\n", |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
997 | command, plugin->info->name); |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
998 | return; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
999 | } |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1000 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1001 | g_hash_table_remove(ipc_info->commands, command); |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1002 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1003 | ipc_info->command_count--; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1004 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1005 | if (ipc_info->command_count == 0) |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1006 | { |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1007 | g_hash_table_destroy(ipc_info->commands); |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1008 | g_free(ipc_info); |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1009 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1010 | plugin->ipc_data = NULL; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1011 | } |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1012 | } |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1013 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1014 | void |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1015 | gaim_plugin_ipc_unregister_all(GaimPlugin *plugin) |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1016 | { |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1017 | GaimPluginIpcInfo *ipc_info; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1018 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1019 | g_return_if_fail(plugin != NULL); |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1020 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1021 | if (plugin->ipc_data == NULL) |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1022 | return; /* Silently ignore it. */ |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1023 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1024 | ipc_info = (GaimPluginIpcInfo *)plugin->ipc_data; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1025 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1026 | g_hash_table_destroy(ipc_info->commands); |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1027 | g_free(ipc_info); |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1028 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1029 | plugin->ipc_data = NULL; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1030 | } |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1031 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1032 | gboolean |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1033 | gaim_plugin_ipc_get_params(GaimPlugin *plugin, const char *command, |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1034 | GaimValue **ret_value, int *num_params, |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1035 | GaimValue ***params) |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1036 | { |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1037 | GaimPluginIpcInfo *ipc_info; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1038 | GaimPluginIpcCommand *ipc_command; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1039 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1040 | g_return_val_if_fail(plugin != NULL, FALSE); |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1041 | g_return_val_if_fail(command != NULL, FALSE); |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1042 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1043 | ipc_info = (GaimPluginIpcInfo *)plugin->ipc_data; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1044 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1045 | if (ipc_info == NULL || |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1046 | (ipc_command = g_hash_table_lookup(ipc_info->commands, |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1047 | command)) == NULL) |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1048 | { |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1049 | gaim_debug_error("plugins", |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1050 | "IPC command '%s' was not registered for plugin %s\n", |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1051 | command, plugin->info->name); |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1052 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1053 | return FALSE; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1054 | } |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1055 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1056 | if (num_params != NULL) |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1057 | *num_params = ipc_command->num_params; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1058 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1059 | if (params != NULL) |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1060 | *params = ipc_command->params; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1061 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1062 | if (ret_value != NULL) |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1063 | *ret_value = ipc_command->ret_value; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1064 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1065 | return TRUE; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1066 | } |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1067 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1068 | void * |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1069 | gaim_plugin_ipc_call(GaimPlugin *plugin, const char *command, |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1070 | gboolean *ok, ...) |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1071 | { |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1072 | GaimPluginIpcInfo *ipc_info; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1073 | GaimPluginIpcCommand *ipc_command; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1074 | va_list args; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1075 | void *ret_value; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1076 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1077 | if (ok != NULL) |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1078 | *ok = FALSE; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1079 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1080 | g_return_val_if_fail(plugin != NULL, NULL); |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1081 | g_return_val_if_fail(command != NULL, NULL); |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1082 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1083 | ipc_info = (GaimPluginIpcInfo *)plugin->ipc_data; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1084 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1085 | if (ipc_info == NULL || |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1086 | (ipc_command = g_hash_table_lookup(ipc_info->commands, |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1087 | command)) == NULL) |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1088 | { |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1089 | gaim_debug_error("plugins", |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1090 | "IPC command '%s' was not registered for plugin %s\n", |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1091 | command, plugin->info->name); |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1092 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1093 | return NULL; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1094 | } |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1095 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1096 | va_start(args, ok); |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1097 | ipc_command->marshal(ipc_command->func, args, NULL, &ret_value); |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1098 | va_end(args); |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1099 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1100 | if (ok != NULL) |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1101 | *ok = TRUE; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1102 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1103 | return ret_value; |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1104 | } |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1105 | |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1106 | /************************************************************************** |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1107 | * Plugins subsystem |
|
4adcde13ad17
[gaim-migrate @ 7366]
Christian Hammond <chipx86@chipx86.com>
parents:
6639
diff
changeset
|
1108 | **************************************************************************/ |
| 10479 | 1109 | void * |
| 1110 | gaim_plugins_get_handle(void) { | |
| 1111 | static int handle; | |
| 1112 | ||
| 1113 | return &handle; | |
| 1114 | } | |
| 1115 | ||
| 1116 | void | |
| 1117 | gaim_plugins_init(void) { | |
| 1118 | void *handle = gaim_plugins_get_handle(); | |
| 1119 | ||
| 1120 | gaim_signal_register(handle, "plugin-load", | |
| 1121 | gaim_marshal_VOID__POINTER, | |
| 1122 | NULL, 1, | |
| 1123 | gaim_value_new(GAIM_TYPE_SUBTYPE, | |
| 1124 | GAIM_SUBTYPE_PLUGIN)); | |
| 1125 | gaim_signal_register(handle, "plugin-unload", | |
| 1126 | gaim_marshal_VOID__POINTER, | |
| 1127 | NULL, 1, | |
| 1128 | gaim_value_new(GAIM_TYPE_SUBTYPE, | |
| 1129 | GAIM_SUBTYPE_PLUGIN)); | |
| 1130 | } | |
| 1131 | ||
| 1132 | void | |
| 1133 | gaim_plugins_uninit(void) { | |
| 1134 | gaim_signals_disconnect_by_handle(gaim_plugins_get_handle()); | |
| 1135 | } | |
| 1136 | ||
| 1137 | /************************************************************************** | |
| 1138 | * Plugins API | |
| 1139 | **************************************************************************/ | |
| 5205 | 1140 | void |
|
10447
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
1141 | gaim_plugins_add_search_path(const char *path) |
| 5205 | 1142 | { |
|
10447
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
1143 | g_return_if_fail(path != NULL); |
| 5205 | 1144 | |
|
10447
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
1145 | if (g_list_find_custom(search_paths, path, (GCompareFunc)strcmp)) |
|
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
1146 | return; |
| 5205 | 1147 | |
|
10447
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
1148 | search_paths = g_list_append(search_paths, strdup(path)); |
| 5205 | 1149 | } |
| 1150 | ||
| 1151 | void | |
| 1152 | gaim_plugins_unload_all(void) | |
| 1153 | { | |
| 1154 | #ifdef GAIM_PLUGINS | |
| 1155 | ||
| 1156 | while (loaded_plugins != NULL) | |
| 1157 | gaim_plugin_unload(loaded_plugins->data); | |
| 1158 | ||
| 1159 | #endif /* GAIM_PLUGINS */ | |
| 1160 | } | |
| 1161 | ||
| 1162 | void | |
|
5242
155da5e9bbf0
[gaim-migrate @ 5613]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1163 | gaim_plugins_destroy_all(void) |
|
155da5e9bbf0
[gaim-migrate @ 5613]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1164 | { |
|
155da5e9bbf0
[gaim-migrate @ 5613]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1165 | #ifdef GAIM_PLUGINS |
|
155da5e9bbf0
[gaim-migrate @ 5613]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1166 | |
|
155da5e9bbf0
[gaim-migrate @ 5613]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1167 | while (plugins != NULL) |
|
155da5e9bbf0
[gaim-migrate @ 5613]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1168 | gaim_plugin_destroy(plugins->data); |
|
155da5e9bbf0
[gaim-migrate @ 5613]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1169 | |
|
155da5e9bbf0
[gaim-migrate @ 5613]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1170 | #endif /* GAIM_PLUGINS */ |
|
155da5e9bbf0
[gaim-migrate @ 5613]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1171 | } |
| 5838 | 1172 | |
| 1173 | void | |
|
5949
bb7cbf02dda9
[gaim-migrate @ 6393]
Christian Hammond <chipx86@chipx86.com>
parents:
5941
diff
changeset
|
1174 | gaim_plugins_load_saved(const char *key) |
| 5838 | 1175 | { |
| 1176 | #ifdef GAIM_PLUGINS | |
|
5949
bb7cbf02dda9
[gaim-migrate @ 6393]
Christian Hammond <chipx86@chipx86.com>
parents:
5941
diff
changeset
|
1177 | GList *f, *files; |
|
bb7cbf02dda9
[gaim-migrate @ 6393]
Christian Hammond <chipx86@chipx86.com>
parents:
5941
diff
changeset
|
1178 | |
|
bb7cbf02dda9
[gaim-migrate @ 6393]
Christian Hammond <chipx86@chipx86.com>
parents:
5941
diff
changeset
|
1179 | g_return_if_fail(key != NULL); |
| 5838 | 1180 | |
|
5949
bb7cbf02dda9
[gaim-migrate @ 6393]
Christian Hammond <chipx86@chipx86.com>
parents:
5941
diff
changeset
|
1181 | files = gaim_prefs_get_string_list(key); |
|
bb7cbf02dda9
[gaim-migrate @ 6393]
Christian Hammond <chipx86@chipx86.com>
parents:
5941
diff
changeset
|
1182 | |
|
7033
f6096f69a11e
[gaim-migrate @ 7596]
Robert McQueen <robot101@debian.org>
parents:
6982
diff
changeset
|
1183 | for (f = files; f; f = f->next) |
|
f6096f69a11e
[gaim-migrate @ 7596]
Robert McQueen <robot101@debian.org>
parents:
6982
diff
changeset
|
1184 | { |
|
10682
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
1185 | char *filename; |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
1186 | char *basename; |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
1187 | GaimPlugin *plugin; |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
1188 | |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
1189 | if (f->data == NULL) |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
1190 | continue; |
|
7033
f6096f69a11e
[gaim-migrate @ 7596]
Robert McQueen <robot101@debian.org>
parents:
6982
diff
changeset
|
1191 | |
|
10682
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
1192 | filename = f->data; |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
1193 | /* |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
1194 | * We don't know if the filename uses Windows or Unix path |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
1195 | * separators (because people might be sharing a prefs.xml |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
1196 | * file across systems), so we find the last occurrence |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
1197 | * of either. |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
1198 | */ |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
1199 | basename = strrchr(filename, '/'); |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
1200 | if ((basename == NULL) || (basename < strrchr(filename, '\\'))) |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
1201 | basename = strrchr(filename, '\\'); |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
1202 | if (basename != NULL) |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
1203 | basename++; |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
1204 | |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
1205 | if ((plugin = gaim_plugins_find_with_filename(filename)) != NULL) |
|
7033
f6096f69a11e
[gaim-migrate @ 7596]
Robert McQueen <robot101@debian.org>
parents:
6982
diff
changeset
|
1206 | { |
|
10682
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
1207 | gaim_debug_info("plugins", "Loading saved plugin %s\n", |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
1208 | plugin->path); |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
1209 | gaim_plugin_load(plugin); |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
1210 | } |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
1211 | else if ((plugin = gaim_plugins_find_with_basename(basename)) != NULL) |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
1212 | { |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
1213 | gaim_debug_info("plugins", "Loading saved plugin %s\n", |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
1214 | plugin->path); |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
1215 | gaim_plugin_load(plugin); |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
1216 | } |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
1217 | else |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
1218 | { |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
1219 | gaim_debug_error("plugins", "Unable to find saved plugin %s\n", |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
1220 | filename); |
|
7033
f6096f69a11e
[gaim-migrate @ 7596]
Robert McQueen <robot101@debian.org>
parents:
6982
diff
changeset
|
1221 | } |
|
f6096f69a11e
[gaim-migrate @ 7596]
Robert McQueen <robot101@debian.org>
parents:
6982
diff
changeset
|
1222 | |
| 5838 | 1223 | g_free(f->data); |
| 1224 | } | |
| 1225 | ||
| 1226 | g_list_free(files); | |
| 1227 | #endif /* GAIM_PLUGINS */ | |
| 1228 | } | |
| 1229 | ||
| 1230 | ||
|
5242
155da5e9bbf0
[gaim-migrate @ 5613]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
1231 | void |
| 5205 | 1232 | gaim_plugins_probe(const char *ext) |
| 1233 | { | |
| 1234 | #ifdef GAIM_PLUGINS | |
| 1235 | GDir *dir; | |
| 1236 | const gchar *file; | |
| 1237 | gchar *path; | |
| 1238 | GaimPlugin *plugin; | |
|
10447
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
1239 | GList *cur; |
|
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
1240 | const char *search_path; |
| 5205 | 1241 | |
| 1242 | if (!g_module_supported()) | |
| 1243 | return; | |
| 1244 | ||
|
10447
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
1245 | /* Probe plugins */ |
|
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
1246 | for (cur = search_paths; cur != NULL; cur = cur->next) |
|
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
1247 | { |
|
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
1248 | search_path = cur->data; |
| 5205 | 1249 | |
|
10447
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
1250 | dir = g_dir_open(search_path, 0, NULL); |
| 5205 | 1251 | |
|
10447
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
1252 | if (dir != NULL) |
|
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
1253 | { |
|
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
1254 | while ((file = g_dir_read_name(dir)) != NULL) |
|
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
1255 | { |
|
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
1256 | path = g_build_filename(search_path, file, NULL); |
| 5205 | 1257 | |
|
10447
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
1258 | if (ext == NULL || has_file_extension(file, ext)) |
| 5205 | 1259 | plugin = gaim_plugin_probe(path); |
| 1260 | ||
| 1261 | g_free(path); | |
| 1262 | } | |
| 1263 | ||
| 1264 | g_dir_close(dir); | |
| 1265 | } | |
| 1266 | } | |
| 1267 | ||
|
10447
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
1268 | /* See if we have any plugins waiting to load */ |
|
6981
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1269 | while (load_queue != NULL) |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1270 | { |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1271 | plugin = (GaimPlugin *)load_queue->data; |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1272 | |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1273 | load_queue = g_list_remove(load_queue, plugin); |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1274 | |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1275 | if (plugin == NULL || plugin->info == NULL) |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1276 | continue; |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1277 | |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1278 | if (plugin->info->type == GAIM_PLUGIN_LOADER) |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1279 | { |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1280 | /* We'll just load this right now. */ |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1281 | if (!gaim_plugin_load(plugin)) |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1282 | { |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1283 | gaim_plugin_destroy(plugin); |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1284 | |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1285 | continue; |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1286 | } |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1287 | |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1288 | plugin_loaders = g_list_append(plugin_loaders, plugin); |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1289 | |
|
10447
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
1290 | for (cur = GAIM_PLUGIN_LOADER_INFO(plugin)->exts; |
|
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
1291 | cur != NULL; |
|
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
1292 | cur = cur->next) |
|
6981
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1293 | { |
|
10447
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
1294 | gaim_plugins_probe(cur->data); |
|
6981
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1295 | } |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1296 | } |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1297 | else if (plugin->info->type == GAIM_PLUGIN_PROTOCOL) |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1298 | { |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1299 | /* We'll just load this right now. */ |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1300 | if (!gaim_plugin_load(plugin)) |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1301 | { |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1302 | gaim_plugin_destroy(plugin); |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1303 | |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1304 | continue; |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1305 | } |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1306 | |
|
11950
a522c2da66e5
[gaim-migrate @ 14241]
Evan Schoenberg <evands@pidgin.im>
parents:
11772
diff
changeset
|
1307 | /* Make sure we don't load two PRPLs with the same name? */ |
| 7956 | 1308 | if (gaim_find_prpl(plugin->info->id)) |
|
6981
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1309 | { |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1310 | /* Nothing to see here--move along, move along */ |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1311 | gaim_plugin_destroy(plugin); |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1312 | |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1313 | continue; |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1314 | } |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1315 | |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1316 | protocol_plugins = g_list_insert_sorted(protocol_plugins, plugin, |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1317 | (GCompareFunc)compare_prpl); |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1318 | } |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1319 | } |
|
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1320 | |
| 5205 | 1321 | if (probe_cb != NULL) |
| 1322 | probe_cb(probe_cb_data); | |
| 1323 | #endif /* GAIM_PLUGINS */ | |
| 1324 | } | |
| 1325 | ||
| 1326 | gboolean | |
| 1327 | gaim_plugin_register(GaimPlugin *plugin) | |
| 1328 | { | |
| 1329 | g_return_val_if_fail(plugin != NULL, FALSE); | |
| 1330 | ||
|
10447
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
1331 | /* If this plugin has been registered already then exit */ |
| 5205 | 1332 | if (g_list_find(plugins, plugin)) |
| 1333 | return TRUE; | |
| 1334 | ||
|
10447
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
1335 | /* Ensure the plugin has the requisite information */ |
|
8749
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
1336 | if (plugin->info->type == GAIM_PLUGIN_LOADER) |
|
6981
749f11b02abf
[gaim-migrate @ 7537]
Christian Hammond <chipx86@chipx86.com>
parents:
6822
diff
changeset
|
1337 | { |
|
8749
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
1338 | GaimPluginLoaderInfo *loader_info; |
|
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
1339 | |
|
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
1340 | loader_info = GAIM_PLUGIN_LOADER_INFO(plugin); |
|
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
1341 | |
| 9943 | 1342 | if (loader_info == NULL) |
|
8749
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
1343 | { |
|
10447
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
1344 | gaim_debug_error("plugins", "%s is unloadable\n", |
| 9943 | 1345 | plugin->path); |
|
8749
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
1346 | return FALSE; |
|
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
1347 | } |
|
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
1348 | } |
|
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
1349 | else if (plugin->info->type == GAIM_PLUGIN_PROTOCOL) |
|
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
1350 | { |
|
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
1351 | GaimPluginProtocolInfo *prpl_info; |
|
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
1352 | |
|
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
1353 | prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(plugin); |
|
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
1354 | |
| 9943 | 1355 | if (prpl_info == NULL) |
|
8749
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
1356 | { |
|
10447
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
1357 | gaim_debug_error("plugins", "%s is unloadable\n", |
| 9943 | 1358 | plugin->path); |
|
8749
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
1359 | return FALSE; |
|
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
1360 | } |
|
10447
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
1361 | } |
|
8749
fb487e9e101a
[gaim-migrate @ 9504]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
1362 | |
|
11950
a522c2da66e5
[gaim-migrate @ 14241]
Evan Schoenberg <evands@pidgin.im>
parents:
11772
diff
changeset
|
1363 | #ifdef GAIM_PLUGINS |
|
10447
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
1364 | /* This plugin should be probed and maybe loaded--add it to the queue */ |
|
887380ec66f5
[gaim-migrate @ 11712]
Mark Doliner <markdoliner@pidgin.im>
parents:
10279
diff
changeset
|
1365 | load_queue = g_list_append(load_queue, plugin); |
|
11950
a522c2da66e5
[gaim-migrate @ 14241]
Evan Schoenberg <evands@pidgin.im>
parents:
11772
diff
changeset
|
1366 | #else |
|
12081
26a81230ffb1
[gaim-migrate @ 14378]
Evan Schoenberg <evands@pidgin.im>
parents:
12077
diff
changeset
|
1367 | if (plugin->info != NULL) |
|
26a81230ffb1
[gaim-migrate @ 14378]
Evan Schoenberg <evands@pidgin.im>
parents:
12077
diff
changeset
|
1368 | { |
|
26a81230ffb1
[gaim-migrate @ 14378]
Evan Schoenberg <evands@pidgin.im>
parents:
12077
diff
changeset
|
1369 | if (plugin->info->type == GAIM_PLUGIN_PROTOCOL) |
|
26a81230ffb1
[gaim-migrate @ 14378]
Evan Schoenberg <evands@pidgin.im>
parents:
12077
diff
changeset
|
1370 | protocol_plugins = g_list_insert_sorted(protocol_plugins, plugin, |
|
26a81230ffb1
[gaim-migrate @ 14378]
Evan Schoenberg <evands@pidgin.im>
parents:
12077
diff
changeset
|
1371 | (GCompareFunc)compare_prpl); |
|
26a81230ffb1
[gaim-migrate @ 14378]
Evan Schoenberg <evands@pidgin.im>
parents:
12077
diff
changeset
|
1372 | if (plugin->info->load != NULL) |
|
26a81230ffb1
[gaim-migrate @ 14378]
Evan Schoenberg <evands@pidgin.im>
parents:
12077
diff
changeset
|
1373 | if (!plugin->info->load(plugin)) |
|
26a81230ffb1
[gaim-migrate @ 14378]
Evan Schoenberg <evands@pidgin.im>
parents:
12077
diff
changeset
|
1374 | return FALSE; |
|
26a81230ffb1
[gaim-migrate @ 14378]
Evan Schoenberg <evands@pidgin.im>
parents:
12077
diff
changeset
|
1375 | } |
|
11950
a522c2da66e5
[gaim-migrate @ 14241]
Evan Schoenberg <evands@pidgin.im>
parents:
11772
diff
changeset
|
1376 | #endif |
| 5205 | 1377 | |
| 1378 | plugins = g_list_append(plugins, plugin); | |
| 1379 | ||
| 1380 | return TRUE; | |
| 1381 | } | |
| 1382 | ||
| 1383 | gboolean | |
| 1384 | gaim_plugins_enabled(void) | |
| 1385 | { | |
| 1386 | #ifdef GAIM_PLUGINS | |
| 1387 | return TRUE; | |
| 1388 | #else | |
| 1389 | return FALSE; | |
| 1390 | #endif | |
| 1391 | } | |
| 1392 | ||
| 1393 | void | |
| 1394 | gaim_plugins_register_probe_notify_cb(void (*func)(void *), void *data) | |
| 1395 | { | |
| 1396 | /* TODO */ | |
| 1397 | probe_cb = func; | |
| 1398 | probe_cb_data = data; | |
| 1399 | } | |
| 1400 | ||
| 1401 | void | |
| 1402 | gaim_plugins_unregister_probe_notify_cb(void (*func)(void *)) | |
| 1403 | { | |
| 1404 | /* TODO */ | |
| 1405 | probe_cb = NULL; | |
| 1406 | probe_cb_data = NULL; | |
| 1407 | } | |
| 1408 | ||
| 1409 | void | |
| 1410 | gaim_plugins_register_load_notify_cb(void (*func)(GaimPlugin *, void *), | |
| 1411 | void *data) | |
| 1412 | { | |
| 1413 | /* TODO */ | |
| 1414 | load_cb = func; | |
| 1415 | load_cb_data = data; | |
| 1416 | } | |
| 1417 | ||
| 1418 | void | |
| 1419 | gaim_plugins_unregister_load_notify_cb(void (*func)(GaimPlugin *, void *)) | |
| 1420 | { | |
| 1421 | /* TODO */ | |
| 1422 | load_cb = NULL; | |
| 1423 | load_cb_data = NULL; | |
| 1424 | } | |
| 1425 | ||
| 1426 | void | |
| 1427 | gaim_plugins_register_unload_notify_cb(void (*func)(GaimPlugin *, void *), | |
| 1428 | void *data) | |
| 1429 | { | |
| 1430 | /* TODO */ | |
| 1431 | unload_cb = func; | |
| 1432 | unload_cb_data = data; | |
| 1433 | } | |
| 1434 | ||
| 1435 | void | |
| 1436 | gaim_plugins_unregister_unload_notify_cb(void (*func)(GaimPlugin *, void *)) | |
| 1437 | { | |
| 1438 | /* TODO */ | |
| 1439 | unload_cb = NULL; | |
| 1440 | unload_cb_data = NULL; | |
| 1441 | } | |
| 1442 | ||
| 1443 | GaimPlugin * | |
| 1444 | gaim_plugins_find_with_name(const char *name) | |
| 1445 | { | |
| 1446 | GaimPlugin *plugin; | |
| 1447 | GList *l; | |
| 1448 | ||
| 1449 | for (l = plugins; l != NULL; l = l->next) { | |
| 1450 | plugin = l->data; | |
| 1451 | ||
| 1452 | if (!strcmp(plugin->info->name, name)) | |
| 1453 | return plugin; | |
| 1454 | } | |
| 1455 | ||
| 1456 | return NULL; | |
| 1457 | } | |
| 1458 | ||
| 1459 | GaimPlugin * | |
| 1460 | gaim_plugins_find_with_filename(const char *filename) | |
| 1461 | { | |
| 1462 | GaimPlugin *plugin; | |
| 1463 | GList *l; | |
| 1464 | ||
| 1465 | for (l = plugins; l != NULL; l = l->next) { | |
| 1466 | plugin = l->data; | |
| 1467 | ||
| 1468 | if (plugin->path != NULL && !strcmp(plugin->path, filename)) | |
| 1469 | return plugin; | |
| 1470 | } | |
| 1471 | ||
| 1472 | return NULL; | |
| 1473 | } | |
| 1474 | ||
| 1475 | GaimPlugin * | |
|
7033
f6096f69a11e
[gaim-migrate @ 7596]
Robert McQueen <robot101@debian.org>
parents:
6982
diff
changeset
|
1476 | gaim_plugins_find_with_basename(const char *basename) |
|
f6096f69a11e
[gaim-migrate @ 7596]
Robert McQueen <robot101@debian.org>
parents:
6982
diff
changeset
|
1477 | { |
|
11950
a522c2da66e5
[gaim-migrate @ 14241]
Evan Schoenberg <evands@pidgin.im>
parents:
11772
diff
changeset
|
1478 | #ifdef GAIM_PLUGINS |
|
7033
f6096f69a11e
[gaim-migrate @ 7596]
Robert McQueen <robot101@debian.org>
parents:
6982
diff
changeset
|
1479 | GaimPlugin *plugin; |
|
f6096f69a11e
[gaim-migrate @ 7596]
Robert McQueen <robot101@debian.org>
parents:
6982
diff
changeset
|
1480 | GList *l; |
|
10682
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
1481 | char *basename_no_ext; |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
1482 | char *tmp; |
|
7033
f6096f69a11e
[gaim-migrate @ 7596]
Robert McQueen <robot101@debian.org>
parents:
6982
diff
changeset
|
1483 | |
|
f6096f69a11e
[gaim-migrate @ 7596]
Robert McQueen <robot101@debian.org>
parents:
6982
diff
changeset
|
1484 | g_return_val_if_fail(basename != NULL, NULL); |
|
f6096f69a11e
[gaim-migrate @ 7596]
Robert McQueen <robot101@debian.org>
parents:
6982
diff
changeset
|
1485 | |
|
10682
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
1486 | basename_no_ext = gaim_plugin_get_basename(basename); |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
1487 | |
|
7033
f6096f69a11e
[gaim-migrate @ 7596]
Robert McQueen <robot101@debian.org>
parents:
6982
diff
changeset
|
1488 | for (l = plugins; l != NULL; l = l->next) |
|
f6096f69a11e
[gaim-migrate @ 7596]
Robert McQueen <robot101@debian.org>
parents:
6982
diff
changeset
|
1489 | { |
|
f6096f69a11e
[gaim-migrate @ 7596]
Robert McQueen <robot101@debian.org>
parents:
6982
diff
changeset
|
1490 | plugin = (GaimPlugin *)l->data; |
|
f6096f69a11e
[gaim-migrate @ 7596]
Robert McQueen <robot101@debian.org>
parents:
6982
diff
changeset
|
1491 | |
| 7278 | 1492 | if (plugin->path != NULL) { |
|
10682
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
1493 | tmp = gaim_plugin_get_basename(plugin->path); |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
1494 | if (!strcmp(tmp, basename_no_ext)) |
|
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
1495 | { |
| 7278 | 1496 | g_free(tmp); |
|
10682
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
1497 | g_free(basename_no_ext); |
|
7033
f6096f69a11e
[gaim-migrate @ 7596]
Robert McQueen <robot101@debian.org>
parents:
6982
diff
changeset
|
1498 | return plugin; |
| 7278 | 1499 | } |
| 7279 | 1500 | g_free(tmp); |
|
7033
f6096f69a11e
[gaim-migrate @ 7596]
Robert McQueen <robot101@debian.org>
parents:
6982
diff
changeset
|
1501 | } |
|
f6096f69a11e
[gaim-migrate @ 7596]
Robert McQueen <robot101@debian.org>
parents:
6982
diff
changeset
|
1502 | } |
|
f6096f69a11e
[gaim-migrate @ 7596]
Robert McQueen <robot101@debian.org>
parents:
6982
diff
changeset
|
1503 | |
|
10682
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
1504 | g_free(basename_no_ext); |
|
11950
a522c2da66e5
[gaim-migrate @ 14241]
Evan Schoenberg <evands@pidgin.im>
parents:
11772
diff
changeset
|
1505 | #endif /* GAIM_PLUGINS */ |
|
10682
c293ad49121e
[gaim-migrate @ 12228]
Richard Laager <rlaager@pidgin.im>
parents:
10504
diff
changeset
|
1506 | |
|
7033
f6096f69a11e
[gaim-migrate @ 7596]
Robert McQueen <robot101@debian.org>
parents:
6982
diff
changeset
|
1507 | return NULL; |
|
f6096f69a11e
[gaim-migrate @ 7596]
Robert McQueen <robot101@debian.org>
parents:
6982
diff
changeset
|
1508 | } |
|
f6096f69a11e
[gaim-migrate @ 7596]
Robert McQueen <robot101@debian.org>
parents:
6982
diff
changeset
|
1509 | |
|
f6096f69a11e
[gaim-migrate @ 7596]
Robert McQueen <robot101@debian.org>
parents:
6982
diff
changeset
|
1510 | GaimPlugin * |
| 5205 | 1511 | gaim_plugins_find_with_id(const char *id) |
| 1512 | { | |
| 1513 | GaimPlugin *plugin; | |
| 1514 | GList *l; | |
| 1515 | ||
| 1516 | g_return_val_if_fail(id != NULL, NULL); | |
| 1517 | ||
|
6486
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
1518 | for (l = plugins; l != NULL; l = l->next) |
|
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
1519 | { |
| 5205 | 1520 | plugin = l->data; |
| 1521 | ||
|
6486
18da8fdbc85b
[gaim-migrate @ 7000]
Christian Hammond <chipx86@chipx86.com>
parents:
6485
diff
changeset
|
1522 | if (plugin->info->id != NULL && !strcmp(plugin->info->id, id)) |
| 5205 | 1523 | return plugin; |
| 1524 | } | |
| 1525 | ||
| 1526 | return NULL; | |
| 1527 | } | |
| 1528 | ||
| 1529 | GList * | |
| 1530 | gaim_plugins_get_loaded(void) | |
| 1531 | { | |
| 1532 | return loaded_plugins; | |
| 1533 | } | |
| 1534 | ||
| 1535 | GList * | |
|
5573
633880e3f137
[gaim-migrate @ 5976]
Christian Hammond <chipx86@chipx86.com>
parents:
5498
diff
changeset
|
1536 | gaim_plugins_get_protocols(void) |
|
633880e3f137
[gaim-migrate @ 5976]
Christian Hammond <chipx86@chipx86.com>
parents:
5498
diff
changeset
|
1537 | { |
|
633880e3f137
[gaim-migrate @ 5976]
Christian Hammond <chipx86@chipx86.com>
parents:
5498
diff
changeset
|
1538 | return protocol_plugins; |
|
633880e3f137
[gaim-migrate @ 5976]
Christian Hammond <chipx86@chipx86.com>
parents:
5498
diff
changeset
|
1539 | } |
|
633880e3f137
[gaim-migrate @ 5976]
Christian Hammond <chipx86@chipx86.com>
parents:
5498
diff
changeset
|
1540 | |
|
633880e3f137
[gaim-migrate @ 5976]
Christian Hammond <chipx86@chipx86.com>
parents:
5498
diff
changeset
|
1541 | GList * |
| 5205 | 1542 | gaim_plugins_get_all(void) |
| 1543 | { | |
| 1544 | return plugins; | |
| 1545 | } | |
| 1546 | ||
|
9015
3c27e9074fa2
[gaim-migrate @ 9791]
Christopher O'Brien <siege@pidgin.im>
parents:
8993
diff
changeset
|
1547 | |
|
3c27e9074fa2
[gaim-migrate @ 9791]
Christopher O'Brien <siege@pidgin.im>
parents:
8993
diff
changeset
|
1548 | GaimPluginAction * |
|
3c27e9074fa2
[gaim-migrate @ 9791]
Christopher O'Brien <siege@pidgin.im>
parents:
8993
diff
changeset
|
1549 | gaim_plugin_action_new(char* label, void (*callback)(GaimPluginAction *)) |
|
3c27e9074fa2
[gaim-migrate @ 9791]
Christopher O'Brien <siege@pidgin.im>
parents:
8993
diff
changeset
|
1550 | { |
|
3c27e9074fa2
[gaim-migrate @ 9791]
Christopher O'Brien <siege@pidgin.im>
parents:
8993
diff
changeset
|
1551 | GaimPluginAction *act = g_new0(GaimPluginAction, 1); |
|
9018
b13b46fa2f16
[gaim-migrate @ 9794]
Mark Doliner <markdoliner@pidgin.im>
parents:
9015
diff
changeset
|
1552 | |
|
9015
3c27e9074fa2
[gaim-migrate @ 9791]
Christopher O'Brien <siege@pidgin.im>
parents:
8993
diff
changeset
|
1553 | act->label = label; |
|
3c27e9074fa2
[gaim-migrate @ 9791]
Christopher O'Brien <siege@pidgin.im>
parents:
8993
diff
changeset
|
1554 | act->callback = callback; |
|
9018
b13b46fa2f16
[gaim-migrate @ 9794]
Mark Doliner <markdoliner@pidgin.im>
parents:
9015
diff
changeset
|
1555 | |
|
b13b46fa2f16
[gaim-migrate @ 9794]
Mark Doliner <markdoliner@pidgin.im>
parents:
9015
diff
changeset
|
1556 | return act; |
|
9015
3c27e9074fa2
[gaim-migrate @ 9791]
Christopher O'Brien <siege@pidgin.im>
parents:
8993
diff
changeset
|
1557 | } |