Mercurial > pidgin
comparison src/protocols/irc/irc.c @ 5136:381da05cb5ed
[gaim-migrate @ 5500]
this started out as simply adding an option to right-click on a jabber buddy
and re-request authorization. Then I ended up chasing the disgusting mess
of const vs non-const parameters all over gaim.
The end result is that you can now right-click on jabber buddies and
re-request auth like you can for ICQ. Also, a lot more things are const
that should be, I fixed a bug or two, and I cleaned up one of my least
favorite functions in gaim (linkify_text). It is now decidedly less evil.
committer: Tailor Script <tailor@pidgin.im>
| author | Nathan Walp <nwalp@pidgin.im> |
|---|---|
| date | Tue, 15 Apr 2003 04:18:00 +0000 |
| parents | b37d7d09ec83 |
| children | 9a19c0a1e1be |
comparison
equal
deleted
inserted
replaced
| 5135:102135caa225 | 5136:381da05cb5ed |
|---|---|
| 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, char *who); | 115 static void irc_start_chat(struct gaim_connection *gc, const char *who); |
| 116 static void irc_ctcp_clientinfo(struct gaim_connection *gc, char *who); | 116 static void irc_ctcp_clientinfo(struct gaim_connection *gc, const char *who); |
| 117 static void irc_ctcp_userinfo(struct gaim_connection *gc, char *who); | 117 static void irc_ctcp_userinfo(struct gaim_connection *gc, const char *who); |
| 118 static void irc_ctcp_version(struct gaim_connection *gc, char *who); | 118 static void irc_ctcp_version(struct gaim_connection *gc, const char *who); |
| 119 static void irc_ctcp_ping(struct gaim_connection *gc, char *who); | 119 static void irc_ctcp_ping(struct gaim_connection *gc, const char *who); |
| 120 | 120 |
| 121 static void irc_send_privmsg(struct gaim_connection *gc, char *who, char *what, gboolean fragment); | 121 static void irc_send_privmsg(struct gaim_connection *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(struct gaim_connection *gc, char *who, char *what); |
| 123 | 123 |
| 124 static char *irc_send_convert(struct gaim_connection *gc, char *string, int maxlen, int *done); | 124 static char *irc_send_convert(struct gaim_connection *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(struct gaim_connection *gc, char *string); |
| 126 static void irc_parse_notice(struct gaim_connection *gc, char *nick, char *ex, | 126 static void irc_parse_notice(struct gaim_connection *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(struct gaim_connection *gc, char *nick, |
| 129 char *word[], char *word_eol[]); | 129 char *word[], char *word_eol[]); |
| 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, char *nick) | 141 find_dcc_chat (struct gaim_connection *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 debug_printf("IRC C: %s", data); | 164 debug_printf("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, char *string, int maxlen, int *done) | 169 irc_send_convert(struct gaim_connection *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 = 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(gc->account->proto_opt[USEROPT_CHARSET], "UTF-8"); |
| 177 if (g_iconv(conv, &inptr, &inleft, &outptr, &outleft) == -1) { | 177 if (g_iconv(conv, &inptr, &inleft, &outptr, &outleft) == -1) { |
| 202 | 202 |
| 203 return (utf8); | 203 return (utf8); |
| 204 } | 204 } |
| 205 | 205 |
| 206 static struct gaim_conversation * | 206 static struct gaim_conversation * |
| 207 irc_find_chat(struct gaim_connection *gc, char *name) | 207 irc_find_chat(struct gaim_connection *gc, const char *name) |
| 208 { | 208 { |
| 209 GSList *bcs = gc->buddy_chats; | 209 GSList *bcs = gc->buddy_chats; |
| 210 | 210 |
| 211 while (bcs) { | 211 while (bcs) { |
| 212 struct gaim_conversation *b = bcs->data; | 212 struct gaim_conversation *b = bcs->data; |
| 1114 break; | 1114 break; |
| 1115 } | 1115 } |
| 1116 } | 1116 } |
| 1117 | 1117 |
| 1118 static gboolean | 1118 static gboolean |
| 1119 is_channel(struct gaim_connection *gc, char *name) | 1119 is_channel(struct gaim_connection *gc, const char *name) |
| 1120 { | 1120 { |
| 1121 struct irc_data *id = gc->proto_data; | 1121 struct irc_data *id = gc->proto_data; |
| 1122 if (strchr(id->chantypes, *name)) | 1122 if (strchr(id->chantypes, *name)) |
| 1123 return TRUE; | 1123 return TRUE; |
| 1124 return FALSE; | 1124 return FALSE; |
| 1916 close(idata->fd); | 1916 close(idata->fd); |
| 1917 g_free(gc->proto_data); | 1917 g_free(gc->proto_data); |
| 1918 } | 1918 } |
| 1919 | 1919 |
| 1920 static void | 1920 static void |
| 1921 set_mode_3(struct gaim_connection *gc, char *who, int sign, int mode, | 1921 set_mode_3(struct gaim_connection *gc, const char *who, int sign, int mode, |
| 1922 int start, int end, char *word[]) | 1922 int start, int end, char *word[]) |
| 1923 { | 1923 { |
| 1924 struct irc_data *id = gc->proto_data; | 1924 struct irc_data *id = gc->proto_data; |
| 1925 char buf[IRC_BUF_LEN]; | 1925 char buf[IRC_BUF_LEN]; |
| 1926 int left; | 1926 int left; |
| 1953 return; | 1953 return; |
| 1954 } | 1954 } |
| 1955 } | 1955 } |
| 1956 | 1956 |
| 1957 static void | 1957 static void |
| 1958 set_mode_6(struct gaim_connection *gc, char *who, int sign, int mode, | 1958 set_mode_6(struct gaim_connection *gc, const char *who, int sign, int mode, |
| 1959 int start, int end, char *word[]) | 1959 int start, int end, char *word[]) |
| 1960 { | 1960 { |
| 1961 struct irc_data *id = gc->proto_data; | 1961 struct irc_data *id = gc->proto_data; |
| 1962 char buf[IRC_BUF_LEN]; | 1962 char buf[IRC_BUF_LEN]; |
| 1963 int left; | 1963 int left; |
| 2010 return; | 2010 return; |
| 2011 } | 2011 } |
| 2012 } | 2012 } |
| 2013 | 2013 |
| 2014 static void | 2014 static void |
| 2015 set_mode(struct gaim_connection *gc, char *who, int sign, int mode, char *word[]) | 2015 set_mode(struct gaim_connection *gc, const char *who, int sign, int mode, char *word[]) |
| 2016 { | 2016 { |
| 2017 struct irc_data *id = gc->proto_data; | 2017 struct irc_data *id = gc->proto_data; |
| 2018 int i = 2; | 2018 int i = 2; |
| 2019 | 2019 |
| 2020 while (1) { | 2020 while (1) { |
| 2030 i++; | 2030 i++; |
| 2031 } | 2031 } |
| 2032 } | 2032 } |
| 2033 | 2033 |
| 2034 static void | 2034 static void |
| 2035 set_chan_mode(struct gaim_connection *gc, char *chan, char *mode_str) | 2035 set_chan_mode(struct gaim_connection *gc, const char *chan, const char *mode_str) |
| 2036 { | 2036 { |
| 2037 struct irc_data *id = gc->proto_data; | 2037 struct irc_data *id = gc->proto_data; |
| 2038 char buf[IRC_BUF_LEN]; | 2038 char buf[IRC_BUF_LEN]; |
| 2039 | 2039 |
| 2040 if ((mode_str[0] == '-') || (mode_str[0] == '+')) { | 2040 if ((mode_str[0] == '-') || (mode_str[0] == '+')) { |
| 2042 irc_write(id->fd, buf, strlen(buf)); | 2042 irc_write(id->fd, buf, strlen(buf)); |
| 2043 } | 2043 } |
| 2044 } | 2044 } |
| 2045 | 2045 |
| 2046 static int | 2046 static int |
| 2047 handle_command(struct gaim_connection *gc, char *who, char *what) | 2047 handle_command(struct gaim_connection *gc, const char *who, const char *in_what) |
| 2048 { | 2048 { |
| 2049 char buf[IRC_BUF_LEN]; | 2049 char buf[IRC_BUF_LEN]; |
| 2050 char pdibuf[IRC_BUF_LEN]; | 2050 char pdibuf[IRC_BUF_LEN]; |
| 2051 char *word[PDIWORDS], *word_eol[PDIWORDS]; | 2051 char *word[PDIWORDS], *word_eol[PDIWORDS]; |
| 2052 char *tmp = g_strdup(what); | 2052 char *tmp = g_strdup(in_what); |
| 2053 GString *str = encode_html(tmp); | 2053 GString *str = encode_html(tmp); |
| 2054 char *intl; | 2054 char *intl; |
| 2055 int len; | 2055 int len; |
| 2056 struct dcc_chat *dccchat = find_dcc_chat(gc, who); | 2056 struct dcc_chat *dccchat = find_dcc_chat(gc, who); |
| 2057 struct irc_data *id = gc->proto_data; | 2057 struct irc_data *id = gc->proto_data; |
| 2058 char *what = str->str; | |
| 2058 | 2059 |
| 2059 g_free(tmp); | 2060 g_free(tmp); |
| 2060 what = str->str; | |
| 2061 | 2061 |
| 2062 if (*what != '/') { | 2062 if (*what != '/') { |
| 2063 if (dccchat) { | 2063 if (dccchat) { |
| 2064 intl = irc_send_convert(gc, what, sizeof(buf), &len); | 2064 intl = irc_send_convert(gc, what, sizeof(buf), &len); |
| 2065 g_snprintf(buf, sizeof(buf), "%s\r\n", intl); | 2065 g_snprintf(buf, sizeof(buf), "%s\r\n", intl); |
| 2128 } else if (!g_ascii_strcasecmp(pdibuf, "VOICE")) { | 2128 } else if (!g_ascii_strcasecmp(pdibuf, "VOICE")) { |
| 2129 set_mode(gc, who, '+', 'v', word); | 2129 set_mode(gc, who, '+', 'v', word); |
| 2130 } else if (!g_ascii_strcasecmp(pdibuf, "DEVOICE")) { | 2130 } else if (!g_ascii_strcasecmp(pdibuf, "DEVOICE")) { |
| 2131 set_mode(gc, who, '-', 'v', word); | 2131 set_mode(gc, who, '-', 'v', word); |
| 2132 } else if (!g_ascii_strcasecmp(pdibuf, "MODE")) { | 2132 } else if (!g_ascii_strcasecmp(pdibuf, "MODE")) { |
| 2133 char *chan = who; | 2133 set_chan_mode(gc, who, word_eol[2]); |
| 2134 set_chan_mode(gc, chan, word_eol[2]); | |
| 2135 } else if (!g_ascii_strcasecmp(pdibuf, "QUOTE")) { | 2134 } else if (!g_ascii_strcasecmp(pdibuf, "QUOTE")) { |
| 2136 if (!*word_eol[2]) { | 2135 if (!*word_eol[2]) { |
| 2137 g_free(what); | 2136 g_free(what); |
| 2138 return -EINVAL; | 2137 return -EINVAL; |
| 2139 } | 2138 } |
| 2177 g_snprintf(buf, sizeof(buf), "JOIN %s %s\r\n", word[2], word[3]); | 2176 g_snprintf(buf, sizeof(buf), "JOIN %s %s\r\n", word[2], word[3]); |
| 2178 else | 2177 else |
| 2179 g_snprintf(buf, sizeof(buf), "JOIN %s\r\n", word[2]); | 2178 g_snprintf(buf, sizeof(buf), "JOIN %s\r\n", word[2]); |
| 2180 irc_write(id->fd, buf, strlen(buf)); | 2179 irc_write(id->fd, buf, strlen(buf)); |
| 2181 } else if (!g_ascii_strcasecmp(pdibuf, "PART")) { | 2180 } else if (!g_ascii_strcasecmp(pdibuf, "PART")) { |
| 2182 char *chan = *word[2] ? word[2] : who; | 2181 const char *chan = *word[2] ? word[2] : who; |
| 2183 char *reason = word_eol[3]; | 2182 char *reason = word_eol[3]; |
| 2184 struct gaim_conversation *c; | 2183 struct gaim_conversation *c; |
| 2185 if (!is_channel(gc, chan)) { | 2184 if (!is_channel(gc, chan)) { |
| 2186 g_free(what); | 2185 g_free(what); |
| 2187 return -EINVAL; | 2186 return -EINVAL; |
| 2317 g_free(what); | 2316 g_free(what); |
| 2318 return 0; | 2317 return 0; |
| 2319 } | 2318 } |
| 2320 | 2319 |
| 2321 static int | 2320 static int |
| 2322 send_msg(struct gaim_connection *gc, char *who, char *what) | 2321 send_msg(struct gaim_connection *gc, const char *who, const char *what) |
| 2323 { | 2322 { |
| 2324 char *cr = strchr(what, '\n'); | 2323 char *cr = strchr(what, '\n'); |
| 2325 if (cr) { | 2324 if (cr) { |
| 2326 int ret = 0; | 2325 int ret = 0; |
| 2327 while (TRUE) { | 2326 while (TRUE) { |
| 2349 g_snprintf(buf, sizeof(buf), "INVITE %s %s\r\n", name, c->name); | 2348 g_snprintf(buf, sizeof(buf), "INVITE %s %s\r\n", name, c->name); |
| 2350 irc_write(id->fd, buf, strlen(buf)); | 2349 irc_write(id->fd, buf, strlen(buf)); |
| 2351 } | 2350 } |
| 2352 | 2351 |
| 2353 static int | 2352 static int |
| 2354 irc_send_im(struct gaim_connection *gc, char *who, char *what, int len, int flags) | 2353 irc_send_im(struct gaim_connection *gc, const char *who, const char *what, int len, int flags) |
| 2355 { | 2354 { |
| 2356 if (*who == '@' || *who == '%' || *who == '+') | 2355 if (*who == '@' || *who == '%' || *who == '+') |
| 2357 return send_msg(gc, who + 1, what); | 2356 return send_msg(gc, who + 1, what); |
| 2358 return send_msg(gc, who, what); | 2357 return send_msg(gc, who, what); |
| 2359 } | 2358 } |
| 2649 proxy_connect(gc->account, ift->ip, ift->port, dcc_recv_callback, ift); | 2648 proxy_connect(gc->account, ift->ip, ift->port, dcc_recv_callback, ift); |
| 2650 } | 2649 } |
| 2651 #endif | 2650 #endif |
| 2652 | 2651 |
| 2653 static void | 2652 static void |
| 2654 irc_ctcp_clientinfo(struct gaim_connection *gc, char *who) | 2653 irc_ctcp_clientinfo(struct gaim_connection *gc, const char *who) |
| 2655 { | 2654 { |
| 2656 char buf[IRC_BUF_LEN]; | 2655 char buf[IRC_BUF_LEN]; |
| 2657 | 2656 |
| 2658 snprintf (buf, sizeof buf, "\001CLIENTINFO\001"); | 2657 snprintf (buf, sizeof buf, "\001CLIENTINFO\001"); |
| 2659 irc_send_privmsg(gc, who, buf, FALSE); | 2658 irc_send_privmsg(gc, who, buf, FALSE); |
| 2660 } | 2659 } |
| 2661 | 2660 |
| 2662 static void | 2661 static void |
| 2663 irc_ctcp_userinfo(struct gaim_connection *gc, char *who) | 2662 irc_ctcp_userinfo(struct gaim_connection *gc, const char *who) |
| 2664 { | 2663 { |
| 2665 char buf[IRC_BUF_LEN]; | 2664 char buf[IRC_BUF_LEN]; |
| 2666 | 2665 |
| 2667 snprintf (buf, sizeof buf, "\001USERINFO\001"); | 2666 snprintf (buf, sizeof buf, "\001USERINFO\001"); |
| 2668 irc_send_privmsg(gc, who, buf, FALSE); | 2667 irc_send_privmsg(gc, who, buf, FALSE); |
| 2669 } | 2668 } |
| 2670 | 2669 |
| 2671 static void | 2670 static void |
| 2672 irc_ctcp_version(struct gaim_connection *gc, char *who) | 2671 irc_ctcp_version(struct gaim_connection *gc, const char *who) |
| 2673 { | 2672 { |
| 2674 char buf[IRC_BUF_LEN]; | 2673 char buf[IRC_BUF_LEN]; |
| 2675 | 2674 |
| 2676 snprintf (buf, sizeof buf, "\001VERSION\001"); | 2675 snprintf (buf, sizeof buf, "\001VERSION\001"); |
| 2677 irc_send_privmsg(gc, who, buf, FALSE); | 2676 irc_send_privmsg(gc, who, buf, FALSE); |
| 2678 } | 2677 } |
| 2679 | 2678 |
| 2680 static void | 2679 static void |
| 2681 irc_ctcp_ping(struct gaim_connection *gc, char *who) | 2680 irc_ctcp_ping(struct gaim_connection *gc, const char *who) |
| 2682 { | 2681 { |
| 2683 char buf[IRC_BUF_LEN]; | 2682 char buf[IRC_BUF_LEN]; |
| 2684 | 2683 |
| 2685 g_snprintf (buf, sizeof(buf), "\001PING %ld\001", time(NULL)); | 2684 g_snprintf (buf, sizeof(buf), "\001PING %ld\001", time(NULL)); |
| 2686 irc_send_privmsg(gc, who, buf, FALSE); | 2685 irc_send_privmsg(gc, who, buf, FALSE); |
| 2714 * to NINETY-THREE chars on dancer, which seems to be a pretty liberal | 2713 * to NINETY-THREE chars on dancer, which seems to be a pretty liberal |
| 2715 * ircd. My rough calculation for now is ":<nick>!~<user>@<host> ", | 2714 * ircd. My rough calculation for now is ":<nick>!~<user>@<host> ", |
| 2716 * where <host> is a max of an (uncalculated) 63 chars. Thanks to | 2715 * where <host> is a max of an (uncalculated) 63 chars. Thanks to |
| 2717 * trelane and #freenode for giving a hand here. */ | 2716 * trelane and #freenode for giving a hand here. */ |
| 2718 static void | 2717 static void |
| 2719 irc_send_privmsg(struct gaim_connection *gc, char *who, char *what, gboolean fragment) | 2718 irc_send_privmsg(struct gaim_connection *gc, const char *who, const char *what, gboolean fragment) |
| 2720 { | 2719 { |
| 2721 char buf[IRC_BUF_LEN], *intl; | 2720 char buf[IRC_BUF_LEN], *intl; |
| 2722 struct irc_data *id = gc->proto_data; | 2721 struct irc_data *id = gc->proto_data; |
| 2723 /* 512 - 12 (for PRIVMSG" "" :""\r\n") - namelen - nicklen - 68 */ | 2722 /* 512 - 12 (for PRIVMSG" "" :""\r\n") - namelen - nicklen - 68 */ |
| 2724 int nicklen = (gc->account->alias && strlen(gc->account->alias)) ? strlen(gc->account->alias) : 4; | 2723 int nicklen = (gc->account->alias && strlen(gc->account->alias)) ? strlen(gc->account->alias) : 4; |
| 2736 what += len; | 2735 what += len; |
| 2737 } while (fragment && strlen(what)); | 2736 } while (fragment && strlen(what)); |
| 2738 } | 2737 } |
| 2739 | 2738 |
| 2740 static void | 2739 static void |
| 2741 irc_start_chat(struct gaim_connection *gc, char *who) { | 2740 irc_start_chat(struct gaim_connection *gc, const char *who) { |
| 2742 struct dcc_chat *chat; | 2741 struct dcc_chat *chat; |
| 2743 int len; | 2742 int len; |
| 2744 struct sockaddr_in addr; | 2743 struct sockaddr_in addr; |
| 2745 char buf[IRC_BUF_LEN]; | 2744 char buf[IRC_BUF_LEN]; |
| 2746 | 2745 |
| 2769 chat->ip_address, chat->port); | 2768 chat->ip_address, chat->port); |
| 2770 irc_send_im (gc, who, buf, -1, 0); | 2769 irc_send_im (gc, who, buf, -1, 0); |
| 2771 } | 2770 } |
| 2772 | 2771 |
| 2773 static void | 2772 static void |
| 2774 irc_get_info(struct gaim_connection *gc, char *who) | 2773 irc_get_info(struct gaim_connection *gc, const char *who) |
| 2775 { | 2774 { |
| 2776 struct irc_data *idata = gc->proto_data; | 2775 struct irc_data *idata = gc->proto_data; |
| 2777 char buf[IRC_BUF_LEN]; | 2776 char buf[IRC_BUF_LEN]; |
| 2778 | 2777 |
| 2779 if (*who == '@') | 2778 if (*who == '@') |
| 2786 g_snprintf(buf, sizeof(buf), "WHOIS %s\r\n", who); | 2785 g_snprintf(buf, sizeof(buf), "WHOIS %s\r\n", who); |
| 2787 irc_write(idata->fd, buf, strlen(buf)); | 2786 irc_write(idata->fd, buf, strlen(buf)); |
| 2788 } | 2787 } |
| 2789 | 2788 |
| 2790 static GList * | 2789 static GList * |
| 2791 irc_buddy_menu(struct gaim_connection *gc, char *who) | 2790 irc_buddy_menu(struct gaim_connection *gc, const char *who) |
| 2792 { | 2791 { |
| 2793 GList *m = NULL; | 2792 GList *m = NULL; |
| 2794 struct proto_buddy_menu *pbm; | 2793 struct proto_buddy_menu *pbm; |
| 2795 | 2794 |
| 2796 pbm = g_new0(struct proto_buddy_menu, 1); | 2795 pbm = g_new0(struct proto_buddy_menu, 1); |
