comparison libpurple/protocols/irc/parse.c @ 32317:d72f2f13b60f

merge of 'c8c73eea7431e6f940916315ace40a41c8da3faa' and 'fec428131bde0ae8247941bd6a3d996c984c9189'
author Ethan Blanton <elb@pidgin.im>
date Fri, 21 Oct 2011 14:36:18 +0000
parents 44fc11beefab
children 3e7a7e14af62
comparison
equal deleted inserted replaced
32316:14787acaf9d7 32317:d72f2f13b60f
173 173
174 gc = purple_conversation_get_gc(conv); 174 gc = purple_conversation_get_gc(conv);
175 if (!gc) 175 if (!gc)
176 return PURPLE_CMD_RET_FAILED; 176 return PURPLE_CMD_RET_FAILED;
177 177
178 irc = gc->proto_data; 178 irc = purple_connection_get_protocol_data(gc);
179 179
180 if ((cmdent = g_hash_table_lookup(irc->cmds, cmd)) == NULL) 180 if ((cmdent = g_hash_table_lookup(irc->cmds, cmd)) == NULL)
181 return PURPLE_CMD_RET_FAILED; 181 return PURPLE_CMD_RET_FAILED;
182 182
183 (cmdent->cb)(irc, cmd, purple_conversation_get_name(conv), (const char **)args); 183 (cmdent->cb)(irc, cmd, purple_conversation_get_name(conv), (const char **)args);
668 g_free(msg); 668 g_free(msg);
669 return; 669 return;
670 } else if (!strncmp(input, "ERROR ", 6)) { 670 } else if (!strncmp(input, "ERROR ", 6)) {
671 if (g_utf8_validate(input, -1, NULL)) { 671 if (g_utf8_validate(input, -1, NULL)) {
672 char *tmp = g_strdup_printf("%s\n%s", _("Disconnected."), input); 672 char *tmp = g_strdup_printf("%s\n%s", _("Disconnected."), input);
673 purple_connection_error_reason (gc, 673 purple_connection_error (gc,
674 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp); 674 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp);
675 g_free(tmp); 675 g_free(tmp);
676 } else 676 } else
677 purple_connection_error_reason (gc, 677 purple_connection_error (gc,
678 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, 678 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
679 _("Disconnected.")); 679 _("Disconnected."));
680 return; 680 return;
681 } 681 }
682 682
706 args = g_new0(char *, strlen(msgent->format)); 706 args = g_new0(char *, strlen(msgent->format));
707 for (cur = end, fmt = msgent->format, i = 0; fmt[i] && *cur++; i++) { 707 for (cur = end, fmt = msgent->format, i = 0; fmt[i] && *cur++; i++) {
708 switch (fmt[i]) { 708 switch (fmt[i]) {
709 case 'v': 709 case 'v':
710 if (!(end = strchr(cur, ' '))) end = cur + strlen(cur); 710 if (!(end = strchr(cur, ' '))) end = cur + strlen(cur);
711 args[i] = g_strndup(cur, end - cur); 711 /* This is a string of unknown encoding which we do not
712 * want to transcode, but it may or may not be valid
713 * UTF-8, so we'll salvage it. If a nick/channel/target
714 * field has inadvertently been marked verbatim, this
715 * could cause weirdness. */
716 tmp = g_strndup(cur, end - cur);
717 args[i] = purple_utf8_salvage(tmp);
718 g_free(tmp);
712 cur += end - cur; 719 cur += end - cur;
713 break; 720 break;
714 case 't': 721 case 't':
715 case 'n': 722 case 'n':
716 case 'c': 723 case 'c':
724 if (*cur == ':') cur++; 731 if (*cur == ':') cur++;
725 args[i] = irc_recv_convert(irc, cur); 732 args[i] = irc_recv_convert(irc, cur);
726 cur = cur + strlen(cur); 733 cur = cur + strlen(cur);
727 break; 734 break;
728 case '*': 735 case '*':
729 args[i] = g_strdup(cur); 736 /* Ditto 'v' above; we're going to salvage this in case
737 * it leaks past the IRC prpl */
738 args[i] = purple_utf8_salvage(cur);
730 cur = cur + strlen(cur); 739 cur = cur + strlen(cur);
731 break; 740 break;
732 default: 741 default:
733 purple_debug(PURPLE_DEBUG_ERROR, "irc", "invalid message format character '%c'\n", fmt[i]); 742 purple_debug(PURPLE_DEBUG_ERROR, "irc", "invalid message format character '%c'\n", fmt[i]);
734 break; 743 break;