comparison libpurple/protocols/jabber/jabber.c @ 16240:547c76fe2e7a

This does the ol' AIM/ICQ split trick on Jabber, creating an XMPP prpl. This can be used, later, to create a Bonjour plugin that reuses libjabber
author Sean Egan <seanegan@gmail.com>
date Wed, 18 Apr 2007 19:51:24 +0000
parents ac1a32ebd62c
children 08db93bbd798 be098f796b32
comparison
equal deleted inserted replaced
16239:55a5791838f7 16240:547c76fe2e7a
337 data + ret, len - ret); 337 data + ret, len - ret);
338 } 338 }
339 return; 339 return;
340 } 340 }
341 341
342 static int jabber_prpl_send_raw(PurpleConnection *gc, const char *buf, int len) 342 int jabber_prpl_send_raw(PurpleConnection *gc, const char *buf, int len)
343 { 343 {
344 JabberStream *js = (JabberStream*)gc->proto_data; 344 JabberStream *js = (JabberStream*)gc->proto_data;
345 jabber_send_raw(js, buf, len); 345 jabber_send_raw(js, buf, len);
346 return len; 346 return len;
347 } 347 }
360 txt = xmlnode_to_str(packet, &len); 360 txt = xmlnode_to_str(packet, &len);
361 jabber_send_raw(js, txt, len); 361 jabber_send_raw(js, txt, len);
362 g_free(txt); 362 g_free(txt);
363 } 363 }
364 364
365 static void jabber_keepalive(PurpleConnection *gc) 365 void jabber_keepalive(PurpleConnection *gc)
366 { 366 {
367 jabber_send_raw(gc->proto_data, "\t", -1); 367 jabber_send_raw(gc->proto_data, "\t", -1);
368 } 368 }
369 369
370 static void 370 static void
533 jabber_login_connect(js, js->user->domain, 533 jabber_login_connect(js, js->user->domain,
534 purple_account_get_int(js->gc->account, "port", 5222)); 534 purple_account_get_int(js->gc->account, "port", 5222));
535 } 535 }
536 } 536 }
537 537
538 538 void
539
540 static void
541 jabber_login(PurpleAccount *account) 539 jabber_login(PurpleAccount *account)
542 { 540 {
543 PurpleConnection *gc = purple_account_get_connection(account); 541 PurpleConnection *gc = purple_account_get_connection(account);
544 const char *connect_server = purple_account_get_string(account, 542 const char *connect_server = purple_account_get_string(account,
545 "connect_server", ""); 543 "connect_server", "");
885 883
886 iq = jabber_iq_new_query(js, JABBER_IQ_GET, "jabber:iq:register"); 884 iq = jabber_iq_new_query(js, JABBER_IQ_GET, "jabber:iq:register");
887 jabber_iq_send(iq); 885 jabber_iq_send(iq);
888 } 886 }
889 887
890 static void jabber_register_account(PurpleAccount *account) 888 void jabber_register_account(PurpleAccount *account)
891 { 889 {
892 PurpleConnection *gc = purple_account_get_connection(account); 890 PurpleConnection *gc = purple_account_get_connection(account);
893 JabberStream *js; 891 JabberStream *js;
894 JabberBuddy *my_jb = NULL; 892 JabberBuddy *my_jb = NULL;
895 const char *connect_server = purple_account_get_string(account, 893 const char *connect_server = purple_account_get_string(account,
956 js); 954 js);
957 } 955 }
958 } 956 }
959 } 957 }
960 958
961 static void jabber_close(PurpleConnection *gc) 959 void jabber_close(PurpleConnection *gc)
962 { 960 {
963 JabberStream *js = gc->proto_data; 961 JabberStream *js = gc->proto_data;
964 962
965 /* Don't perform any actions on the ssl connection 963 /* Don't perform any actions on the ssl connection
966 * if we were forcibly disconnected because it will crash 964 * if we were forcibly disconnected because it will crash
1071 { 1069 {
1072 return g_strdup_printf("purple%x", js->next_id++); 1070 return g_strdup_printf("purple%x", js->next_id++);
1073 } 1071 }
1074 1072
1075 1073
1076 static void jabber_idle_set(PurpleConnection *gc, int idle) 1074 void jabber_idle_set(PurpleConnection *gc, int idle)
1077 { 1075 {
1078 JabberStream *js = gc->proto_data; 1076 JabberStream *js = gc->proto_data;
1079 1077
1080 js->idle = idle ? time(NULL) - idle : idle; 1078 js->idle = idle ? time(NULL) - idle : idle;
1081 } 1079 }
1082 1080
1083 static const char *jabber_list_icon(PurpleAccount *a, PurpleBuddy *b) 1081 const char *jabber_list_icon(PurpleAccount *a, PurpleBuddy *b)
1084 { 1082 {
1085 return "jabber"; 1083 return "jabber";
1086 } 1084 }
1087 1085
1088 static const char* jabber_list_emblem(PurpleBuddy *b) 1086 const char* jabber_list_emblem(PurpleBuddy *b)
1089 { 1087 {
1090 JabberStream *js; 1088 JabberStream *js;
1091 JabberBuddy *jb = NULL; 1089 JabberBuddy *jb = NULL;
1092 1090
1093 if(!b->account->gc) 1091 if(!b->account->gc)
1103 return "not-authorized"; 1101 return "not-authorized";
1104 } 1102 }
1105 return NULL; 1103 return NULL;
1106 } 1104 }
1107 1105
1108 static char *jabber_status_text(PurpleBuddy *b) 1106 char *jabber_status_text(PurpleBuddy *b)
1109 { 1107 {
1110 JabberBuddy *jb = jabber_buddy_find(b->account->gc->proto_data, b->name, 1108 JabberBuddy *jb = jabber_buddy_find(b->account->gc->proto_data, b->name,
1111 FALSE); 1109 FALSE);
1112 char *ret = NULL; 1110 char *ret = NULL;
1113 1111
1132 } 1130 }
1133 1131
1134 return ret; 1132 return ret;
1135 } 1133 }
1136 1134
1137 static void jabber_tooltip_text(PurpleBuddy *b, PurpleNotifyUserInfo *user_info, gboolean full) 1135 void jabber_tooltip_text(PurpleBuddy *b, PurpleNotifyUserInfo *user_info, gboolean full)
1138 { 1136 {
1139 JabberBuddy *jb; 1137 JabberBuddy *jb;
1140 1138
1141 g_return_if_fail(b != NULL); 1139 g_return_if_fail(b != NULL);
1142 g_return_if_fail(b->account != NULL); 1140 g_return_if_fail(b->account != NULL);
1216 purple_notify_user_info_add_pair(user_info, _("Error"), jb->error_msg); 1214 purple_notify_user_info_add_pair(user_info, _("Error"), jb->error_msg);
1217 } 1215 }
1218 } 1216 }
1219 } 1217 }
1220 1218
1221 static GList *jabber_status_types(PurpleAccount *account) 1219 GList *jabber_status_types(PurpleAccount *account)
1222 { 1220 {
1223 PurpleStatusType *type; 1221 PurpleStatusType *type;
1224 GList *types = NULL; 1222 GList *types = NULL;
1225 PurpleValue *priority_value; 1223 PurpleValue *priority_value;
1226 1224
1369 _("Change Jabber Password"), _("Please enter your new password"), 1367 _("Change Jabber Password"), _("Please enter your new password"),
1370 fields, _("OK"), G_CALLBACK(jabber_password_change_cb), 1368 fields, _("OK"), G_CALLBACK(jabber_password_change_cb),
1371 _("Cancel"), NULL, js); 1369 _("Cancel"), NULL, js);
1372 } 1370 }
1373 1371
1374 static GList *jabber_actions(PurplePlugin *plugin, gpointer context) 1372 GList *jabber_actions(PurplePlugin *plugin, gpointer context)
1375 { 1373 {
1376 GList *m = NULL; 1374 GList *m = NULL;
1377 PurplePluginAction *act; 1375 PurplePluginAction *act;
1378 1376
1379 act = purple_plugin_action_new(_("Set User Info..."), 1377 act = purple_plugin_action_new(_("Set User Info..."),
1391 m = g_list_append(m, act); 1389 m = g_list_append(m, act);
1392 1390
1393 return m; 1391 return m;
1394 } 1392 }
1395 1393
1396 static PurpleChat *jabber_find_blist_chat(PurpleAccount *account, const char *name) 1394 PurpleChat *jabber_find_blist_chat(PurpleAccount *account, const char *name)
1397 { 1395 {
1398 PurpleBlistNode *gnode, *cnode; 1396 PurpleBlistNode *gnode, *cnode;
1399 JabberID *jid; 1397 JabberID *jid;
1400 1398
1401 if(!(jid = jabber_id_new(name))) 1399 if(!(jid = jabber_id_new(name)))
1425 } 1423 }
1426 jabber_id_free(jid); 1424 jabber_id_free(jid);
1427 return NULL; 1425 return NULL;
1428 } 1426 }
1429 1427
1430 static void jabber_convo_closed(PurpleConnection *gc, const char *who) 1428 void jabber_convo_closed(PurpleConnection *gc, const char *who)
1431 { 1429 {
1432 JabberStream *js = gc->proto_data; 1430 JabberStream *js = gc->proto_data;
1433 JabberID *jid; 1431 JabberID *jid;
1434 JabberBuddy *jb; 1432 JabberBuddy *jb;
1435 JabberBuddyResource *jbr; 1433 JabberBuddyResource *jbr;
1775 1773
1776 g_free(who); 1774 g_free(who);
1777 return PURPLE_CMD_RET_OK; 1775 return PURPLE_CMD_RET_OK;
1778 } 1776 }
1779 1777
1780 static gboolean jabber_offline_message(const PurpleBuddy *buddy) 1778 gboolean jabber_offline_message(const PurpleBuddy *buddy)
1781 { 1779 {
1782 return TRUE; 1780 return TRUE;
1783 } 1781 }
1784 1782
1785 static void jabber_register_commands(void) 1783 void jabber_register_commands(void)
1786 { 1784 {
1787 purple_cmd_register("config", "", PURPLE_CMD_P_PRPL, 1785 purple_cmd_register("config", "", PURPLE_CMD_P_PRPL,
1788 PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_PRPL_ONLY, 1786 PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_PRPL_ONLY,
1789 "prpl-jabber", jabber_cmd_chat_config, 1787 "prpl-jabber", jabber_cmd_chat_config,
1790 _("config: Configure a chat room."), NULL); 1788 _("config: Configure a chat room."), NULL);
1854 "prpl-jabber", jabber_cmd_chat_msg, 1852 "prpl-jabber", jabber_cmd_chat_msg,
1855 _("msg &lt;user&gt; &lt;message&gt;: Send a private message to another user."), 1853 _("msg &lt;user&gt; &lt;message&gt;: Send a private message to another user."),
1856 NULL); 1854 NULL);
1857 } 1855 }
1858 1856
1859 static PurplePluginProtocolInfo prpl_info = 1857 void
1860 { 1858 jabber_init_plugin(PurplePlugin *plugin)
1861 #ifdef HAVE_CYRUS_SASL 1859 {
1862 OPT_PROTO_CHAT_TOPIC | OPT_PROTO_UNIQUE_CHATNAME | 1860 my_protocol = plugin;
1863 OPT_PROTO_MAIL_CHECK | OPT_PROTO_PASSWORD_OPTIONAL, 1861 }
1864 #else
1865 OPT_PROTO_CHAT_TOPIC | OPT_PROTO_UNIQUE_CHATNAME | OPT_PROTO_MAIL_CHECK,
1866 #endif
1867 NULL, /* user_splits */
1868 NULL, /* protocol_options */
1869 {"png,gif,jpeg", 32, 32, 96, 96, 8191, PURPLE_ICON_SCALE_SEND | PURPLE_ICON_SCALE_DISPLAY}, /* icon_spec */
1870 jabber_list_icon, /* list_icon */
1871 jabber_list_emblem, /* list_emblems */
1872 jabber_status_text, /* status_text */
1873 jabber_tooltip_text, /* tooltip_text */
1874 jabber_status_types, /* status_types */
1875 jabber_blist_node_menu, /* blist_node_menu */
1876 jabber_chat_info, /* chat_info */
1877 jabber_chat_info_defaults, /* chat_info_defaults */
1878 jabber_login, /* login */
1879 jabber_close, /* close */
1880 jabber_message_send_im, /* send_im */
1881 jabber_set_info, /* set_info */
1882 jabber_send_typing, /* send_typing */
1883 jabber_buddy_get_info, /* get_info */
1884 jabber_presence_send, /* set_away */
1885 jabber_idle_set, /* set_idle */
1886 NULL, /* change_passwd */
1887 jabber_roster_add_buddy, /* add_buddy */
1888 NULL, /* add_buddies */
1889 jabber_roster_remove_buddy, /* remove_buddy */
1890 NULL, /* remove_buddies */
1891 NULL, /* add_permit */
1892 jabber_google_roster_add_deny, /* add_deny */
1893 NULL, /* rem_permit */
1894 jabber_google_roster_rem_deny, /* rem_deny */
1895 NULL, /* set_permit_deny */
1896 jabber_chat_join, /* join_chat */
1897 NULL, /* reject_chat */
1898 jabber_get_chat_name, /* get_chat_name */
1899 jabber_chat_invite, /* chat_invite */
1900 jabber_chat_leave, /* chat_leave */
1901 NULL, /* chat_whisper */
1902 jabber_message_send_chat, /* chat_send */
1903 jabber_keepalive, /* keepalive */
1904 jabber_register_account, /* register_user */
1905 jabber_buddy_get_info_chat, /* get_cb_info */
1906 NULL, /* get_cb_away */
1907 jabber_roster_alias_change, /* alias_buddy */
1908 jabber_roster_group_change, /* group_buddy */
1909 jabber_roster_group_rename, /* rename_group */
1910 NULL, /* buddy_free */
1911 jabber_convo_closed, /* convo_closed */
1912 jabber_normalize, /* normalize */
1913 jabber_set_buddy_icon, /* set_buddy_icon */
1914 NULL, /* remove_group */
1915 jabber_chat_buddy_real_name, /* get_cb_real_name */
1916 jabber_chat_set_topic, /* set_chat_topic */
1917 jabber_find_blist_chat, /* find_blist_chat */
1918 jabber_roomlist_get_list, /* roomlist_get_list */
1919 jabber_roomlist_cancel, /* roomlist_cancel */
1920 NULL, /* roomlist_expand_category */
1921 NULL, /* can_receive_file */
1922 jabber_si_xfer_send, /* send_file */
1923 jabber_si_new_xfer, /* new_xfer */
1924 jabber_offline_message, /* offline_message */
1925 NULL, /* whiteboard_prpl_ops */
1926 jabber_prpl_send_raw, /* send_raw */
1927 jabber_roomlist_room_serialize, /* roomlist_room_serialize */
1928 };
1929
1930 static gboolean load_plugin(PurplePlugin *plugin)
1931 {
1932 purple_signal_register(plugin, "jabber-receiving-xmlnode",
1933 purple_marshal_VOID__POINTER_POINTER, NULL, 2,
1934 purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION),
1935 purple_value_new_outgoing(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_XMLNODE));
1936
1937 purple_signal_register(plugin, "jabber-sending-xmlnode",
1938 purple_marshal_VOID__POINTER_POINTER, NULL, 2,
1939 purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION),
1940 purple_value_new_outgoing(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_XMLNODE));
1941
1942 purple_signal_register(plugin, "jabber-sending-text",
1943 purple_marshal_VOID__POINTER_POINTER, NULL, 2,
1944 purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION),
1945 purple_value_new_outgoing(PURPLE_TYPE_STRING));
1946
1947
1948 return TRUE;
1949 }
1950
1951 static gboolean unload_plugin(PurplePlugin *plugin)
1952 {
1953 purple_signal_unregister(plugin, "jabber-receiving-xmlnode");
1954
1955 purple_signal_unregister(plugin, "jabber-sending-xmlnode");
1956
1957 purple_signal_unregister(plugin, "jabber-sending-text");
1958
1959 return TRUE;
1960 }
1961
1962 static PurplePluginInfo info =
1963 {
1964 PURPLE_PLUGIN_MAGIC,
1965 PURPLE_MAJOR_VERSION,
1966 PURPLE_MINOR_VERSION,
1967 PURPLE_PLUGIN_PROTOCOL, /**< type */
1968 NULL, /**< ui_requirement */
1969 0, /**< flags */
1970 NULL, /**< dependencies */
1971 PURPLE_PRIORITY_DEFAULT, /**< priority */
1972
1973 "prpl-jabber", /**< id */
1974 "Jabber", /**< name */
1975 VERSION, /**< version */
1976 /** summary */
1977 N_("Jabber Protocol Plugin"),
1978 /** description */
1979 N_("Jabber Protocol Plugin"),
1980 NULL, /**< author */
1981 PURPLE_WEBSITE, /**< homepage */
1982
1983 load_plugin, /**< load */
1984 unload_plugin, /**< unload */
1985 NULL, /**< destroy */
1986
1987 NULL, /**< ui_info */
1988 &prpl_info, /**< extra_info */
1989 NULL, /**< prefs_info */
1990 jabber_actions
1991 };
1992
1993 static void
1994 init_plugin(PurplePlugin *plugin)
1995 {
1996 PurpleAccountUserSplit *split;
1997 PurpleAccountOption *option;
1998
1999 split = purple_account_user_split_new(_("Server"), "jabber.org", '@');
2000 prpl_info.user_splits = g_list_append(prpl_info.user_splits, split);
2001
2002 split = purple_account_user_split_new(_("Resource"), "Home", '/');
2003 prpl_info.user_splits = g_list_append(prpl_info.user_splits, split);
2004
2005 option = purple_account_option_bool_new(_("Force old (port 5223) SSL"), "old_ssl", FALSE);
2006 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options,
2007 option);
2008
2009 option = purple_account_option_bool_new(
2010 _("Allow plaintext auth over unencrypted streams"),
2011 "auth_plain_in_clear", FALSE);
2012 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options,
2013 option);
2014
2015 option = purple_account_option_int_new(_("Connect port"), "port", 5222);
2016 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options,
2017 option);
2018
2019 option = purple_account_option_string_new(_("Connect server"),
2020 "connect_server", NULL);
2021 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options,
2022 option);
2023
2024 my_protocol = plugin;
2025
2026 purple_prefs_remove("/plugins/prpl/jabber");
2027
2028 /* XXX - If any other plugin wants SASL this won't be good ... */
2029 #ifdef HAVE_CYRUS_SASL
2030 sasl_client_init(NULL);
2031 #endif
2032 jabber_register_commands();
2033
2034 jabber_iq_init();
2035 }
2036
2037 PURPLE_INIT_PLUGIN(jabber, init_plugin, info);