| 5584:b824439e352c | 5585:010e190ddac6 |
|---|---|
| 69 #endif | 69 #endif |
| 70 | 70 |
| 71 /* Datastructs */ | 71 /* Datastructs */ |
| 72 struct dcc_chat | 72 struct dcc_chat |
| 73 { | 73 { |
| 74 struct gaim_connection *gc; | 74 GaimConnection *gc; |
| 75 char ip_address[INET6_ADDRSTRLEN]; | 75 char ip_address[INET6_ADDRSTRLEN]; |
| 76 int port; | 76 int port; |
| 77 int fd; | 77 int fd; |
| 78 int inpa; | 78 int inpa; |
| 79 char nick[80]; | 79 char nick[80]; |
| 110 GString *liststr; | 110 GString *liststr; |
| 111 GSList *file_transfers; | 111 GSList *file_transfers; |
| 112 }; | 112 }; |
| 113 | 113 |
| 114 /* Prototypes */ | 114 /* Prototypes */ |
| 115 static void irc_start_chat(struct gaim_connection *gc, const char *who); | 115 static void irc_start_chat(GaimConnection *gc, const char *who); |
| 116 static void irc_ctcp_clientinfo(struct gaim_connection *gc, const char *who); | 116 static void irc_ctcp_clientinfo(GaimConnection *gc, const char *who); |
| 117 static void irc_ctcp_userinfo(struct gaim_connection *gc, const char *who); | 117 static void irc_ctcp_userinfo(GaimConnection *gc, const char *who); |
| 118 static void irc_ctcp_version(struct gaim_connection *gc, const char *who); | 118 static void irc_ctcp_version(GaimConnection *gc, const char *who); |
| 119 static void irc_ctcp_ping(struct gaim_connection *gc, const char *who); | 119 static void irc_ctcp_ping(GaimConnection *gc, const char *who); |
| 120 | 120 |
| 121 static void irc_send_privmsg(struct gaim_connection *gc, const char *who, const char *what, gboolean fragment); | 121 static void irc_send_privmsg(GaimConnection *gc, const char *who, const char *what, gboolean fragment); |
| 122 static void irc_send_notice(struct gaim_connection *gc, char *who, char *what); | 122 static void irc_send_notice(GaimConnection *gc, char *who, char *what); |
| 123 | 123 |
| 124 static char *irc_send_convert(struct gaim_connection *gc, const char *string, int maxlen, int *done); | 124 static char *irc_send_convert(GaimConnection *gc, const char *string, int maxlen, int *done); |
| 125 static char *irc_recv_convert(struct gaim_connection *gc, char *string); | 125 static char *irc_recv_convert(GaimConnection *gc, char *string); |
| 126 static void irc_parse_notice(struct gaim_connection *gc, char *nick, char *ex, | 126 static void irc_parse_notice(GaimConnection *gc, char *nick, char *ex, |
| 127 char *word[], char *word_eol[]); | 127 char *word[], char *word_eol[]); |
| 128 static void irc_parse_join(struct gaim_connection *gc, char *nick, | 128 static void irc_parse_join(GaimConnection *gc, char *nick, |
| 129 char *word[], char *word_eol[]); | 129 char *word[], char *word_eol[]); |
| 130 static gboolean irc_parse_part(struct gaim_connection *gc, char *nick, char *cmd, | 130 static gboolean irc_parse_part(GaimConnection *gc, char *nick, char *cmd, |
| 131 char *word[], char *word_eol[]); | 131 char *word[], char *word_eol[]); |
| 132 static void irc_parse_topic(struct gaim_connection *gc, char *nick, | 132 static void irc_parse_topic(GaimConnection *gc, char *nick, |
| 133 char *word[], char *word_eol[]); | 133 char *word[], char *word_eol[]); |
| 134 | 134 |
| 135 static void dcc_chat_cancel(struct dcc_chat *); | 135 static void dcc_chat_cancel(struct dcc_chat *); |
| 136 | 136 |
| 137 /* Global variables */ | 137 /* Global variables */ |
| 138 GSList *dcc_chat_list = NULL; | 138 GSList *dcc_chat_list = NULL; |
| 139 | 139 |
| 140 struct dcc_chat * | 140 struct dcc_chat * |
| 141 find_dcc_chat (struct gaim_connection *gc, const char *nick) | 141 find_dcc_chat (GaimConnection *gc, const char *nick) |
| 142 { | 142 { |
| 143 GSList *tmp; | 143 GSList *tmp; |
| 144 struct dcc_chat *data; | 144 struct dcc_chat *data; |
| 145 tmp = dcc_chat_list; | 145 tmp = dcc_chat_list; |
| 146 while (tmp != NULL) | 146 while (tmp != NULL) |
| 164 gaim_debug(GAIM_DEBUG_MISC, "irc", "C: %s", data); | 164 gaim_debug(GAIM_DEBUG_MISC, "irc", "C: %s", data); |
| 165 return write(fd, data, len); | 165 return write(fd, data, len); |
| 166 } | 166 } |
| 167 | 167 |
| 168 static char * | 168 static char * |
| 169 irc_send_convert(struct gaim_connection *gc, const char *string, int maxlen, int *done) | 169 irc_send_convert(GaimConnection *gc, const char *string, int maxlen, int *done) |
| 170 { | 170 { |
| 171 char *converted = g_malloc(maxlen + 1); | 171 char *converted = g_malloc(maxlen + 1); |
| 172 gchar *inptr = (gchar*)string, *outptr = converted; | 172 gchar *inptr = (gchar*)string, *outptr = converted; |
| 173 int inleft = strlen(string), outleft = maxlen; | 173 int inleft = strlen(string), outleft = maxlen; |
| 174 GIConv conv; | 174 GIConv conv; |
| 175 | 175 |
| 176 conv = g_iconv_open(gc->account->proto_opt[USEROPT_CHARSET], "UTF-8"); | 176 conv = g_iconv_open(gaim_account_get_string(gaim_connection_get_account(gc), "charset", "UTF-8") , "UTF-8"); |
| 177 if (g_iconv(conv, &inptr, &inleft, &outptr, &outleft) == -1) { | 177 if (g_iconv(conv, &inptr, &inleft, &outptr, &outleft) == -1) { |
| 178 gaim_debug(GAIM_DEBUG_ERROR, "irc", "Charset conversion error\n"); | 178 gaim_debug(GAIM_DEBUG_ERROR, "irc", "Charset conversion error\n"); |
| 179 gaim_debug(GAIM_DEBUG_ERROR, "irc", | 179 gaim_debug(GAIM_DEBUG_ERROR, "irc", |
| 180 "Sending as UTF-8 (this is a hack!)\n"); | 180 "Sending as UTF-8 (this is a hack!)\n"); |
| 181 g_free(converted); | 181 g_free(converted); |
| 187 *outptr = '\0'; | 187 *outptr = '\0'; |
| 188 return(converted); | 188 return(converted); |
| 189 } | 189 } |
| 190 | 190 |
| 191 static char * | 191 static char * |
| 192 irc_recv_convert(struct gaim_connection *gc, char *string) | 192 irc_recv_convert(GaimConnection *gc, char *string) |
| 193 { | 193 { |
| 194 char *utf8; | 194 char *utf8; |
| 195 GError *err = NULL; | 195 GError *err = NULL; |
| 196 | 196 |
| 197 utf8 = g_convert(string, strlen(string), "UTF-8", | 197 utf8 = g_convert(string, strlen(string), "UTF-8", |
| 198 gc->account->proto_opt[USEROPT_CHARSET], NULL, NULL, &err); | 198 gaim_account_get_string(gaim_connection_get_account(gc), "charset", "UTF-8") , NULL, NULL, &err); |
| 199 if (err) { | 199 if (err) { |
| 200 gaim_debug(GAIM_DEBUG_ERROR, "irc", | 200 gaim_debug(GAIM_DEBUG_ERROR, "irc", |
| 201 "recv conversion error: %s\n", err->message); | 201 "recv conversion error: %s\n", err->message); |
| 202 utf8 = g_strdup(_("(There was an error converting this message. Check the 'Encoding' option in the Account Editor)")); | 202 utf8 = g_strdup(_("(There was an error converting this message. Check the 'Encoding' option in the Account Editor)")); |
| 203 } | 203 } |
| 204 | 204 |
| 205 return (utf8); | 205 return (utf8); |
| 206 } | 206 } |
| 207 | 207 |
| 208 static struct gaim_conversation * | 208 static struct gaim_conversation * |
| 209 irc_find_chat(struct gaim_connection *gc, const char *name) | 209 irc_find_chat(GaimConnection *gc, const char *name) |
| 210 { | 210 { |
| 211 GSList *bcs = gc->buddy_chats; | 211 GSList *bcs = gc->buddy_chats; |
| 212 | 212 |
| 213 while (bcs) { | 213 while (bcs) { |
| 214 struct gaim_conversation *b = bcs->data; | 214 struct gaim_conversation *b = bcs->data; |
| 271 cmd++; | 271 cmd++; |
| 272 } | 272 } |
| 273 } | 273 } |
| 274 | 274 |
| 275 static void | 275 static void |
| 276 handle_005(struct gaim_connection *gc, char *word[], char *word_eol[]) | 276 handle_005(GaimConnection *gc, char *word[], char *word_eol[]) |
| 277 { | 277 { |
| 278 int w = 4; | 278 int w = 4; |
| 279 struct irc_data *id = gc->proto_data; | 279 struct irc_data *id = gc->proto_data; |
| 280 | 280 |
| 281 while (w < PDIWORDS && *word[w]) { | 281 while (w < PDIWORDS && *word[w]) { |
| 462 str = g_string_append(str, cur); | 462 str = g_string_append(str, cur); |
| 463 return str; | 463 return str; |
| 464 } | 464 } |
| 465 | 465 |
| 466 static void | 466 static void |
| 467 irc_got_im(struct gaim_connection *gc, char *who, char *what, int flags, time_t t) | 467 irc_got_im(GaimConnection *gc, char *who, char *what, int flags, time_t t) |
| 468 { | 468 { |
| 469 char *utf8 = irc_recv_convert(gc, what); | 469 char *utf8 = irc_recv_convert(gc, what); |
| 470 GString *str = decode_html(utf8); | 470 GString *str = decode_html(utf8); |
| 471 serv_got_im(gc, who, str->str, flags, t, -1); | 471 serv_got_im(gc, who, str->str, flags, t, -1); |
| 472 g_string_free(str, TRUE); | 472 g_string_free(str, TRUE); |
| 562 gaim_input_remove(chat->inpa); | 562 gaim_input_remove(chat->inpa); |
| 563 chat->inpa = gaim_input_add(source, GAIM_INPUT_READ, dcc_chat_in, chat); | 563 chat->inpa = gaim_input_add(source, GAIM_INPUT_READ, dcc_chat_in, chat); |
| 564 } | 564 } |
| 565 | 565 |
| 566 static void | 566 static void |
| 567 irc_got_chat_in(struct gaim_connection *gc, int id, char *who, int whisper, char *msg, time_t t) | 567 irc_got_chat_in(GaimConnection *gc, int id, char *who, int whisper, char *msg, time_t t) |
| 568 { | 568 { |
| 569 char *utf8 = irc_recv_convert(gc, msg); | 569 char *utf8 = irc_recv_convert(gc, msg); |
| 570 GString *str = decode_html(utf8); | 570 GString *str = decode_html(utf8); |
| 571 serv_got_chat_in(gc, id, who, whisper, str->str, t); | 571 serv_got_chat_in(gc, id, who, whisper, str->str, t); |
| 572 g_string_free(str, TRUE); | 572 g_string_free(str, TRUE); |
| 573 g_free(utf8); | 573 g_free(utf8); |
| 574 } | 574 } |
| 575 | 575 |
| 576 static void | 576 static void |
| 577 handle_list(struct gaim_connection *gc, char *list) | 577 handle_list(GaimConnection *gc, char *list) |
| 578 { | 578 { |
| 579 struct irc_data *id = gc->proto_data; | 579 struct irc_data *id = gc->proto_data; |
| 580 char *tmp; | 580 char *tmp; |
| 581 GaimBlistNode *gnode, *bnode; | 581 GaimBlistNode *gnode, *bnode; |
| 582 | 582 |
| 617 } | 617 } |
| 618 | 618 |
| 619 static gboolean | 619 static gboolean |
| 620 irc_request_buddy_update(gpointer data) | 620 irc_request_buddy_update(gpointer data) |
| 621 { | 621 { |
| 622 struct gaim_connection *gc = data; | 622 GaimConnection *gc = data; |
| 623 struct irc_data *id = gc->proto_data; | 623 struct irc_data *id = gc->proto_data; |
| 624 char buf[500]; | 624 char buf[500]; |
| 625 int n = g_snprintf(buf, sizeof(buf), "ISON"); | 625 int n = g_snprintf(buf, sizeof(buf), "ISON"); |
| 626 gboolean found = FALSE; | 626 gboolean found = FALSE; |
| 627 | 627 |
| 659 | 659 |
| 660 return TRUE; | 660 return TRUE; |
| 661 } | 661 } |
| 662 | 662 |
| 663 static void | 663 static void |
| 664 handle_names(struct gaim_connection *gc, char *chan, char *names) | 664 handle_names(GaimConnection *gc, char *chan, char *names) |
| 665 { | 665 { |
| 666 struct gaim_conversation *c = irc_find_chat(gc, chan); | 666 struct gaim_conversation *c = irc_find_chat(gc, chan); |
| 667 struct gaim_chat *chat; | 667 struct gaim_chat *chat; |
| 668 char **buf, **tmp; | 668 char **buf, **tmp; |
| 669 | 669 |
| 679 | 679 |
| 680 g_strfreev(buf); | 680 g_strfreev(buf); |
| 681 } | 681 } |
| 682 | 682 |
| 683 static void | 683 static void |
| 684 handle_notopic(struct gaim_connection *gc, char *text) | 684 handle_notopic(GaimConnection *gc, char *text) |
| 685 { | 685 { |
| 686 struct gaim_conversation *c; | 686 struct gaim_conversation *c; |
| 687 | 687 |
| 688 if ((c = irc_find_chat(gc, text))) { | 688 if ((c = irc_find_chat(gc, text))) { |
| 689 char buf[IRC_BUF_LEN]; | 689 char buf[IRC_BUF_LEN]; |
| 693 gaim_chat_set_topic(GAIM_CHAT(c), NULL, buf); | 693 gaim_chat_set_topic(GAIM_CHAT(c), NULL, buf); |
| 694 } | 694 } |
| 695 } | 695 } |
| 696 | 696 |
| 697 static void | 697 static void |
| 698 handle_topic(struct gaim_connection *gc, char *text) | 698 handle_topic(GaimConnection *gc, char *text) |
| 699 { | 699 { |
| 700 struct gaim_conversation *c; | 700 struct gaim_conversation *c; |
| 701 char *po = strchr(text, ' '), *buf; | 701 char *po = strchr(text, ' '), *buf; |
| 702 | 702 |
| 703 if (!po) | 703 if (!po) |
| 715 g_free(po); | 715 g_free(po); |
| 716 } | 716 } |
| 717 } | 717 } |
| 718 | 718 |
| 719 static gboolean | 719 static gboolean |
| 720 mode_has_arg(struct gaim_connection *gc, char sign, char mode) | 720 mode_has_arg(GaimConnection *gc, char sign, char mode) |
| 721 { | 721 { |
| 722 struct irc_data *id = gc->proto_data; | 722 struct irc_data *id = gc->proto_data; |
| 723 char *cm = id->chanmodes; | 723 char *cm = id->chanmodes; |
| 724 int type = 0; | 724 int type = 0; |
| 725 | 725 |
| 746 | 746 |
| 747 return FALSE; | 747 return FALSE; |
| 748 } | 748 } |
| 749 | 749 |
| 750 static void | 750 static void |
| 751 irc_chan_mode(struct gaim_connection *gc, char *room, char sign, char mode, char *argstr, char *who) | 751 irc_chan_mode(GaimConnection *gc, char *room, char sign, char mode, char *argstr, char *who) |
| 752 { | 752 { |
| 753 struct gaim_conversation *c = irc_find_chat(gc, room); | 753 struct gaim_conversation *c = irc_find_chat(gc, room); |
| 754 char buf[IRC_BUF_LEN]; | 754 char buf[IRC_BUF_LEN]; |
| 755 char *nick = g_strndup(who, strchr(who, '!') - who); | 755 char *nick = g_strndup(who, strchr(who, '!') - who); |
| 756 | 756 |
| 761 | 761 |
| 762 gaim_conversation_write(c, NULL, buf, -1, WFLAG_SYSTEM, time(NULL)); | 762 gaim_conversation_write(c, NULL, buf, -1, WFLAG_SYSTEM, time(NULL)); |
| 763 } | 763 } |
| 764 | 764 |
| 765 static void | 765 static void |
| 766 irc_user_mode(struct gaim_connection *gc, char *room, char sign, char mode, char *nick) | 766 irc_user_mode(GaimConnection *gc, char *room, char sign, char mode, char *nick) |
| 767 { | 767 { |
| 768 struct gaim_conversation *c = irc_find_chat(gc, room); | 768 struct gaim_conversation *c = irc_find_chat(gc, room); |
| 769 GList *r; | 769 GList *r; |
| 770 | 770 |
| 771 if (mode != 'o' && mode != 'v' && mode != 'h') | 771 if (mode != 'o' && mode != 'v' && mode != 'h') |
| 829 r = r->next; | 829 r = r->next; |
| 830 } | 830 } |
| 831 } | 831 } |
| 832 | 832 |
| 833 static void | 833 static void |
| 834 handle_mode(struct gaim_connection *gc, char *word[], char *word_eol[], gboolean n324) | 834 handle_mode(GaimConnection *gc, char *word[], char *word_eol[], gboolean n324) |
| 835 { | 835 { |
| 836 struct irc_data *id = gc->proto_data; | 836 struct irc_data *id = gc->proto_data; |
| 837 int offset = n324 ? 4 : 3; | 837 int offset = n324 ? 4 : 3; |
| 838 char *chan = word[offset]; | 838 char *chan = word[offset]; |
| 839 struct gaim_conversation *c = irc_find_chat(gc, chan); | 839 struct gaim_conversation *c = irc_find_chat(gc, chan); |
| 871 modes++; | 871 modes++; |
| 872 } | 872 } |
| 873 } | 873 } |
| 874 | 874 |
| 875 static void | 875 static void |
| 876 handle_version(struct gaim_connection *gc, char *word[], char *word_eol[], int num) | 876 handle_version(GaimConnection *gc, char *word[], char *word_eol[], int num) |
| 877 { | 877 { |
| 878 struct irc_data *id = gc->proto_data; | 878 struct irc_data *id = gc->proto_data; |
| 879 GString *str; | 879 GString *str; |
| 880 | 880 |
| 881 id->liststr = g_string_new(""); | 881 id->liststr = g_string_new(""); |
| 889 g_string_free(id->liststr, TRUE); | 889 g_string_free(id->liststr, TRUE); |
| 890 id->liststr = NULL; | 890 id->liststr = NULL; |
| 891 } | 891 } |
| 892 | 892 |
| 893 static void | 893 static void |
| 894 handle_who(struct gaim_connection *gc, char *word[], char *word_eol[], int num) | 894 handle_who(GaimConnection *gc, char *word[], char *word_eol[], int num) |
| 895 { | 895 { |
| 896 struct irc_data *id = gc->proto_data; | 896 struct irc_data *id = gc->proto_data; |
| 897 char buf[IRC_BUF_LEN]; | 897 char buf[IRC_BUF_LEN]; |
| 898 | 898 |
| 899 if (!id->in_whois) { | 899 if (!id->in_whois) { |
| 913 /* Handle our whois stuff here. You know what, I have a sore throat. You know | 913 /* Handle our whois stuff here. You know what, I have a sore throat. You know |
| 914 * what I think about that? I'm not too pleased with it. Perhaps I should take | 914 * what I think about that? I'm not too pleased with it. Perhaps I should take |
| 915 * some medicine, or perhaps I should go to bed? Blah!! */ | 915 * some medicine, or perhaps I should go to bed? Blah!! */ |
| 916 | 916 |
| 917 static void | 917 static void |
| 918 handle_whois(struct gaim_connection *gc, char *word[], char *word_eol[], int num) | 918 handle_whois(GaimConnection *gc, char *word[], char *word_eol[], int num) |
| 919 { | 919 { |
| 920 struct irc_data *id = gc->proto_data; | 920 struct irc_data *id = gc->proto_data; |
| 921 char tmp[1024]; | 921 char tmp[1024]; |
| 922 | 922 |
| 923 if (!id->in_whois) { | 923 if (!id->in_whois) { |
| 979 else | 979 else |
| 980 id->liststr = g_string_append(id->liststr, word_eol[5]); | 980 id->liststr = g_string_append(id->liststr, word_eol[5]); |
| 981 } | 981 } |
| 982 | 982 |
| 983 static void | 983 static void |
| 984 handle_roomlist(struct gaim_connection *gc, char *word[], char *word_eol[]) | 984 handle_roomlist(GaimConnection *gc, char *word[], char *word_eol[]) |
| 985 { | 985 { |
| 986 struct irc_data *id = gc->proto_data; | 986 struct irc_data *id = gc->proto_data; |
| 987 | 987 |
| 988 if (!id->in_list) { | 988 if (!id->in_list) { |
| 989 id->in_list = TRUE; | 989 id->in_list = TRUE; |
| 996 id->liststr = g_string_append(id->liststr, word_eol[4]); | 996 id->liststr = g_string_append(id->liststr, word_eol[4]); |
| 997 } | 997 } |
| 998 | 998 |
| 999 static void | 999 static void |
| 1000 irc_change_nick(void *a, const char *b) { | 1000 irc_change_nick(void *a, const char *b) { |
| 1001 struct gaim_connection *gc = a; | 1001 GaimConnection *gc = a; |
| 1002 struct irc_data *id = gc->proto_data; | 1002 struct irc_data *id = gc->proto_data; |
| 1003 char buf[IRC_BUF_LEN]; | 1003 char buf[IRC_BUF_LEN]; |
| 1004 g_snprintf(buf, sizeof(buf), "NICK %s\r\n", b); | 1004 g_snprintf(buf, sizeof(buf), "NICK %s\r\n", b); |
| 1005 irc_write(id->fd, buf, strlen(buf)); | 1005 irc_write(id->fd, buf, strlen(buf)); |
| 1006 g_snprintf(gc->displayname, sizeof(gc->displayname), "%s", b); | 1006 gaim_connection_set_display_name(gc, b); |
| 1007 } | 1007 } |
| 1008 | 1008 |
| 1009 static void | 1009 static void |
| 1010 process_numeric(struct gaim_connection *gc, char *word[], char *word_eol[]) | 1010 process_numeric(GaimConnection *gc, char *word[], char *word_eol[]) |
| 1011 { | 1011 { |
| 1012 const char *displayname = gaim_connection_get_display_name(gc); | |
| 1012 struct irc_data *id = gc->proto_data; | 1013 struct irc_data *id = gc->proto_data; |
| 1013 char *text = word_eol[3]; | 1014 char *text = word_eol[3]; |
| 1014 int n = atoi(word[2]); | 1015 int n = atoi(word[2]); |
| 1015 char tmp[1024]; | 1016 char tmp[1024]; |
| 1016 | 1017 |
| 1017 if (!g_ascii_strncasecmp(gc->displayname, text, strlen(gc->displayname))) | 1018 if (!g_ascii_strncasecmp(displayname, text, strlen(displayname))) |
| 1018 text += strlen(gc->displayname) + 1; | 1019 text += strlen(displayname) + 1; |
| 1019 if (*text == ':') | 1020 if (*text == ':') |
| 1020 text++; | 1021 text++; |
| 1021 | 1022 |
| 1022 /* RPL_ and ERR_ */ | 1023 /* RPL_ and ERR_ */ |
| 1023 switch (n) { | 1024 switch (n) { |
| 1111 _("IRC Error")); | 1112 _("IRC Error")); |
| 1112 break; | 1113 break; |
| 1113 case 433: | 1114 case 433: |
| 1114 gaim_request_input(gc, NULL, _("That nick is already in use. " | 1115 gaim_request_input(gc, NULL, _("That nick is already in use. " |
| 1115 "Please enter a new nick"), | 1116 "Please enter a new nick"), |
| 1116 NULL, gc->displayname, FALSE, | 1117 NULL, gaim_connection_get_display_name(gc), FALSE, |
| 1117 _("OK"), G_CALLBACK(irc_change_nick), | 1118 _("OK"), G_CALLBACK(irc_change_nick), |
| 1118 _("Cancel"), NULL, gc); | 1119 _("Cancel"), NULL, gc); |
| 1119 break; | 1120 break; |
| 1120 default: | 1121 default: |
| 1121 /* Other error messages */ | 1122 /* Other error messages */ |
| 1134 break; | 1135 break; |
| 1135 } | 1136 } |
| 1136 } | 1137 } |
| 1137 | 1138 |
| 1138 static gboolean | 1139 static gboolean |
| 1139 is_channel(struct gaim_connection *gc, const char *name) | 1140 is_channel(GaimConnection *gc, const char *name) |
| 1140 { | 1141 { |
| 1141 struct irc_data *id = gc->proto_data; | 1142 struct irc_data *id = gc->proto_data; |
| 1142 if (strchr(id->chantypes, *name)) | 1143 if (strchr(id->chantypes, *name)) |
| 1143 return TRUE; | 1144 return TRUE; |
| 1144 return FALSE; | 1145 return FALSE; |
| 1145 } | 1146 } |
| 1146 | 1147 |
| 1147 static void | 1148 static void |
| 1148 irc_rem_chat_bud(struct gaim_connection *gc, char *nick, struct gaim_conversation *b, char *reason) | 1149 irc_rem_chat_bud(GaimConnection *gc, char *nick, struct gaim_conversation *b, char *reason) |
| 1149 { | 1150 { |
| 1150 | 1151 |
| 1151 struct gaim_chat *chat; | 1152 struct gaim_chat *chat; |
| 1152 | 1153 |
| 1153 if (b) { | 1154 if (b) { |
| 1180 } | 1181 } |
| 1181 } | 1182 } |
| 1182 } | 1183 } |
| 1183 | 1184 |
| 1184 static void | 1185 static void |
| 1185 irc_change_name(struct gaim_connection *gc, char *old, char *new) | 1186 irc_change_name(GaimConnection *gc, char *old, char *new) |
| 1186 { | 1187 { |
| 1187 GSList *bcs = gc->buddy_chats; | 1188 GSList *bcs = gc->buddy_chats; |
| 1188 char buf[IRC_BUF_LEN]; | 1189 char buf[IRC_BUF_LEN]; |
| 1189 | 1190 |
| 1190 while (bcs) { | 1191 while (bcs) { |
| 1218 bcs = bcs->next; | 1219 bcs = bcs->next; |
| 1219 } | 1220 } |
| 1220 } | 1221 } |
| 1221 | 1222 |
| 1222 static void | 1223 static void |
| 1223 handle_privmsg(struct gaim_connection *gc, char *to, char *nick, char *msg) | 1224 handle_privmsg(GaimConnection *gc, char *to, char *nick, char *msg) |
| 1224 { | 1225 { |
| 1225 if (is_channel(gc, to)) { | 1226 if (is_channel(gc, to)) { |
| 1226 struct gaim_conversation *c = irc_find_chat(gc, to); | 1227 struct gaim_conversation *c = irc_find_chat(gc, to); |
| 1227 if (!c) | 1228 if (!c) |
| 1228 return; | 1229 return; |
| 1262 } | 1263 } |
| 1263 g_free(data); | 1264 g_free(data); |
| 1264 } | 1265 } |
| 1265 | 1266 |
| 1266 static void | 1267 static void |
| 1267 irc_convo_closed(struct gaim_connection *gc, char *who) | 1268 irc_convo_closed(GaimConnection *gc, char *who) |
| 1268 { | 1269 { |
| 1269 struct dcc_chat *dchat = find_dcc_chat(gc, who); | 1270 struct dcc_chat *dchat = find_dcc_chat(gc, who); |
| 1270 if (!dchat) | 1271 if (!dchat) |
| 1271 return; | 1272 return; |
| 1272 | 1273 |
| 1386 | 1387 |
| 1387 return best; | 1388 return best; |
| 1388 } | 1389 } |
| 1389 | 1390 |
| 1390 static void | 1391 static void |
| 1391 handle_ctcp(struct gaim_connection *gc, char *to, char *nick, | 1392 handle_ctcp(GaimConnection *gc, char *to, char *nick, |
| 1392 char *msg, char *word[], char *word_eol[]) | 1393 char *msg, char *word[], char *word_eol[]) |
| 1393 { | 1394 { |
| 1394 struct irc_data *id = gc->proto_data; | 1395 struct irc_data *id = gc->proto_data; |
| 1395 char buf[IRC_BUF_LEN]; | 1396 char buf[IRC_BUF_LEN]; |
| 1396 char out[IRC_BUF_LEN]; | 1397 char out[IRC_BUF_LEN]; |
| 1531 gaim_xfer_request(xfer); | 1532 gaim_xfer_request(xfer); |
| 1532 } | 1533 } |
| 1533 } | 1534 } |
| 1534 | 1535 |
| 1535 static gboolean | 1536 static gboolean |
| 1536 irc_parse(struct gaim_connection *gc, char *buf) | 1537 irc_parse(GaimConnection *gc, char *buf) |
| 1537 { | 1538 { |
| 1538 struct irc_data *idata = gc->proto_data; | 1539 struct irc_data *idata = gc->proto_data; |
| 1539 gchar outbuf[IRC_BUF_LEN]; | 1540 gchar outbuf[IRC_BUF_LEN]; |
| 1540 char *word[PDIWORDS], *word_eol[PDIWORDS]; | 1541 char *word[PDIWORDS], *word_eol[PDIWORDS]; |
| 1541 char pdibuf[522]; | 1542 char pdibuf[522]; |
| 1549 buf += 7; | 1550 buf += 7; |
| 1550 if (!strncmp(buf, "PING ", 5)) { | 1551 if (!strncmp(buf, "PING ", 5)) { |
| 1551 int r = FALSE; | 1552 int r = FALSE; |
| 1552 g_snprintf(outbuf, sizeof(outbuf), "PONG %s\r\n", buf + 5); | 1553 g_snprintf(outbuf, sizeof(outbuf), "PONG %s\r\n", buf + 5); |
| 1553 if (irc_write(idata->fd, outbuf, strlen(outbuf)) < 0) { | 1554 if (irc_write(idata->fd, outbuf, strlen(outbuf)) < 0) { |
| 1554 hide_login_progress(gc, _("Unable to write")); | 1555 gaim_connection_error(gc, _("Unable to write")); |
| 1555 signoff(gc); | |
| 1556 r = TRUE; | 1556 r = TRUE; |
| 1557 } | 1557 } |
| 1558 return r; | 1558 return r; |
| 1559 } | 1559 } |
| 1560 /* XXX doesn't handle ERROR */ | 1560 /* XXX doesn't handle ERROR */ |
| 1561 return FALSE; | 1561 return FALSE; |
| 1562 } | 1562 } |
| 1563 | 1563 |
| 1564 if (!idata->online) { | 1564 if (!idata->online) { |
| 1565 /* Now lets sign ourselves on */ | 1565 /* Now lets sign ourselves on */ |
| 1566 account_online(gc); | 1566 gaim_connection_set_state(gc, GAIM_CONNECTED); |
| 1567 serv_finish_login(gc); | 1567 serv_finish_login(gc); |
| 1568 | 1568 |
| 1569 /* we don't call this now because otherwise some IRC servers might not like us */ | 1569 /* we don't call this now because otherwise some IRC servers might not like us */ |
| 1570 idata->timer = g_timeout_add(20000, irc_request_buddy_update, gc); | 1570 idata->timer = g_timeout_add(20000, irc_request_buddy_update, gc); |
| 1571 idata->online = TRUE; | 1571 idata->online = TRUE; |
| 1606 | 1606 |
| 1607 serv_got_chat_invite(gc, word[4] + 1, nick, NULL, components); | 1607 serv_got_chat_invite(gc, word[4] + 1, nick, NULL, components); |
| 1608 } else if (!strcmp(cmd, "JOIN")) { | 1608 } else if (!strcmp(cmd, "JOIN")) { |
| 1609 irc_parse_join(gc, nick, word, word_eol); | 1609 irc_parse_join(gc, nick, word, word_eol); |
| 1610 } else if (!strcmp(cmd, "KICK")) { | 1610 } else if (!strcmp(cmd, "KICK")) { |
| 1611 if (!strcmp(gc->displayname, word[4])) { | 1611 if (!strcmp(gaim_connection_get_display_name(gc), word[4])) { |
| 1612 struct gaim_conversation *c = irc_find_chat(gc, word[3]); | 1612 struct gaim_conversation *c = irc_find_chat(gc, word[3]); |
| 1613 if (!c) | 1613 if (!c) |
| 1614 return FALSE; | 1614 return FALSE; |
| 1615 gc->buddy_chats = g_slist_remove(gc->buddy_chats, c); | 1615 gc->buddy_chats = g_slist_remove(gc->buddy_chats, c); |
| 1616 gaim_conversation_set_account(c, NULL); | 1616 gaim_conversation_set_account(c, NULL); |
| 1627 } else if (!strcmp(cmd, "KILL")) { /* */ | 1627 } else if (!strcmp(cmd, "KILL")) { /* */ |
| 1628 } else if (!strcmp(cmd, "MODE")) { | 1628 } else if (!strcmp(cmd, "MODE")) { |
| 1629 handle_mode(gc, word, word_eol, FALSE); | 1629 handle_mode(gc, word, word_eol, FALSE); |
| 1630 } else if (!strcmp(cmd, "NICK")) { | 1630 } else if (!strcmp(cmd, "NICK")) { |
| 1631 char *new = *word_eol[3] == ':' ? word_eol[3] + 1 : word_eol[3]; | 1631 char *new = *word_eol[3] == ':' ? word_eol[3] + 1 : word_eol[3]; |
| 1632 if (!strcmp(gc->displayname, nick)) | 1632 if (!strcmp(gaim_connection_get_display_name(gc), nick)) |
| 1633 g_snprintf(gc->displayname, sizeof(gc->displayname), "%s", new); | 1633 gaim_connection_set_display_name(gc, new); |
| 1634 irc_change_name(gc, nick, new); | 1634 irc_change_name(gc, nick, new); |
| 1635 } else if (!strcmp(cmd, "NOTICE")) { | 1635 } else if (!strcmp(cmd, "NOTICE")) { |
| 1636 irc_parse_notice(gc, nick, ex, word, word_eol); | 1636 irc_parse_notice(gc, nick, ex, word, word_eol); |
| 1637 } else if (!strcmp(cmd, "PART")) { | 1637 } else if (!strcmp(cmd, "PART")) { |
| 1638 if (!irc_parse_part(gc, nick, cmd, word, word_eol)) | 1638 if (!irc_parse_part(gc, nick, cmd, word, word_eol)) |
| 1664 return FALSE; | 1664 return FALSE; |
| 1665 } | 1665 } |
| 1666 | 1666 |
| 1667 /* CTCP by jonas@birme.se */ | 1667 /* CTCP by jonas@birme.se */ |
| 1668 static void | 1668 static void |
| 1669 irc_parse_notice(struct gaim_connection *gc, char *nick, char *ex, | 1669 irc_parse_notice(GaimConnection *gc, char *nick, char *ex, |
| 1670 char *word[], char *word_eol[]) | 1670 char *word[], char *word_eol[]) |
| 1671 { | 1671 { |
| 1672 char buf[IRC_BUF_LEN]; | 1672 char buf[IRC_BUF_LEN]; |
| 1673 | 1673 |
| 1674 if (!g_ascii_strcasecmp(word[4], ":\001CLIENTINFO")) { | 1674 if (!g_ascii_strcasecmp(word[4], ":\001CLIENTINFO")) { |
| 1724 irc_got_im(gc, nick, word_eol[4], 0, time(NULL)); | 1724 irc_got_im(gc, nick, word_eol[4], 0, time(NULL)); |
| 1725 } | 1725 } |
| 1726 } | 1726 } |
| 1727 | 1727 |
| 1728 static void | 1728 static void |
| 1729 irc_parse_join(struct gaim_connection *gc, char *nick, | 1729 irc_parse_join(GaimConnection *gc, char *nick, |
| 1730 char *word[], char *word_eol[]) | 1730 char *word[], char *word_eol[]) |
| 1731 { | 1731 { |
| 1732 char *chan = *word[3] == ':' ? word[3] + 1 : word[3]; | 1732 char *chan = *word[3] == ':' ? word[3] + 1 : word[3]; |
| 1733 static int id = 1; | 1733 static int id = 1; |
| 1734 struct gaim_conversation *c; | 1734 struct gaim_conversation *c; |
| 1735 char *hostmask, *p; | 1735 char *hostmask, *p; |
| 1736 | 1736 |
| 1737 if (!gaim_utf8_strcasecmp(gc->displayname, nick)) { | 1737 if (!gaim_utf8_strcasecmp(gaim_connection_get_display_name(gc), nick)) { |
| 1738 serv_got_joined_chat(gc, id++, chan); | 1738 serv_got_joined_chat(gc, id++, chan); |
| 1739 } else { | 1739 } else { |
| 1740 c = irc_find_chat(gc, chan); | 1740 c = irc_find_chat(gc, chan); |
| 1741 if (c) { | 1741 if (c) { |
| 1742 hostmask = g_strdup(word[1]); | 1742 hostmask = g_strdup(word[1]); |
| 1754 } | 1754 } |
| 1755 } | 1755 } |
| 1756 } | 1756 } |
| 1757 | 1757 |
| 1758 static void | 1758 static void |
| 1759 irc_parse_topic(struct gaim_connection *gc, char *nick, | 1759 irc_parse_topic(GaimConnection *gc, char *nick, |
| 1760 char *word[], char *word_eol[]) | 1760 char *word[], char *word_eol[]) |
| 1761 { | 1761 { |
| 1762 struct gaim_conversation *c = irc_find_chat(gc, word[3]); | 1762 struct gaim_conversation *c = irc_find_chat(gc, word[3]); |
| 1763 char *topic = irc_recv_convert(gc, *word_eol[4] == ':' ? word_eol[4] + 1 : word_eol[4]); | 1763 char *topic = irc_recv_convert(gc, *word_eol[4] == ':' ? word_eol[4] + 1 : word_eol[4]); |
| 1764 char buf[IRC_BUF_LEN]; | 1764 char buf[IRC_BUF_LEN]; |
| 1772 } | 1772 } |
| 1773 g_free(topic); | 1773 g_free(topic); |
| 1774 } | 1774 } |
| 1775 | 1775 |
| 1776 static gboolean | 1776 static gboolean |
| 1777 irc_parse_part(struct gaim_connection *gc, char *nick, char *cmd, | 1777 irc_parse_part(GaimConnection *gc, char *nick, char *cmd, |
| 1778 char *word[], char *word_eol[]) | 1778 char *word[], char *word_eol[]) |
| 1779 { | 1779 { |
| 1780 char *chan = cmd + 5; | 1780 char *chan = cmd + 5; |
| 1781 struct gaim_conversation *c; | 1781 struct gaim_conversation *c; |
| 1782 struct gaim_chat *chat; | 1782 struct gaim_chat *chat; |
| 1787 chan++; | 1787 chan++; |
| 1788 if (*reason == ':') | 1788 if (*reason == ':') |
| 1789 reason++; | 1789 reason++; |
| 1790 if (!(c = irc_find_chat(gc, chan))) | 1790 if (!(c = irc_find_chat(gc, chan))) |
| 1791 return FALSE; | 1791 return FALSE; |
| 1792 if (!strcmp(nick, gc->displayname)) { | 1792 if (!strcmp(nick, gaim_connection_get_display_name(gc))) { |
| 1793 serv_got_chat_left(gc, gaim_chat_get_id(GAIM_CHAT(c))); | 1793 serv_got_chat_left(gc, gaim_chat_get_id(GAIM_CHAT(c))); |
| 1794 return FALSE; | 1794 return FALSE; |
| 1795 } | 1795 } |
| 1796 | 1796 |
| 1797 chat = GAIM_CHAT(c); | 1797 chat = GAIM_CHAT(c); |
| 1816 } | 1816 } |
| 1817 | 1817 |
| 1818 static void | 1818 static void |
| 1819 irc_callback(gpointer data, gint source, GaimInputCondition condition) | 1819 irc_callback(gpointer data, gint source, GaimInputCondition condition) |
| 1820 { | 1820 { |
| 1821 struct gaim_connection *gc = data; | 1821 GaimConnection *gc = data; |
| 1822 struct irc_data *idata = gc->proto_data; | 1822 struct irc_data *idata = gc->proto_data; |
| 1823 int i = 0; | 1823 int i = 0; |
| 1824 gchar buf[1024]; | 1824 gchar buf[1024]; |
| 1825 gboolean off; | 1825 gboolean off; |
| 1826 | 1826 |
| 1827 i = read(idata->fd, buf, 1024); | 1827 i = read(idata->fd, buf, 1024); |
| 1828 if (i <= 0) { | 1828 if (i <= 0) { |
| 1829 hide_login_progress_error(gc, "Read error"); | 1829 gaim_connection_error(gc, "Read error"); |
| 1830 signoff(gc); | |
| 1831 return; | 1830 return; |
| 1832 } | 1831 } |
| 1833 | 1832 |
| 1834 idata->rxqueue = g_realloc(idata->rxqueue, i + idata->rxlen + 1); | 1833 idata->rxqueue = g_realloc(idata->rxqueue, i + idata->rxlen + 1); |
| 1835 memcpy(idata->rxqueue + idata->rxlen, buf, i); | 1834 memcpy(idata->rxqueue + idata->rxlen, buf, i); |
| 1871 } | 1870 } |
| 1872 | 1871 |
| 1873 static void | 1872 static void |
| 1874 irc_login_callback(gpointer data, gint source, GaimInputCondition condition) | 1873 irc_login_callback(gpointer data, gint source, GaimInputCondition condition) |
| 1875 { | 1874 { |
| 1876 struct gaim_connection *gc = data; | 1875 GaimConnection *gc = data; |
| 1876 GaimAccount *account = gaim_connection_get_account(gc); | |
| 1877 struct irc_data *idata; | 1877 struct irc_data *idata; |
| 1878 char hostname[256]; | 1878 char hostname[256]; |
| 1879 char buf[IRC_BUF_LEN]; | 1879 char buf[IRC_BUF_LEN]; |
| 1880 char *test; | 1880 char *test; |
| 1881 const char *charset = gaim_account_get_string(account, "charset", "UTF-8"); | |
| 1881 GError *err = NULL; | 1882 GError *err = NULL; |
| 1882 | 1883 |
| 1883 if (!g_slist_find(connections, gc)) { | 1884 if (!g_slist_find(connections, gc)) { |
| 1884 close(source); | 1885 close(source); |
| 1885 return; | 1886 return; |
| 1886 } | 1887 } |
| 1887 | 1888 |
| 1888 idata = gc->proto_data; | 1889 idata = gc->proto_data; |
| 1889 | 1890 |
| 1890 if (source < 0) { | 1891 if (source < 0) { |
| 1891 hide_login_progress(gc, "Write error"); | 1892 gaim_connection_error(gc, "Write error"); |
| 1892 signoff(gc); | |
| 1893 return; | 1893 return; |
| 1894 } | 1894 } |
| 1895 idata->fd = source; | 1895 idata->fd = source; |
| 1896 | 1896 |
| 1897 /* Try a quick conversion to see if the specified encoding is OK */ | 1897 /* Try a quick conversion to see if the specified encoding is OK */ |
| 1898 test = g_convert("test", strlen("test"), gc->account->proto_opt[USEROPT_CHARSET], | 1898 test = g_convert("test", strlen("test"), charset, |
| 1899 "UTF-8", NULL, NULL, &err); | 1899 "UTF-8", NULL, NULL, &err); |
| 1900 if (err) { | 1900 if (err) { |
| 1901 gaim_debug(GAIM_DEBUG_ERROR, "irc", | 1901 gaim_debug(GAIM_DEBUG_ERROR, "irc", |
| 1902 "Couldn't initialize %s for IRC charset conversion, using ISO-8859-1\n", | 1902 "Couldn't initialize %s for IRC charset conversion, using ISO-8859-1\n", |
| 1903 gc->account->proto_opt[USEROPT_CHARSET]); | 1903 charset); |
| 1904 strcpy(gc->account->proto_opt[USEROPT_CHARSET], "ISO-8859-1"); | 1904 gaim_account_set_string(account, "charset", "UTF-8"); |
| 1905 } | 1905 } |
| 1906 | 1906 |
| 1907 g_free(test); | 1907 g_free(test); |
| 1908 | 1908 |
| 1909 gethostname(hostname, sizeof(hostname) - 1); | 1909 gethostname(hostname, sizeof(hostname) - 1); |
| 1910 hostname[sizeof(hostname) - 1] = 0; | 1910 hostname[sizeof(hostname) - 1] = 0; |
| 1911 if (!*hostname) | 1911 if (!*hostname) |
| 1912 g_snprintf(hostname, sizeof(hostname), "localhost"); | 1912 g_snprintf(hostname, sizeof(hostname), "localhost"); |
| 1913 | 1913 |
| 1914 if (*gc->account->password) { | 1914 if (*gc->account->password) { |
| 1915 g_snprintf(buf, sizeof(buf), "PASS %s\r\n", gc->account->password); | 1915 g_snprintf(buf, sizeof(buf), "PASS %s\r\n", gaim_account_get_password(account)); |
| 1916 | 1916 |
| 1917 if (irc_write(idata->fd, buf, strlen(buf)) < 0) { | 1917 if (irc_write(idata->fd, buf, strlen(buf)) < 0) { |
| 1918 hide_login_progress(gc, "Write error"); | 1918 gaim_connection_error(gc, "Write error"); |
| 1919 signoff(gc); | |
| 1920 return; | 1919 return; |
| 1921 } | 1920 } |
| 1922 } | |
| 1923 | 1921 |
| 1924 g_snprintf(buf, sizeof(buf), "USER %s %s %s :%s\r\n", | 1922 g_snprintf(buf, sizeof(buf), "USER %s %s %s :%s\r\n", |
| 1925 g_get_user_name(), hostname, | 1923 g_get_user_name(), hostname, |
| 1926 idata->server, | 1924 idata->server, |
| 1927 *gc->account->alias ? gc->account->alias : "gaim"); | 1925 *gc->account->alias ? gc->account->alias : "gaim"); |
| 1928 if (irc_write(idata->fd, buf, strlen(buf)) < 0) { | 1926 if (irc_write(idata->fd, buf, strlen(buf)) < 0) { |
| 1929 hide_login_progress(gc, "Write error"); | 1927 gaim_connection_error(gc, "Write error"); |
| 1930 signoff(gc); | |
| 1931 return; | 1928 return; |
| 1932 } | 1929 } |
| 1933 | 1930 |
| 1934 g_snprintf(buf, sizeof(buf), "NICK %s\r\n", gc->displayname); | 1931 g_snprintf(buf, sizeof(buf), "NICK %s\r\n", gaim_connection_get_display_name(gc)); |
| 1935 if (irc_write(idata->fd, buf, strlen(buf)) < 0) { | 1932 if (irc_write(idata->fd, buf, strlen(buf)) < 0) { |
| 1936 hide_login_progress(gc, "Write error"); | 1933 gaim_connection_error(gc, "Write error"); |
| 1937 signoff(gc); | |
| 1938 return; | 1934 return; |
| 1939 } | 1935 } |
| 1940 | 1936 |
| 1941 gc->inpa = gaim_input_add(idata->fd, GAIM_INPUT_READ, irc_callback, gc); | 1937 gc->inpa = gaim_input_add(idata->fd, GAIM_INPUT_READ, irc_callback, gc); |
| 1942 } | 1938 } |
| 1943 | 1939 |
| 1944 static void | 1940 static void |
| 1945 irc_login(struct gaim_account *account) | 1941 irc_login(GaimAccount *account) |
| 1946 { | 1942 { |
| 1943 const char *username = gaim_account_get_username(account); | |
| 1947 char buf[IRC_BUF_LEN]; | 1944 char buf[IRC_BUF_LEN]; |
| 1948 int rc; | 1945 int rc; |
| 1949 | 1946 |
| 1950 struct gaim_connection *gc; | 1947 GaimConnection *gc; |
| 1951 struct irc_data *idata; | 1948 struct irc_data *idata; |
| 1952 char **parts; | 1949 char **parts; |
| 1953 if(!strrchr(account->username, '@')) { | 1950 |
| 1954 char *username = g_strdup(account->username); | 1951 if(!strrchr(username, '@')) { |
| 1955 g_snprintf(account->username, sizeof(account->username), "%s@%s", | 1952 char *tmp = g_strdup_printf("%s@%s", username, |
| 1956 username, *account->proto_opt[USEROPT_SERV] ? | 1953 gaim_account_get_string(account, "server", DEFAULT_SERVER)); |
| 1957 account->proto_opt[USEROPT_SERV] : DEFAULT_SERVER); | 1954 gaim_account_set_username(account, tmp); |
| 1958 g_free(username); | 1955 /* XXX: delete function required */ |
| 1959 strcpy(account->proto_opt[USEROPT_SERV], ""); | 1956 gaim_account_set_string(account, "server", NULL); |
| 1960 save_prefs(); | 1957 g_free(tmp); |
| 1961 } | 1958 } |
| 1962 | 1959 |
| 1963 gc = new_gaim_conn(account); | 1960 gc = gaim_account_get_connection(account); |
| 1964 idata = gc->proto_data = g_new0(struct irc_data, 1); | 1961 idata = gc->proto_data = g_new0(struct irc_data, 1); |
| 1965 | 1962 |
| 1966 parts = g_strsplit(gc->username, "@", 2); | 1963 parts = g_strsplit(username, "@", 2); |
| 1967 g_snprintf(gc->displayname, sizeof(gc->displayname), "%s", parts[0]); | 1964 gaim_connection_set_display_name(gc, parts[0]); |
| 1968 idata->server = g_strdup(parts[1]); | 1965 idata->server = g_strdup(parts[1]); |
| 1969 g_strfreev(parts); | 1966 g_strfreev(parts); |
| 1970 | 1967 |
| 1971 g_snprintf(buf, sizeof(buf), _("Signon: %s"), gc->username); | 1968 g_snprintf(buf, sizeof(buf), _("Signon: %s"), username); |
| 1972 set_login_progress(gc, 2, buf); | 1969 gaim_connection_update_progress(gc, buf, 1, 2); |
| 1973 | 1970 |
| 1974 idata->chantypes = g_strdup("#&!+"); | 1971 idata->chantypes = g_strdup("#&!+"); |
| 1975 idata->chanmodes = g_strdup("beI,k,lnt"); | 1972 idata->chanmodes = g_strdup("beI,k,lnt"); |
| 1976 idata->nickmodes = g_strdup("ohv"); | 1973 idata->nickmodes = g_strdup("ohv"); |
| 1977 idata->str = g_string_new(""); | 1974 idata->str = g_string_new(""); |
| 1978 idata->fd = -1; | 1975 idata->fd = -1; |
| 1979 | 1976 |
| 1980 rc = proxy_connect(account, idata->server, | 1977 rc = proxy_connect(account, idata->server, |
| 1981 account->proto_opt[USEROPT_PORT][0] ? | 1978 gaim_account_get_int(account, "port", 6667), |
| 1982 atoi(account->proto_opt[USEROPT_PORT]) : 6667, | 1979 irc_login_callback, gc); |
| 1983 irc_login_callback, gc); | 1980 |
| 1984 if (!account->gc || (rc != 0)) { | 1981 if (!account->gc || (rc != 0)) { |
| 1985 hide_login_progress(gc, "Unable to create socket"); | 1982 gaim_connection_error(gc, "Unable to create socket"); |
| 1986 signoff(gc); | |
| 1987 return; | 1983 return; |
| 1988 } | 1984 } |
| 1989 } | 1985 } |
| 1990 | 1986 |
| 1991 static void | 1987 static void |
| 1992 irc_close(struct gaim_connection *gc) | 1988 irc_close(GaimConnection *gc) |
| 1993 { | 1989 { |
| 1994 struct irc_data *idata = (struct irc_data *)gc->proto_data; | 1990 struct irc_data *idata = (struct irc_data *)gc->proto_data; |
| 1995 | 1991 |
| 1996 gchar buf[IRC_BUF_LEN]; | 1992 gchar buf[IRC_BUF_LEN]; |
| 1997 | 1993 |
| 2040 close(idata->fd); | 2036 close(idata->fd); |
| 2041 g_free(gc->proto_data); | 2037 g_free(gc->proto_data); |
| 2042 } | 2038 } |
| 2043 | 2039 |
| 2044 static void | 2040 static void |
| 2045 set_mode_3(struct gaim_connection *gc, const char *who, int sign, int mode, | 2041 set_mode_3(GaimConnection *gc, const char *who, int sign, int mode, |
| 2046 int start, int end, char *word[]) | 2042 int start, int end, char *word[]) |
| 2047 { | 2043 { |
| 2048 struct irc_data *id = gc->proto_data; | 2044 struct irc_data *id = gc->proto_data; |
| 2049 char buf[IRC_BUF_LEN]; | 2045 char buf[IRC_BUF_LEN]; |
| 2050 int left; | 2046 int left; |
| 2077 return; | 2073 return; |
| 2078 } | 2074 } |
| 2079 } | 2075 } |
| 2080 | 2076 |
| 2081 static void | 2077 static void |
| 2082 set_mode_6(struct gaim_connection *gc, const char *who, int sign, int mode, | 2078 set_mode_6(GaimConnection *gc, const char *who, int sign, int mode, |
| 2083 int start, int end, char *word[]) | 2079 int start, int end, char *word[]) |
| 2084 { | 2080 { |
| 2085 struct irc_data *id = gc->proto_data; | 2081 struct irc_data *id = gc->proto_data; |
| 2086 char buf[IRC_BUF_LEN]; | 2082 char buf[IRC_BUF_LEN]; |
| 2087 int left; | 2083 int left; |
| 2134 return; | 2130 return; |
| 2135 } | 2131 } |
| 2136 } | 2132 } |
| 2137 | 2133 |
| 2138 static void | 2134 static void |
| 2139 set_mode(struct gaim_connection *gc, const char *who, int sign, int mode, char *word[]) | 2135 set_mode(GaimConnection *gc, const char *who, int sign, int mode, char *word[]) |
| 2140 { | 2136 { |
| 2141 struct irc_data *id = gc->proto_data; | 2137 struct irc_data *id = gc->proto_data; |
| 2142 int i = 2; | 2138 int i = 2; |
| 2143 | 2139 |
| 2144 while (1) { | 2140 while (1) { |
| 2154 i++; | 2150 i++; |
| 2155 } | 2151 } |
| 2156 } | 2152 } |
| 2157 | 2153 |
| 2158 static void | 2154 static void |
| 2159 set_chan_mode(struct gaim_connection *gc, const char *chan, const char *mode_str) | 2155 set_chan_mode(GaimConnection *gc, const char *chan, const char *mode_str) |
| 2160 { | 2156 { |
| 2161 struct irc_data *id = gc->proto_data; | 2157 struct irc_data *id = gc->proto_data; |
| 2162 char buf[IRC_BUF_LEN]; | 2158 char buf[IRC_BUF_LEN]; |
| 2163 | 2159 |
| 2164 if ((mode_str[0] == '-') || (mode_str[0] == '+')) { | 2160 if ((mode_str[0] == '-') || (mode_str[0] == '+')) { |
| 2166 irc_write(id->fd, buf, strlen(buf)); | 2162 irc_write(id->fd, buf, strlen(buf)); |
| 2167 } | 2163 } |
| 2168 } | 2164 } |
| 2169 | 2165 |
| 2170 static int | 2166 static int |
| 2171 handle_command(struct gaim_connection *gc, const char *who, const char *in_what) | 2167 handle_command(GaimConnection *gc, const char *who, const char *in_what) |
| 2172 { | 2168 { |
| 2173 char buf[IRC_BUF_LEN]; | 2169 char buf[IRC_BUF_LEN]; |
| 2174 char pdibuf[IRC_BUF_LEN]; | 2170 char pdibuf[IRC_BUF_LEN]; |
| 2175 char *word[PDIWORDS], *word_eol[PDIWORDS]; | 2171 char *word[PDIWORDS], *word_eol[PDIWORDS]; |
| 2176 char *tmp = g_strdup(in_what); | 2172 char *tmp = g_strdup(in_what); |
| 2440 g_free(what); | 2436 g_free(what); |
| 2441 return 0; | 2437 return 0; |
| 2442 } | 2438 } |
| 2443 | 2439 |
| 2444 static int | 2440 static int |
| 2445 send_msg(struct gaim_connection *gc, const char *who, const char *what) | 2441 send_msg(GaimConnection *gc, const char *who, const char *what) |
| 2446 { | 2442 { |
| 2447 char *cr = strchr(what, '\n'); | 2443 char *cr = strchr(what, '\n'); |
| 2448 if (cr) { | 2444 if (cr) { |
| 2449 int ret = 0; | 2445 int ret = 0; |
| 2450 while (TRUE) { | 2446 while (TRUE) { |
| 2463 } else | 2459 } else |
| 2464 return handle_command(gc, who, what); | 2460 return handle_command(gc, who, what); |
| 2465 } | 2461 } |
| 2466 | 2462 |
| 2467 static void | 2463 static void |
| 2468 irc_chat_invite(struct gaim_connection *gc, int idn, const char *message, const char *name) { | 2464 irc_chat_invite(GaimConnection *gc, int idn, const char *message, const char *name) { |
| 2469 char buf[IRC_BUF_LEN]; | 2465 char buf[IRC_BUF_LEN]; |
| 2470 struct irc_data *id = gc->proto_data; | 2466 struct irc_data *id = gc->proto_data; |
| 2471 struct gaim_conversation *c = gaim_find_chat(gc, idn); | 2467 struct gaim_conversation *c = gaim_find_chat(gc, idn); |
| 2472 g_snprintf(buf, sizeof(buf), "INVITE %s %s\r\n", name, c->name); | 2468 g_snprintf(buf, sizeof(buf), "INVITE %s %s\r\n", name, c->name); |
| 2473 irc_write(id->fd, buf, strlen(buf)); | 2469 irc_write(id->fd, buf, strlen(buf)); |
| 2474 } | 2470 } |
| 2475 | 2471 |
| 2476 static int | 2472 static int |
| 2477 irc_send_im(struct gaim_connection *gc, const char *who, const char *what, int len, int flags) | 2473 irc_send_im(GaimConnection *gc, const char *who, const char *what, int len, int flags) |
| 2478 { | 2474 { |
| 2479 if (*who == '@' || *who == '%' || *who == '+') | 2475 if (*who == '@' || *who == '%' || *who == '+') |
| 2480 return send_msg(gc, who + 1, what); | 2476 return send_msg(gc, who + 1, what); |
| 2481 return send_msg(gc, who, what); | 2477 return send_msg(gc, who, what); |
| 2482 } | 2478 } |
| 2483 | 2479 |
| 2484 /* IRC doesn't have a buddy list, but we can still figure out who's online with ISON */ | 2480 /* IRC doesn't have a buddy list, but we can still figure out who's online with ISON */ |
| 2485 static void | 2481 static void |
| 2486 irc_add_buddy(struct gaim_connection *gc, const char *who) {} | 2482 irc_add_buddy(GaimConnection *gc, const char *who) {} |
| 2487 static void | 2483 static void |
| 2488 irc_remove_buddy(struct gaim_connection *gc, char *who, char *group) {} | 2484 irc_remove_buddy(GaimConnection *gc, char *who, char *group) {} |
| 2489 | 2485 |
| 2490 static GList * | 2486 static GList * |
| 2491 irc_chat_info(struct gaim_connection *gc) | 2487 irc_chat_info(GaimConnection *gc) |
| 2492 { | 2488 { |
| 2493 GList *m = NULL; | 2489 GList *m = NULL; |
| 2494 struct proto_chat_entry *pce; | 2490 struct proto_chat_entry *pce; |
| 2495 | 2491 |
| 2496 pce = g_new0(struct proto_chat_entry, 1); | 2492 pce = g_new0(struct proto_chat_entry, 1); |
| 2505 | 2501 |
| 2506 return m; | 2502 return m; |
| 2507 } | 2503 } |
| 2508 | 2504 |
| 2509 static void | 2505 static void |
| 2510 irc_join_chat(struct gaim_connection *gc, GHashTable *data) | 2506 irc_join_chat(GaimConnection *gc, GHashTable *data) |
| 2511 { | 2507 { |
| 2512 struct irc_data *id = gc->proto_data; | 2508 struct irc_data *id = gc->proto_data; |
| 2513 char buf[IRC_BUF_LEN]; | 2509 char buf[IRC_BUF_LEN]; |
| 2514 char *name, *pass; | 2510 char *name, *pass; |
| 2515 | 2511 |
| 2524 g_snprintf(buf, sizeof(buf), "JOIN %s\r\n", name); | 2520 g_snprintf(buf, sizeof(buf), "JOIN %s\r\n", name); |
| 2525 irc_write(id->fd, buf, strlen(buf)); | 2521 irc_write(id->fd, buf, strlen(buf)); |
| 2526 } | 2522 } |
| 2527 | 2523 |
| 2528 static void | 2524 static void |
| 2529 irc_chat_leave(struct gaim_connection *gc, int id) | 2525 irc_chat_leave(GaimConnection *gc, int id) |
| 2530 { | 2526 { |
| 2531 struct irc_data *idata = gc->proto_data; | 2527 struct irc_data *idata = gc->proto_data; |
| 2532 struct gaim_conversation *c = gaim_find_chat(gc, id); | 2528 struct gaim_conversation *c = gaim_find_chat(gc, id); |
| 2533 char buf[IRC_BUF_LEN]; | 2529 char buf[IRC_BUF_LEN]; |
| 2534 | 2530 |
| 2537 g_snprintf(buf, sizeof(buf), "PART %s\r\n", c->name); | 2533 g_snprintf(buf, sizeof(buf), "PART %s\r\n", c->name); |
| 2538 irc_write(idata->fd, buf, strlen(buf)); | 2534 irc_write(idata->fd, buf, strlen(buf)); |
| 2539 } | 2535 } |
| 2540 | 2536 |
| 2541 static int | 2537 static int |
| 2542 irc_chat_send(struct gaim_connection *gc, int id, char *what) | 2538 irc_chat_send(GaimConnection *gc, int id, char *what) |
| 2543 { | 2539 { |
| 2544 struct gaim_conversation *c = gaim_find_chat(gc, id); | 2540 struct gaim_conversation *c = gaim_find_chat(gc, id); |
| 2545 if (!c) | 2541 if (!c) |
| 2546 return -EINVAL; | 2542 return -EINVAL; |
| 2547 if (send_msg(gc, c->name, what) > 0) | 2543 if (send_msg(gc, c->name, what) > 0) |
| 2548 serv_got_chat_in(gc, gaim_chat_get_id(GAIM_CHAT(c)), | 2544 serv_got_chat_in(gc, gaim_chat_get_id(GAIM_CHAT(c)), |
| 2549 gc->displayname, 0, what, time(NULL)); | 2545 gaim_connection_get_display_name(gc), 0, what, time(NULL)); |
| 2550 return 0; | 2546 return 0; |
| 2551 } | 2547 } |
| 2552 | 2548 |
| 2553 static GList * | 2549 static GList * |
| 2554 irc_away_states(struct gaim_connection *gc) | 2550 irc_away_states(GaimConnection *gc) |
| 2555 { | 2551 { |
| 2556 return g_list_append(NULL, GAIM_AWAY_CUSTOM); | 2552 return g_list_append(NULL, GAIM_AWAY_CUSTOM); |
| 2557 } | 2553 } |
| 2558 | 2554 |
| 2559 static void | 2555 static void |
| 2560 irc_set_away(struct gaim_connection *gc, char *state, char *msg) | 2556 irc_set_away(GaimConnection *gc, char *state, char *msg) |
| 2561 { | 2557 { |
| 2562 struct irc_data *idata = gc->proto_data; | 2558 struct irc_data *idata = gc->proto_data; |
| 2563 char buf[IRC_BUF_LEN]; | 2559 char buf[IRC_BUF_LEN]; |
| 2564 | 2560 |
| 2565 if (gc->away) { | 2561 if (gc->away) { |
| 2575 | 2571 |
| 2576 irc_write(idata->fd, buf, strlen(buf)); | 2572 irc_write(idata->fd, buf, strlen(buf)); |
| 2577 } | 2573 } |
| 2578 | 2574 |
| 2579 static const char * | 2575 static const char * |
| 2580 irc_list_icon(struct gaim_account *a, struct buddy *b) | 2576 irc_list_icon(GaimAccount *a, struct buddy *b) |
| 2581 { | 2577 { |
| 2582 return "irc"; | 2578 return "irc"; |
| 2583 } | 2579 } |
| 2584 | 2580 |
| 2585 static void irc_list_emblems(struct buddy *b, char **se, char **sw, char **nw, char **ne) | 2581 static void irc_list_emblems(struct buddy *b, char **se, char **sw, char **nw, char **ne) |
| 2643 "Chat with %s established\n", chat->nick); | 2639 "Chat with %s established\n", chat->nick); |
| 2644 dcc_chat_list = g_slist_append (dcc_chat_list, chat); | 2640 dcc_chat_list = g_slist_append (dcc_chat_list, chat); |
| 2645 } | 2641 } |
| 2646 #if 0 | 2642 #if 0 |
| 2647 static void | 2643 static void |
| 2648 irc_ask_send_file(struct gaim_connection *gc, char *destsn) { | 2644 irc_ask_send_file(GaimConnection *gc, char *destsn) { |
| 2649 struct irc_data *id = (struct irc_data *)gc->proto_data; | 2645 struct irc_data *id = (struct irc_data *)gc->proto_data; |
| 2650 struct irc_file_transfer *ift = g_new0(struct irc_file_transfer, 1); | 2646 struct irc_file_transfer *ift = g_new0(struct irc_file_transfer, 1); |
| 2651 char *localip = (char *)malloc(12); | 2647 char *localip = (char *)malloc(12); |
| 2652 | 2648 |
| 2653 if (getlocalip(localip) == -1) { | 2649 if (getlocalip(localip) == -1) { |
| 2663 | 2659 |
| 2664 ift->xfer = transfer_out_add(gc, ift->sn); | 2660 ift->xfer = transfer_out_add(gc, ift->sn); |
| 2665 } | 2661 } |
| 2666 | 2662 |
| 2667 static struct | 2663 static struct |
| 2668 irc_file_transfer *find_ift_by_xfer(struct gaim_connection *gc, | 2664 irc_file_transfer *find_ift_by_xfer(GaimConnection *gc, |
| 2669 struct file_transfer *xfer) { | 2665 struct file_transfer *xfer) { |
| 2670 | 2666 |
| 2671 GSList *g = ((struct irc_data *)gc->proto_data)->file_transfers; | 2667 GSList *g = ((struct irc_data *)gc->proto_data)->file_transfers; |
| 2672 struct irc_file_transfer *f = NULL; | 2668 struct irc_file_transfer *f = NULL; |
| 2673 | 2669 |
| 2681 | 2677 |
| 2682 return f; | 2678 return f; |
| 2683 } | 2679 } |
| 2684 | 2680 |
| 2685 static void | 2681 static void |
| 2686 irc_file_transfer_data_chunk(struct gaim_connection *gc, struct file_transfer *xfer, const char *data, int len) { | 2682 irc_file_transfer_data_chunk(GaimConnection *gc, struct file_transfer *xfer, const char *data, int len) { |
| 2687 struct irc_file_transfer *ift = find_ift_by_xfer(gc, xfer); | 2683 struct irc_file_transfer *ift = find_ift_by_xfer(gc, xfer); |
| 2688 guint32 pos; | 2684 guint32 pos; |
| 2689 | 2685 |
| 2690 ift->cur += len; | 2686 ift->cur += len; |
| 2691 pos = htonl(ift->cur); | 2687 pos = htonl(ift->cur); |
| 2694 // FIXME: You should check to verify that they received the data when | 2690 // FIXME: You should check to verify that they received the data when |
| 2695 // you are sending a file ... | 2691 // you are sending a file ... |
| 2696 } | 2692 } |
| 2697 | 2693 |
| 2698 static void | 2694 static void |
| 2699 irc_file_transfer_cancel (struct gaim_connection *gc, struct file_transfer *xfer) { | 2695 irc_file_transfer_cancel (GaimConnection *gc, struct file_transfer *xfer) { |
| 2700 struct irc_data *id = (struct irc_data *)gc->proto_data; | 2696 struct irc_data *id = (struct irc_data *)gc->proto_data; |
| 2701 struct irc_file_transfer *ift = find_ift_by_xfer(gc, xfer); | 2697 struct irc_file_transfer *ift = find_ift_by_xfer(gc, xfer); |
| 2702 | 2698 |
| 2703 printf("Our shit got canceled, yo!\n"); | 2699 printf("Our shit got canceled, yo!\n"); |
| 2704 | 2700 |
| 2715 | 2711 |
| 2716 g_free(ift); | 2712 g_free(ift); |
| 2717 } | 2713 } |
| 2718 | 2714 |
| 2719 static void | 2715 static void |
| 2720 irc_file_transfer_done(struct gaim_connection *gc, struct file_transfer *xfer) { | 2716 irc_file_transfer_done(GaimConnection *gc, struct file_transfer *xfer) { |
| 2721 struct irc_data *id = (struct irc_data *)gc->proto_data; | 2717 struct irc_data *id = (struct irc_data *)gc->proto_data; |
| 2722 struct irc_file_transfer *ift = find_ift_by_xfer(gc, xfer); | 2718 struct irc_file_transfer *ift = find_ift_by_xfer(gc, xfer); |
| 2723 | 2719 |
| 2724 | 2720 |
| 2725 printf("Our shit be done, yo.\n"); | 2721 printf("Our shit be done, yo.\n"); |
| 2737 | 2733 |
| 2738 g_free(ift); | 2734 g_free(ift); |
| 2739 } | 2735 } |
| 2740 | 2736 |
| 2741 static void | 2737 static void |
| 2742 irc_file_transfer_out (struct gaim_connection *gc, struct file_transfer *xfer, const char *name, int totfiles, int totsize) { | 2738 irc_file_transfer_out (GaimConnection *gc, struct file_transfer *xfer, const char *name, int totfiles, int totsize) { |
| 2743 struct irc_file_transfer *ift = find_ift_by_xfer(gc, xfer); | 2739 struct irc_file_transfer *ift = find_ift_by_xfer(gc, xfer); |
| 2744 struct sockaddr_in addr; | 2740 struct sockaddr_in addr; |
| 2745 char buf[IRC_BUF_LEN]; | 2741 char buf[IRC_BUF_LEN]; |
| 2746 int len; | 2742 int len; |
| 2747 | 2743 |
| 2765 printf("Trying: %s\n", buf); | 2761 printf("Trying: %s\n", buf); |
| 2766 irc_send_im (gc, ift->sn, buf, -1, 0); | 2762 irc_send_im (gc, ift->sn, buf, -1, 0); |
| 2767 } | 2763 } |
| 2768 | 2764 |
| 2769 static void | 2765 static void |
| 2770 irc_file_transfer_in(struct gaim_connection *gc, | 2766 irc_file_transfer_in(GaimConnection *gc, |
| 2771 struct file_transfer *xfer, int offset) { | 2767 struct file_transfer *xfer, int offset) { |
| 2772 | 2768 |
| 2773 struct irc_file_transfer *ift = find_ift_by_xfer(gc, xfer); | 2769 struct irc_file_transfer *ift = find_ift_by_xfer(gc, xfer); |
| 2774 | 2770 |
| 2775 ift->xfer = xfer; | 2771 ift->xfer = xfer; |
| 2776 proxy_connect(gc->account, ift->ip, ift->port, dcc_recv_callback, ift); | 2772 proxy_connect(gc->account, ift->ip, ift->port, dcc_recv_callback, ift); |
| 2777 } | 2773 } |
| 2778 #endif | 2774 #endif |
| 2779 | 2775 |
| 2780 static void | 2776 static void |
| 2781 irc_ctcp_clientinfo(struct gaim_connection *gc, const char *who) | 2777 irc_ctcp_clientinfo(GaimConnection *gc, const char *who) |
| 2782 { | 2778 { |
| 2783 char buf[IRC_BUF_LEN]; | 2779 char buf[IRC_BUF_LEN]; |
| 2784 | 2780 |
| 2785 snprintf (buf, sizeof buf, "\001CLIENTINFO\001"); | 2781 snprintf (buf, sizeof buf, "\001CLIENTINFO\001"); |
| 2786 irc_send_privmsg(gc, who, buf, FALSE); | 2782 irc_send_privmsg(gc, who, buf, FALSE); |
| 2787 } | 2783 } |
| 2788 | 2784 |
| 2789 static void | 2785 static void |
| 2790 irc_ctcp_userinfo(struct gaim_connection *gc, const char *who) | 2786 irc_ctcp_userinfo(GaimConnection *gc, const char *who) |
| 2791 { | 2787 { |
| 2792 char buf[IRC_BUF_LEN]; | 2788 char buf[IRC_BUF_LEN]; |
| 2793 | 2789 |
| 2794 snprintf (buf, sizeof buf, "\001USERINFO\001"); | 2790 snprintf (buf, sizeof buf, "\001USERINFO\001"); |
| 2795 irc_send_privmsg(gc, who, buf, FALSE); | 2791 irc_send_privmsg(gc, who, buf, FALSE); |
| 2796 } | 2792 } |
| 2797 | 2793 |
| 2798 static void | 2794 static void |
| 2799 irc_ctcp_version(struct gaim_connection *gc, const char *who) | 2795 irc_ctcp_version(GaimConnection *gc, const char *who) |
| 2800 { | 2796 { |
| 2801 char buf[IRC_BUF_LEN]; | 2797 char buf[IRC_BUF_LEN]; |
| 2802 | 2798 |
| 2803 snprintf (buf, sizeof buf, "\001VERSION\001"); | 2799 snprintf (buf, sizeof buf, "\001VERSION\001"); |
| 2804 irc_send_privmsg(gc, who, buf, FALSE); | 2800 irc_send_privmsg(gc, who, buf, FALSE); |
| 2805 } | 2801 } |
| 2806 | 2802 |
| 2807 static void | 2803 static void |
| 2808 irc_ctcp_ping(struct gaim_connection *gc, const char *who) | 2804 irc_ctcp_ping(GaimConnection *gc, const char *who) |
| 2809 { | 2805 { |
| 2810 char buf[IRC_BUF_LEN]; | 2806 char buf[IRC_BUF_LEN]; |
| 2811 struct timeval now; | 2807 struct timeval now; |
| 2812 | 2808 |
| 2813 gettimeofday(&now, NULL); | 2809 gettimeofday(&now, NULL); |
| 2815 now.tv_usec/1000); | 2811 now.tv_usec/1000); |
| 2816 irc_send_privmsg(gc, who, buf, FALSE); | 2812 irc_send_privmsg(gc, who, buf, FALSE); |
| 2817 } | 2813 } |
| 2818 | 2814 |
| 2819 static void | 2815 static void |
| 2820 irc_send_notice(struct gaim_connection *gc, char *who, char *what) | 2816 irc_send_notice(GaimConnection *gc, char *who, char *what) |
| 2821 { | 2817 { |
| 2822 char buf[IRC_BUF_LEN], *intl; | 2818 char buf[IRC_BUF_LEN], *intl; |
| 2823 struct irc_data *id = gc->proto_data; | 2819 struct irc_data *id = gc->proto_data; |
| 2824 int len; | 2820 int len; |
| 2825 | 2821 |
| 2844 * to NINETY-THREE chars on dancer, which seems to be a pretty liberal | 2840 * to NINETY-THREE chars on dancer, which seems to be a pretty liberal |
| 2845 * ircd. My rough calculation for now is ":<nick>!~<user>@<host> ", | 2841 * ircd. My rough calculation for now is ":<nick>!~<user>@<host> ", |
| 2846 * where <host> is a max of an (uncalculated) 63 chars. Thanks to | 2842 * where <host> is a max of an (uncalculated) 63 chars. Thanks to |
| 2847 * trelane and #freenode for giving a hand here. */ | 2843 * trelane and #freenode for giving a hand here. */ |
| 2848 static void | 2844 static void |
| 2849 irc_send_privmsg(struct gaim_connection *gc, const char *who, const char *what, gboolean fragment) | 2845 irc_send_privmsg(GaimConnection *gc, const char *who, const char *what, gboolean fragment) |
| 2850 { | 2846 { |
| 2851 char buf[IRC_BUF_LEN], *intl; | 2847 char buf[IRC_BUF_LEN], *intl; |
| 2852 struct irc_data *id = gc->proto_data; | 2848 struct irc_data *id = gc->proto_data; |
| 2853 /* 512 - 12 (for PRIVMSG" "" :""\r\n") - namelen - nicklen - 68 */ | 2849 /* 512 - 12 (for PRIVMSG" "" :""\r\n") - namelen - nicklen - 68 */ |
| 2854 int nicklen = (gc->account->alias && strlen(gc->account->alias)) ? strlen(gc->account->alias) : 4; | 2850 int nicklen = (gc->account->alias && strlen(gc->account->alias)) ? strlen(gc->account->alias) : 4; |
| 2866 what += len; | 2862 what += len; |
| 2867 } while (fragment && strlen(what)); | 2863 } while (fragment && strlen(what)); |
| 2868 } | 2864 } |
| 2869 | 2865 |
| 2870 static void | 2866 static void |
| 2871 irc_start_chat(struct gaim_connection *gc, const char *who) { | 2867 irc_start_chat(GaimConnection *gc, const char *who) { |
| 2872 struct dcc_chat *chat; | 2868 struct dcc_chat *chat; |
| 2873 int len; | 2869 int len; |
| 2874 struct sockaddr_in addr; | 2870 struct sockaddr_in addr; |
| 2875 char buf[IRC_BUF_LEN]; | 2871 char buf[IRC_BUF_LEN]; |
| 2876 | 2872 |
| 2899 chat->ip_address, chat->port); | 2895 chat->ip_address, chat->port); |
| 2900 irc_send_im (gc, who, buf, -1, 0); | 2896 irc_send_im (gc, who, buf, -1, 0); |
| 2901 } | 2897 } |
| 2902 | 2898 |
| 2903 static void | 2899 static void |
| 2904 irc_get_info(struct gaim_connection *gc, const char *who) | 2900 irc_get_info(GaimConnection *gc, const char *who) |
| 2905 { | 2901 { |
| 2906 struct irc_data *idata = gc->proto_data; | 2902 struct irc_data *idata = gc->proto_data; |
| 2907 char buf[IRC_BUF_LEN]; | 2903 char buf[IRC_BUF_LEN]; |
| 2908 | 2904 |
| 2909 if (*who == '@') | 2905 if (*who == '@') |
| 2916 g_snprintf(buf, sizeof(buf), "WHOIS %s\r\n", who); | 2912 g_snprintf(buf, sizeof(buf), "WHOIS %s\r\n", who); |
| 2917 irc_write(idata->fd, buf, strlen(buf)); | 2913 irc_write(idata->fd, buf, strlen(buf)); |
| 2918 } | 2914 } |
| 2919 | 2915 |
| 2920 static GList * | 2916 static GList * |
| 2921 irc_buddy_menu(struct gaim_connection *gc, const char *who) | 2917 irc_buddy_menu(GaimConnection *gc, const char *who) |
| 2922 { | 2918 { |
| 2923 GList *m = NULL; | 2919 GList *m = NULL; |
| 2924 struct proto_buddy_menu *pbm; | 2920 struct proto_buddy_menu *pbm; |
| 2925 | 2921 |
| 2926 pbm = g_new0(struct proto_buddy_menu, 1); | 2922 pbm = g_new0(struct proto_buddy_menu, 1); |