| 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 { |