Mercurial > pidgin
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; |
