pidgin: a5232ddc: jabber: Move the initialization into the...
darkrain42 at pidgin.im
darkrain42 at pidgin.im
Tue Mar 9 14:25:51 EST 2010
-----------------------------------------------------------------
Revision: a5232ddc6fa6b156ac9f9190455a8de91068e0d9
Ancestor: f7a3e12cb13f23daa4985be10a119d54cbfb066b
Author: darkrain42 at pidgin.im
Date: 2010-03-09T18:59:08
Branch: im.pidgin.pidgin
URL: http://d.pidgin.im/viewmtn/revision/info/a5232ddc6fa6b156ac9f9190455a8de91068e0d9
Modified files:
libpurple/protocols/jabber/jabber.c
libpurple/protocols/jabber/jabber.h
libpurple/protocols/jabber/libxmpp.c
ChangeLog:
jabber: Move the initialization into the jabber plugin, and only initialize some things once.
This would allow multiple plugins to use the jabber plugin /properly/
(and ref-counted!). Commands still need to be fixed.
-------------- next part --------------
============================================================
--- libpurple/protocols/jabber/jabber.c 7aa3ded52e37b83ba1cd48f07eed1dbf02cd2c84
+++ libpurple/protocols/jabber/jabber.c e1733fdcc30a32947d0e23cc978c61afbae0365e
@@ -76,6 +76,8 @@ static GSList *jabber_cmds = NULL;
GList *jabber_identities = NULL;
static GSList *jabber_cmds = NULL;
+static gint plugin_ref = 0;
+
static void jabber_unregister_account_cb(JabberStream *js);
static void try_srv_connect(JabberStream *js);
@@ -3519,8 +3521,8 @@ jabber_ipc_add_feature(const gchar *feat
jabber_caps_broadcast_change();
}
-void
-jabber_init_plugin(PurplePlugin *plugin)
+static void
+jabber_do_init(void)
{
GHashTable *ui_info = purple_core_get_ui_info();
const gchar *ui_type;
@@ -3590,8 +3592,54 @@ jabber_init_plugin(PurplePlugin *plugin)
G_CALLBACK(jabber_caps_broadcast_change), NULL);
#endif
+ /* TODO: This needs to be per-plugin */
+ jabber_register_commands();
+
+ /* reverse order of unload_plugin */
+ jabber_iq_init();
+ jabber_caps_init();
+ /* PEP things should be init via jabber_pep_init, not here */
+ jabber_pep_init();
+ jabber_data_init();
+ jabber_bosh_init();
+
+ /* TODO: Implement adding and retrieving own features via IPC API */
+
+ jabber_ibb_init();
+ jabber_si_init();
+
jabber_auth_init();
+}
+static void
+jabber_do_uninit(void)
+{
+ /* reverse order of jabber_do_init */
+ jabber_bosh_uninit();
+ jabber_data_uninit();
+ jabber_si_uninit();
+ jabber_ibb_uninit();
+ /* PEP things should be uninit via jabber_pep_uninit, not here */
+ jabber_pep_uninit();
+ jabber_caps_uninit();
+ jabber_presence_uninit();
+ jabber_iq_uninit();
+
+ /* TODO: This needs to be per-main plugin */
+ jabber_unregister_commands();
+
+ jabber_auth_uninit();
+ jabber_features_destroy();
+ jabber_identities_destroy();
+}
+
+void jabber_plugin_init(PurplePlugin *plugin)
+{
+ ++plugin_ref;
+
+ if (plugin_ref == 1)
+ jabber_do_init();
+
/* IPC functions */
purple_plugin_ipc_register(plugin, "contact_has_feature", PURPLE_CALLBACK(jabber_ipc_contact_has_feature),
purple_marshal_BOOLEAN__POINTER_POINTER_POINTER,
@@ -3605,7 +3653,6 @@ jabber_init_plugin(PurplePlugin *plugin)
NULL, 1,
purple_value_new(PURPLE_TYPE_STRING));
- /* Modifying these? Look at libxmpp.c:load_plugin for the signal versions */
purple_plugin_ipc_register(plugin, "register_namespace_watcher",
PURPLE_CALLBACK(jabber_iq_signal_register),
purple_marshal_VOID__POINTER_POINTER,
@@ -3619,14 +3666,93 @@ jabber_init_plugin(PurplePlugin *plugin)
NULL, 2,
purple_value_new(PURPLE_TYPE_STRING), /* node */
purple_value_new(PURPLE_TYPE_STRING)); /* namespace */
+
+ purple_signal_register(plugin, "jabber-register-namespace-watcher",
+ purple_marshal_VOID__POINTER_POINTER,
+ NULL, 2,
+ purple_value_new(PURPLE_TYPE_STRING), /* node */
+ purple_value_new(PURPLE_TYPE_STRING)); /* namespace */
+
+ purple_signal_register(plugin, "jabber-unregister-namespace-watcher",
+ purple_marshal_VOID__POINTER_POINTER,
+ NULL, 2,
+ purple_value_new(PURPLE_TYPE_STRING), /* node */
+ purple_value_new(PURPLE_TYPE_STRING)); /* namespace */
+
+ purple_signal_connect(plugin, "jabber-register-namespace-watcher",
+ plugin, PURPLE_CALLBACK(jabber_iq_signal_register), NULL);
+ purple_signal_connect(plugin, "jabber-unregister-namespace-watcher",
+ plugin, PURPLE_CALLBACK(jabber_iq_signal_unregister), NULL);
+
+
+ purple_signal_register(plugin, "jabber-receiving-xmlnode",
+ purple_marshal_VOID__POINTER_POINTER, NULL, 2,
+ purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION),
+ purple_value_new_outgoing(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_XMLNODE));
+
+ purple_signal_register(plugin, "jabber-sending-xmlnode",
+ purple_marshal_VOID__POINTER_POINTER, NULL, 2,
+ purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION),
+ purple_value_new_outgoing(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_XMLNODE));
+
+ /*
+ * Do not remove this or the plugin will fail. Completely. You have been
+ * warned!
+ */
+ purple_signal_connect_priority(plugin, "jabber-sending-xmlnode",
+ plugin, PURPLE_CALLBACK(jabber_send_signal_cb),
+ NULL, PURPLE_SIGNAL_PRIORITY_HIGHEST);
+
+ purple_signal_register(plugin, "jabber-sending-text",
+ purple_marshal_VOID__POINTER_POINTER, NULL, 2,
+ purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION),
+ purple_value_new_outgoing(PURPLE_TYPE_STRING));
+
+ purple_signal_register(plugin, "jabber-receiving-message",
+ purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_POINTER_POINTER,
+ purple_value_new(PURPLE_TYPE_BOOLEAN), 6,
+ purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION),
+ purple_value_new(PURPLE_TYPE_STRING), /* type */
+ purple_value_new(PURPLE_TYPE_STRING), /* id */
+ purple_value_new(PURPLE_TYPE_STRING), /* from */
+ purple_value_new(PURPLE_TYPE_STRING), /* to */
+ purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_XMLNODE));
+
+ purple_signal_register(plugin, "jabber-receiving-iq",
+ purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_POINTER,
+ purple_value_new(PURPLE_TYPE_BOOLEAN), 5,
+ purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION),
+ purple_value_new(PURPLE_TYPE_STRING), /* type */
+ purple_value_new(PURPLE_TYPE_STRING), /* id */
+ purple_value_new(PURPLE_TYPE_STRING), /* from */
+ purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_XMLNODE));
+
+ purple_signal_register(plugin, "jabber-watched-iq",
+ purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_POINTER,
+ purple_value_new(PURPLE_TYPE_BOOLEAN), 5,
+ purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION),
+ purple_value_new(PURPLE_TYPE_STRING), /* type */
+ purple_value_new(PURPLE_TYPE_STRING), /* id */
+ purple_value_new(PURPLE_TYPE_STRING), /* from */
+ purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_XMLNODE)); /* child */
+
+ purple_signal_register(plugin, "jabber-receiving-presence",
+ purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER,
+ purple_value_new(PURPLE_TYPE_BOOLEAN), 4,
+ purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION),
+ purple_value_new(PURPLE_TYPE_STRING), /* type */
+ purple_value_new(PURPLE_TYPE_STRING), /* from */
+ purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_XMLNODE));
}
-void
-jabber_uninit_plugin(PurplePlugin *plugin)
+void jabber_plugin_uninit(PurplePlugin *plugin)
{
+ g_return_if_fail(plugin_ref > 0);
+
+ purple_signals_unregister_by_instance(plugin);
purple_plugin_ipc_unregister_all(plugin);
- jabber_auth_uninit();
- jabber_features_destroy();
- jabber_identities_destroy();
+ --plugin_ref;
+ if (plugin_ref == 0)
+ jabber_do_uninit();
}
============================================================
--- libpurple/protocols/jabber/jabber.h 0e6e98982a3b5fab363175e68fd2a1bef72df2e8
+++ libpurple/protocols/jabber/jabber.h 8b6da786eef8b2bea1817a2cdc76d61aa3fb206f
@@ -379,7 +379,7 @@ void jabber_unregister_commands(void);
void jabber_register_commands(void);
void jabber_unregister_commands(void);
-void jabber_init_plugin(PurplePlugin *plugin);
-void jabber_uninit_plugin(PurplePlugin *plugin);
+void jabber_plugin_init(PurplePlugin *plugin);
+void jabber_plugin_uninit(PurplePlugin *plugin);
#endif /* PURPLE_JABBER_H_ */
============================================================
--- libpurple/protocols/jabber/libxmpp.c e25ba9f1f863e25b9aadbc3d8b6c2bf02376d029
+++ libpurple/protocols/jabber/libxmpp.c 9bb1535722a66ce893ef5b1b455fa1980fb4f904
@@ -132,105 +132,15 @@ static gboolean load_plugin(PurplePlugin
static gboolean load_plugin(PurplePlugin *plugin)
{
- purple_signal_register(plugin, "jabber-receiving-xmlnode",
- purple_marshal_VOID__POINTER_POINTER, NULL, 2,
- purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION),
- purple_value_new_outgoing(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_XMLNODE));
+ jabber_plugin_init(plugin);
- purple_signal_register(plugin, "jabber-sending-xmlnode",
- purple_marshal_VOID__POINTER_POINTER, NULL, 2,
- purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION),
- purple_value_new_outgoing(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_XMLNODE));
-
- /*
- * Do not remove this or the plugin will fail. Completely. You have been
- * warned!
- */
- purple_signal_connect_priority(plugin, "jabber-sending-xmlnode",
- plugin, PURPLE_CALLBACK(jabber_send_signal_cb),
- NULL, PURPLE_SIGNAL_PRIORITY_HIGHEST);
-
- purple_signal_register(plugin, "jabber-sending-text",
- purple_marshal_VOID__POINTER_POINTER, NULL, 2,
- purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION),
- purple_value_new_outgoing(PURPLE_TYPE_STRING));
-
- purple_signal_register(plugin, "jabber-receiving-message",
- purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_POINTER_POINTER,
- purple_value_new(PURPLE_TYPE_BOOLEAN), 6,
- purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION),
- purple_value_new(PURPLE_TYPE_STRING), /* type */
- purple_value_new(PURPLE_TYPE_STRING), /* id */
- purple_value_new(PURPLE_TYPE_STRING), /* from */
- purple_value_new(PURPLE_TYPE_STRING), /* to */
- purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_XMLNODE));
-
- purple_signal_register(plugin, "jabber-receiving-iq",
- purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_POINTER,
- purple_value_new(PURPLE_TYPE_BOOLEAN), 5,
- purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION),
- purple_value_new(PURPLE_TYPE_STRING), /* type */
- purple_value_new(PURPLE_TYPE_STRING), /* id */
- purple_value_new(PURPLE_TYPE_STRING), /* from */
- purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_XMLNODE));
-
- purple_signal_register(plugin, "jabber-watched-iq",
- purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_POINTER,
- purple_value_new(PURPLE_TYPE_BOOLEAN), 5,
- purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION),
- purple_value_new(PURPLE_TYPE_STRING), /* type */
- purple_value_new(PURPLE_TYPE_STRING), /* id */
- purple_value_new(PURPLE_TYPE_STRING), /* from */
- purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_XMLNODE)); /* child */
-
- /* Modifying these? Look at jabber_init_plugin for the ipc versions */
- purple_signal_register(plugin, "jabber-register-namespace-watcher",
- purple_marshal_VOID__POINTER_POINTER,
- NULL, 2,
- purple_value_new(PURPLE_TYPE_STRING), /* node */
- purple_value_new(PURPLE_TYPE_STRING)); /* namespace */
-
- purple_signal_register(plugin, "jabber-unregister-namespace-watcher",
- purple_marshal_VOID__POINTER_POINTER,
- NULL, 2,
- purple_value_new(PURPLE_TYPE_STRING), /* node */
- purple_value_new(PURPLE_TYPE_STRING)); /* namespace */
-
- purple_signal_connect(plugin, "jabber-register-namespace-watcher",
- plugin, PURPLE_CALLBACK(jabber_iq_signal_register), NULL);
- purple_signal_connect(plugin, "jabber-unregister-namespace-watcher",
- plugin, PURPLE_CALLBACK(jabber_iq_signal_unregister), NULL);
-
- purple_signal_register(plugin, "jabber-receiving-presence",
- purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER,
- purple_value_new(PURPLE_TYPE_BOOLEAN), 4,
- purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION),
- purple_value_new(PURPLE_TYPE_STRING), /* type */
- purple_value_new(PURPLE_TYPE_STRING), /* from */
- purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_XMLNODE));
-
return TRUE;
}
static gboolean unload_plugin(PurplePlugin *plugin)
{
- purple_signals_unregister_by_instance(plugin);
+ jabber_plugin_uninit(plugin);
- /* reverse order of init_plugin */
- jabber_bosh_uninit();
- jabber_data_uninit();
- jabber_si_uninit();
- jabber_ibb_uninit();
- /* PEP things should be uninit via jabber_pep_uninit, not here */
- jabber_pep_uninit();
- jabber_caps_uninit();
- jabber_iq_uninit();
-
- jabber_unregister_commands();
-
- /* Stay on target...stay on target... Almost there... */
- jabber_uninit_plugin(plugin);
-
return TRUE;
}
@@ -402,7 +312,6 @@ init_plugin(PurplePlugin *plugin)
option);
my_protocol = plugin;
- jabber_init_plugin(plugin);
purple_prefs_remove("/plugins/prpl/jabber");
@@ -423,21 +332,7 @@ init_plugin(PurplePlugin *plugin)
SetErrorMode(old_error_mode);
#endif
#endif
- jabber_register_commands();
- /* reverse order of unload_plugin */
- jabber_iq_init();
- jabber_caps_init();
- /* PEP things should be init via jabber_pep_init, not here */
- jabber_pep_init();
- jabber_data_init();
- jabber_bosh_init();
-
- /* TODO: Implement adding and retrieving own features via IPC API */
-
- jabber_ibb_init();
- jabber_si_init();
-
purple_signal_connect(purple_get_core(), "uri-handler", plugin,
PURPLE_CALLBACK(xmpp_uri_handler), NULL);
}
More information about the Commits
mailing list