libpurple/protocols/jabber/libfacebook.c

branch
soc.2013.gobjectification.plugins
changeset 36582
095b9c85c45c
parent 36545
23b59a16c808
child 36583
0582190c9382
--- a/libpurple/protocols/jabber/libfacebook.c	Tue Aug 27 04:04:42 2013 +0530
+++ b/libpurple/protocols/jabber/libfacebook.c	Tue Aug 27 04:08:20 2013 +0530
@@ -26,120 +26,14 @@
  */
 
 #include "internal.h"
-
-#include "accountopt.h"
+#include "chat.h"
 #include "core.h"
-#include "debug.h"
-#include "version.h"
-
-#include "iq.h"
-#include "jabber.h"
-#include "chat.h"
-#include "disco.h"
-#include "message.h"
-#include "roster.h"
-#include "si.h"
-#include "message.h"
 #include "plugins.h"
-#include "presence.h"
-#include "google/google.h"
-#include "pep.h"
-#include "usermood.h"
-#include "usertune.h"
-#include "caps.h"
-#include "data.h"
-#include "ibb.h"
 
-static const char *
-facebook_list_icon(PurpleAccount *a, PurpleBuddy *b)
-{
-	return "facebook";
-}
+#include "libfacebook.h"
 
 static PurpleProtocol *my_protocol = NULL;
 
-static PurpleProtocol protocol =
-{
-	"prpl-facebook-xmpp",                   /* id */
-	"Facebook (XMPP)",                      /* name */
-	sizeof(PurpleProtocol),       /* struct_size */
-	OPT_PROTO_CHAT_TOPIC | OPT_PROTO_UNIQUE_CHATNAME | OPT_PROTO_MAIL_CHECK |
-#ifdef HAVE_CYRUS_SASL
-	OPT_PROTO_PASSWORD_OPTIONAL |
-#endif
-	OPT_PROTO_SLASH_COMMANDS_NATIVE,
-	NULL,							/* user_splits */
-	NULL,							/* protocol_options */
-	{"png", 32, 32, 96, 96, 0, PURPLE_ICON_SCALE_SEND | PURPLE_ICON_SCALE_DISPLAY}, /* icon_spec */
-	jabber_get_actions,				/* get_actions */
-	facebook_list_icon,				/* list_icon */
-	jabber_list_emblem,			/* list_emblems */
-	jabber_status_text,				/* status_text */
-	jabber_tooltip_text,			/* tooltip_text */
-	jabber_status_types,			/* status_types */
-	jabber_blist_node_menu,			/* blist_node_menu */
-	jabber_chat_info,				/* chat_info */
-	jabber_chat_info_defaults,		/* chat_info_defaults */
-	jabber_login,					/* login */
-	jabber_close,					/* close */
-	jabber_message_send_im,			/* send_im */
-	jabber_set_info,				/* set_info */
-	jabber_send_typing,				/* send_typing */
-	jabber_buddy_get_info,			/* get_info */
-	jabber_set_status,				/* set_status */
-	jabber_idle_set,				/* set_idle */
-	NULL,							/* change_passwd */
-	NULL,							/* add_buddy */
-	NULL,							/* add_buddies */
-	NULL,							/* remove_buddy */
-	NULL,							/* remove_buddies */
-	NULL,							/* add_permit */
-	NULL,							/* add_deny */
-	NULL,							/* rem_permit */
-	NULL,							/* rem_deny */
-	NULL,							/* set_permit_deny */
-	jabber_chat_join,				/* join_chat */
-	NULL,							/* reject_chat */
-	jabber_get_chat_name,			/* get_chat_name */
-	jabber_chat_invite,				/* chat_invite */
-	jabber_chat_leave,				/* chat_leave */
-	NULL,							/* chat_whisper */
-	jabber_message_send_chat,		/* chat_send */
-	jabber_keepalive,				/* keepalive */
-	NULL,							/* register_user */
-	NULL,							/* get_cb_info */
-	NULL,							/* alias_buddy */
-	NULL,							/* group_buddy */
-	NULL,							/* rename_group */
-	NULL,							/* buddy_free */
-	jabber_convo_closed,			/* convo_closed */
-	jabber_normalize,				/* normalize */
-	jabber_set_buddy_icon,			/* set_buddy_icon */
-	NULL,							/* remove_group */
-	jabber_chat_user_real_name,	/* get_cb_real_name */
-	jabber_chat_set_topic,			/* set_chat_topic */
-	jabber_find_blist_chat,			/* find_blist_chat */
-	jabber_roomlist_get_list,		/* roomlist_get_list */
-	jabber_roomlist_cancel,			/* roomlist_cancel */
-	NULL,							/* roomlist_expand_category */
-	NULL,							/* can_receive_file */
-	NULL,							/* send_file */
-	NULL,							/* new_xfer */
-	jabber_offline_message,			/* offline_message */
-	NULL,							/* whiteboard_protocol_ops */
-	jabber_protocol_send_raw,			/* send_raw */
-	jabber_roomlist_room_serialize, /* roomlist_room_serialize */
-	NULL,							/* unregister_user */
-	NULL,							/* send_attention */
-	NULL,							/* attention_types */
-	NULL, /* get_account_text_table */
-	NULL,							/* initiate_media */
-	NULL,							/* get_media_caps */
-	NULL,							/* get_moods */
-	NULL, /* set_public_alias */
-	NULL  /* get_public_alias */
-};
-
 static PurpleAccount *find_acct(const char *prpl, const char *acct_id)
 {
 	PurpleAccount *acct = NULL;
@@ -172,7 +66,7 @@
 	if (g_ascii_strcasecmp(proto, "xmpp"))
 		return FALSE;
 
-	acct = find_acct(my_protocol->id, acct_id);
+	acct = find_acct(purple_protocol_get_id(my_protocol), acct_id);
 
 	if (!acct)
 		return FALSE;
@@ -204,12 +98,114 @@
 	return FALSE;
 }
 
