# HG changeset patch # User Sadrul Habib Chowdhury # Date 1209968386 0 # Node ID 718a9c28783964c77212108deb3b3fe32dc8fac6 # Parent 53bf3c21b79de4d414b09a862fd3196b4e19ab63 Use up the last padding for PurplePluginProtocolInfo in a way that allows adding newer functions without causing any major version bump. This is based on the changes from the .vv branch. I changed the PURPLE_PROTOCOL_PLUGIN_HAS_FUNC macro a little so it can be used for the old as well as the new functions. Someone should confirm this looks OK. diff -r 53bf3c21b79d -r 718a9c287839 libpurple/protocols/bonjour/bonjour.c --- a/libpurple/protocols/bonjour/bonjour.c Wed Apr 30 21:09:59 2008 +0000 +++ b/libpurple/protocols/bonjour/bonjour.c Mon May 05 06:19:46 2008 +0000 @@ -487,7 +487,7 @@ NULL, NULL, NULL, - NULL + sizeof(PurplePluginProtocolInfo), /* struct_size */ }; static PurplePluginInfo info = diff -r 53bf3c21b79d -r 718a9c287839 libpurple/protocols/gg/gg.c --- a/libpurple/protocols/gg/gg.c Wed Apr 30 21:09:59 2008 +0000 +++ b/libpurple/protocols/gg/gg.c Mon May 05 06:19:46 2008 +0000 @@ -2152,7 +2152,7 @@ NULL, NULL, NULL, - NULL + sizeof(PurplePluginProtocolInfo), /* struct_size */ }; /* }}} */ diff -r 53bf3c21b79d -r 718a9c287839 libpurple/protocols/irc/irc.c --- a/libpurple/protocols/irc/irc.c Wed Apr 30 21:09:59 2008 +0000 +++ b/libpurple/protocols/irc/irc.c Mon May 05 06:19:46 2008 +0000 @@ -905,7 +905,7 @@ NULL, NULL, NULL, - NULL + sizeof(PurplePluginProtocolInfo), /* struct_size */ }; static gboolean load_plugin (PurplePlugin *plugin) { diff -r 53bf3c21b79d -r 718a9c287839 libpurple/protocols/jabber/libxmpp.c --- a/libpurple/protocols/jabber/libxmpp.c Wed Apr 30 21:09:59 2008 +0000 +++ b/libpurple/protocols/jabber/libxmpp.c Mon May 05 06:19:46 2008 +0000 @@ -116,8 +116,7 @@ jabber_send_attention, /* send_attention */ jabber_attention_types, /* attention_types */ - /* padding */ - NULL + sizeof(PurplePluginProtocolInfo), /* struct_size */ }; static gboolean load_plugin(PurplePlugin *plugin) diff -r 53bf3c21b79d -r 718a9c287839 libpurple/protocols/msn/msn.c --- a/libpurple/protocols/msn/msn.c Wed Apr 30 21:09:59 2008 +0000 +++ b/libpurple/protocols/msn/msn.c Mon May 05 06:19:46 2008 +0000 @@ -132,7 +132,6 @@ return list; } - static PurpleCmdRet msn_cmd_nudge(PurpleConversation *conv, const gchar *cmd, gchar **args, gchar **error, void *data) { @@ -2307,8 +2306,7 @@ msn_send_attention, /* send_attention */ msn_attention_types, /* attention_types */ - /* padding */ - NULL + sizeof(PurplePluginProtocolInfo), /* struct_size */ }; static PurplePluginInfo info = diff -r 53bf3c21b79d -r 718a9c287839 libpurple/protocols/msnp9/msn.c --- a/libpurple/protocols/msnp9/msn.c Wed Apr 30 21:09:59 2008 +0000 +++ b/libpurple/protocols/msnp9/msn.c Mon May 05 06:19:46 2008 +0000 @@ -133,7 +133,6 @@ return list; } - static PurpleCmdRet msn_cmd_nudge(PurpleConversation *conv, const gchar *cmd, gchar **args, gchar **error, void *data) { @@ -2148,8 +2147,7 @@ msn_send_attention, /* send_attention */ msn_attention_types, /* attention_types */ - /* padding */ - NULL + sizeof(PurplePluginProtocolInfo), /* struct_size */ }; static PurplePluginInfo info = diff -r 53bf3c21b79d -r 718a9c287839 libpurple/protocols/myspace/myspace.c --- a/libpurple/protocols/myspace/myspace.c Wed Apr 30 21:09:59 2008 +0000 +++ b/libpurple/protocols/myspace/myspace.c Mon May 05 06:19:46 2008 +0000 @@ -3131,14 +3131,15 @@ NULL, /* unregister_user */ msim_send_attention, /* send_attention */ msim_attention_types, /* attention_types */ - NULL /* _purple_reserved4 */ + + sizeof(PurplePluginProtocolInfo), /* struct_size */ }; /** Based on MSN's plugin info comments. */ static PurplePluginInfo info = { - PURPLE_PLUGIN_MAGIC, + PURPLE_PLUGIN_MAGIC, PURPLE_MAJOR_VERSION, PURPLE_MINOR_VERSION, PURPLE_PLUGIN_PROTOCOL, /**< type */ diff -r 53bf3c21b79d -r 718a9c287839 libpurple/protocols/novell/novell.c --- a/libpurple/protocols/novell/novell.c Wed Apr 30 21:09:59 2008 +0000 +++ b/libpurple/protocols/novell/novell.c Mon May 05 06:19:46 2008 +0000 @@ -3517,7 +3517,7 @@ NULL, NULL, NULL, - NULL + sizeof(PurplePluginProtocolInfo), /* struct_size */ }; static PurplePluginInfo info = { diff -r 53bf3c21b79d -r 718a9c287839 libpurple/protocols/oscar/libaim.c --- a/libpurple/protocols/oscar/libaim.c Wed Apr 30 21:09:59 2008 +0000 +++ b/libpurple/protocols/oscar/libaim.c Mon May 05 06:19:46 2008 +0000 @@ -96,8 +96,7 @@ NULL, /* send_attention */ NULL, /* get_attention_types */ - /* padding */ - NULL + sizeof(PurplePluginProtocolInfo), /* struct_size */ }; static PurplePluginInfo info = diff -r 53bf3c21b79d -r 718a9c287839 libpurple/protocols/oscar/libicq.c --- a/libpurple/protocols/oscar/libicq.c Wed Apr 30 21:09:59 2008 +0000 +++ b/libpurple/protocols/oscar/libicq.c Mon May 05 06:19:46 2008 +0000 @@ -96,8 +96,7 @@ NULL, /* send_attention */ NULL, /* get_attention_types */ - /* padding */ - NULL + sizeof(PurplePluginProtocolInfo), /* struct_size */ }; static PurplePluginInfo info = diff -r 53bf3c21b79d -r 718a9c287839 libpurple/protocols/qq/qq.c --- a/libpurple/protocols/qq/qq.c Wed Apr 30 21:09:59 2008 +0000 +++ b/libpurple/protocols/qq/qq.c Mon May 05 06:19:46 2008 +0000 @@ -706,7 +706,7 @@ NULL, NULL, NULL, - NULL + sizeof(PurplePluginProtocolInfo), /* struct_size */ }; static PurplePluginInfo info = { diff -r 53bf3c21b79d -r 718a9c287839 libpurple/protocols/silc/silc.c --- a/libpurple/protocols/silc/silc.c Wed Apr 30 21:09:59 2008 +0000 +++ b/libpurple/protocols/silc/silc.c Mon May 05 06:19:46 2008 +0000 @@ -2071,7 +2071,7 @@ NULL, NULL, NULL, - NULL + sizeof(PurplePluginProtocolInfo), /* struct_size */ }; static PurplePluginInfo info = diff -r 53bf3c21b79d -r 718a9c287839 libpurple/protocols/silc10/silc.c --- a/libpurple/protocols/silc10/silc.c Wed Apr 30 21:09:59 2008 +0000 +++ b/libpurple/protocols/silc10/silc.c Mon May 05 06:19:46 2008 +0000 @@ -1800,11 +1800,10 @@ NULL, /* send_raw */ NULL, /* roomlist_room_serialize */ - /* padding */ NULL, NULL, NULL, - NULL + sizeof(PurplePluginProtocolInfo), /* struct_size */ }; static PurplePluginInfo info = diff -r 53bf3c21b79d -r 718a9c287839 libpurple/protocols/simple/simple.c --- a/libpurple/protocols/simple/simple.c Wed Apr 30 21:09:59 2008 +0000 +++ b/libpurple/protocols/simple/simple.c Mon May 05 06:19:46 2008 +0000 @@ -2052,7 +2052,7 @@ NULL, NULL, NULL, - NULL + sizeof(PurplePluginProtocolInfo), /* struct_size */ }; diff -r 53bf3c21b79d -r 718a9c287839 libpurple/protocols/yahoo/yahoo.c --- a/libpurple/protocols/yahoo/yahoo.c Wed Apr 30 21:09:59 2008 +0000 +++ b/libpurple/protocols/yahoo/yahoo.c Mon May 05 06:19:46 2008 +0000 @@ -4379,8 +4379,7 @@ yahoo_send_attention, yahoo_attention_types, - /* padding */ - NULL + sizeof(PurplePluginProtocolInfo), /* struct_size */ }; static PurplePluginInfo info = diff -r 53bf3c21b79d -r 718a9c287839 libpurple/protocols/zephyr/zephyr.c --- a/libpurple/protocols/zephyr/zephyr.c Wed Apr 30 21:09:59 2008 +0000 +++ b/libpurple/protocols/zephyr/zephyr.c Mon May 05 06:19:46 2008 +0000 @@ -2907,11 +2907,10 @@ NULL, /* send_raw */ NULL, /* roomlist_room_serialize */ - /* padding */ NULL, NULL, NULL, - NULL + sizeof(PurplePluginProtocolInfo), /* struct_size */ }; static PurplePluginInfo info = { diff -r 53bf3c21b79d -r 718a9c287839 libpurple/prpl.h --- a/libpurple/prpl.h Wed Apr 30 21:09:59 2008 +0000 +++ b/libpurple/prpl.h Mon May 05 06:19:46 2008 +0000 @@ -398,9 +398,34 @@ gboolean (*send_attention)(PurpleConnection *gc, const char *username, guint type); GList *(*get_attention_types)(PurpleAccount *acct); - void (*_purple_reserved4)(void); + /** + * The size of the PurplePluginProtocolInfo. This should always be sizeof(PurplePluginProtocolInfo). + * This allows adding more functions to this struct without requiring a major version bump. + */ + unsigned long struct_size; + + /* NOTE: + * If more functions are added, they should accessed using the following syntax: + * + * if (PURPLE_PROTOCOL_PLUGIN_HAS_FUNC(prpl, new_function)) + * prpl->new_function(...); + * + * instead of + * + * if (prpl->new_function != NULL) + * prpl->new_function(...); + * + * The PURPLE_PROTOCOL_PLUGIN_HAS_FUNC macro can be used for the older member + * functions (e.g. login, send_im etc.) too. + */ }; +#define PURPLE_PROTOCOL_PLUGIN_HAS_FUNC(prpl, member) \ + (((G_STRUCT_OFFSET(PurplePluginProtocolInfo, member) < G_STRUCT_OFFSET(PurplePluginProtocolInfo, struct_size)) \ + || (G_STRUCT_OFFSET(PurplePluginProtocolInfo, member) < prpl->struct_size)) && \ + prpl->member != NULL) + + #define PURPLE_IS_PROTOCOL_PLUGIN(plugin) \ ((plugin)->info->type == PURPLE_PLUGIN_PROTOCOL)