Mercurial > pidgin
annotate plugins/mono/loader/mono.c @ 13253:87a7c3077c19
[gaim-migrate @ 15619]
More cleaning up of oscar. Renamed some functions to be more clear.
Got rid of some stuff that wasn't used. Inlined some small things
in conn.c that were only used once.
The goals of all this are
1. Non-blocking I/O for all connections
2. p2p stuff won't use the same struct as oscar connections, because
that's stupid
3. The oscar PRPL should be less scary
committer: Tailor Script <tailor@pidgin.im>
| author | Mark Doliner <mark@kingant.net> |
|---|---|
| date | Sun, 12 Feb 2006 21:27:04 +0000 |
| parents | ecd33ffb0b0a |
| children |
| rev | line source |
|---|---|
| 11660 | 1 /* |
| 2 * Mono Plugin Loader | |
| 3 * | |
| 4 * -- Thanks to the perl plugin loader for all the great tips ;-) | |
| 5 * | |
| 6 * Eoin Coffey | |
| 7 */ | |
| 8 | |
| 9 #ifdef HAVE_CONFIG_H | |
|
11786
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
10 # include <config.h> |
| 11660 | 11 #endif |
| 12 | |
| 13 #include "internal.h" | |
| 14 #include "debug.h" | |
| 15 #include "plugin.h" | |
| 16 #include "version.h" | |
| 17 #include "mono-helper.h" | |
| 18 | |
| 19 #define MONO_PLUGIN_ID "core-mono" | |
| 20 | |
|
11786
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
21 /****************************************************************************** |
|
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
22 * Loader Stuff |
|
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
23 *****************************************************************************/ |
| 11660 | 24 /* probes the given plugin to determine if its a plugin */ |
| 25 static gboolean probe_mono_plugin(GaimPlugin *plugin) | |
| 26 { | |
| 27 MonoAssembly *assm; | |
| 28 MonoMethod *m = NULL; | |
| 29 MonoMethod *info_method = NULL; | |
| 30 MonoObject *plugin_info; | |
| 31 gboolean found_load = FALSE, found_unload = FALSE, found_destroy = FALSE, found_info = FALSE; | |
| 32 gpointer iter = NULL; | |
|
11786
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
33 |
| 11660 | 34 GaimPluginInfo *info; |
| 35 GaimMonoPlugin *mplug; | |
|
11786
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
36 |
| 11660 | 37 char *file = plugin->path; |
|
11786
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
38 |
|
11980
67fbd2ff4c4e
[gaim-migrate @ 14273]
Gary Kramlich <grim@reaperworld.com>
parents:
11952
diff
changeset
|
39 assm = mono_domain_assembly_open(ml_get_domain(), file); |
|
11786
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
40 |
| 11660 | 41 if (!assm) { |
| 42 return FALSE; | |
| 43 } | |
|
11786
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
44 |
| 11660 | 45 gaim_debug(GAIM_DEBUG_INFO, "mono", "Probing plugin\n"); |
|
11786
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
46 |
|
11980
67fbd2ff4c4e
[gaim-migrate @ 14273]
Gary Kramlich <grim@reaperworld.com>
parents:
11952
diff
changeset
|
47 if (ml_is_api_dll(mono_assembly_get_image(assm))) { |
| 11660 | 48 gaim_debug(GAIM_DEBUG_INFO, "mono", "Found our GaimAPI.dll\n"); |
| 49 return FALSE; | |
| 50 } | |
|
11786
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
51 |
| 11660 | 52 info = g_new0(GaimPluginInfo, 1); |
| 53 mplug = g_new0(GaimMonoPlugin, 1); | |
|
11980
67fbd2ff4c4e
[gaim-migrate @ 14273]
Gary Kramlich <grim@reaperworld.com>
parents:
11952
diff
changeset
|
54 |
|
67fbd2ff4c4e
[gaim-migrate @ 14273]
Gary Kramlich <grim@reaperworld.com>
parents:
11952
diff
changeset
|
55 mplug->signal_data = NULL; |
|
11786
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
56 |
| 11660 | 57 mplug->assm = assm; |
|
11786
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
58 |
|
11980
67fbd2ff4c4e
[gaim-migrate @ 14273]
Gary Kramlich <grim@reaperworld.com>
parents:
11952
diff
changeset
|
59 mplug->klass = ml_find_plugin_class(mono_assembly_get_image(mplug->assm)); |
| 11660 | 60 if (!mplug->klass) { |
| 61 gaim_debug(GAIM_DEBUG_ERROR, "mono", "no plugin class in \'%s\'\n", file); | |
| 62 return FALSE; | |
| 63 } | |
|
11786
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
64 |
|
11980
67fbd2ff4c4e
[gaim-migrate @ 14273]
Gary Kramlich <grim@reaperworld.com>
parents:
11952
diff
changeset
|
65 mplug->obj = mono_object_new(ml_get_domain(), mplug->klass); |
| 11660 | 66 if (!mplug->obj) { |
| 67 gaim_debug(GAIM_DEBUG_ERROR, "mono", "obj not valid\n"); | |
| 68 return FALSE; | |
| 69 } | |
|
11786
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
70 |
| 11660 | 71 mono_runtime_object_init(mplug->obj); |
|
11786
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
72 |
| 11660 | 73 while ((m = mono_class_get_methods(mplug->klass, &iter))) { |
| 74 if (strcmp(mono_method_get_name(m), "Load") == 0) { | |
| 75 mplug->load = m; | |
| 76 found_load = TRUE; | |
| 77 } else if (strcmp(mono_method_get_name(m), "Unload") == 0) { | |
| 78 mplug->unload = m; | |
| 79 found_unload = TRUE; | |
| 80 } else if (strcmp(mono_method_get_name(m), "Destroy") == 0) { | |
| 81 mplug->destroy = m; | |
| 82 found_destroy = TRUE; | |
| 83 } else if (strcmp(mono_method_get_name(m), "Info") == 0) { | |
| 84 info_method = m; | |
| 85 found_info = TRUE; | |
| 86 } | |
| 87 } | |
|
11786
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
88 |
| 11660 | 89 if (!(found_load && found_unload && found_destroy && found_info)) { |
| 90 gaim_debug(GAIM_DEBUG_ERROR, "mono", "did not find the required methods\n"); | |
| 91 return FALSE; | |
| 92 } | |
|
11786
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
93 |
|
11980
67fbd2ff4c4e
[gaim-migrate @ 14273]
Gary Kramlich <grim@reaperworld.com>
parents:
11952
diff
changeset
|
94 plugin_info = ml_invoke(info_method, mplug->obj, NULL); |
|
11786
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
95 |
| 11660 | 96 /* now that the methods are filled out we can populate |
| 97 the info struct with all the needed info */ | |
|
11786
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
98 |
|
11980
67fbd2ff4c4e
[gaim-migrate @ 14273]
Gary Kramlich <grim@reaperworld.com>
parents:
11952
diff
changeset
|
99 info->name = ml_get_prop_string(plugin_info, "Name"); |
|
67fbd2ff4c4e
[gaim-migrate @ 14273]
Gary Kramlich <grim@reaperworld.com>
parents:
11952
diff
changeset
|
100 info->version = ml_get_prop_string(plugin_info, "Version"); |
|
67fbd2ff4c4e
[gaim-migrate @ 14273]
Gary Kramlich <grim@reaperworld.com>
parents:
11952
diff
changeset
|
101 info->summary = ml_get_prop_string(plugin_info, "Summary"); |
|
67fbd2ff4c4e
[gaim-migrate @ 14273]
Gary Kramlich <grim@reaperworld.com>
parents:
11952
diff
changeset
|
102 info->description = ml_get_prop_string(plugin_info, "Description"); |
|
67fbd2ff4c4e
[gaim-migrate @ 14273]
Gary Kramlich <grim@reaperworld.com>
parents:
11952
diff
changeset
|
103 info->author = ml_get_prop_string(plugin_info, "Author"); |
|
67fbd2ff4c4e
[gaim-migrate @ 14273]
Gary Kramlich <grim@reaperworld.com>
parents:
11952
diff
changeset
|
104 info->homepage = ml_get_prop_string(plugin_info, "Homepage"); |
|
11786
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
105 |
| 11660 | 106 info->magic = GAIM_PLUGIN_MAGIC; |
| 107 info->major_version = GAIM_MAJOR_VERSION; | |
| 108 info->minor_version = GAIM_MINOR_VERSION; | |
| 109 info->type = GAIM_PLUGIN_STANDARD; | |
|
11786
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
110 |
| 11660 | 111 /* this plugin depends on us; duh */ |
| 112 info->dependencies = g_list_append(info->dependencies, MONO_PLUGIN_ID); | |
| 113 mplug->plugin = plugin; | |
| 114 | |
| 115 plugin->info = info; | |
| 116 info->extra_info = mplug; | |
|
11786
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
117 |
|
11980
67fbd2ff4c4e
[gaim-migrate @ 14273]
Gary Kramlich <grim@reaperworld.com>
parents:
11952
diff
changeset
|
118 ml_add_plugin(mplug); |
|
11786
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
119 |
| 11660 | 120 return gaim_plugin_register(plugin); |
| 121 } | |
| 122 | |
| 123 /* Loads a Mono Plugin by calling 'load' in the class */ | |
| 124 static gboolean load_mono_plugin(GaimPlugin *plugin) | |
| 125 { | |
| 126 GaimMonoPlugin *mplug; | |
|
11786
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
127 |
| 11660 | 128 gaim_debug(GAIM_DEBUG_INFO, "mono", "Loading plugin\n"); |
|
11786
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
129 |
| 11660 | 130 mplug = (GaimMonoPlugin*)plugin->info->extra_info; |
|
11786
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
131 |
|
11980
67fbd2ff4c4e
[gaim-migrate @ 14273]
Gary Kramlich <grim@reaperworld.com>
parents:
11952
diff
changeset
|
132 ml_invoke(mplug->load, mplug->obj, NULL); |
|
11786
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
133 |
| 11660 | 134 return TRUE; |
| 135 } | |
| 136 | |
| 137 /* Unloads a Mono Plugin by calling 'unload' in the class */ | |
| 138 static gboolean unload_mono_plugin(GaimPlugin *plugin) | |
| 139 { | |
| 140 GaimMonoPlugin *mplug; | |
|
11786
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
141 |
| 11660 | 142 gaim_debug(GAIM_DEBUG_INFO, "mono", "Unloading plugin\n"); |
|
11786
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
143 |
| 11660 | 144 mplug = (GaimMonoPlugin*)plugin->info->extra_info; |
|
11786
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
145 |
| 11660 | 146 gaim_signals_disconnect_by_handle((gpointer)mplug->klass); |
|
11996
ecd33ffb0b0a
[gaim-migrate @ 14289]
Gary Kramlich <grim@reaperworld.com>
parents:
11980
diff
changeset
|
147 g_list_foreach(mplug->signal_data, (GFunc)g_free, NULL); |
|
11980
67fbd2ff4c4e
[gaim-migrate @ 14273]
Gary Kramlich <grim@reaperworld.com>
parents:
11952
diff
changeset
|
148 g_list_free(mplug->signal_data); |
|
67fbd2ff4c4e
[gaim-migrate @ 14273]
Gary Kramlich <grim@reaperworld.com>
parents:
11952
diff
changeset
|
149 mplug->signal_data = NULL; |
|
11786
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
150 |
|
11980
67fbd2ff4c4e
[gaim-migrate @ 14273]
Gary Kramlich <grim@reaperworld.com>
parents:
11952
diff
changeset
|
151 ml_invoke(mplug->unload, mplug->obj, NULL); |
|
11786
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
152 |
| 11660 | 153 return TRUE; |
| 154 } | |
| 155 | |
|
11679
f05542391cd2
[gaim-migrate @ 13965]
Gary Kramlich <grim@reaperworld.com>
parents:
11660
diff
changeset
|
156 static void destroy_mono_plugin(GaimPlugin *plugin) |
| 11660 | 157 { |
| 158 GaimMonoPlugin *mplug; | |
|
11786
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
159 |
| 11660 | 160 gaim_debug(GAIM_DEBUG_INFO, "mono", "Destroying plugin\n"); |
|
11786
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
161 |
| 11660 | 162 mplug = (GaimMonoPlugin*)plugin->info->extra_info; |
|
11786
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
163 |
|
11980
67fbd2ff4c4e
[gaim-migrate @ 14273]
Gary Kramlich <grim@reaperworld.com>
parents:
11952
diff
changeset
|
164 ml_invoke(mplug->destroy, mplug->obj, NULL); |
|
11786
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
165 |
| 11660 | 166 if (plugin->info) { |
|
11786
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
167 g_free(plugin->info->name); |
|
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
168 g_free(plugin->info->version); |
|
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
169 g_free(plugin->info->summary); |
|
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
170 g_free(plugin->info->description); |
|
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
171 g_free(plugin->info->author); |
|
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
172 g_free(plugin->info->homepage); |
| 11660 | 173 } |
|
11786
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
174 |
| 11660 | 175 if (mplug) { |
| 176 if (mplug->assm) { | |
| 177 mono_assembly_close(mplug->assm); | |
| 178 } | |
|
11786
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
179 |
| 11660 | 180 g_free(mplug); |
| 181 mplug = NULL; | |
| 182 } | |
| 183 } | |
| 184 | |
|
11786
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
185 /****************************************************************************** |
|
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
186 * Plugin Stuff |
|
2c8216659a84
[gaim-migrate @ 14077]
Gary Kramlich <grim@reaperworld.com>
parents:
11679
diff
changeset
|
187 *****************************************************************************/ |
|
11679
f05542391cd2
[gaim-migrate @ 13965]
Gary Kramlich <grim@reaperworld.com>
parents:
11660
diff
changeset
|
188 static void plugin_destroy(GaimPlugin *plugin) |
| 11660 | 189 { |
|
11980
67fbd2ff4c4e
[gaim-migrate @ 14273]
Gary Kramlich <grim@reaperworld.com>
parents:
11952
diff
changeset
|
190 ml_uninit(); |
| 11660 | 191 } |
| 192 | |
| 193 static GaimPluginLoaderInfo loader_info = | |
| 194 { | |
| 195 NULL, | |
| 196 probe_mono_plugin, | |
| 197 load_mono_plugin, | |
| 198 unload_mono_plugin, | |
| 199 destroy_mono_plugin | |
| 200 }; | |
| 201 | |
| 202 static GaimPluginInfo info = | |
| 203 { | |
| 204 GAIM_PLUGIN_MAGIC, | |
| 205 GAIM_MAJOR_VERSION, | |
| 206 GAIM_MINOR_VERSION, | |
| 207 GAIM_PLUGIN_LOADER, | |
| 208 NULL, | |
| 209 0, | |
| 210 NULL, | |
| 211 GAIM_PRIORITY_DEFAULT, | |
| 212 MONO_PLUGIN_ID, | |
| 213 N_("Mono Plugin Loader"), | |
| 214 VERSION, | |
| 215 N_("Loads .NET plugins with Mono."), | |
| 216 N_("Loads .NET plugins with Mono."), | |
| 217 "Eoin Coffey <ecoffey@simla.colostate.edu>", | |
| 218 GAIM_WEBSITE, | |
| 219 NULL, | |
| 220 NULL, | |
| 221 plugin_destroy, | |
| 222 NULL, | |
| 223 &loader_info, | |
| 224 NULL, | |
| 225 NULL | |
| 226 }; | |
| 227 | |
| 228 static void init_plugin(GaimPlugin *plugin) | |
| 229 { | |
|
11980
67fbd2ff4c4e
[gaim-migrate @ 14273]
Gary Kramlich <grim@reaperworld.com>
parents:
11952
diff
changeset
|
230 ml_init(); |
|
67fbd2ff4c4e
[gaim-migrate @ 14273]
Gary Kramlich <grim@reaperworld.com>
parents:
11952
diff
changeset
|
231 |
| 11660 | 232 loader_info.exts = g_list_append(loader_info.exts, "dll"); |
| 233 } | |
| 234 | |
| 235 GAIM_INIT_PLUGIN(mono, init_plugin, info) |