+static const char *
+facebook_list_icon(PurpleAccount *a, PurpleBuddy *b)
+{
+	return "facebook";
+}
+
+static void
+facebook_protocol_base_init(FacebookProtocolClass *klass)
+{
+	PurpleProtocolClass *proto_class = PURPLE_PROTOCOL_CLASS(klass);
+	PurpleAccountUserSplit *split;
+	PurpleAccountOption *option;
+	GList *encryption_values = NULL;
+
+	proto_class->id        = FACEBOOK_ID;
+	proto_class->name      = FACEBOOK_NAME;
+
+	/* Translators: 'domain' is used here in the context of Internet domains, e.g. pidgin.im */
+	split = purple_account_user_split_new(_("Domain"), "chat.facebook.com", '@');
+	purple_account_user_split_set_reverse(split, FALSE);
+	proto_class->user_splits = g_list_append(proto_class->user_splits, split);
+
+	split = purple_account_user_split_new(_("Resource"), "", '/');
+	purple_account_user_split_set_reverse(split, FALSE);
+	proto_class->user_splits = g_list_append(proto_class->user_splits, split);
+
+#define ADD_VALUE(list, desc, v) { \
+	PurpleKeyValuePair *kvp = g_new0(PurpleKeyValuePair, 1); \
+	kvp->key = g_strdup((desc)); \
+	kvp->value = g_strdup((v)); \
+	list = g_list_prepend(list, kvp); \
+}
+
+	ADD_VALUE(encryption_values, _("Require encryption"), "require_tls");
+	ADD_VALUE(encryption_values, _("Use encryption if available"), "opportunistic_tls");
+	ADD_VALUE(encryption_values, _("Use old-style SSL"), "old_ssl");
+#if 0
+	ADD_VALUE(encryption_values, "None", "none");
+#endif
+	encryption_values = g_list_reverse(encryption_values);
+
+#undef ADD_VALUE
+
+	option = purple_account_option_list_new(_("Connection security"), "connection_security", encryption_values);
+	proto_class->protocol_options = g_list_append(proto_class->protocol_options,
+						   option);
+
+	option = purple_account_option_bool_new(
+						_("Allow plaintext auth over unencrypted streams"),
+						"auth_plain_in_clear", FALSE);
+	proto_class->protocol_options = g_list_append(proto_class->protocol_options,
+						   option);
+
+	option = purple_account_option_int_new(_("Connect port"), "port", 5222);
+	proto_class->protocol_options = g_list_append(proto_class->protocol_options,
+						   option);
+
+	option = purple_account_option_string_new(_("Connect server"),
+						  "connect_server", NULL);
+	proto_class->protocol_options = g_list_append(proto_class->protocol_options,
+						  option);
+
+	option = purple_account_option_string_new(_("BOSH URL"),
+						  "bosh_url", NULL);
+	proto_class->protocol_options = g_list_append(proto_class->protocol_options,
+						  option);
+
+	/* this should probably be part of global smiley theme settings later on,
+	  shared with MSN */
+	option = purple_account_option_bool_new(_("Show Custom Smileys"),
+		"custom_smileys", TRUE);
+	proto_class->protocol_options = g_list_append(proto_class->protocol_options,
+		option);
+}
+
+static void
+facebook_protocol_interface_init(PurpleProtocolInterface *iface)
+{
+	iface->list_icon           = facebook_list_icon;
+
+	/* disable xmpp functions not available for facebook */
+	iface->add_buddy           = NULL;
+	iface->remove_buddy        = NULL;
+	iface->add_deny            = NULL;
+	iface->rem_deny            = NULL;
+	iface->register_user       = NULL;
+	iface->alias_buddy         = NULL;
+	iface->group_buddy         = NULL;
+	iface->rename_group        = NULL;
+	iface->can_receive_file    = NULL;
+	iface->send_file           = NULL;
+	iface->new_xfer            = NULL;
+	iface->unregister_user     = NULL;
+	iface->send_attention      = NULL;
+	iface->get_attention_types = NULL;
+	iface->initiate_media      = NULL;
+	iface->get_media_caps      = NULL;
+	iface->get_moods           = NULL;
+}
+
+static void facebook_protocol_base_finalize(FacebookProtocolClass *klass) { }
+
 static PurplePluginInfo *
 plugin_query(GError **error)
 {
 	return purple_plugin_info_new(
-		"id",           "prpl-facebook-xmpp",
-		"name",         "Facebook (XMPP)",
+		"id",           FACEBOOK_ID,
+		"name",         FACEBOOK_NAME,
 		"version",      DISPLAY_VERSION,
 		"category",     N_("Protocol"),
 		"summary",      N_("Facebook XMPP Protocol Plugin"),
@@ -225,86 +221,32 @@
 static gboolean
 plugin_load(PurplePlugin *plugin, GError **error)
 {
-	PurpleAccountUserSplit *split;
-	PurpleAccountOption *option;
-	GList *encryption_values = NULL;
-
-	/* Translators: 'domain' is used here in the context of Internet domains, e.g. pidgin.im */
-	split = purple_account_user_split_new(_("Domain"), "chat.facebook.com", '@');
-	purple_account_user_split_set_reverse(split, FALSE);
-	protocol.user_splits = g_list_append(protocol.user_splits, split);
-
-	split = purple_account_user_split_new(_("Resource"), "", '/');
-	purple_account_user_split_set_reverse(split, FALSE);
-	protocol.user_splits = g_list_append(protocol.user_splits, split);
-
-#define ADD_VALUE(list, desc, v) { \
-	PurpleKeyValuePair *kvp = g_new0(PurpleKeyValuePair, 1); \
-	kvp->key = g_strdup((desc)); \
-	kvp->value = g_strdup((v)); \
-	list = g_list_prepend(list, kvp); \
-}
-
-	ADD_VALUE(encryption_values, _("Use encryption if available"), "opportunistic_tls");
-	ADD_VALUE(encryption_values, _("Require encryption"), "require_tls");
-	ADD_VALUE(encryption_values, _("Use old-style SSL"), "old_ssl");
-#if 0
-	ADD_VALUE(encryption_values, "None", "none");
-#endif
-	encryption_values = g_list_reverse(encryption_values);
-
-#undef ADD_VALUE
-
-	option = purple_account_option_list_new(_("Connection security"), "connection_security", encryption_values);
-	protocol.protocol_options = g_list_append(protocol.protocol_options,
-						   option);
-
-	option = purple_account_option_bool_new(
-						_("Allow plaintext auth over unencrypted streams"),
-						"auth_plain_in_clear", FALSE);
-	protocol.protocol_options = g_list_append(protocol.protocol_options,
-						   option);
-
-	option = purple_account_option_int_new(_("Connect port"), "port", 5222);
-	protocol.protocol_options = g_list_append(protocol.protocol_options,
-						   option);
-
-	option = purple_account_option_string_new(_("Connect server"),
-						  "connect_server", NULL);
-	protocol.protocol_options = g_list_append(protocol.protocol_options,
-						  option);
-
-	option = purple_account_option_string_new(_("BOSH URL"),
-						  "bosh_url", NULL);
-	protocol.protocol_options = g_list_append(protocol.protocol_options,
-						  option);
-
-	/* this should probably be part of global smiley theme settings later on,
-	  shared with MSN */
-	option = purple_account_option_bool_new(_("Show Custom Smileys"),
-		"custom_smileys", TRUE);
-	protocol.protocol_options = g_list_append(protocol.protocol_options,
-		option);
-
-	my_protocol = &protocol;
+	my_protocol = purple_protocols_add(FACEBOOK_TYPE_PROTOCOL);
+	if (!my_protocol) {
+		g_set_error(error, FACEBOOK_DOMAIN, 0, _("Failed to add facebook protocol"));
+		return FALSE;
+	}
 
 	purple_signal_connect(purple_get_core(), "uri-handler", my_protocol,
 		PURPLE_CALLBACK(xmpp_uri_handler), NULL);
 
-	purple_protocols_add(my_protocol);
-	jabber_plugin_init(my_protocol);
-
+	jabber_protocol_init(my_protocol);
 	return TRUE;
 }
 
 static gboolean
 plugin_unload(PurplePlugin *plugin, GError **error)
 {
-	jabber_plugin_uninit(my_protocol);
-	purple_protocols_remove(my_protocol);
+	jabber_protocol_uninit(my_protocol);
+	if (!purple_protocols_remove(my_protocol)) {
+		g_set_error(error, FACEBOOK_DOMAIN, 0, _("Failed to remove facebook protocol"));
+		return FALSE;
+	}
 
 	return TRUE;
 }
 
+PURPLE_PROTOCOL_DEFINE_EXTENDED(FacebookProtocol, facebook_protocol,
+                                JABBER_TYPE_PROTOCOL, 0);
+
 PURPLE_PLUGIN_INIT(facebookxmpp, plugin_query, plugin_load, plugin_unload);
-

mercurial