# HG changeset patch # User Nick Hebner # Date 1241381829 0 # Node ID 1dfa009f6db58049b65e5398d072268aa72b3d5a # Parent af2b87aa82ee41dc15cb5ea8a0d0bc4d564598fd Clean up jabber prpl memory allocations on uninit. Thanks to Nick Hebner. I had previously done some work on this, which is why this patch doesn't look as similar as it might to jabber_memory_cleanup.diff. Closes #8683. committer: Paul Aurich diff -r af2b87aa82ee -r 1dfa009f6db5 libpurple/protocols/jabber/caps.c --- a/libpurple/protocols/jabber/caps.c Sun May 03 19:53:53 2009 +0000 +++ b/libpurple/protocols/jabber/caps.c Sun May 03 20:17:09 2009 +0000 @@ -349,7 +349,7 @@ } g_hash_table_destroy(capstable); g_hash_table_destroy(nodetable); - capstable = NULL; + capstable = nodetable = NULL; } typedef struct _jabber_caps_cbplususerdata { diff -r af2b87aa82ee -r 1dfa009f6db5 libpurple/protocols/jabber/ibb.c --- a/libpurple/protocols/jabber/ibb.c Sun May 03 19:53:53 2009 +0000 +++ b/libpurple/protocols/jabber/ibb.c Sun May 03 20:17:09 2009 +0000 @@ -503,6 +503,8 @@ { jabber_ibb_sessions = g_hash_table_new(g_str_hash, g_str_equal); + jabber_add_feature(XEP_0047_NAMESPACE, NULL); + jabber_iq_register_handler("close", XEP_0047_NAMESPACE, jabber_ibb_parse); jabber_iq_register_handler("data", XEP_0047_NAMESPACE, jabber_ibb_parse); jabber_iq_register_handler("open", XEP_0047_NAMESPACE, jabber_ibb_parse); diff -r af2b87aa82ee -r 1dfa009f6db5 libpurple/protocols/jabber/jabber.c --- a/libpurple/protocols/jabber/jabber.c Sun May 03 19:53:53 2009 +0000 +++ b/libpurple/protocols/jabber/jabber.c Sun May 03 20:17:09 2009 +0000 @@ -70,6 +70,7 @@ static PurplePlugin *my_protocol = NULL; GList *jabber_features = NULL; GList *jabber_identities = NULL; +GSList *jabber_cmds = NULL; static void jabber_unregister_account_cb(JabberStream *js); static void try_srv_connect(JabberStream *js); @@ -3159,89 +3160,126 @@ void jabber_register_commands(void) { - purple_cmd_register("config", "", PURPLE_CMD_P_PRPL, + PurpleCmdId id; + id = purple_cmd_register("config", "", PURPLE_CMD_P_PRPL, PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_PRPL_ONLY, "prpl-jabber", jabber_cmd_chat_config, _("config: Configure a chat room."), NULL); - purple_cmd_register("configure", "", PURPLE_CMD_P_PRPL, + jabber_cmds = g_slist_prepend(jabber_cmds, GUINT_TO_POINTER(id)); + + id = purple_cmd_register("configure", "", PURPLE_CMD_P_PRPL, PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_PRPL_ONLY, "prpl-jabber", jabber_cmd_chat_config, _("configure: Configure a chat room."), NULL); - purple_cmd_register("nick", "s", PURPLE_CMD_P_PRPL, + jabber_cmds = g_slist_prepend(jabber_cmds, GUINT_TO_POINTER(id)); + + id = purple_cmd_register("nick", "s", PURPLE_CMD_P_PRPL, PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_PRPL_ONLY, "prpl-jabber", jabber_cmd_chat_nick, _("nick <new nickname>: Change your nickname."), NULL); - purple_cmd_register("part", "s", PURPLE_CMD_P_PRPL, + jabber_cmds = g_slist_prepend(jabber_cmds, GUINT_TO_POINTER(id)); + + id = purple_cmd_register("part", "s", PURPLE_CMD_P_PRPL, PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_PRPL_ONLY | PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS, "prpl-jabber", jabber_cmd_chat_part, _("part [room]: Leave the room."), NULL); - purple_cmd_register("register", "", PURPLE_CMD_P_PRPL, + jabber_cmds = g_slist_prepend(jabber_cmds, GUINT_TO_POINTER(id)); + + id = purple_cmd_register("register", "", PURPLE_CMD_P_PRPL, PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_PRPL_ONLY, "prpl-jabber", jabber_cmd_chat_register, _("register: Register with a chat room."), NULL); + jabber_cmds = g_slist_prepend(jabber_cmds, GUINT_TO_POINTER(id)); + /* XXX: there needs to be a core /topic cmd, methinks */ - purple_cmd_register("topic", "s", PURPLE_CMD_P_PRPL, + id = purple_cmd_register("topic", "s", PURPLE_CMD_P_PRPL, PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_PRPL_ONLY | PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS, "prpl-jabber", jabber_cmd_chat_topic, _("topic [new topic]: View or change the topic."), NULL); - purple_cmd_register("ban", "ws", PURPLE_CMD_P_PRPL, + jabber_cmds = g_slist_prepend(jabber_cmds, GUINT_TO_POINTER(id)); + + id = purple_cmd_register("ban", "ws", PURPLE_CMD_P_PRPL, PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_PRPL_ONLY | PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS, "prpl-jabber", jabber_cmd_chat_ban, _("ban <user> [reason]: Ban a user from the room."), NULL); - purple_cmd_register("affiliate", "ws", PURPLE_CMD_P_PRPL, + jabber_cmds = g_slist_prepend(jabber_cmds, GUINT_TO_POINTER(id)); + + id = purple_cmd_register("affiliate", "ws", PURPLE_CMD_P_PRPL, PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_PRPL_ONLY | PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS, "prpl-jabber", jabber_cmd_chat_affiliate, _("affiliate <owner|admin|member|outcast|none> [nick1] [nick2] ...: Get the users with an affiliation or set users' affiliation with the room."), NULL); - purple_cmd_register("role", "ws", PURPLE_CMD_P_PRPL, + jabber_cmds = g_slist_prepend(jabber_cmds, GUINT_TO_POINTER(id)); + + id = purple_cmd_register("role", "ws", PURPLE_CMD_P_PRPL, PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_PRPL_ONLY | PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS, "prpl-jabber", jabber_cmd_chat_role, _("role <moderator|participant|visitor|none> [nick1] [nick2] ...: Get the users with an role or set users' role with the room."), NULL); - purple_cmd_register("invite", "ws", PURPLE_CMD_P_PRPL, + jabber_cmds = g_slist_prepend(jabber_cmds, GUINT_TO_POINTER(id)); + + id = purple_cmd_register("invite", "ws", PURPLE_CMD_P_PRPL, PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_PRPL_ONLY | PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS, "prpl-jabber", jabber_cmd_chat_invite, _("invite <user> [message]: Invite a user to the room."), NULL); - purple_cmd_register("join", "ws", PURPLE_CMD_P_PRPL, + jabber_cmds = g_slist_prepend(jabber_cmds, GUINT_TO_POINTER(id)); + + id = purple_cmd_register("join", "ws", PURPLE_CMD_P_PRPL, PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_PRPL_ONLY | PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS, "prpl-jabber", jabber_cmd_chat_join, _("join: <room> [password]: Join a chat on this server."), NULL); - purple_cmd_register("kick", "ws", PURPLE_CMD_P_PRPL, + jabber_cmds = g_slist_prepend(jabber_cmds, GUINT_TO_POINTER(id)); + + id = purple_cmd_register("kick", "ws", PURPLE_CMD_P_PRPL, PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_PRPL_ONLY | PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS, "prpl-jabber", jabber_cmd_chat_kick, _("kick <user> [reason]: Kick a user from the room."), NULL); - purple_cmd_register("msg", "ws", PURPLE_CMD_P_PRPL, + jabber_cmds = g_slist_prepend(jabber_cmds, GUINT_TO_POINTER(id)); + + id = purple_cmd_register("msg", "ws", PURPLE_CMD_P_PRPL, PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_PRPL_ONLY, "prpl-jabber", jabber_cmd_chat_msg, _("msg <user> <message>: Send a private message to another user."), NULL); - purple_cmd_register("ping", "w", PURPLE_CMD_P_PRPL, + jabber_cmds = g_slist_prepend(jabber_cmds, GUINT_TO_POINTER(id)); + + id = purple_cmd_register("ping", "w", PURPLE_CMD_P_PRPL, PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_IM | PURPLE_CMD_FLAG_PRPL_ONLY, "prpl-jabber", jabber_cmd_ping, _("ping <jid>: Ping a user/component/server."), NULL); - purple_cmd_register("buzz", "w", PURPLE_CMD_P_PRPL, + jabber_cmds = g_slist_prepend(jabber_cmds, GUINT_TO_POINTER(id)); + + id = purple_cmd_register("buzz", "w", PURPLE_CMD_P_PRPL, PURPLE_CMD_FLAG_IM | PURPLE_CMD_FLAG_PRPL_ONLY | PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS, "prpl-jabber", jabber_cmd_buzz, _("buzz: Buzz a user to get their attention"), NULL); } +void jabber_unregister_commands(void) +{ + while (jabber_cmds != NULL) { + purple_cmd_unregister(GPOINTER_TO_UINT(jabber_cmds->data)); + jabber_cmds = g_slist_delete_link(jabber_cmds, jabber_cmds); + } +} + /* IPC functions */ /** @@ -3317,6 +3355,12 @@ jabber_add_feature("http://jabber.org/protocol/xhtml-im", 0); jabber_add_feature("urn:xmpp:ping", 0); + /* Buzz/Attention */ + jabber_add_feature(XEP_0224_NAMESPACE, jabber_buzz_isenabled); + + /* Bits Of Binary */ + jabber_add_feature(XEP_0231_NAMESPACE, jabber_custom_smileys_isenabled); + /* Jingle features! */ jabber_add_feature(JINGLE, 0); jabber_add_feature(JINGLE_TRANSPORT_RAWUDP, 0); diff -r af2b87aa82ee -r 1dfa009f6db5 libpurple/protocols/jabber/jabber.h --- a/libpurple/protocols/jabber/jabber.h Sun May 03 19:53:53 2009 +0000 +++ b/libpurple/protocols/jabber/jabber.h Sun May 03 20:17:09 2009 +0000 @@ -366,6 +366,7 @@ PurpleMediaCaps jabber_get_media_caps(PurpleAccount *account, const char *who); void jabber_register_commands(void); +void jabber_unregister_commands(void); void jabber_init_plugin(PurplePlugin *plugin); void jabber_uninit_plugin(void); diff -r af2b87aa82ee -r 1dfa009f6db5 libpurple/protocols/jabber/libxmpp.c --- a/libpurple/protocols/jabber/libxmpp.c Sun May 03 19:53:53 2009 +0000 +++ b/libpurple/protocols/jabber/libxmpp.c Sun May 03 20:17:09 2009 +0000 @@ -161,6 +161,8 @@ jabber_caps_uninit(); jabber_iq_uninit(); + jabber_unregister_commands(); + /* Stay on target...stay on target... Almost there... */ jabber_uninit_plugin(); @@ -298,10 +300,6 @@ jabber_ibb_init(); jabber_si_init(); - - jabber_add_feature(XEP_0224_NAMESPACE, jabber_buzz_isenabled); - jabber_add_feature(XEP_0231_NAMESPACE, jabber_custom_smileys_isenabled); - jabber_add_feature(XEP_0047_NAMESPACE, NULL); } diff -r af2b87aa82ee -r 1dfa009f6db5 libpurple/protocols/jabber/pep.c --- a/libpurple/protocols/jabber/pep.c Sun May 03 19:53:53 2009 +0000 +++ b/libpurple/protocols/jabber/pep.c Sun May 03 20:17:09 2009 +0000 @@ -44,7 +44,10 @@ } void jabber_pep_uninit(void) { - /* any PEP handlers that need to clean things up go here */ + /* any PEP handlers that need to clean things up go here. The standard + * cleanup of removing the handler and feature are handled here and by + * jabber_features_destroy() in jabber.c + */ g_hash_table_destroy(pep_handlers); pep_handlers = NULL; }