libpurple/protocols/simple/simple.c

branch
cpw.qulogic.gtk3
changeset 32438
dc8991868906
parent 32157
39ba2e2492ee
equal deleted inserted replaced
32437:a1093fbc45d2 32438:dc8991868906
65 static const char *simple_list_icon(PurpleAccount *a, PurpleBuddy *b) { 65 static const char *simple_list_icon(PurpleAccount *a, PurpleBuddy *b) {
66 return "simple"; 66 return "simple";
67 } 67 }
68 68
69 static void simple_keep_alive(PurpleConnection *gc) { 69 static void simple_keep_alive(PurpleConnection *gc) {
70 struct simple_account_data *sip = gc->proto_data; 70 struct simple_account_data *sip = purple_connection_get_protocol_data(gc);
71 if(sip->udp) { /* in case of UDP send a packet only with a 0 byte to 71 if(sip->udp) { /* in case of UDP send a packet only with a 0 byte to
72 remain in the NAT table */ 72 remain in the NAT table */
73 gchar buf[2] = {0, 0}; 73 gchar buf[2] = {0, 0};
74 purple_debug_info("simple", "sending keep alive\n"); 74 purple_debug_info("simple", "sending keep alive\n");
75 sendto(sip->fd, buf, 1, 0, (struct sockaddr*)&sip->serveraddr, sizeof(struct sockaddr_in)); 75 sendto(sip->fd, buf, 1, 0, (struct sockaddr*)&sip->serveraddr, sizeof(struct sockaddr_in));
98 tmp = tmp->next; 98 tmp = tmp->next;
99 } 99 }
100 } 100 }
101 101
102 static void simple_set_status(PurpleAccount *account, PurpleStatus *status) { 102 static void simple_set_status(PurpleAccount *account, PurpleStatus *status) {
103 PurpleConnection *gc = purple_account_get_connection(account);
103 PurpleStatusPrimitive primitive = purple_status_type_get_primitive(purple_status_get_type(status)); 104 PurpleStatusPrimitive primitive = purple_status_type_get_primitive(purple_status_get_type(status));
104 struct simple_account_data *sip = NULL; 105 struct simple_account_data *sip = NULL;
105 106
106 if (!purple_status_is_active(status)) 107 if (!purple_status_is_active(status))
107 return; 108 return;
108 109
109 if (account->gc) 110 if (gc)
110 sip = account->gc->proto_data; 111 sip = purple_connection_get_protocol_data(gc);
111 112
112 if (sip) 113 if (sip)
113 { 114 {
114 g_free(sip->status); 115 g_free(sip->status);
115 if (primitive == PURPLE_STATUS_AVAILABLE) 116 if (primitive == PURPLE_STATUS_AVAILABLE)
190 connection_remove(sip, ret->fd); 191 connection_remove(sip, ret->fd);
191 entry = sip->openconns; 192 entry = sip->openconns;
192 } 193 }
193 } 194 }
194 195
195 static void simple_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group) 196 static void simple_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group, const char *message)
196 { 197 {
197 struct simple_account_data *sip = (struct simple_account_data *)gc->proto_data; 198 struct simple_account_data *sip = purple_connection_get_protocol_data(gc);
198 struct simple_buddy *b; 199 struct simple_buddy *b;
199 const char *name = purple_buddy_get_name(buddy); 200 const char *name = purple_buddy_get_name(buddy);
200 if(strncmp(name, "sip:", 4)) { 201 if(strncmp(name, "sip:", 4)) {
201 gchar *buf = g_strdup_printf("sip:%s", name); 202 gchar *buf = g_strdup_printf("sip:%s", name);
202 purple_blist_rename_buddy(buddy, buf); 203 purple_blist_rename_buddy(buddy, buf);
220 221
221 account = purple_connection_get_account(gc); 222 account = purple_connection_get_account(gc);
222 buddies = purple_find_buddies(account, NULL); 223 buddies = purple_find_buddies(account, NULL);
223 while (buddies) { 224 while (buddies) {
224 PurpleBuddy *buddy = buddies->data; 225 PurpleBuddy *buddy = buddies->data;
225 simple_add_buddy(gc, buddy, purple_buddy_get_group(buddy)); 226 simple_add_buddy(gc, buddy, purple_buddy_get_group(buddy), NULL);
226 227
227 buddies = g_slist_delete_link(buddies, buddies); 228 buddies = g_slist_delete_link(buddies, buddies);
228 } 229 }
229 } 230 }
230 231
231 static void simple_remove_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group) 232 static void simple_remove_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group)
232 { 233 {
233 const char *name = purple_buddy_get_name(buddy); 234 const char *name = purple_buddy_get_name(buddy);
234 struct simple_account_data *sip = (struct simple_account_data *)gc->proto_data; 235 struct simple_account_data *sip = purple_connection_get_protocol_data(gc);
235 struct simple_buddy *b = g_hash_table_lookup(sip->buddies, name); 236 struct simple_buddy *b = g_hash_table_lookup(sip->buddies, name);
236 g_hash_table_remove(sip->buddies, name); 237 g_hash_table_remove(sip->buddies, name);
237 g_free(b->name); 238 g_free(b->name);
238 g_free(b); 239 g_free(b);
239 } 240 }
410 411
411 } 412 }
412 413
413 static void simple_canwrite_cb(gpointer data, gint source, PurpleInputCondition cond) { 414 static void simple_canwrite_cb(gpointer data, gint source, PurpleInputCondition cond) {
414 PurpleConnection *gc = data; 415 PurpleConnection *gc = data;
415 struct simple_account_data *sip = gc->proto_data; 416 struct simple_account_data *sip = purple_connection_get_protocol_data(gc);
416 gsize max_write; 417 gsize max_write;
417 gssize written; 418 gssize written;
418 419
419 max_write = purple_circ_buffer_get_max_read(sip->txbuf); 420 max_write = purple_circ_buffer_get_max_read(sip->txbuf);
420 421
455 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp); 456 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp);
456 g_free(tmp); 457 g_free(tmp);
457 return; 458 return;
458 } 459 }
459 460
460 sip = gc->proto_data; 461 sip = purple_connection_get_protocol_data(gc);
461 sip->fd = source; 462 sip->fd = source;
462 sip->connecting = FALSE; 463 sip->connecting = FALSE;
463 464
464 simple_canwrite_cb(gc, sip->fd, PURPLE_INPUT_WRITE); 465 simple_canwrite_cb(gc, sip->fd, PURPLE_INPUT_WRITE);
465 466
472 conn->inputhandler = purple_input_add(sip->fd, PURPLE_INPUT_READ, simple_input_cb, gc); 473 conn->inputhandler = purple_input_add(sip->fd, PURPLE_INPUT_READ, simple_input_cb, gc);
473 } 474 }
474 475
475 476
476 static void sendlater(PurpleConnection *gc, const char *buf) { 477 static void sendlater(PurpleConnection *gc, const char *buf) {
477 struct simple_account_data *sip = gc->proto_data; 478 struct simple_account_data *sip = purple_connection_get_protocol_data(gc);
478 479
479 if(!sip->connecting) { 480 if(!sip->connecting) {
480 purple_debug_info("simple", "connecting to %s port %d\n", sip->realhostname ? sip->realhostname : "{NULL}", sip->realport); 481 purple_debug_info("simple", "connecting to %s port %d\n", sip->realhostname ? sip->realhostname : "{NULL}", sip->realport);
481 if (purple_proxy_connect(gc, sip->account, sip->realhostname, sip->realport, send_later_cb, gc) == NULL) { 482 if (purple_proxy_connect(gc, sip->account, sip->realhostname, sip->realport, send_later_cb, gc) == NULL) {
482 purple_connection_error(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Unable to connect")); 483 purple_connection_error(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Unable to connect"));
489 490
490 purple_circ_buffer_append(sip->txbuf, buf, strlen(buf)); 491 purple_circ_buffer_append(sip->txbuf, buf, strlen(buf));
491 } 492 }
492 493
493 static void sendout_pkt(PurpleConnection *gc, const char *buf) { 494 static void sendout_pkt(PurpleConnection *gc, const char *buf) {
494 struct simple_account_data *sip = gc->proto_data; 495 struct simple_account_data *sip = purple_connection_get_protocol_data(gc);
495 time_t currtime = time(NULL); 496 time_t currtime = time(NULL);
496 int writelen = strlen(buf); 497 int writelen = strlen(buf);
497 498
498 purple_debug(PURPLE_DEBUG_MISC, "simple", "\n\nsending - %s\n######\n%s\n######\n\n", ctime(&currtime), buf); 499 purple_debug(PURPLE_DEBUG_MISC, "simple", "\n\nsending - %s\n######\n%s\n######\n\n", ctime(&currtime), buf);
499 if(sip->udp) { 500 if(sip->udp) {
627 } 628 }
628 629
629 static void send_sip_request(PurpleConnection *gc, const gchar *method, 630 static void send_sip_request(PurpleConnection *gc, const gchar *method,
630 const gchar *url, const gchar *to, const gchar *addheaders, 631 const gchar *url, const gchar *to, const gchar *addheaders,
631 const gchar *body, struct sip_dialog *dialog, TransCallback tc) { 632 const gchar *body, struct sip_dialog *dialog, TransCallback tc) {
632 struct simple_account_data *sip = gc->proto_data; 633 struct simple_account_data *sip = purple_connection_get_protocol_data(gc);
633 char *callid = dialog ? g_strdup(dialog->callid) : gencallid(); 634 char *callid = dialog ? g_strdup(dialog->callid) : gencallid();
634 char *auth = NULL; 635 char *auth = NULL;
635 const char *addh = ""; 636 const char *addh = "";
636 gchar *branch = genbranch(); 637 gchar *branch = genbranch();
637 gchar *tag = NULL; 638 gchar *tag = NULL;
1024 g_free(hdr); 1025 g_free(hdr);
1025 g_free(fullto); 1026 g_free(fullto);
1026 } 1027 }
1027 1028
1028 static int simple_im_send(PurpleConnection *gc, const char *who, const char *what, PurpleMessageFlags flags) { 1029 static int simple_im_send(PurpleConnection *gc, const char *who, const char *what, PurpleMessageFlags flags) {
1029 struct simple_account_data *sip = gc->proto_data; 1030 struct simple_account_data *sip = purple_connection_get_protocol_data(gc);
1030 char *to = g_strdup(who); 1031 char *to = g_strdup(who);
1031 char *text = purple_unescape_html(what); 1032 char *text = purple_unescape_html(what);
1032 simple_send_message(sip, to, text, NULL); 1033 simple_send_message(sip, to, text, NULL);
1033 g_free(to); 1034 g_free(to);
1034 g_free(text); 1035 g_free(text);
1118 break; 1119 break;
1119 case 401: 1120 case 401:
1120 if(sip->registerstatus != SIMPLE_REGISTER_RETRY) { 1121 if(sip->registerstatus != SIMPLE_REGISTER_RETRY) {
1121 purple_debug_info("simple", "REGISTER retries %d\n", sip->registrar.retries); 1122 purple_debug_info("simple", "REGISTER retries %d\n", sip->registrar.retries);
1122 if(sip->registrar.retries > SIMPLE_REGISTER_RETRY_MAX) { 1123 if(sip->registrar.retries > SIMPLE_REGISTER_RETRY_MAX) {
1123 if (!purple_account_get_remember_password(sip->gc->account)) 1124 if (!purple_account_get_remember_password(purple_connection_get_account(sip->gc)))
1124 purple_account_set_password(sip->gc->account, NULL); 1125 purple_account_set_password(purple_connection_get_account(sip->gc), NULL);
1125 purple_connection_error(sip->gc, 1126 purple_connection_error(sip->gc,
1126 PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, 1127 PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED,
1127 _("Incorrect password")); 1128 _("Incorrect password"));
1128 return TRUE; 1129 return TRUE;
1129 } 1130 }
1283 1284
1284 send_sip_response(sip->gc, msg, 200, "OK", NULL); 1285 send_sip_response(sip->gc, msg, 200, "OK", NULL);
1285 } 1286 }
1286 1287
1287 static unsigned int simple_typing(PurpleConnection *gc, const char *name, PurpleTypingState state) { 1288 static unsigned int simple_typing(PurpleConnection *gc, const char *name, PurpleTypingState state) {
1288 struct simple_account_data *sip = gc->proto_data; 1289 struct simple_account_data *sip = purple_connection_get_protocol_data(gc);
1289 1290
1290 gchar *xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" 1291 gchar *xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
1291 "<isComposing xmlns=\"urn:ietf:params:xml:ns:im-iscomposing\"\n" 1292 "<isComposing xmlns=\"urn:ietf:params:xml:ns:im-iscomposing\"\n"
1292 "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" 1293 "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n"
1293 "xsi:schemaLocation=\"urn:ietf:params:xml:ns:im-composing iscomposing.xsd\">\n" 1294 "xsi:schemaLocation=\"urn:ietf:params:xml:ns:im-composing iscomposing.xsd\">\n"
1659 } 1660 }
1660 } 1661 }
1661 1662
1662 static void simple_udp_process(gpointer data, gint source, PurpleInputCondition con) { 1663 static void simple_udp_process(gpointer data, gint source, PurpleInputCondition con) {
1663 PurpleConnection *gc = data; 1664 PurpleConnection *gc = data;
1664 struct simple_account_data *sip = gc->proto_data; 1665 struct simple_account_data *sip = purple_connection_get_protocol_data(gc);
1665 struct sipmsg *msg; 1666 struct sipmsg *msg;
1666 int len; 1667 int len;
1667 time_t currtime = time(NULL); 1668 time_t currtime = time(NULL);
1668 1669
1669 static char buffer[65536]; 1670 static char buffer[65536];
1679 } 1680 }
1680 1681
1681 static void simple_input_cb(gpointer data, gint source, PurpleInputCondition cond) 1682 static void simple_input_cb(gpointer data, gint source, PurpleInputCondition cond)
1682 { 1683 {
1683 PurpleConnection *gc = data; 1684 PurpleConnection *gc = data;
1684 struct simple_account_data *sip = gc->proto_data; 1685 struct simple_account_data *sip = purple_connection_get_protocol_data(gc);
1685 int len; 1686 int len;
1686 struct sip_connection *conn = connection_find(sip, source); 1687 struct sip_connection *conn = connection_find(sip, source);
1687 if(!conn) { 1688 if(!conn) {
1688 purple_debug_error("simple", "Connection not found!\n"); 1689 purple_debug_error("simple", "Connection not found!\n");
1689 return; 1690 return;
1702 purple_debug_info("simple", "simple_input_cb: read error\n"); 1703 purple_debug_info("simple", "simple_input_cb: read error\n");
1703 connection_remove(sip, source); 1704 connection_remove(sip, source);
1704 if(sip->fd == source) sip->fd = -1; 1705 if(sip->fd == source) sip->fd = -1;
1705 return; 1706 return;
1706 } 1707 }
1707 gc->last_received = time(NULL); 1708 purple_connection_update_last_received(gc);
1708 conn->inbufused += len; 1709 conn->inbufused += len;
1709 conn->inbuf[conn->inbufused] = '\0'; 1710 conn->inbuf[conn->inbufused] = '\0';
1710 1711
1711 process_input(sip, conn); 1712 process_input(sip, conn);
1712 } 1713 }
1713 1714
1714 /* Callback for new connections on incoming TCP port */ 1715 /* Callback for new connections on incoming TCP port */
1715 static void simple_newconn_cb(gpointer data, gint source, PurpleInputCondition cond) { 1716 static void simple_newconn_cb(gpointer data, gint source, PurpleInputCondition cond) {
1716 PurpleConnection *gc = data; 1717 PurpleConnection *gc = data;
1717 struct simple_account_data *sip = gc->proto_data; 1718 struct simple_account_data *sip = purple_connection_get_protocol_data(gc);
1718 struct sip_connection *conn; 1719 struct sip_connection *conn;
1719 int newfd, flags; 1720 int newfd, flags;
1720 1721
1721 newfd = accept(source, NULL, NULL); 1722 newfd = accept(source, NULL, NULL);
1722 1723
1743 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp); 1744 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp);
1744 g_free(tmp); 1745 g_free(tmp);
1745 return; 1746 return;
1746 } 1747 }
1747 1748
1748 sip = gc->proto_data; 1749 sip = purple_connection_get_protocol_data(gc);
1749 sip->fd = source; 1750 sip->fd = source;
1750 1751
1751 conn = connection_create(sip, source); 1752 conn = connection_create(sip, source);
1752 1753
1753 sip->registertimeout = purple_timeout_add((rand()%100)+10*1000, (GSourceFunc)subscribe_timeout, sip); 1754 sip->registertimeout = purple_timeout_add((rand()%100)+10*1000, (GSourceFunc)subscribe_timeout, sip);
1820 g_free(hosts->data); 1821 g_free(hosts->data);
1821 hosts = g_slist_remove(hosts, hosts->data); 1822 hosts = g_slist_remove(hosts, hosts->data);
1822 } 1823 }
1823 1824
1824 /* create socket for incoming connections */ 1825 /* create socket for incoming connections */
1825 sip->listen_data = purple_network_listen_range(5060, 5160, SOCK_DGRAM, 1826 sip->listen_data = purple_network_listen_range(5060, 5160, AF_UNSPEC, SOCK_DGRAM, TRUE,
1826 simple_udp_host_resolved_listen_cb, sip); 1827 simple_udp_host_resolved_listen_cb, sip);
1827 if (sip->listen_data == NULL) { 1828 if (sip->listen_data == NULL) {
1828 purple_connection_error(sip->gc, 1829 purple_connection_error(sip->gc,
1829 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, 1830 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
1830 _("Unable to create listen socket")); 1831 _("Unable to create listen socket"));
1890 if(!sip->realport) sip->realport = 5060; 1891 if(!sip->realport) sip->realport = 5060;
1891 1892
1892 /* TCP case */ 1893 /* TCP case */
1893 if(!sip->udp) { 1894 if(!sip->udp) {
1894 /* create socket for incoming connections */ 1895 /* create socket for incoming connections */
1895 sip->listen_data = purple_network_listen_range(5060, 5160, SOCK_STREAM, 1896 sip->listen_data = purple_network_listen_range(5060, 5160, AF_UNSPEC, SOCK_STREAM, TRUE,
1896 simple_tcp_connect_listen_cb, sip); 1897 simple_tcp_connect_listen_cb, sip);
1897 if (sip->listen_data == NULL) { 1898 if (sip->listen_data == NULL) {
1898 purple_connection_error(sip->gc, 1899 purple_connection_error(sip->gc,
1899 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, 1900 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
1900 _("Unable to create listen socket")); 1901 _("Unable to create listen socket"));
1901 return; 1902 return;
1902 } 1903 }
1903 } else { /* UDP */ 1904 } else { /* UDP */
1904 purple_debug_info("simple", "using udp with server %s and port %d\n", hostname, port); 1905 purple_debug_info("simple", "using udp with server %s and port %d\n", hostname, port);
1905 1906
1906 sip->query_data = purple_dnsquery_a_account(sip->account, hostname, 1907 sip->query_data = purple_dnsquery_a(sip->account, hostname,
1907 port, simple_udp_host_resolved, sip); 1908 port, simple_udp_host_resolved, sip);
1908 if (sip->query_data == NULL) { 1909 if (sip->query_data == NULL) {
1909 purple_connection_error(sip->gc, 1910 purple_connection_error(sip->gc,
1910 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, 1911 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
1911 _("Unable to resolve hostname")); 1912 _("Unable to resolve hostname"));
1928 PURPLE_CONNECTION_ERROR_INVALID_SETTINGS, 1929 PURPLE_CONNECTION_ERROR_INVALID_SETTINGS,
1929 _("SIP usernames may not contain whitespaces or @ symbols")); 1930 _("SIP usernames may not contain whitespaces or @ symbols"));
1930 return; 1931 return;
1931 } 1932 }
1932 1933
1933 gc->proto_data = sip = g_new0(struct simple_account_data, 1); 1934 sip = g_new0(struct simple_account_data, 1);
1935 purple_connection_set_protocol_data(gc, sip);
1934 sip->gc = gc; 1936 sip->gc = gc;
1935 sip->fd = -1; 1937 sip->fd = -1;
1936 sip->listenfd = -1; 1938 sip->listenfd = -1;
1937 sip->account = account; 1939 sip->account = account;
1938 sip->registerexpire = 900; 1940 sip->registerexpire = 900;
1966 hosttoconnect = sip->servername; 1968 hosttoconnect = sip->servername;
1967 } else { 1969 } else {
1968 hosttoconnect = purple_account_get_string(account, "proxy", sip->servername); 1970 hosttoconnect = purple_account_get_string(account, "proxy", sip->servername);
1969 } 1971 }
1970 1972
1971 sip->srv_query_data = purple_srv_resolve_account(account, "sip", 1973 sip->srv_query_data = purple_srv_resolve(account, "sip",
1972 sip->udp ? "udp" : "tcp", hosttoconnect, srvresolved, sip); 1974 sip->udp ? "udp" : "tcp", hosttoconnect, srvresolved, sip);
1973 } 1975 }
1974 1976
1975 static void simple_close(PurpleConnection *gc) 1977 static void simple_close(PurpleConnection *gc)
1976 { 1978 {
1977 struct simple_account_data *sip = gc->proto_data; 1979 struct simple_account_data *sip = purple_connection_get_protocol_data(gc);
1978 1980
1979 if (!sip) 1981 if (!sip)
1980 return; 1982 return;
1981 1983
1982 /* unregister */ 1984 /* unregister */
2003 purple_timeout_remove(sip->registertimeout); 2005 purple_timeout_remove(sip->registertimeout);
2004 if (sip->query_data != NULL) 2006 if (sip->query_data != NULL)
2005 purple_dnsquery_destroy(sip->query_data); 2007 purple_dnsquery_destroy(sip->query_data);
2006 2008
2007 if (sip->srv_query_data != NULL) 2009 if (sip->srv_query_data != NULL)
2008 purple_srv_cancel(sip->srv_query_data); 2010 purple_srv_txt_query_destroy(sip->srv_query_data);
2009 2011
2010 if (sip->listen_data != NULL) 2012 if (sip->listen_data != NULL)
2011 purple_network_listen_cancel(sip->listen_data); 2013 purple_network_listen_cancel(sip->listen_data);
2012 2014
2013 if (sip->fd >= 0) 2015 if (sip->fd >= 0)
2037 if (sip->txbuf) 2039 if (sip->txbuf)
2038 purple_circ_buffer_destroy(sip->txbuf); 2040 purple_circ_buffer_destroy(sip->txbuf);
2039 g_free(sip->realhostname); 2041 g_free(sip->realhostname);
2040 2042
2041 g_free(sip); 2043 g_free(sip);
2042 gc->proto_data = NULL; 2044 purple_connection_set_protocol_data(gc, NULL);
2043 } 2045 }
2044 2046
2045 static PurplePluginProtocolInfo prpl_info = 2047 static PurplePluginProtocolInfo prpl_info =
2046 { 2048 {
2049 sizeof(PurplePluginProtocolInfo), /* struct_size */
2047 0, 2050 0,
2048 NULL, /* user_splits */ 2051 NULL, /* user_splits */
2049 NULL, /* protocol_options */ 2052 NULL, /* protocol_options */
2050 NO_BUDDY_ICONS, /* icon_spec */ 2053 NO_BUDDY_ICONS, /* icon_spec */
2051 simple_list_icon, /* list_icon */ 2054 simple_list_icon, /* list_icon */
2082 NULL, /* chat_whisper */ 2085 NULL, /* chat_whisper */
2083 NULL, /* chat_send */ 2086 NULL, /* chat_send */
2084 simple_keep_alive, /* keepalive */ 2087 simple_keep_alive, /* keepalive */
2085 NULL, /* register_user */ 2088 NULL, /* register_user */
2086 NULL, /* get_cb_info */ 2089 NULL, /* get_cb_info */
2087 NULL, /* get_cb_away */
2088 NULL, /* alias_buddy */ 2090 NULL, /* alias_buddy */
2089 NULL, /* group_buddy */ 2091 NULL, /* group_buddy */
2090 NULL, /* rename_group */ 2092 NULL, /* rename_group */
2091 NULL, /* buddy_free */ 2093 NULL, /* buddy_free */
2092 NULL, /* convo_closed */ 2094 NULL, /* convo_closed */
2107 simple_send_raw, /* send_raw */ 2109 simple_send_raw, /* send_raw */
2108 NULL, /* roomlist_room_serialize */ 2110 NULL, /* roomlist_room_serialize */
2109 NULL, /* unregister_user */ 2111 NULL, /* unregister_user */
2110 NULL, /* send_attention */ 2112 NULL, /* send_attention */
2111 NULL, /* get_attention_types */ 2113 NULL, /* get_attention_types */
2112 sizeof(PurplePluginProtocolInfo), /* struct_size */
2113 NULL, /* get_account_text_table */ 2114 NULL, /* get_account_text_table */
2114 NULL, /* initiate_media */ 2115 NULL, /* initiate_media */
2115 NULL, /* get_media_caps */ 2116 NULL, /* get_media_caps */
2116 NULL, /* get_moods */ 2117 NULL, /* get_moods */
2117 NULL, /* set_public_alias */ 2118 NULL, /* set_public_alias */
2118 NULL, /* get_public_alias */ 2119 NULL /* get_public_alias */
2119 NULL, /* add_buddy_with_invite */
2120 NULL /* add_buddies_with_invite */
2121 }; 2120 };
2122 2121
2123 2122
2124 static PurplePluginInfo info = 2123 static PurplePluginInfo info =
2125 { 2124 {

mercurial