comparison src/protocols/msn/utils.c @ 5309:e2e53316a21d

[gaim-migrate @ 5681] Announcing the new MSN prpl! It probably has some bugs, and for the time being, there is no file transfer. That's good though, because the current MSN file transfer is a little broken. I've had many corrupted files. I'll commit new file transfer code when it's written. I want this heavily tested before 0.63! If you use MSN, please talk to people on it. Let me know of any oddities, crashes, bugs, whatever. I'll fix things as I find them. committer: Tailor Script <tailor@pidgin.im>
author Christian Hammond <chipx86@chipx86.com>
date Tue, 06 May 2003 02:06:56 +0000
parents
children 89948fedf782
comparison
equal deleted inserted replaced
5308:6aa785e55d0f 5309:e2e53316a21d
1 /**
2 * @file utils.h Utility functions
3 *
4 * gaim
5 *
6 * Copyright (C) 2003 Christian Hammond <chipx86@gnupdate.org>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 */
22 #include "msn.h"
23
24 char *
25 msn_url_decode(const char *str)
26 {
27 static char buf[MSN_BUF_LEN];
28 int i, j = 0;
29 char *bum;
30
31 g_return_val_if_fail(str != NULL, NULL);
32
33 for (i = 0; i < strlen(str); i++) {
34 char hex[3];
35
36 if (str[i] != '%')
37 buf[j++] = str[i];
38 else {
39 strncpy(hex, str + ++i, 2);
40 hex[2] = '\0';
41
42 /* i is pointing to the start of the number */
43 i++;
44
45 /*
46 * Now it's at the end and at the start of the for loop
47 * will be at the next character.
48 */
49 buf[j++] = strtol(hex, NULL, 16);
50 }
51 }
52
53 buf[j] = '\0';
54
55 if (!g_utf8_validate(buf, -1, (const char **)&bum))
56 *bum = '\0';
57
58 return buf;
59 }
60
61 char *
62 msn_url_encode(const char *str)
63 {
64 static char buf[MSN_BUF_LEN];
65 int i, j = 0;
66
67 g_return_val_if_fail(str != NULL, NULL);
68
69 for (i = 0; i < strlen(str); i++) {
70 if (isalnum(str[i]))
71 buf[j++] = str[i];
72 else {
73 sprintf(buf + j, "%%%02x", (unsigned char)str[i]);
74 j += 3;
75 }
76 }
77
78 buf[j] = '\0';
79
80 return buf;
81 }
82
83 char *
84 msn_parse_format(const char *mime)
85 {
86 char *cur;
87 GString *ret = g_string_new(NULL);
88 guint colorbuf;
89 char *colors = (char *)(&colorbuf);
90
91 cur = strstr(mime, "FN=");
92
93 if (cur && (*(cur = cur + 3) != ';')) {
94 ret = g_string_append(ret, "<FONT FACE=\"");
95
96 while (*cur && *cur != ';') {
97 ret = g_string_append_c(ret, *cur);
98 cur++;
99 }
100
101 ret = g_string_append(ret, "\">");
102 }
103
104 cur = strstr(mime, "EF=");
105
106 if (cur && (*(cur = cur + 3) != ';')) {
107 while (*cur && *cur != ';') {
108 ret = g_string_append_c(ret, '<');
109 ret = g_string_append_c(ret, *cur);
110 ret = g_string_append_c(ret, '>');
111 cur++;
112 }
113 }
114
115 cur = strstr(mime, "CO=");
116
117 if (cur && (*(cur = cur + 3) != ';')) {
118 if (sscanf (cur, "%x;", &colorbuf) == 1) {
119 char tag[64];
120 g_snprintf(tag, sizeof(tag),
121 "<FONT COLOR=\"#%02hhx%02hhx%02hhx\">",
122 colors[0], colors[1], colors[2]);
123
124 ret = g_string_append(ret, tag);
125 }
126 }
127
128 cur = msn_url_decode(ret->str);
129 g_string_free(ret, TRUE);
130
131 return cur;
132 }