summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Laager <rlaager@pidgin.im>2007-03-24 06:24:59 +0000
committerRichard Laager <rlaager@pidgin.im>2007-03-24 06:24:59 +0000
commitbd282b3027193578e406e4e48a2e7cc1462a0871 (patch)
tree96e7519d93022e943c1a0b436d6d0f6c86ff5984
parent921909ca8dc75abe4fa75f34cd295c8bb2afdcbc (diff)
downloadpidgin-bd282b3027193578e406e4e48a2e7cc1462a0871.tar.gz
SF Patch #1686400 from Eoin Coffey ("ecoffey")
ecoffey described the changes: 1) Small tweaks to the loader to bring it up to speed with new mono versions and API wrapper changes that grim had made. (was in original patch, just forgot about it :-P) 2) .NET Plugins are now required to define an Id as part of their info. 3) Modified gaim_probe_plugin to check for existence of info->id and to make sure it's not empty; Prints an error, stores an error in the plugin and sets plugin->unloadable = TRUE.
-rw-r--r--libpurple/plugin.c14
-rw-r--r--libpurple/plugins/mono/BooPlugin.boo6
-rw-r--r--libpurple/plugins/mono/GetBuddyBack.cs6
-rw-r--r--libpurple/plugins/mono/MPlugin.cs4
-rw-r--r--libpurple/plugins/mono/api/PurplePlugin.cs (renamed from libpurple/plugins/mono/api/GaimPlugin.cs)10
-rw-r--r--libpurple/plugins/mono/loader/mono-helper.c19
-rw-r--r--libpurple/plugins/mono/loader/mono-helper.h2
-rw-r--r--libpurple/plugins/mono/loader/mono.c14
8 files changed, 55 insertions, 20 deletions
diff --git a/libpurple/plugin.c b/libpurple/plugin.c
index 0fd6f32a22..e5126a626e 100644
--- a/libpurple/plugin.c
+++ b/libpurple/plugin.c
@@ -369,6 +369,20 @@ purple_plugin_probe(const char *filename)
return plugin;
}
+ /*
+ * Check to make sure a plugin has defined an id.
+ * Not having this check caused purple_plugin_unload to
+ * enter an infinite loop in certain situations by passing
+ * purple_find_plugin_by_id a NULL value. -- ecoffey
+ */
+ if (!plugin->info->id || !strcmp(plugin->info->id, ""))
+ {
+ plugin->error = g_strdup_printf(_("This plugin has not defined an ID."));
+ purple_debug_error("plugins", "%s is not loadable: info->id is not defined.\n", plugin->path);
+ plugin->unloadable = TRUE;
+ return plugin;
+ }
+
/* Really old plugins. */
if (plugin->info->magic != PURPLE_PLUGIN_MAGIC)
{
diff --git a/libpurple/plugins/mono/BooPlugin.boo b/libpurple/plugins/mono/BooPlugin.boo
index bae8579f74..a16e010a2c 100644
--- a/libpurple/plugins/mono/BooPlugin.boo
+++ b/libpurple/plugins/mono/BooPlugin.boo
@@ -1,6 +1,6 @@
-import Gaim
+import Purple
-class BooPlugin(GaimPlugin):
+class BooPlugin(PurplePlugin):
def handle(*args as (object)):
b as Buddy
@@ -18,5 +18,5 @@ class BooPlugin(GaimPlugin):
Debug.debug(Debug.INFO, "booplugin", "destroying...\n")
override def Info():
- return GaimPluginInfo("Boo Plugin", "0.1", "Test Boo Plugin", "Longer Description", "Eoin Coffey", "urled")
+ return PurplePluginInfo("mono-boo", "Boo Plugin", "0.1", "Test Boo Plugin", "Longer Description", "Eoin Coffey", "urled")
diff --git a/libpurple/plugins/mono/GetBuddyBack.cs b/libpurple/plugins/mono/GetBuddyBack.cs
index e7a6fb01ee..a89029c582 100644
--- a/libpurple/plugins/mono/GetBuddyBack.cs
+++ b/libpurple/plugins/mono/GetBuddyBack.cs
@@ -1,8 +1,8 @@
-using Gaim;
+using Purple;
public class GetBuddyBack : Plugin
{
- private static PluginInfo info = new PluginInfo("C# Get Buddy Back", "0.1", "Prints when a Buddy returns", "Longer Description", "Eoin Coffey", "urled");
+ private static PluginInfo info = new PluginInfo("mono-buddyback", "C# Get Buddy Back", "0.1", "Prints when a Buddy returns", "Longer Description", "Eoin Coffey", "urled");
public GetBuddyBack()
: base (info)
@@ -21,7 +21,7 @@ public class GetBuddyBack : Plugin
Debug.debug(Debug.INFO, "buddyback", "loading...\n");
/*Signal.connect(BuddyList.GetHandle(), this, "buddy-back", new Signal.Handler(HandleSig));*/
- /*BuddyList.OnBuddyBack.connect(this, new Signal.Handler(HandleSig));*/
+ BuddyList.OnBuddyStatusChanged.connect(this, new Signal.Handler(HandleSig));
}
public override void Unload()
diff --git a/libpurple/plugins/mono/MPlugin.cs b/libpurple/plugins/mono/MPlugin.cs
index 0b64aa857e..9dabfd8bbd 100644
--- a/libpurple/plugins/mono/MPlugin.cs
+++ b/libpurple/plugins/mono/MPlugin.cs
@@ -1,8 +1,8 @@
-using Gaim;
+using Purple;
public class MPlugin : Plugin
{
- private static PluginInfo info = new PluginInfo("C# Plugin", "0.1", "Test C# Plugin", "Longer Description", "Eoin Coffey", "urled");
+ private static PluginInfo info = new PluginInfo("mono-mplugin", "C# Plugin", "0.1", "Test C# Plugin", "Longer Description", "Eoin Coffey", "urled");
public MPlugin()
: base(info)
diff --git a/libpurple/plugins/mono/api/GaimPlugin.cs b/libpurple/plugins/mono/api/PurplePlugin.cs
index 89739ca418..dd57f0299e 100644
--- a/libpurple/plugins/mono/api/GaimPlugin.cs
+++ b/libpurple/plugins/mono/api/PurplePlugin.cs
@@ -1,5 +1,6 @@
-namespace Gaim {
+namespace Purple {
public class PluginInfo {
+ private string id;
private string name;
private string version;
private string summary;
@@ -7,9 +8,10 @@ namespace Gaim {
private string author;
private string homepage;
- public PluginInfo(string name, string version, string summary,
+ public PluginInfo(string id, string name, string version, string summary,
string description, string author, string homepage)
{
+ this.id = id;
this.name = name;
this.version = version;
this.summary = summary;
@@ -18,6 +20,10 @@ namespace Gaim {
this.homepage = homepage;
}
+ public string Id {
+ get { return id; }
+ }
+
public string Name {
get { return name; }
}
diff --git a/libpurple/plugins/mono/loader/mono-helper.c b/libpurple/plugins/mono/loader/mono-helper.c
index c3eca3075e..6196a93105 100644
--- a/libpurple/plugins/mono/loader/mono-helper.c
+++ b/libpurple/plugins/mono/loader/mono-helper.c
@@ -84,10 +84,13 @@ MonoClass* ml_find_plugin_class(MonoImage *image)
total = mono_image_get_table_rows (image, MONO_TABLE_TYPEDEF);
for (i = 1; i <= total; ++i) {
klass = mono_class_get (image, MONO_TOKEN_TYPE_DEF | i);
+
pklass = mono_class_get_parent(klass);
- if (pklass)
- if (strcmp("PurplePlugin", mono_class_get_name(pklass)) == 0)
+ if (pklass) {
+
+ if (strcmp("Plugin", mono_class_get_name(pklass)) == 0)
return klass;
+ }
}
return NULL;
@@ -126,6 +129,18 @@ gchar* ml_get_prop_string(MonoObject *obj, char *field)
return mono_string_to_utf8(str);
}
+MonoObject* ml_get_info_prop(MonoObject *obj)
+{
+ MonoClass *klass;
+ MonoProperty *prop;
+
+ klass = mono_class_get_parent(mono_object_get_class(obj));
+
+ prop = mono_class_get_property_from_name(klass, "Info");
+
+ return mono_property_get_value(prop, obj, NULL, NULL);
+}
+
gboolean ml_is_api_dll(MonoImage *image)
{
MonoClass *klass;
diff --git a/libpurple/plugins/mono/loader/mono-helper.h b/libpurple/plugins/mono/loader/mono-helper.h
index 5b36b426d1..191a8fbe8e 100644
--- a/libpurple/plugins/mono/loader/mono-helper.h
+++ b/libpurple/plugins/mono/loader/mono-helper.h
@@ -40,6 +40,8 @@ gchar* ml_get_prop_string(MonoObject *obj, char *field);
void ml_set_prop_string(MonoObject *obj, char *field, char *data);
+MonoObject* ml_get_info_prop(MonoObject *obj);
+
gboolean ml_is_api_dll(MonoImage *image);
MonoDomain* ml_get_domain(void);
diff --git a/libpurple/plugins/mono/loader/mono.c b/libpurple/plugins/mono/loader/mono.c
index 512dad57db..43575deb73 100644
--- a/libpurple/plugins/mono/loader/mono.c
+++ b/libpurple/plugins/mono/loader/mono.c
@@ -26,9 +26,8 @@ static gboolean probe_mono_plugin(PurplePlugin *plugin)
{
MonoAssembly *assm;
MonoMethod *m = NULL;
- MonoMethod *info_method = NULL;
MonoObject *plugin_info;
- gboolean found_load = FALSE, found_unload = FALSE, found_destroy = FALSE, found_info = FALSE;
+ gboolean found_load = FALSE, found_unload = FALSE, found_destroy = FALSE;
gpointer iter = NULL;
PurplePluginInfo *info;
@@ -71,6 +70,7 @@ static gboolean probe_mono_plugin(PurplePlugin *plugin)
mono_runtime_object_init(mplug->obj);
while ((m = mono_class_get_methods(mplug->klass, &iter))) {
+ purple_debug_info("mono", "plugin method: %s\n", mono_method_get_name(m));
if (strcmp(mono_method_get_name(m), "Load") == 0) {
mplug->load = m;
found_load = TRUE;
@@ -80,22 +80,20 @@ static gboolean probe_mono_plugin(PurplePlugin *plugin)
} else if (strcmp(mono_method_get_name(m), "Destroy") == 0) {
mplug->destroy = m;
found_destroy = TRUE;
- } else if (strcmp(mono_method_get_name(m), "Info") == 0) {
- info_method = m;
- found_info = TRUE;
}
}
- if (!(found_load && found_unload && found_destroy && found_info)) {
+ if (!(found_load && found_unload && found_destroy)) {
purple_debug(PURPLE_DEBUG_ERROR, "mono", "did not find the required methods\n");
return FALSE;
}
-
- plugin_info = ml_invoke(info_method, mplug->obj, NULL);
+
+ plugin_info = ml_get_info_prop(mplug->obj);
/* now that the methods are filled out we can populate
the info struct with all the needed info */
+ info->id = ml_get_prop_string(plugin_info, "Id");
info->name = ml_get_prop_string(plugin_info, "Name");
info->version = ml_get_prop_string(plugin_info, "Version");
info->summary = ml_get_prop_string(plugin_info, "Summary");