Mon, 29 Nov 2004 04:29:49 +0000
[gaim-migrate @ 11431]
Memory leak fixes in plugins, signals
| 1 | 1 | /* |
|
7094
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2 | * @file util.h Utility Functions |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
3 | * @ingroup core |
| 1 | 4 | * |
| 8046 | 5 | * Gaim is the legal property of its developers, whose names are too numerous |
| 6 | * to list here. Please refer to the COPYRIGHT file distributed with this | |
| 7 | * source distribution. | |
| 1 | 8 | * |
| 9 | * This program is free software; you can redistribute it and/or modify | |
| 10 | * it under the terms of the GNU General Public License as published by | |
| 11 | * the Free Software Foundation; either version 2 of the License, or | |
| 12 | * (at your option) any later version. | |
| 13 | * | |
| 14 | * This program is distributed in the hope that it will be useful, | |
| 15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 17 | * GNU General Public License for more details. | |
| 18 | * | |
| 19 | * You should have received a copy of the GNU General Public License | |
| 20 | * along with this program; if not, write to the Free Software | |
| 21 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| 22 | */ | |
|
5872
754c63f29b77
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5826
diff
changeset
|
23 | #include "internal.h" |
| 3630 | 24 | |
|
5872
754c63f29b77
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5826
diff
changeset
|
25 | #include "conversation.h" |
|
754c63f29b77
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5826
diff
changeset
|
26 | #include "debug.h" |
|
1575
220b4d845309
[gaim-migrate @ 1585]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1560
diff
changeset
|
27 | #include "prpl.h" |
|
5545
a8b1a1262402
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5532
diff
changeset
|
28 | #include "prefs.h" |
|
7094
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
29 | #include "util.h" |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
30 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
31 | typedef struct |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
32 | { |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
33 | void (*callback)(void *, const char *, size_t); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
34 | void *user_data; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
35 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
36 | struct |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
37 | { |
| 9227 | 38 | char *user; |
| 39 | char *passwd; | |
|
7094
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
40 | char *address; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
41 | int port; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
42 | char *page; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
43 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
44 | } website; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
45 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
46 | char *url; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
47 | gboolean full; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
48 | char *user_agent; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
49 | gboolean http11; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
50 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
51 | int inpa; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
52 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
53 | gboolean sentreq; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
54 | gboolean newline; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
55 | gboolean startsaving; |
| 9240 | 56 | gboolean has_explicit_data_len; |
|
7094
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
57 | char *webdata; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
58 | unsigned long len; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
59 | unsigned long data_len; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
60 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
61 | } GaimFetchUrlData; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
62 | |
| 8596 | 63 | static char custom_home_dir[MAXPATHLEN]; |
| 3630 | 64 | static char home_dir[MAXPATHLEN]; |
| 65 | ||
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
66 | /************************************************************************** |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
67 | * Base16 Functions |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
68 | **************************************************************************/ |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
69 | unsigned char * |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
70 | gaim_base16_encode(const unsigned char *data, int length) |
| 1 | 71 | { |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
72 | int i; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
73 | unsigned char *ascii = NULL; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
74 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
75 | g_return_val_if_fail(data != NULL, NULL); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
76 | g_return_val_if_fail(length > 0, NULL); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
77 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
78 | ascii = g_malloc(length * 2 + 1); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
79 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
80 | for (i = 0; i < length; i++) |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
81 | snprintf(&ascii[i * 2], 3, "%02hhx", data[i]); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
82 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
83 | return ascii; |
| 1 | 84 | } |
| 85 | ||
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
86 | int |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
87 | gaim_base16_decode(const char *ascii, unsigned char **raw) |
| 1 | 88 | { |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
89 | int len, i, accumulator = 0; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
90 | unsigned char *data; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
91 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
92 | g_return_val_if_fail(ascii != NULL, 0); |
| 1 | 93 | |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
94 | len = strlen(ascii); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
95 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
96 | g_return_val_if_fail(strlen(ascii) > 0, 0); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
97 | g_return_val_if_fail(len % 2 > 0, 0); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
98 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
99 | data = g_malloc(len / 2); |
| 1 | 100 | |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
101 | for (i = 0; i < len; i++) |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
102 | { |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
103 | if ((i % 2) == 0) |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
104 | accumulator = 0; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
105 | else |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
106 | accumulator <<= 4; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
107 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
108 | if (isdigit(ascii[i])) |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
109 | accumulator |= ascii[i] - 48; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
110 | else |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
111 | { |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
112 | switch(ascii[i]) |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
113 | { |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
114 | case 'a': case 'A': accumulator |= 10; break; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
115 | case 'b': case 'B': accumulator |= 11; break; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
116 | case 'c': case 'C': accumulator |= 12; break; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
117 | case 'd': case 'D': accumulator |= 13; break; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
118 | case 'e': case 'E': accumulator |= 14; break; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
119 | case 'f': case 'F': accumulator |= 15; break; |
|
1826
2353dd376dcf
[gaim-migrate @ 1836]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1815
diff
changeset
|
120 | } |
|
1252
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
121 | } |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
122 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
123 | if (i % 2) |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
124 | data[(i - 1) / 2] = accumulator; |
|
1252
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
125 | } |
| 1 | 126 | |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
127 | *raw = data; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
128 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
129 | return (len / 2); |
| 1 | 130 | } |
| 131 | ||
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
132 | /************************************************************************** |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
133 | * Base64 Functions |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
134 | **************************************************************************/ |
|
4888
09f16a932490
[gaim-migrate @ 5218]
Christian Hammond <chipx86@chipx86.com>
parents:
4853
diff
changeset
|
135 | static const char alphabet[] = |
|
09f16a932490
[gaim-migrate @ 5218]
Christian Hammond <chipx86@chipx86.com>
parents:
4853
diff
changeset
|
136 | "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" |
|
09f16a932490
[gaim-migrate @ 5218]
Christian Hammond <chipx86@chipx86.com>
parents:
4853
diff
changeset
|
137 | "0123456789+/"; |
|
1252
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
138 | |
| 8929 | 139 | static const char xdigits[] = |
| 140 | "0123456789abcdef"; | |
| 141 | ||
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
142 | unsigned char * |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
143 | gaim_base64_encode(const unsigned char *in, size_t inlen) |
| 1 | 144 | { |
| 6872 | 145 | char *out, *rv; |
|
1252
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
146 | |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
147 | g_return_val_if_fail(in != NULL, NULL); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
148 | g_return_val_if_fail(inlen > 0, NULL); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
149 | |
| 7265 | 150 | rv = out = g_malloc(((inlen/3)+1)*4 + 1); |
| 1238 | 151 | |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
152 | for (; inlen >= 3; inlen -= 3) |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
153 | { |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
154 | *out++ = alphabet[in[0] >> 2]; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
155 | *out++ = alphabet[((in[0] << 4) & 0x30) | (in[1] >> 4)]; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
156 | *out++ = alphabet[((in[1] << 2) & 0x3c) | (in[2] >> 6)]; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
157 | *out++ = alphabet[in[2] & 0x3f]; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
158 | in += 3; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
159 | } |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
160 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
161 | if (inlen > 0) |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
162 | { |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
163 | unsigned char fragment; |
| 6872 | 164 | |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
165 | *out++ = alphabet[in[0] >> 2]; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
166 | fragment = (in[0] << 4) & 0x30; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
167 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
168 | if (inlen > 1) |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
169 | fragment |= in[1] >> 4; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
170 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
171 | *out++ = alphabet[fragment]; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
172 | *out++ = (inlen < 2) ? '=' : alphabet[(in[1] << 2) & 0x3c]; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
173 | *out++ = '='; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
174 | } |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
175 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
176 | *out = '\0'; |
| 5426 | 177 | |
| 178 | return rv; | |
| 1 | 179 | } |
| 180 | ||
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
181 | void |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
182 | gaim_base64_decode(const char *text, char **data, int *size) |
| 1 | 183 | { |
|
1252
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
184 | char *out = NULL; |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
185 | char tmp = 0; |
|
1920
8e86151db7dc
[gaim-migrate @ 1930]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1878
diff
changeset
|
186 | const char *c; |
|
1252
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
187 | gint32 tmp2 = 0; |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
188 | int len = 0, n = 0; |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
189 | |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
190 | g_return_if_fail(text != NULL); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
191 | g_return_if_fail(data != NULL); |
|
1920
8e86151db7dc
[gaim-migrate @ 1930]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1878
diff
changeset
|
192 | |
|
1252
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
193 | c = text; |
| 1 | 194 | |
|
1252
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
195 | while (*c) { |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
196 | if (*c >= 'A' && *c <= 'Z') { |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
197 | tmp = *c - 'A'; |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
198 | } else if (*c >= 'a' && *c <= 'z') { |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
199 | tmp = 26 + (*c - 'a'); |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
200 | } else if (*c >= '0' && *c <= 57) { |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
201 | tmp = 52 + (*c - '0'); |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
202 | } else if (*c == '+') { |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
203 | tmp = 62; |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
204 | } else if (*c == '/') { |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
205 | tmp = 63; |
| 5289 | 206 | } else if (*c == '\r' || *c == '\n') { |
| 207 | c++; | |
| 208 | continue; | |
|
1252
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
209 | } else if (*c == '=') { |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
210 | if (n == 3) { |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
211 | out = g_realloc(out, len + 2); |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
212 | out[len] = (char)(tmp2 >> 10) & 0xff; |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
213 | len++; |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
214 | out[len] = (char)(tmp2 >> 2) & 0xff; |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
215 | len++; |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
216 | } else if (n == 2) { |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
217 | out = g_realloc(out, len + 1); |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
218 | out[len] = (char)(tmp2 >> 4) & 0xff; |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
219 | len++; |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
220 | } |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
221 | break; |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
222 | } |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
223 | tmp2 = ((tmp2 << 6) | (tmp & 0xff)); |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
224 | n++; |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
225 | if (n == 4) { |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
226 | out = g_realloc(out, len + 3); |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
227 | out[len] = (char)((tmp2 >> 16) & 0xff); |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
228 | len++; |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
229 | out[len] = (char)((tmp2 >> 8) & 0xff); |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
230 | len++; |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
231 | out[len] = (char)(tmp2 & 0xff); |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
232 | len++; |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
233 | tmp2 = 0; |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
234 | n = 0; |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
235 | } |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
236 | c++; |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
237 | } |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
238 | |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
239 | out = g_realloc(out, len + 1); |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
240 | out[len] = 0; |
|
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
241 | |
|
1920
8e86151db7dc
[gaim-migrate @ 1930]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1878
diff
changeset
|
242 | *data = out; |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
243 | |
|
1920
8e86151db7dc
[gaim-migrate @ 1930]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1878
diff
changeset
|
244 | if (size) |
|
8e86151db7dc
[gaim-migrate @ 1930]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1878
diff
changeset
|
245 | *size = len; |
| 1 | 246 | } |
| 247 | ||
|
7679
c9804d02dcab
[gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7675
diff
changeset
|
248 | /************************************************************************** |
| 8929 | 249 | * Quoted Printable Functions (see RFC 1341) |
|
7679
c9804d02dcab
[gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7675
diff
changeset
|
250 | **************************************************************************/ |
|
c9804d02dcab
[gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7675
diff
changeset
|
251 | void |
|
c9804d02dcab
[gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7675
diff
changeset
|
252 | gaim_quotedp_decode(const char *str, char **ret_str, int *ret_len) |
|
c9804d02dcab
[gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7675
diff
changeset
|
253 | { |
| 8125 | 254 | char *n, *new; |
| 255 | const char *end, *p; | |
| 7722 | 256 | |
|
8005
de2b2ad34ee5
[gaim-migrate @ 8682]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7956
diff
changeset
|
257 | n = new = g_malloc(strlen (str) + 1); |
| 8125 | 258 | end = str + strlen(str); |
|
7679
c9804d02dcab
[gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7675
diff
changeset
|
259 | |
| 8125 | 260 | for (p = str; p < end; p++, n++) { |
|
7679
c9804d02dcab
[gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7675
diff
changeset
|
261 | if (*p == '=') { |
| 8929 | 262 | if (p[1] == '\r' && p[2] == '\n') { /* 5.1 #5 */ |
| 263 | n -= 1; | |
| 264 | p += 2; | |
| 265 | } else if (p[1] == '\n') { /* fuzzy case for 5.1 #5 */ | |
| 266 | n -= 1; | |
| 267 | p += 1; | |
| 268 | } else if (p[1] && p[2]) { | |
| 269 | char *nibble1 = strchr(xdigits, tolower(p[1])); | |
| 270 | char *nibble2 = strchr(xdigits, tolower(p[2])); | |
| 271 | if (nibble1 && nibble2) { /* 5.1 #1 */ | |
| 272 | *n = ((nibble1 - xdigits) << 4) | (nibble2 - xdigits); | |
| 273 | p += 2; | |
| 274 | } else { /* This should never happen */ | |
| 275 | *n = *p; | |
| 276 | } | |
| 277 | } else { /* This should never happen */ | |
| 278 | *n = *p; | |
| 279 | } | |
|
7679
c9804d02dcab
[gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7675
diff
changeset
|
280 | } |
|
c9804d02dcab
[gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7675
diff
changeset
|
281 | else if (*p == '_') |
|
c9804d02dcab
[gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7675
diff
changeset
|
282 | *n = ' '; |
|
c9804d02dcab
[gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7675
diff
changeset
|
283 | else |
|
c9804d02dcab
[gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7675
diff
changeset
|
284 | *n = *p; |
|
c9804d02dcab
[gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7675
diff
changeset
|
285 | } |
|
c9804d02dcab
[gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7675
diff
changeset
|
286 | |
|
c9804d02dcab
[gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7675
diff
changeset
|
287 | *n = '\0'; |
|
c9804d02dcab
[gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7675
diff
changeset
|
288 | |
|
c9804d02dcab
[gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7675
diff
changeset
|
289 | if (ret_len) |
|
c9804d02dcab
[gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7675
diff
changeset
|
290 | *ret_len = n - new; |
| 7722 | 291 | |
|
7679
c9804d02dcab
[gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7675
diff
changeset
|
292 | /* Resize to take less space */ |
|
c9804d02dcab
[gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7675
diff
changeset
|
293 | /* new = realloc(new, n - new); */ |
|
c9804d02dcab
[gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7675
diff
changeset
|
294 | |
|
c9804d02dcab
[gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7675
diff
changeset
|
295 | *ret_str = new; |
|
c9804d02dcab
[gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7675
diff
changeset
|
296 | } |
|
c9804d02dcab
[gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7675
diff
changeset
|
297 | |
|
c9804d02dcab
[gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7675
diff
changeset
|
298 | /************************************************************************** |
|
c9804d02dcab
[gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7675
diff
changeset
|
299 | * MIME Functions |
|
c9804d02dcab
[gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7675
diff
changeset
|
300 | **************************************************************************/ |
|
c9804d02dcab
[gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7675
diff
changeset
|
301 | char * |
|
c9804d02dcab
[gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7675
diff
changeset
|
302 | gaim_mime_decode_field(const char *str) |
|
c9804d02dcab
[gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7675
diff
changeset
|
303 | { |
|
7858
d382c4189f4d
[gaim-migrate @ 8512]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7840
diff
changeset
|
304 | /* |
| 8958 | 305 | * This is wing's version, partially based on revo/shx's version |
| 306 | * See RFC2047 [which apparently obsoletes RFC1342] | |
|
7858
d382c4189f4d
[gaim-migrate @ 8512]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7840
diff
changeset
|
307 | */ |
| 8958 | 308 | typedef enum { |
| 309 | state_start, state_equal1, state_question1, | |
| 310 | state_charset, state_question2, | |
| 311 | state_encoding, state_question3, | |
| 312 | state_encoded_text, state_question4, state_equal2 = state_start | |
| 313 | } encoded_word_state_t; | |
| 314 | encoded_word_state_t state = state_start; | |
|
7858
d382c4189f4d
[gaim-migrate @ 8512]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7840
diff
changeset
|
315 | const char *cur, *mark; |
| 8958 | 316 | const char *charset0 = NULL, *encoding0 = NULL, *encoded_text0 = NULL; |
|
7858
d382c4189f4d
[gaim-migrate @ 8512]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7840
diff
changeset
|
317 | char *n, *new; |
|
d382c4189f4d
[gaim-migrate @ 8512]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7840
diff
changeset
|
318 | |
| 8976 | 319 | /* token can be any CHAR (supposedly ISO8859-1/ISO2022), not just ASCII */ |
| 8958 | 320 | #define token_char_p(c) \ |
| 321 | (c != ' ' && !iscntrl(c) && !strchr("()<>@,;:\"/[]?.=", c)) | |
| 322 | ||
| 323 | /* But encoded-text must be ASCII; alas, isascii() may not exist */ | |
| 324 | #define encoded_text_char_p(c) \ | |
| 325 | ((c & 0x80) == 0 && c != '?' && c != ' ' && isgraph(c)) | |
| 326 | ||
| 327 | #define RECOVER_MARKED_TEXT strncpy(n, mark, cur - mark + 1); \ | |
| 328 | n += cur - mark + 1 | |
| 329 | ||
| 8976 | 330 | g_return_val_if_fail(str != NULL, NULL); |
| 331 | ||
| 332 | /* NOTE: Assuming that we need just strlen(str)+1 *may* be wrong. | |
| 333 | * It would be wrong if one byte (in some unknown encoding) could | |
| 334 | * expand to >=4 bytes of UTF-8; I don't know if there are such things. | |
| 335 | */ | |
|
7858
d382c4189f4d
[gaim-migrate @ 8512]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7840
diff
changeset
|
336 | n = new = g_malloc(strlen(str) + 1); |
|
d382c4189f4d
[gaim-migrate @ 8512]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7840
diff
changeset
|
337 | |
|
d382c4189f4d
[gaim-migrate @ 8512]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7840
diff
changeset
|
338 | /* Here we will be looking for encoded words and if they seem to be |
|
d382c4189f4d
[gaim-migrate @ 8512]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7840
diff
changeset
|
339 | * valid then decode them. |
|
d382c4189f4d
[gaim-migrate @ 8512]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7840
diff
changeset
|
340 | * They are of this form: =?charset?encoding?text?= |
|
d382c4189f4d
[gaim-migrate @ 8512]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7840
diff
changeset
|
341 | */ |
|
d382c4189f4d
[gaim-migrate @ 8512]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7840
diff
changeset
|
342 | |
| 8958 | 343 | for (cur = str, mark = NULL; *cur; cur += 1) { |
| 344 | switch (state) { | |
| 345 | case state_equal1: | |
| 346 | if (*cur == '?') { | |
| 347 | state = state_question1; | |
| 348 | } else { | |
| 349 | RECOVER_MARKED_TEXT; | |
| 350 | state = state_start; | |
| 351 | } | |
| 352 | break; | |
| 353 | case state_question1: | |
| 354 | if (token_char_p(*cur)) { | |
| 355 | charset0 = cur; | |
| 356 | state = state_charset; | |
| 357 | } else { /* This should never happen */ | |
| 358 | RECOVER_MARKED_TEXT; | |
| 359 | state = state_start; | |
| 360 | } | |
| 361 | break; | |
| 362 | case state_charset: | |
|
7858
d382c4189f4d
[gaim-migrate @ 8512]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7840
diff
changeset
|
363 | if (*cur == '?') { |
| 8958 | 364 | state = state_question2; |
| 8976 | 365 | } else if (!token_char_p(*cur)) { /* This should never happen */ |
| 8958 | 366 | RECOVER_MARKED_TEXT; |
| 367 | state = state_start; | |
| 368 | } | |
| 369 | break; | |
| 370 | case state_question2: | |
| 371 | if (token_char_p(*cur)) { | |
| 372 | encoding0 = cur; | |
| 373 | state = state_encoding; | |
| 374 | } else { /* This should never happen */ | |
| 375 | RECOVER_MARKED_TEXT; | |
| 376 | state = state_start; | |
| 377 | } | |
| 378 | break; | |
| 379 | case state_encoding: | |
| 380 | if (*cur == '?') { | |
| 381 | state = state_question3; | |
| 8976 | 382 | } else if (!token_char_p(*cur)) { /* This should never happen */ |
| 8958 | 383 | RECOVER_MARKED_TEXT; |
| 384 | state = state_start; | |
| 385 | } | |
| 386 | break; | |
| 387 | case state_question3: | |
| 388 | if (encoded_text_char_p(*cur)) { | |
| 389 | encoded_text0 = cur; | |
| 390 | state = state_encoded_text; | |
| 8976 | 391 | } else if (*cur == '?') { /* empty string */ |
| 392 | encoded_text0 = cur; | |
| 393 | state = state_question4; | |
| 8958 | 394 | } else { /* This should never happen */ |
| 395 | RECOVER_MARKED_TEXT; | |
| 396 | state = state_start; | |
|
7858
d382c4189f4d
[gaim-migrate @ 8512]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7840
diff
changeset
|
397 | } |
| 8958 | 398 | break; |
| 399 | case state_encoded_text: | |
| 400 | if (*cur == '?') { | |
| 401 | state = state_question4; | |
| 402 | } else if (!encoded_text_char_p(*cur)) { | |
| 403 | RECOVER_MARKED_TEXT; | |
| 404 | state = state_start; | |
| 405 | } | |
| 406 | break; | |
| 407 | case state_question4: | |
| 408 | if (*cur == '=') { /* Got the whole encoded-word */ | |
| 409 | char *charset = g_strndup(charset0, encoding0 - charset0 - 1); | |
| 410 | char *encoding = g_strndup(encoding0, encoded_text0 - encoding0 - 1); | |
| 411 | char *encoded_text = g_strndup(encoded_text0, cur - encoded_text0 - 1); | |
| 412 | char *decoded = NULL; | |
| 413 | int dec_len; | |
| 414 | if (g_ascii_strcasecmp(encoding, "Q") == 0) | |
| 415 | gaim_quotedp_decode(encoded_text, &decoded, &dec_len); | |
| 416 | else if (g_ascii_strcasecmp(encoding, "B") == 0) | |
| 417 | gaim_base64_decode(encoded_text, &decoded, &dec_len); | |
| 418 | else | |
| 419 | decoded = NULL; | |
| 420 | if (decoded) { | |
| 421 | gsize len; | |
| 422 | char *converted = g_convert(decoded, dec_len, "utf-8", charset, NULL, &len, NULL); | |
| 423 | ||
| 424 | if (converted) { | |
| 425 | n = strncpy(n, converted, len) + len; | |
| 426 | g_free(converted); | |
| 427 | } | |
| 428 | g_free(decoded); | |
|
7858
d382c4189f4d
[gaim-migrate @ 8512]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7840
diff
changeset
|
429 | } |
| 8958 | 430 | g_free(charset); |
| 431 | g_free(encoding); | |
| 432 | g_free(encoded_text); | |
| 433 | state = state_equal2; /* Restart the FSM */ | |
| 434 | } else { /* This should never happen */ | |
| 435 | RECOVER_MARKED_TEXT; | |
| 436 | state = state_start; | |
|
7858
d382c4189f4d
[gaim-migrate @ 8512]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7840
diff
changeset
|
437 | } |
| 8958 | 438 | break; |
| 439 | default: | |
| 440 | if (*cur == '=') { | |
| 441 | mark = cur; | |
| 442 | state = state_equal1; | |
| 443 | } else { | |
| 444 | /* Some unencoded text. */ | |
| 445 | *n = *cur; | |
| 446 | n += 1; | |
| 447 | } | |
| 448 | break; | |
| 449 | } /* switch */ | |
| 450 | } /* for */ | |
| 451 | ||
| 452 | if (state != state_start) { | |
| 453 | RECOVER_MARKED_TEXT; | |
|
7858
d382c4189f4d
[gaim-migrate @ 8512]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7840
diff
changeset
|
454 | } |
|
d382c4189f4d
[gaim-migrate @ 8512]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7840
diff
changeset
|
455 | *n = '\0'; |
|
d382c4189f4d
[gaim-migrate @ 8512]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7840
diff
changeset
|
456 | |
|
d382c4189f4d
[gaim-migrate @ 8512]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7840
diff
changeset
|
457 | return new; |
|
7840
6a145f8cea82
[gaim-migrate @ 8493]
Mark Doliner <markdoliner@pidgin.im>
parents:
7824
diff
changeset
|
458 | } |
|
7824
8ac3a78f2ec0
[gaim-migrate @ 8476]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7820
diff
changeset
|
459 | |
|
7679
c9804d02dcab
[gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents:
7675
diff
changeset
|
460 | |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
461 | /************************************************************************** |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
462 | * Date/Time Functions |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
463 | **************************************************************************/ |
| 7162 | 464 | const char * |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
465 | gaim_date(void) |
| 1 | 466 | { |
| 467 | static char date[80]; | |
| 468 | time_t tme; | |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
469 | |
| 1 | 470 | time(&tme); |
| 471 | strftime(date, sizeof(date), "%H:%M:%S", localtime(&tme)); | |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
472 | |
| 1 | 473 | return date; |
| 474 | } | |
| 475 | ||
| 7162 | 476 | const char * |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
477 | gaim_date_full(void) |
|
1252
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
478 | { |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
479 | char *date; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
480 | time_t tme; |
|
1252
94fbface2d84
[gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
481 | |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
482 | time(&tme); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
483 | date = ctime(&tme); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
484 | date[strlen(date) - 1] = '\0'; |
|
1100
efc7d10c7826
[gaim-migrate @ 1110]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1087
diff
changeset
|
485 | |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
486 | return date; |
| 3630 | 487 | } |
| 488 | ||
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
489 | time_t |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
490 | gaim_time_build(int year, int month, int day, int hour, int min, int sec) |
|
1805
c2aeee08d50e
[gaim-migrate @ 1815]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1753
diff
changeset
|
491 | { |
|
c2aeee08d50e
[gaim-migrate @ 1815]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1753
diff
changeset
|
492 | struct tm tm; |
|
c2aeee08d50e
[gaim-migrate @ 1815]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1753
diff
changeset
|
493 | |
|
c2aeee08d50e
[gaim-migrate @ 1815]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1753
diff
changeset
|
494 | tm.tm_year = year - 1900; |
|
c2aeee08d50e
[gaim-migrate @ 1815]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1753
diff
changeset
|
495 | tm.tm_mon = month - 1; |
|
c2aeee08d50e
[gaim-migrate @ 1815]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1753
diff
changeset
|
496 | tm.tm_mday = day; |
|
c2aeee08d50e
[gaim-migrate @ 1815]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1753
diff
changeset
|
497 | tm.tm_hour = hour; |
|
c2aeee08d50e
[gaim-migrate @ 1815]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1753
diff
changeset
|
498 | tm.tm_min = min; |
|
c2aeee08d50e
[gaim-migrate @ 1815]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1753
diff
changeset
|
499 | tm.tm_sec = sec >= 0 ? sec : time(NULL) % 60; |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
500 | |
|
1805
c2aeee08d50e
[gaim-migrate @ 1815]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1753
diff
changeset
|
501 | return mktime(&tm); |
|
c2aeee08d50e
[gaim-migrate @ 1815]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1753
diff
changeset
|
502 | } |
|
3230
6d0e07333504
[gaim-migrate @ 3247]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3153
diff
changeset
|
503 | |
| 8577 | 504 | time_t |
| 505 | gaim_str_to_time(const char *timestamp, gboolean utc) | |
| 506 | { | |
|
9722
c1072806bcae
[gaim-migrate @ 10583]
Mark Doliner <markdoliner@pidgin.im>
parents:
9716
diff
changeset
|
507 | time_t retval = 0; |
|
9716
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
508 | struct tm *t; |
|
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
509 | char buf[32]; |
|
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
510 | char *c; |
|
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
511 | int tzoff = 0; |
|
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
512 | |
|
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
513 | time(&retval); |
|
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
514 | t = localtime(&retval); |
|
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
515 | |
|
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
516 | snprintf(buf, sizeof(buf), "%s", timestamp); |
|
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
517 | c = buf; |
|
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
518 | |
|
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
519 | /* 4 digit year */ |
|
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
520 | if (!sscanf(c, "%04d", &t->tm_year)) return 0; |
|
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
521 | c += 4; |
|
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
522 | if (*c == '-') |
|
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
523 | c++; |
|
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
524 | |
|
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
525 | t->tm_year -= 1900; |
| 8577 | 526 | |
| 527 | /* 2 digit month */ | |
|
9716
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
528 | if (!sscanf(c, "%02d", &t->tm_mon)) return 0; |
|
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
529 | c += 2; |
|
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
530 | if (*c == '-') |
| 8577 | 531 | c++; |
| 532 | ||
|
9716
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
533 | t->tm_mon -= 1; |
|
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
534 | |
|
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
535 | /* 2 digit day */ |
|
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
536 | if (!sscanf(c, "%02d", &t->tm_mday)) return 0; |
|
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
537 | c += 2; |
|
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
538 | if (*c == 'T' || *c == '.') { /* we have more than a date, keep going */ |
|
9725
4383542a4291
[gaim-migrate @ 10586]
Mark Doliner <markdoliner@pidgin.im>
parents:
9722
diff
changeset
|
539 | c++; /* skip the "T" */ |
|
4383542a4291
[gaim-migrate @ 10586]
Mark Doliner <markdoliner@pidgin.im>
parents:
9722
diff
changeset
|
540 | |
|
4383542a4291
[gaim-migrate @ 10586]
Mark Doliner <markdoliner@pidgin.im>
parents:
9722
diff
changeset
|
541 | /* 2 digit hour */ |
|
4383542a4291
[gaim-migrate @ 10586]
Mark Doliner <markdoliner@pidgin.im>
parents:
9722
diff
changeset
|
542 | if (sscanf(c, "%02d:%02d:%02d", &t->tm_hour, &t->tm_min, &t->tm_sec) == 3 || |
|
4383542a4291
[gaim-migrate @ 10586]
Mark Doliner <markdoliner@pidgin.im>
parents:
9722
diff
changeset
|
543 | sscanf(c, "%02d%02d%02d", &t->tm_hour, &t->tm_min, &t->tm_sec) == 3) { |
|
4383542a4291
[gaim-migrate @ 10586]
Mark Doliner <markdoliner@pidgin.im>
parents:
9722
diff
changeset
|
544 | int tzhrs, tzmins; |
|
4383542a4291
[gaim-migrate @ 10586]
Mark Doliner <markdoliner@pidgin.im>
parents:
9722
diff
changeset
|
545 | c += 8; |
|
4383542a4291
[gaim-migrate @ 10586]
Mark Doliner <markdoliner@pidgin.im>
parents:
9722
diff
changeset
|
546 | if (*c == '.') /* dealing with precision we don't care about */ |
|
4383542a4291
[gaim-migrate @ 10586]
Mark Doliner <markdoliner@pidgin.im>
parents:
9722
diff
changeset
|
547 | c += 4; |
|
4383542a4291
[gaim-migrate @ 10586]
Mark Doliner <markdoliner@pidgin.im>
parents:
9722
diff
changeset
|
548 | if ((*c == '+' || *c == '-') && |
|
4383542a4291
[gaim-migrate @ 10586]
Mark Doliner <markdoliner@pidgin.im>
parents:
9722
diff
changeset
|
549 | sscanf(c+1, "%02d:%02d", &tzhrs, &tzmins)) { |
|
4383542a4291
[gaim-migrate @ 10586]
Mark Doliner <markdoliner@pidgin.im>
parents:
9722
diff
changeset
|
550 | tzoff = tzhrs*60*60 + tzmins*60; |
|
4383542a4291
[gaim-migrate @ 10586]
Mark Doliner <markdoliner@pidgin.im>
parents:
9722
diff
changeset
|
551 | if (*c == '+') |
|
4383542a4291
[gaim-migrate @ 10586]
Mark Doliner <markdoliner@pidgin.im>
parents:
9722
diff
changeset
|
552 | tzoff *= -1; |
|
9716
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
553 | } |
|
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
554 | |
|
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
555 | if (tzoff || utc) { |
| 8577 | 556 | #ifdef HAVE_TM_GMTOFF |
|
9716
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
557 | tzoff += t->tm_gmtoff; |
| 8577 | 558 | #else |
|
9716
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
559 | # ifdef HAVE_TIMEZONE |
|
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
560 | tzset(); /* making sure */ |
|
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
561 | tzoff -= timezone; |
|
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
562 | # endif |
| 8577 | 563 | #endif |
| 564 | } | |
|
9716
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
565 | } |
|
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
566 | } |
|
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
567 | |
|
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
568 | t->tm_isdst = -1; |
|
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
569 | retval = mktime(t); |
|
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
570 | retval += tzoff; |
|
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
571 | |
|
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
572 | return retval; |
| 8577 | 573 | } |
| 574 | ||
| 575 | ||
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
576 | /************************************************************************** |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
577 | * Markup Functions |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
578 | **************************************************************************/ |
|
7094
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
579 | gboolean |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
580 | gaim_markup_find_tag(const char *needle, const char *haystack, |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
581 | const char **start, const char **end, GData **attributes) |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
582 | { |
|
6982
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
583 | GData *attribs; |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
584 | const char *cur = haystack; |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
585 | char *name = NULL; |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
586 | gboolean found = FALSE; |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
587 | gboolean in_tag = FALSE; |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
588 | gboolean in_attr = FALSE; |
|
7094
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
589 | const char *in_quotes = NULL; |
|
7804
125cc377a21c
[gaim-migrate @ 8451]
Robert McQueen <robot101@debian.org>
parents:
7722
diff
changeset
|
590 | size_t needlelen; |
|
6982
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
591 | |
|
7804
125cc377a21c
[gaim-migrate @ 8451]
Robert McQueen <robot101@debian.org>
parents:
7722
diff
changeset
|
592 | g_return_val_if_fail( needle != NULL, FALSE); |
|
125cc377a21c
[gaim-migrate @ 8451]
Robert McQueen <robot101@debian.org>
parents:
7722
diff
changeset
|
593 | g_return_val_if_fail( *needle != '\0', FALSE); |
|
125cc377a21c
[gaim-migrate @ 8451]
Robert McQueen <robot101@debian.org>
parents:
7722
diff
changeset
|
594 | g_return_val_if_fail( haystack != NULL, FALSE); |
|
125cc377a21c
[gaim-migrate @ 8451]
Robert McQueen <robot101@debian.org>
parents:
7722
diff
changeset
|
595 | g_return_val_if_fail( *haystack != '\0', FALSE); |
|
125cc377a21c
[gaim-migrate @ 8451]
Robert McQueen <robot101@debian.org>
parents:
7722
diff
changeset
|
596 | g_return_val_if_fail( start != NULL, FALSE); |
|
125cc377a21c
[gaim-migrate @ 8451]
Robert McQueen <robot101@debian.org>
parents:
7722
diff
changeset
|
597 | g_return_val_if_fail( end != NULL, FALSE); |
|
125cc377a21c
[gaim-migrate @ 8451]
Robert McQueen <robot101@debian.org>
parents:
7722
diff
changeset
|
598 | g_return_val_if_fail(attributes != NULL, FALSE); |
|
125cc377a21c
[gaim-migrate @ 8451]
Robert McQueen <robot101@debian.org>
parents:
7722
diff
changeset
|
599 | |
|
125cc377a21c
[gaim-migrate @ 8451]
Robert McQueen <robot101@debian.org>
parents:
7722
diff
changeset
|
600 | needlelen = strlen(needle); |
|
6982
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
601 | g_datalist_init(&attribs); |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
602 | |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
603 | while (*cur && !found) { |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
604 | if (in_tag) { |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
605 | if (in_quotes) { |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
606 | const char *close = cur; |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
607 | |
| 7078 | 608 | while (*close && *close != *in_quotes) |
|
6982
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
609 | close++; |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
610 | |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
611 | /* if we got the close quote, store the value and carry on from * |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
612 | * after it. if we ran to the end of the string, point to the NULL * |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
613 | * and we're outta here */ |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
614 | if (*close) { |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
615 | /* only store a value if we have an attribute name */ |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
616 | if (name) { |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
617 | size_t len = close - cur; |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
618 | char *val = g_strndup(cur, len); |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
619 | |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
620 | g_datalist_set_data_full(&attribs, name, val, g_free); |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
621 | g_free(name); |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
622 | name = NULL; |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
623 | } |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
624 | |
| 7078 | 625 | in_quotes = NULL; |
|
6982
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
626 | cur = close + 1; |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
627 | } else { |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
628 | cur = close; |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
629 | } |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
630 | } else if (in_attr) { |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
631 | const char *close = cur; |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
632 | |
| 7078 | 633 | while (*close && *close != '>' && *close != '"' && |
| 634 | *close != '\'' && *close != ' ' && *close != '=') | |
|
6982
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
635 | close++; |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
636 | |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
637 | /* if we got the equals, store the name of the attribute. if we got |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
638 | * the quote, save the attribute and go straight to quote mode. |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
639 | * otherwise the tag closed or we reached the end of the string, |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
640 | * so we can get outta here */ |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
641 | switch (*close) { |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
642 | case '"': |
| 7078 | 643 | case '\'': |
| 644 | in_quotes = close; | |
|
6982
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
645 | case '=': |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
646 | { |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
647 | size_t len = close - cur; |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
648 | |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
649 | /* don't store a blank attribute name */ |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
650 | if (len) { |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
651 | if (name) |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
652 | g_free(name); |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
653 | name = g_ascii_strdown(cur, len); |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
654 | } |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
655 | |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
656 | in_attr = FALSE; |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
657 | cur = close + 1; |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
658 | break; |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
659 | } |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
660 | case ' ': |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
661 | case '>': |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
662 | in_attr = FALSE; |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
663 | default: |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
664 | cur = close; |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
665 | break; |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
666 | } |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
667 | } else { |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
668 | switch (*cur) { |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
669 | case ' ': |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
670 | /* swallow extra spaces inside tag */ |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
671 | while (*cur && *cur == ' ') cur++; |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
672 | in_attr = TRUE; |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
673 | break; |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
674 | case '>': |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
675 | found = TRUE; |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
676 | *end = cur; |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
677 | break; |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
678 | case '"': |
| 7078 | 679 | case '\'': |
| 680 | in_quotes = cur; | |
|
6982
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
681 | default: |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
682 | cur++; |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
683 | break; |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
684 | } |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
685 | } |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
686 | } else { |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
687 | /* if we hit a < followed by the name of our tag... */ |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
688 | if (*cur == '<' && !g_ascii_strncasecmp(cur + 1, needle, needlelen)) { |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
689 | *start = cur; |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
690 | cur = cur + needlelen + 1; |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
691 | |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
692 | /* if we're pointing at a space or a >, we found the right tag. if * |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
693 | * we're not, we've found a longer tag, so we need to skip to the * |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
694 | * >, but not being distracted by >s inside quotes. */ |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
695 | if (*cur == ' ' || *cur == '>') { |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
696 | in_tag = TRUE; |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
697 | } else { |
|
7804
125cc377a21c
[gaim-migrate @ 8451]
Robert McQueen <robot101@debian.org>
parents:
7722
diff
changeset
|
698 | while (*cur && *cur != '"' && *cur != '\'' && *cur != '>') { |
|
6982
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
699 | if (*cur == '"') { |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
700 | cur++; |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
701 | while (*cur && *cur != '"') |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
702 | cur++; |
|
7804
125cc377a21c
[gaim-migrate @ 8451]
Robert McQueen <robot101@debian.org>
parents:
7722
diff
changeset
|
703 | } else if (*cur == '\'') { |
|
125cc377a21c
[gaim-migrate @ 8451]
Robert McQueen <robot101@debian.org>
parents:
7722
diff
changeset
|
704 | cur++; |
|
125cc377a21c
[gaim-migrate @ 8451]
Robert McQueen <robot101@debian.org>
parents:
7722
diff
changeset
|
705 | while (*cur && *cur != '\'') |
|
125cc377a21c
[gaim-migrate @ 8451]
Robert McQueen <robot101@debian.org>
parents:
7722
diff
changeset
|
706 | cur++; |
|
6982
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
707 | } else { |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
708 | cur++; |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
709 | } |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
710 | } |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
711 | } |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
712 | } else { |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
713 | cur++; |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
714 | } |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
715 | } |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
716 | } |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
717 | |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
718 | /* clean up any attribute name from a premature termination */ |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
719 | if (name) |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
720 | g_free(name); |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
721 | |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
722 | if (found) { |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
723 | *attributes = attribs; |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
724 | } else { |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
725 | *start = NULL; |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
726 | *end = NULL; |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
727 | *attributes = NULL; |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
728 | } |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
729 | |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
730 | return found; |
|
12f08de92674
[gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents:
6872
diff
changeset
|
731 | } |
|
7094
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
732 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
733 | gboolean |
| 7675 | 734 | gaim_markup_extract_info_field(const char *str, int len, GString *dest, |
|
7095
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
735 | const char *start_token, int skip, |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
736 | const char *end_token, char check_value, |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
737 | const char *no_value_token, |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
738 | const char *display_name, gboolean is_link, |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
739 | const char *link_prefix) |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
740 | { |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
741 | const char *p, *q; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
742 | |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
743 | g_return_val_if_fail(str != NULL, FALSE); |
| 7675 | 744 | g_return_val_if_fail(dest != NULL, FALSE); |
|
7095
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
745 | g_return_val_if_fail(start_token != NULL, FALSE); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
746 | g_return_val_if_fail(end_token != NULL, FALSE); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
747 | g_return_val_if_fail(display_name != NULL, FALSE); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
748 | |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
749 | p = strstr(str, start_token); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
750 | |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
751 | if (p == NULL) |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
752 | return FALSE; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
753 | |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
754 | p += strlen(start_token) + skip; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
755 | |
| 7675 | 756 | if (p >= str + len) |
| 757 | return FALSE; | |
| 758 | ||
|
7095
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
759 | if (check_value != '\0' && *p == check_value) |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
760 | return FALSE; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
761 | |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
762 | q = strstr(p, end_token); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
763 | |
| 9161 | 764 | /* Trim leading blanks */ |
| 765 | while (*p != '\n' && g_ascii_isspace(*p)) { | |
| 766 | p += 1; | |
| 767 | } | |
| 768 | ||
| 769 | /* Trim trailing blanks */ | |
| 770 | while (q > p && g_ascii_isspace(*(q - 1))) { | |
| 771 | q -= 1; | |
| 772 | } | |
| 773 | ||
| 774 | /* Don't bother with null strings */ | |
| 775 | if (p == q) | |
| 776 | return FALSE; | |
| 777 | ||
|
7095
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
778 | if (q != NULL && (!no_value_token || |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
779 | (no_value_token && strncmp(p, no_value_token, |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
780 | strlen(no_value_token))))) |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
781 | { |
| 9220 | 782 | g_string_append_printf(dest, _("<b>%s:</b> "), display_name); |
|
7095
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
783 | |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
784 | if (is_link) |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
785 | { |
| 7675 | 786 | g_string_append(dest, "<br><a href=\""); |
|
7095
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
787 | |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
788 | if (link_prefix) |
| 7675 | 789 | g_string_append(dest, link_prefix); |
|
7095
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
790 | |
| 7675 | 791 | g_string_append_len(dest, p, q - p); |
| 792 | g_string_append(dest, "\">"); | |
|
7095
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
793 | |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
794 | if (link_prefix) |
| 7675 | 795 | g_string_append(dest, link_prefix); |
|
7095
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
796 | |
| 7675 | 797 | g_string_append_len(dest, p, q - p); |
| 798 | g_string_append(dest, "</a>"); | |
|
7095
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
799 | } |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
800 | else |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
801 | { |
| 7675 | 802 | g_string_append_len(dest, p, q - p); |
|
7095
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
803 | } |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
804 | |
| 7675 | 805 | g_string_append(dest, "<br>\n"); |
|
7095
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
806 | |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
807 | return TRUE; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
808 | } |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
809 | |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
810 | return FALSE; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
811 | } |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
812 | |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
813 | struct gaim_parse_tag { |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
814 | char *src_tag; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
815 | char *dest_tag; |
| 8064 | 816 | gboolean ignore; |
|
7095
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
817 | }; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
818 | |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
819 | #define ALLOW_TAG_ALT(x, y) if(!g_ascii_strncasecmp(c, "<" x " ", strlen("<" x " "))) { \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
820 | const char *o = c + strlen("<" x); \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
821 | const char *p = NULL, *q = NULL, *r = NULL; \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
822 | GString *innards = g_string_new(""); \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
823 | while(o && *o) { \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
824 | if(!q && (*o == '\"' || *o == '\'') ) { \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
825 | q = o; \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
826 | } else if(q) { \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
827 | if(*o == *q) { \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
828 | char *unescaped = g_strndup(q+1, o-q-1); \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
829 | char *escaped = g_markup_escape_text(unescaped, -1); \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
830 | g_string_append_printf(innards, "%c%s%c", *q, escaped, *q); \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
831 | g_free(unescaped); \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
832 | g_free(escaped); \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
833 | q = NULL; \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
834 | } else if(*c == '\\') { \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
835 | o++; \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
836 | } \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
837 | } else if(*o == '<') { \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
838 | r = o; \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
839 | } else if(*o == '>') { \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
840 | p = o; \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
841 | break; \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
842 | } else { \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
843 | innards = g_string_append_c(innards, *o); \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
844 | } \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
845 | o++; \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
846 | } \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
847 | if(p && !r) { \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
848 | if(*(p-1) != '/') { \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
849 | struct gaim_parse_tag *pt = g_new0(struct gaim_parse_tag, 1); \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
850 | pt->src_tag = x; \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
851 | pt->dest_tag = y; \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
852 | tags = g_list_prepend(tags, pt); \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
853 | } \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
854 | xhtml = g_string_append(xhtml, "<" y); \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
855 | c += strlen("<" x ); \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
856 | xhtml = g_string_append(xhtml, innards->str); \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
857 | xhtml = g_string_append_c(xhtml, '>'); \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
858 | c = p + 1; \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
859 | } else { \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
860 | xhtml = g_string_append(xhtml, "<"); \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
861 | plain = g_string_append_c(plain, '<'); \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
862 | c++; \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
863 | } \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
864 | g_string_free(innards, TRUE); \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
865 | continue; \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
866 | } \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
867 | if(!g_ascii_strncasecmp(c, "<" x, strlen("<" x)) && \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
868 | (*(c+strlen("<" x)) == '>' || \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
869 | !g_ascii_strncasecmp(c+strlen("<" x), "/>", 2))) { \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
870 | xhtml = g_string_append(xhtml, "<" y); \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
871 | c += strlen("<" x); \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
872 | if(*c != '/') { \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
873 | struct gaim_parse_tag *pt = g_new0(struct gaim_parse_tag, 1); \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
874 | pt->src_tag = x; \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
875 | pt->dest_tag = y; \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
876 | tags = g_list_prepend(tags, pt); \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
877 | xhtml = g_string_append_c(xhtml, '>'); \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
878 | } else { \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
879 | xhtml = g_string_append(xhtml, "/>");\ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
880 | } \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
881 | c = strchr(c, '>') + 1; \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
882 | continue; \ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
883 | } |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
884 | #define ALLOW_TAG(x) ALLOW_TAG_ALT(x, x) |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
885 | void |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
886 | gaim_markup_html_to_xhtml(const char *html, char **xhtml_out, |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
887 | char **plain_out) |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
888 | { |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
889 | GString *xhtml = g_string_new(""); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
890 | GString *plain = g_string_new(""); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
891 | GList *tags = NULL, *tag; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
892 | const char *c = html; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
893 | |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
894 | while(c && *c) { |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
895 | if(*c == '<') { |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
896 | if(*(c+1) == '/') { /* closing tag */ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
897 | tag = tags; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
898 | while(tag) { |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
899 | struct gaim_parse_tag *pt = tag->data; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
900 | if(!g_ascii_strncasecmp((c+2), pt->src_tag, strlen(pt->src_tag)) && *(c+strlen(pt->src_tag)+2) == '>') { |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
901 | c += strlen(pt->src_tag) + 3; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
902 | break; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
903 | } |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
904 | tag = tag->next; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
905 | } |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
906 | if(tag) { |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
907 | while(tags) { |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
908 | struct gaim_parse_tag *pt = tags->data; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
909 | g_string_append_printf(xhtml, "</%s>", pt->dest_tag); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
910 | if(tags == tag) |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
911 | break; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
912 | tags = g_list_remove(tags, pt); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
913 | g_free(pt); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
914 | } |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
915 | g_free(tag->data); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
916 | tags = g_list_remove(tags, tag->data); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
917 | } else { |
| 8534 | 918 | /* a closing tag we weren't expecting... |
| 919 | * we'll let it slide, if it's really a tag...if it's | |
| 920 | * just a </ we'll escape it properly */ | |
| 921 | const char *end = c+2; | |
| 922 | while(*end && g_ascii_isalpha(*end)) | |
| 923 | end++; | |
| 924 | if(*end == '>') { | |
| 925 | c = end+1; | |
| 926 | } else { | |
| 927 | xhtml = g_string_append(xhtml, "<"); | |
| 928 | plain = g_string_append_c(plain, '<'); | |
| 929 | c++; | |
| 930 | } | |
|
7095
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
931 | } |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
932 | } else { /* opening tag */ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
933 | ALLOW_TAG("a"); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
934 | ALLOW_TAG_ALT("b", "strong"); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
935 | ALLOW_TAG("blockquote"); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
936 | ALLOW_TAG_ALT("bold", "strong"); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
937 | ALLOW_TAG("cite"); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
938 | ALLOW_TAG("div"); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
939 | ALLOW_TAG("em"); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
940 | ALLOW_TAG("h1"); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
941 | ALLOW_TAG("h2"); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
942 | ALLOW_TAG("h3"); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
943 | ALLOW_TAG("h4"); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
944 | ALLOW_TAG("h5"); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
945 | ALLOW_TAG("h6"); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
946 | /* we only allow html to start the message */ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
947 | if(c == html) |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
948 | ALLOW_TAG("html"); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
949 | ALLOW_TAG_ALT("i", "em"); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
950 | ALLOW_TAG_ALT("italic", "em"); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
951 | ALLOW_TAG("li"); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
952 | ALLOW_TAG("ol"); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
953 | ALLOW_TAG("p"); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
954 | ALLOW_TAG("pre"); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
955 | ALLOW_TAG("q"); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
956 | ALLOW_TAG("span"); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
957 | ALLOW_TAG("strong"); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
958 | ALLOW_TAG("ul"); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
959 | |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
960 | /* we skip <HR> because it's not legal in XHTML-IM. However, |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
961 | * we still want to send something sensible, so we put a |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
962 | * linebreak in its place. <BR> also needs special handling |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
963 | * because putting a </BR> to close it would just be dumb. */ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
964 | if((!g_ascii_strncasecmp(c, "<br", 3) |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
965 | || !g_ascii_strncasecmp(c, "<hr", 3)) |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
966 | && (*(c+3) == '>' || |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
967 | !g_ascii_strncasecmp(c+3, "/>", 2) || |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
968 | !g_ascii_strncasecmp(c+3, " />", 3))) { |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
969 | c = strchr(c, '>') + 1; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
970 | xhtml = g_string_append(xhtml, "<br/>"); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
971 | if(*c != '\n') |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
972 | plain = g_string_append_c(plain, '\n'); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
973 | continue; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
974 | } |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
975 | if(!g_ascii_strncasecmp(c, "<u>", 3) || !g_ascii_strncasecmp(c, "<underline>", strlen("<underline>"))) { |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
976 | struct gaim_parse_tag *pt = g_new0(struct gaim_parse_tag, 1); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
977 | pt->src_tag = *(c+2) == '>' ? "u" : "underline"; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
978 | pt->dest_tag = "span"; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
979 | tags = g_list_prepend(tags, pt); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
980 | c = strchr(c, '>') + 1; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
981 | xhtml = g_string_append(xhtml, "<span style='text-decoration: underline;'>"); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
982 | continue; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
983 | } |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
984 | if(!g_ascii_strncasecmp(c, "<s>", 3) || !g_ascii_strncasecmp(c, "<strike>", strlen("<strike>"))) { |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
985 | struct gaim_parse_tag *pt = g_new0(struct gaim_parse_tag, 1); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
986 | pt->src_tag = *(c+2) == '>' ? "s" : "strike"; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
987 | pt->dest_tag = "span"; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
988 | tags = g_list_prepend(tags, pt); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
989 | c = strchr(c, '>') + 1; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
990 | xhtml = g_string_append(xhtml, "<span style='text-decoration: line-through;'>"); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
991 | continue; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
992 | } |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
993 | if(!g_ascii_strncasecmp(c, "<sub>", 5)) { |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
994 | struct gaim_parse_tag *pt = g_new0(struct gaim_parse_tag, 1); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
995 | pt->src_tag = "sub"; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
996 | pt->dest_tag = "span"; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
997 | tags = g_list_prepend(tags, pt); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
998 | c = strchr(c, '>') + 1; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
999 | xhtml = g_string_append(xhtml, "<span style='vertical-align:sub;'>"); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1000 | continue; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1001 | } |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1002 | if(!g_ascii_strncasecmp(c, "<sup>", 5)) { |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1003 | struct gaim_parse_tag *pt = g_new0(struct gaim_parse_tag, 1); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1004 | pt->src_tag = "sup"; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1005 | pt->dest_tag = "span"; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1006 | tags = g_list_prepend(tags, pt); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1007 | c = strchr(c, '>') + 1; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1008 | xhtml = g_string_append(xhtml, "<span style='vertical-align:super;'>"); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1009 | continue; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1010 | } |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1011 | if(!g_ascii_strncasecmp(c, "<font", 5) && (*(c+5) == '>' || *(c+5) == ' ')) { |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1012 | const char *p = c; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1013 | GString *style = g_string_new(""); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1014 | struct gaim_parse_tag *pt; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1015 | while(*p && *p != '>') { |
| 8064 | 1016 | if(!g_ascii_strncasecmp(p, "back=", strlen("back="))) { |
| 1017 | const char *q = p + strlen("back="); | |
| 1018 | GString *color = g_string_new(""); | |
| 1019 | if(*q == '\'' || *q == '\"') | |
| 1020 | q++; | |
| 1021 | while(*q && *q != '\"' && *q != '\'' && *q != ' ') { | |
| 1022 | color = g_string_append_c(color, *q); | |
| 1023 | q++; | |
| 1024 | } | |
| 1025 | g_string_append_printf(style, "background: %s; ", color->str); | |
| 1026 | g_string_free(color, TRUE); | |
| 1027 | p = q; | |
| 1028 | } else if(!g_ascii_strncasecmp(p, "color=", strlen("color="))) { | |
|
7095
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1029 | const char *q = p + strlen("color="); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1030 | GString *color = g_string_new(""); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1031 | if(*q == '\'' || *q == '\"') |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1032 | q++; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1033 | while(*q && *q != '\"' && *q != '\'' && *q != ' ') { |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1034 | color = g_string_append_c(color, *q); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1035 | q++; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1036 | } |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1037 | g_string_append_printf(style, "color: %s; ", color->str); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1038 | g_string_free(color, TRUE); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1039 | p = q; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1040 | } else if(!g_ascii_strncasecmp(p, "face=", strlen("face="))) { |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1041 | const char *q = p + strlen("face="); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1042 | gboolean space_allowed = FALSE; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1043 | GString *face = g_string_new(""); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1044 | if(*q == '\'' || *q == '\"') { |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1045 | space_allowed = TRUE; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1046 | q++; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1047 | } |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1048 | while(*q && *q != '\"' && *q != '\'' && (space_allowed || *q != ' ')) { |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1049 | face = g_string_append_c(face, *q); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1050 | q++; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1051 | } |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1052 | g_string_append_printf(style, "font-family: %s; ", face->str); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1053 | g_string_free(face, TRUE); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1054 | p = q; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1055 | } else if(!g_ascii_strncasecmp(p, "size=", strlen("size="))) { |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1056 | const char *q = p + strlen("size="); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1057 | int sz; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1058 | const char *size = "medium"; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1059 | if(*q == '\'' || *q == '\"') |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1060 | q++; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1061 | sz = atoi(q); |
| 8686 | 1062 | switch (sz) |
| 1063 | { | |
| 1064 | case 1: | |
| 1065 | size = "xx-small"; | |
| 1066 | break; | |
| 1067 | case 2: | |
| 1068 | size = "x-small"; | |
| 1069 | break; | |
| 1070 | case 3: | |
| 1071 | size = "small"; | |
| 1072 | break; | |
| 1073 | case 4: | |
| 1074 | size = "medium"; | |
| 1075 | break; | |
| 1076 | case 5: | |
| 1077 | size = "large"; | |
| 1078 | break; | |
| 1079 | case 6: | |
| 1080 | size = "x-large"; | |
| 1081 | break; | |
| 1082 | case 7: | |
| 1083 | size = "xx-large"; | |
| 1084 | break; | |
| 1085 | default: | |
| 1086 | break; | |
| 1087 | } | |
|
7095
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1088 | g_string_append_printf(style, "font-size: %s; ", size); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1089 | p = q; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1090 | } |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1091 | p++; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1092 | } |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1093 | c = strchr(c, '>') + 1; |
| 8064 | 1094 | pt = g_new0(struct gaim_parse_tag, 1); |
| 1095 | pt->src_tag = "font"; | |
| 1096 | pt->dest_tag = "span"; | |
| 1097 | tags = g_list_prepend(tags, pt); | |
| 1098 | if(style->len) | |
| 8026 | 1099 | g_string_append_printf(xhtml, "<span style='%s'>", style->str); |
| 8064 | 1100 | else |
| 1101 | pt->ignore = TRUE; | |
|
7095
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1102 | g_string_free(style, TRUE); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1103 | continue; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1104 | } |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1105 | if(!g_ascii_strncasecmp(c, "<body ", 6)) { |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1106 | const char *p = c; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1107 | gboolean did_something = FALSE; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1108 | while(*p && *p != '>') { |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1109 | if(!g_ascii_strncasecmp(p, "bgcolor=", strlen("bgcolor="))) { |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1110 | const char *q = p + strlen("bgcolor="); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1111 | struct gaim_parse_tag *pt = g_new0(struct gaim_parse_tag, 1); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1112 | GString *color = g_string_new(""); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1113 | if(*q == '\'' || *q == '\"') |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1114 | q++; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1115 | while(*q && *q != '\"' && *q != '\'' && *q != ' ') { |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1116 | color = g_string_append_c(color, *q); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1117 | q++; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1118 | } |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1119 | g_string_append_printf(xhtml, "<span style='background: %s;'>", color->str); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1120 | g_string_free(color, TRUE); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1121 | c = strchr(c, '>') + 1; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1122 | pt->src_tag = "body"; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1123 | pt->dest_tag = "span"; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1124 | tags = g_list_prepend(tags, pt); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1125 | did_something = TRUE; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1126 | break; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1127 | } |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1128 | p++; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1129 | } |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1130 | if(did_something) continue; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1131 | } |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1132 | /* this has to come after the special case for bgcolor */ |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1133 | ALLOW_TAG("body"); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1134 | if(!g_ascii_strncasecmp(c, "<!--", strlen("<!--"))) { |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1135 | char *p = strstr(c + strlen("<!--"), "-->"); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1136 | if(p) { |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1137 | xhtml = g_string_append(xhtml, "<!--"); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1138 | c += strlen("<!--"); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1139 | continue; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1140 | } |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1141 | } |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1142 | |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1143 | xhtml = g_string_append(xhtml, "<"); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1144 | plain = g_string_append_c(plain, '<'); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1145 | c++; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1146 | } |
| 7287 | 1147 | } else if(*c == '&') { |
| 1148 | char buf[7]; | |
| 1149 | char *pln; | |
| 1150 | int len = 1; | |
| 1151 | guint pound; | |
| 1152 | if(!g_ascii_strncasecmp(c, "&", 5)) { | |
| 1153 | pln = "&"; | |
| 1154 | len = 5; | |
| 1155 | } else if(!g_ascii_strncasecmp(c, "<", 4)) { | |
| 1156 | pln = "<"; | |
| 1157 | len = 4; | |
| 1158 | } else if(!g_ascii_strncasecmp(c, ">", 4)) { | |
| 1159 | pln = ">"; | |
| 1160 | len = 4; | |
| 1161 | } else if(!g_ascii_strncasecmp(c, " ", 6)) { | |
| 1162 | pln = " "; | |
| 1163 | len = 6; | |
| 1164 | } else if(!g_ascii_strncasecmp(c, "©", 6)) { | |
| 1165 | pln = "©"; | |
| 1166 | len = 6; | |
| 1167 | } else if(!g_ascii_strncasecmp(c, """, 6)) { | |
| 1168 | pln = "\""; | |
| 1169 | len = 6; | |
| 1170 | } else if(!g_ascii_strncasecmp(c, "®", 5)) { | |
| 1171 | pln = "®"; | |
| 1172 | len = 5; | |
| 1173 | } else if(!g_ascii_strncasecmp(c, "'", 6)) { | |
| 1174 | pln = "\'"; | |
| 1175 | len = 6; | |
| 1176 | } else if(*(c+1) == '#' && (sscanf(c, "&#%u;", £) == 1) && | |
| 1177 | pound != 0 && *(c+3+(gint)log10(pound)) == ';') { | |
| 1178 | int buflen = g_unichar_to_utf8((gunichar)pound, buf); | |
| 1179 | buf[buflen] = '\0'; | |
| 1180 | pln = buf; | |
| 1181 | ||
| 1182 | ||
| 1183 | len = 2; | |
| 1184 | while(isdigit((gint) c [len])) len++; | |
| 1185 | if(c [len] == ';') len++; | |
| 1186 | } else { | |
| 1187 | len = 1; | |
| 1188 | g_snprintf(buf, sizeof(buf), "%c", *c); | |
| 1189 | pln = buf; | |
| 1190 | } | |
| 1191 | xhtml = g_string_append_len(xhtml, c, len); | |
| 1192 | plain = g_string_append(plain, pln); | |
| 1193 | c += len; | |
|
7095
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1194 | } else { |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1195 | xhtml = g_string_append_c(xhtml, *c); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1196 | plain = g_string_append_c(plain, *c); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1197 | c++; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1198 | } |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1199 | } |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1200 | tag = tags; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1201 | while(tag) { |
| 8064 | 1202 | struct gaim_parse_tag *pt = tag->data; |
| 1203 | if(!pt->ignore) | |
| 1204 | g_string_append_printf(xhtml, "</%s>", pt->dest_tag); | |
|
7095
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1205 | tag = tag->next; |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1206 | } |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1207 | g_list_free(tags); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1208 | if(xhtml_out) |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1209 | *xhtml_out = g_strdup(xhtml->str); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1210 | if(plain_out) |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1211 | *plain_out = g_strdup(plain->str); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1212 | g_string_free(xhtml, TRUE); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1213 | g_string_free(plain, TRUE); |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1214 | } |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1215 | |
| 9161 | 1216 | /* The following are probably reasonable changes: |
| 1217 | * - \n should be converted to a normal space | |
| 1218 | * - in addition to <br>, <p> and <div> etc. should also be converted into \n | |
| 9241 | 1219 | * - We want to turn </td>#whitespace<td> sequences into a single tab |
| 1220 | * - We want to turn <td> into a single tab (for msn profile "parsing") | |
| 9161 | 1221 | * - We want to turn </tr>#whitespace<tr> sequences into a single \n |
| 9241 | 1222 | * - <script>...</script> and <style>...</style> should be completely removed |
| 9161 | 1223 | */ |
| 1224 | ||
|
7095
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1225 | char * |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1226 | gaim_markup_strip_html(const char *str) |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1227 | { |
| 7103 | 1228 | int i, j, k; |
| 1229 | gboolean visible = TRUE; | |
| 9161 | 1230 | gboolean closing_td_p = FALSE; |
| 7103 | 1231 | gchar *str2; |
| 9241 | 1232 | const gchar *cdata_close_tag = NULL; |
| 7103 | 1233 | |
| 7110 | 1234 | if(!str) |
| 1235 | return NULL; | |
| 7103 | 1236 | |
| 1237 | str2 = g_strdup(str); | |
| 1238 | ||
| 1239 | for (i = 0, j = 0; str2[i]; i++) | |
| 1240 | { | |
| 1241 | if (str2[i] == '<') | |
| 1242 | { | |
| 9241 | 1243 | if (cdata_close_tag) |
| 9161 | 1244 | { |
| 9241 | 1245 | /* Note: Don't even assume any other tag is a tag in CDATA */ |
| 1246 | if (strncasecmp(str2 + i, cdata_close_tag, | |
| 1247 | strlen(cdata_close_tag)) == 0) | |
| 1248 | { | |
| 1249 | i += strlen(cdata_close_tag) - 1; | |
| 1250 | cdata_close_tag = NULL; | |
| 1251 | } | |
| 1252 | continue; | |
| 1253 | } | |
| 1254 | else if (strncasecmp(str2 + i, "<td", 3) == 0 && closing_td_p) | |
| 1255 | { | |
| 1256 | str2[j++] = '\t'; | |
| 9161 | 1257 | visible = TRUE; |
| 1258 | } | |
| 1259 | else if (strncasecmp(str2 + i, "</td>", 5) == 0) | |
| 8517 | 1260 | { |
| 9161 | 1261 | closing_td_p = TRUE; |
| 1262 | visible = FALSE; | |
| 1263 | } | |
| 1264 | else | |
| 1265 | { | |
| 1266 | closing_td_p = FALSE; | |
| 1267 | visible = TRUE; | |
| 8517 | 1268 | } |
| 1269 | ||
| 7103 | 1270 | k = i + 1; |
| 1271 | ||
| 1272 | if(g_ascii_isspace(str2[k])) | |
| 1273 | visible = TRUE; | |
| 9170 | 1274 | else if (str2[k]) |
| 7103 | 1275 | { |
| 9161 | 1276 | /* Scan until we end the tag either implicitly (closed start |
| 1277 | * tag) or explicitly, using a sloppy method (i.e., < or > | |
| 1278 | * inside quoted attributes will screw us up) | |
| 1279 | */ | |
| 1280 | while (str2[k] && str2[k] != '<' && str2[k] != '>') | |
| 7103 | 1281 | { |
| 1282 | k++; | |
| 1283 | } | |
| 9241 | 1284 | |
| 9161 | 1285 | /* Check for tags which should be mapped to newline */ |
| 1286 | if (strncasecmp(str2 + i, "<p>", 3) == 0 | |
| 1287 | || strncasecmp(str2 + i, "<tr", 3) == 0 | |
| 1288 | || strncasecmp(str2 + i, "<br", 3) == 0 | |
| 1289 | || strncasecmp(str2 + i, "<li", 3) == 0 | |
| 1290 | || strncasecmp(str2 + i, "<div", 4) == 0 | |
| 1291 | || strncasecmp(str2 + i, "</table>", 8) == 0) | |
| 1292 | { | |
| 1293 | str2[j++] = '\n'; | |
| 1294 | } | |
| 9241 | 1295 | /* Check for tags which begin CDATA and need to be closed */ |
| 1296 | #if 0 /* FIXME.. option is end tag optional, we can't handle this right now */ | |
| 1297 | else if (strncasecmp(str2 + i, "<option", 7) == 0) | |
| 1298 | { | |
| 1299 | /* FIXME: We should not do this if the OPTION is SELECT'd */ | |
| 1300 | cdata_close_tag = "</option>"; | |
| 1301 | } | |
| 1302 | #endif | |
| 1303 | else if (strncasecmp(str2 + i, "<script", 7) == 0) | |
| 1304 | { | |
| 1305 | cdata_close_tag = "</script>"; | |
| 1306 | } | |
| 1307 | else if (strncasecmp(str2 + i, "<style", 6) == 0) | |
| 1308 | { | |
| 1309 | cdata_close_tag = "</style>"; | |
| 1310 | } | |
| 9161 | 1311 | /* Update the index and continue checking after the tag */ |
| 1312 | i = (str2[k] == '<')? k - 1: k; | |
| 1313 | continue; | |
| 7103 | 1314 | } |
| 1315 | } | |
| 9241 | 1316 | else if (cdata_close_tag) |
| 1317 | { | |
| 1318 | continue; | |
| 1319 | } | |
| 9161 | 1320 | else if (!g_ascii_isspace(str2[i])) |
| 7103 | 1321 | { |
| 1322 | visible = TRUE; | |
| 1323 | } | |
| 1324 | ||
| 9273 | 1325 | /* XXX: This sucks. We need to be un-escaping all entities, which |
| 1326 | * includes these, as well as the &#num; ones */ | |
| 1327 | ||
| 7103 | 1328 | if (str2[i] == '&' && strncasecmp(str2 + i, """, 6) == 0) |
| 1329 | { | |
| 1330 | str2[j++] = '\"'; | |
| 1331 | i = i + 5; | |
| 1332 | continue; | |
| 1333 | } | |
| 1334 | ||
| 8517 | 1335 | if (str2[i] == '&' && strncasecmp(str2 + i, "&", 5) == 0) |
| 1336 | { | |
| 1337 | str2[j++] = '&'; | |
| 1338 | i = i + 4; | |
| 1339 | continue; | |
| 1340 | } | |
| 1341 | ||
| 1342 | if (str2[i] == '&' && strncasecmp(str2 + i, "<", 4) == 0) | |
| 1343 | { | |
| 1344 | str2[j++] = '<'; | |
| 1345 | i = i + 3; | |
| 1346 | continue; | |
| 1347 | } | |
| 1348 | ||
| 1349 | if (str2[i] == '&' && strncasecmp(str2 + i, ">", 4) == 0) | |
| 1350 | { | |
| 1351 | str2[j++] = '>'; | |
| 1352 | i = i + 3; | |
| 1353 | continue; | |
| 1354 | } | |
| 1355 | ||
| 9273 | 1356 | if (str2[i] == '&' && strncasecmp(str2 + i, "'", 6) == 0) |
| 1357 | { | |
| 1358 | str2[j++] = '\''; | |
| 1359 | i = i + 5; | |
| 1360 | continue; | |
| 1361 | } | |
| 1362 | ||
| 7103 | 1363 | if (visible) |
| 9161 | 1364 | str2[j++] = g_ascii_isspace(str2[i])? ' ': str2[i]; |
| 7103 | 1365 | } |
| 1366 | ||
| 1367 | str2[j] = '\0'; | |
| 1368 | ||
| 1369 | return str2; | |
|
7095
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1370 | } |
|
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
1371 | |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1372 | static gint |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1373 | badchar(char c) |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1374 | { |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1375 | switch (c) { |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1376 | case ' ': |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1377 | case ',': |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1378 | case '\0': |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1379 | case '\n': |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1380 | case '<': |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1381 | case '>': |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1382 | case '"': |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1383 | case '\'': |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1384 | return 1; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1385 | default: |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1386 | return 0; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1387 | } |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1388 | } |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1389 | |
|
7107
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1390 | char * |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1391 | gaim_markup_linkify(const char *text) |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1392 | { |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1393 | const char *c, *t, *q = NULL; |
| 8918 | 1394 | char *tmp, *tmpurlbuf; |
|
7107
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1395 | char url_buf[BUF_LEN * 4]; |
|
9222
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1396 | gunichar g; |
| 8538 | 1397 | gboolean inside_html = FALSE; |
|
9222
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1398 | int inside_paren = 0; |
|
7107
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1399 | GString *ret = g_string_new(""); |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1400 | /* Assumes you have a buffer able to cary at least BUF_LEN * 2 bytes */ |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1401 | |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1402 | c = text; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1403 | while (*c) { |
|
9222
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1404 | |
|
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1405 | if(*c == '(' && !inside_html) { |
|
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1406 | inside_paren++; |
|
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1407 | ret = g_string_append_c(ret, *c); |
|
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1408 | c++; |
|
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1409 | } |
|
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1410 | |
| 8538 | 1411 | if(inside_html) { |
| 1412 | if(*c == '>') { | |
| 1413 | inside_html = FALSE; | |
| 1414 | } else if(!q && (*c == '\"' || *c == '\'')) { | |
| 1415 | q = c; | |
| 1416 | } else if(q) { | |
| 1417 | if(*c == *q) | |
| 1418 | q = NULL; | |
| 1419 | } | |
| 1420 | } else if(*c == '<') { | |
| 1421 | inside_html = TRUE; | |
| 9077 | 1422 | if (!g_ascii_strncasecmp(c, "<A", 2)) { |
| 1423 | while (1) { | |
| 1424 | if (!g_ascii_strncasecmp(c, "/A>", 3)) { | |
| 1425 | inside_html = FALSE; | |
| 1426 | break; | |
| 1427 | } | |
| 1428 | ret = g_string_append_c(ret, *c); | |
| 1429 | c++; | |
| 1430 | if (!(*c)) | |
| 1431 | break; | |
|
7107
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1432 | } |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1433 | } |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1434 | } else if ((*c=='h') && (!g_ascii_strncasecmp(c, "http://", 7) || |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1435 | (!g_ascii_strncasecmp(c, "https://", 8)))) { |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1436 | t = c; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1437 | while (1) { |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1438 | if (badchar(*t)) { |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1439 | |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1440 | if (*(t) == ',' && (*(t + 1) != ' ')) { |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1441 | t++; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1442 | continue; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1443 | } |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1444 | |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1445 | if (*(t - 1) == '.') |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1446 | t--; |
|
9222
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1447 | if ((*(t - 1) == ')' && (inside_paren > 0))) { |
|
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1448 | t--; |
|
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1449 | } |
|
7107
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1450 | strncpy(url_buf, c, t - c); |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1451 | url_buf[t - c] = 0; |
| 8918 | 1452 | tmpurlbuf = gaim_unescape_html(url_buf); |
|
7107
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1453 | g_string_append_printf(ret, "<A HREF=\"%s\">%s</A>", |
| 8918 | 1454 | tmpurlbuf, url_buf); |
| 1455 | g_free(tmpurlbuf); | |
|
7107
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1456 | c = t; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1457 | break; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1458 | } |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1459 | if (!t) |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1460 | break; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1461 | t++; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1462 | |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1463 | } |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1464 | } else if (!g_ascii_strncasecmp(c, "www.", 4)) { |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1465 | if (c[4] != '.') { |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1466 | t = c; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1467 | while (1) { |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1468 | if (badchar(*t)) { |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1469 | if (t - c == 4) { |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1470 | break; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1471 | } |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1472 | |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1473 | if (*(t) == ',' && (*(t + 1) != ' ')) { |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1474 | t++; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1475 | continue; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1476 | } |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1477 | |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1478 | if (*(t - 1) == '.') |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1479 | t--; |
|
9222
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1480 | if ((*(t - 1) == ')' && (inside_paren > 0))) { |
|
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1481 | t--; |
|
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1482 | } |
|
7107
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1483 | strncpy(url_buf, c, t - c); |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1484 | url_buf[t - c] = 0; |
| 8918 | 1485 | tmpurlbuf = gaim_unescape_html(url_buf); |
|
7107
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1486 | g_string_append_printf(ret, |
| 8918 | 1487 | "<A HREF=\"http://%s\">%s</A>", tmpurlbuf, |
|
7107
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1488 | url_buf); |
| 8918 | 1489 | g_free(tmpurlbuf); |
|
7107
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1490 | c = t; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1491 | break; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1492 | } |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1493 | if (!t) |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1494 | break; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1495 | t++; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1496 | } |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1497 | } |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1498 | } else if (!g_ascii_strncasecmp(c, "ftp://", 6)) { |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1499 | t = c; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1500 | while (1) { |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1501 | if (badchar(*t)) { |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1502 | if (*(t - 1) == '.') |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1503 | t--; |
|
9222
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1504 | if ((*(t - 1) == ')' && (inside_paren > 0))) { |
|
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1505 | t--; |
|
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1506 | } |
|
7107
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1507 | strncpy(url_buf, c, t - c); |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1508 | url_buf[t - c] = 0; |
| 8918 | 1509 | tmpurlbuf = gaim_unescape_html(url_buf); |
|
7107
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1510 | g_string_append_printf(ret, "<A HREF=\"%s\">%s</A>", |
| 8918 | 1511 | tmpurlbuf, url_buf); |
| 1512 | g_free(tmpurlbuf); | |
|
7107
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1513 | c = t; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1514 | break; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1515 | } |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1516 | if (!t) |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1517 | break; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1518 | t++; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1519 | |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1520 | } |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1521 | } else if (!g_ascii_strncasecmp(c, "ftp.", 4)) { |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1522 | if (c[4] != '.') { |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1523 | t = c; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1524 | while (1) { |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1525 | if (badchar(*t)) { |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1526 | if (t - c == 4) { |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1527 | break; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1528 | } |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1529 | if (*(t - 1) == '.') |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1530 | t--; |
|
9222
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1531 | if ((*(t - 1) == ')' && (inside_paren > 0))) { |
|
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1532 | t--; |
|
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1533 | } |
|
7107
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1534 | strncpy(url_buf, c, t - c); |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1535 | url_buf[t - c] = 0; |
| 8918 | 1536 | tmpurlbuf = gaim_unescape_html(url_buf); |
|
7107
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1537 | g_string_append_printf(ret, |
| 8918 | 1538 | "<A HREF=\"ftp://%s\">%s</A>", tmpurlbuf, |
|
7107
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1539 | url_buf); |
| 8918 | 1540 | g_free(tmpurlbuf); |
|
7107
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1541 | c = t; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1542 | break; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1543 | } |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1544 | if (!t) |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1545 | break; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1546 | t++; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1547 | } |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1548 | } |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1549 | } else if (!g_ascii_strncasecmp(c, "mailto:", 7)) { |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1550 | t = c; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1551 | while (1) { |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1552 | if (badchar(*t)) { |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1553 | if (*(t - 1) == '.') |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1554 | t--; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1555 | strncpy(url_buf, c, t - c); |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1556 | url_buf[t - c] = 0; |
| 8918 | 1557 | tmpurlbuf = gaim_unescape_html(url_buf); |
|
7107
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1558 | g_string_append_printf(ret, "<A HREF=\"%s\">%s</A>", |
| 8918 | 1559 | tmpurlbuf, url_buf); |
| 1560 | g_free(tmpurlbuf); | |
|
7107
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1561 | c = t; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1562 | break; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1563 | } |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1564 | if (!t) |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1565 | break; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1566 | t++; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1567 | |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1568 | } |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1569 | } else if (c != text && (*c == '@')) { |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1570 | int flag; |
|
9222
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1571 | GString *gurl_buf; |
|
7107
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1572 | const char illegal_chars[] = "!@#$%^&*()[]{}/|\\<>\":;\r\n \0"; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1573 | url_buf[0] = 0; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1574 | |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1575 | if (strchr(illegal_chars,*(c - 1)) || strchr(illegal_chars, *(c + 1))) |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1576 | flag = 0; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1577 | else |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1578 | flag = 1; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1579 | |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1580 | t = c; |
|
9222
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1581 | gurl_buf = g_string_new(""); |
|
7107
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1582 | while (flag) { |
|
9222
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1583 | /* iterate backwards grabbing the local part of an email address */ |
|
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1584 | g = g_utf8_get_char(t); |
|
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1585 | if (badchar(*t) || (g >= 127) || (*t == '(') || |
|
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1586 | ((*t == ';') && (t > (text+2)) && !g_ascii_strncasecmp(t - 3, "<", 4))) { |
|
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1587 | /* local part will already be part of ret, strip it out */ |
|
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1588 | ret = g_string_truncate(ret, ret->len - (c - t)); |
|
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1589 | ret = g_string_append_unichar(ret, g); |
|
7107
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1590 | break; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1591 | } else { |
|
9222
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1592 | g_string_prepend_unichar(gurl_buf, g); |
|
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1593 | t = g_utf8_find_prev_char(text, t); |
|
7107
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1594 | if (t < text) { |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1595 | ret = g_string_assign(ret, ""); |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1596 | break; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1597 | } |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1598 | } |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1599 | } |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1600 | |
|
9222
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1601 | t = g_utf8_find_next_char(c, NULL); |
|
7107
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1602 | |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1603 | while (flag) { |
|
9222
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1604 | /* iterate forwards grabbing the domain part of an email address */ |
|
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1605 | g = g_utf8_get_char(t); |
|
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1606 | if (badchar(*t) || (g >= 127) || (*t == ')') || |
|
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1607 | ((*t == '&') && !g_ascii_strncasecmp(t, ">", 4))) { |
|
7107
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1608 | char *d; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1609 | |
|
9222
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1610 | strcpy(url_buf, gurl_buf->str); |
|
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1611 | |
|
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1612 | /* strip off trailing periods */ |
|
7107
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1613 | for (d = url_buf + strlen(url_buf) - 1; *d == '.'; d--, t--) |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1614 | *d = '\0'; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1615 | |
| 8918 | 1616 | tmpurlbuf = gaim_unescape_html(url_buf); |
| 9045 | 1617 | if (gaim_email_is_valid(tmpurlbuf)) { |
| 1618 | g_string_append_printf(ret, "<A HREF=\"mailto:%s\">%s</A>", | |
| 1619 | tmpurlbuf, url_buf); | |
| 1620 | } else { | |
| 1621 | g_string_append(ret, url_buf); | |
| 1622 | } | |
| 8918 | 1623 | g_free(tmpurlbuf); |
|
7107
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1624 | c = t; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1625 | |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1626 | break; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1627 | } else { |
|
9222
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1628 | g_string_append_unichar(gurl_buf, g); |
|
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1629 | t = g_utf8_find_next_char(t, NULL); |
|
7107
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1630 | } |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1631 | } |
|
9222
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1632 | g_string_free(gurl_buf, TRUE); |
|
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1633 | } |
|
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1634 | |
|
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1635 | if(*c == ')' && !inside_html) { |
|
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1636 | inside_paren--; |
|
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1637 | ret = g_string_append_c(ret, *c); |
|
e15847e6086a
[gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9220
diff
changeset
|
1638 | c++; |
|
7107
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1639 | } |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1640 | |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1641 | if (*c == 0) |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1642 | break; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1643 | |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1644 | ret = g_string_append_c(ret, *c); |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1645 | c++; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1646 | |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1647 | } |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1648 | tmp = ret->str; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1649 | g_string_free(ret, FALSE); |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1650 | return tmp; |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1651 | } |
|
903864ff76c3
[gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents:
7106
diff
changeset
|
1652 | |
| 8163 | 1653 | char * |
| 1654 | gaim_escape_html(const char *html) { | |
|
9777
82ae75055e22
[gaim-migrate @ 10645]
Mark Doliner <markdoliner@pidgin.im>
parents:
9725
diff
changeset
|
1655 | const char *c = html; |
|
9786
177d8ed6e8fd
[gaim-migrate @ 10654]
Mark Doliner <markdoliner@pidgin.im>
parents:
9777
diff
changeset
|
1656 | GString *ret; |
|
9777
82ae75055e22
[gaim-migrate @ 10645]
Mark Doliner <markdoliner@pidgin.im>
parents:
9725
diff
changeset
|
1657 | |
|
82ae75055e22
[gaim-migrate @ 10645]
Mark Doliner <markdoliner@pidgin.im>
parents:
9725
diff
changeset
|
1658 | if (html == NULL) |
|
82ae75055e22
[gaim-migrate @ 10645]
Mark Doliner <markdoliner@pidgin.im>
parents:
9725
diff
changeset
|
1659 | return NULL; |
|
82ae75055e22
[gaim-migrate @ 10645]
Mark Doliner <markdoliner@pidgin.im>
parents:
9725
diff
changeset
|
1660 | |
|
9786
177d8ed6e8fd
[gaim-migrate @ 10654]
Mark Doliner <markdoliner@pidgin.im>
parents:
9777
diff
changeset
|
1661 | ret = g_string_new(""); |
|
177d8ed6e8fd
[gaim-migrate @ 10654]
Mark Doliner <markdoliner@pidgin.im>
parents:
9777
diff
changeset
|
1662 | |
|
9777
82ae75055e22
[gaim-migrate @ 10645]
Mark Doliner <markdoliner@pidgin.im>
parents:
9725
diff
changeset
|
1663 | while (*c) { |
|
82ae75055e22
[gaim-migrate @ 10645]
Mark Doliner <markdoliner@pidgin.im>
parents:
9725
diff
changeset
|
1664 | switch (*c) { |
|
82ae75055e22
[gaim-migrate @ 10645]
Mark Doliner <markdoliner@pidgin.im>
parents:
9725
diff
changeset
|
1665 | case '&': |
|
82ae75055e22
[gaim-migrate @ 10645]
Mark Doliner <markdoliner@pidgin.im>
parents:
9725
diff
changeset
|
1666 | ret = g_string_append(ret, "&"); |
|
82ae75055e22
[gaim-migrate @ 10645]
Mark Doliner <markdoliner@pidgin.im>
parents:
9725
diff
changeset
|
1667 | break; |
|
82ae75055e22
[gaim-migrate @ 10645]
Mark Doliner <markdoliner@pidgin.im>
parents:
9725
diff
changeset
|
1668 | case '<': |
|
82ae75055e22
[gaim-migrate @ 10645]
Mark Doliner <markdoliner@pidgin.im>
parents:
9725
diff
changeset
|
1669 | ret = g_string_append(ret, "<"); |
|
82ae75055e22
[gaim-migrate @ 10645]
Mark Doliner <markdoliner@pidgin.im>
parents:
9725
diff
changeset
|
1670 | break; |
|
82ae75055e22
[gaim-migrate @ 10645]
Mark Doliner <markdoliner@pidgin.im>
parents:
9725
diff
changeset
|
1671 | case '>': |
|
82ae75055e22
[gaim-migrate @ 10645]
Mark Doliner <markdoliner@pidgin.im>
parents:
9725
diff
changeset
|
1672 | ret = g_string_append(ret, ">"); |
|
82ae75055e22
[gaim-migrate @ 10645]
Mark Doliner <markdoliner@pidgin.im>
parents:
9725
diff
changeset
|
1673 | break; |
|
82ae75055e22
[gaim-migrate @ 10645]
Mark Doliner <markdoliner@pidgin.im>
parents:
9725
diff
changeset
|
1674 | case '"': |
|
82ae75055e22
[gaim-migrate @ 10645]
Mark Doliner <markdoliner@pidgin.im>
parents:
9725
diff
changeset
|
1675 | ret = g_string_append(ret, """); |
|
82ae75055e22
[gaim-migrate @ 10645]
Mark Doliner <markdoliner@pidgin.im>
parents:
9725
diff
changeset
|
1676 | break; |
|
82ae75055e22
[gaim-migrate @ 10645]
Mark Doliner <markdoliner@pidgin.im>
parents:
9725
diff
changeset
|
1677 | default: |
|
82ae75055e22
[gaim-migrate @ 10645]
Mark Doliner <markdoliner@pidgin.im>
parents:
9725
diff
changeset
|
1678 | ret = g_string_append_c(ret, *c); |
| 8163 | 1679 | } |
|
9777
82ae75055e22
[gaim-migrate @ 10645]
Mark Doliner <markdoliner@pidgin.im>
parents:
9725
diff
changeset
|
1680 | c++; |
| 8163 | 1681 | } |
|
9696
9d62e1ec5977
[gaim-migrate @ 10555]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9670
diff
changeset
|
1682 | |
|
9777
82ae75055e22
[gaim-migrate @ 10645]
Mark Doliner <markdoliner@pidgin.im>
parents:
9725
diff
changeset
|
1683 | return g_string_free(ret, FALSE); |
| 8163 | 1684 | } |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1685 | |
| 8442 | 1686 | char * |
| 1687 | gaim_unescape_html(const char *html) { | |
| 1688 | char *unescaped = NULL; | |
| 1689 | ||
| 1690 | if (html != NULL) { | |
| 1691 | const char *c = html; | |
| 1692 | GString *ret = g_string_new(""); | |
| 1693 | while (*c) { | |
| 1694 | if (!strncmp(c, "&", 5)) { | |
| 1695 | ret = g_string_append_c(ret, '&'); | |
| 1696 | c += 5; | |
| 1697 | } else if (!strncmp(c, "<", 4)) { | |
| 1698 | ret = g_string_append_c(ret, '<'); | |
| 1699 | c += 4; | |
| 1700 | } else if (!strncmp(c, ">", 4)) { | |
| 1701 | ret = g_string_append_c(ret, '>'); | |
| 1702 | c += 4; | |
| 1703 | } else if (!strncmp(c, """, 6)) { | |
| 1704 | ret = g_string_append_c(ret, '"'); | |
| 1705 | c += 6; | |
| 8625 | 1706 | } else if (!strncmp(c, "'", 6)) { |
| 1707 | ret = g_string_append_c(ret, '\''); | |
| 1708 | c += 6; | |
| 8500 | 1709 | } else if (!strncmp(c, "<br>", 4)) { |
| 1710 | ret = g_string_append_c(ret, '\n'); | |
| 1711 | c += 4; | |
| 8442 | 1712 | } else { |
| 1713 | ret = g_string_append_c(ret, *c); | |
| 1714 | c++; | |
| 1715 | } | |
| 1716 | } | |
| 1717 | ||
| 1718 | unescaped = ret->str; | |
| 1719 | g_string_free(ret, FALSE); | |
| 1720 | } | |
| 1721 | return unescaped; | |
| 1722 | ||
| 1723 | } | |
| 1724 | ||
| 9175 | 1725 | char * |
| 1726 | gaim_markup_slice(const char *str, guint x, guint y) | |
| 1727 | { | |
| 1728 | GString *ret; | |
| 1729 | GQueue *q; | |
| 1730 | guint z = 0; | |
| 1731 | gboolean appended = FALSE; | |
| 1732 | gunichar c; | |
| 1733 | char *tag; | |
| 1734 | ||
| 1735 | g_return_val_if_fail(x <= y, NULL); | |
| 1736 | ||
| 1737 | if (x == y) | |
| 1738 | return g_strdup(""); | |
| 1739 | ||
| 1740 | ret = g_string_new(""); | |
| 1741 | q = g_queue_new(); | |
| 1742 | ||
| 1743 | while (*str && (z < y)) { | |
| 1744 | c = g_utf8_get_char(str); | |
| 1745 | ||
| 1746 | if (c == '<') { | |
| 1747 | char *end = strchr(str, '>'); | |
| 1748 | ||
| 1749 | if (!end) { | |
| 1750 | g_string_free(ret, TRUE); | |
| 1751 | while ((tag = g_queue_pop_head(q))) | |
| 1752 | g_free(tag); | |
| 1753 | g_queue_free(q); | |
| 1754 | return NULL; | |
| 1755 | } | |
| 1756 | ||
| 1757 | if (!g_ascii_strncasecmp(str, "<img ", 5)) { | |
| 1758 | z += strlen("[Image]"); | |
| 1759 | } else if (!g_ascii_strncasecmp(str, "<br", 3)) { | |
| 1760 | z += 1; | |
| 1761 | } else if (!g_ascii_strncasecmp(str, "<hr>", 4)) { | |
| 1762 | z += strlen("\n---\n"); | |
| 1763 | } else if (!g_ascii_strncasecmp(str, "</", 2)) { | |
| 1764 | /* pop stack */ | |
| 1765 | char *tmp; | |
| 1766 | ||
| 1767 | tmp = g_queue_pop_head(q); | |
| 1768 | if (tmp) | |
| 1769 | g_free(tmp); | |
| 1770 | /* z += 0; */ | |
| 1771 | } else { | |
| 1772 | /* push it unto the stack */ | |
| 1773 | char *tmp; | |
| 1774 | ||
| 1775 | tmp = g_strndup(str, end - str + 1); | |
| 1776 | g_queue_push_head(q, tmp); | |
| 1777 | /* z += 0; */ | |
| 1778 | } | |
| 1779 | ||
| 1780 | if (z == x && !appended) { | |
| 1781 | GList *l = q->tail; | |
| 1782 | ||
| 1783 | while (l) { | |
| 1784 | tag = l->data; | |
| 1785 | g_string_append(ret, tag); | |
| 1786 | l = l->prev; | |
| 1787 | } | |
| 1788 | appended = TRUE; | |
| 1789 | } else if (z >= x) { | |
| 1790 | g_string_append_len(ret, str, end - str + 1); | |
| 1791 | } | |
| 1792 | ||
| 1793 | str = end; | |
| 1794 | } else if (c == '&') { | |
| 1795 | char *end = strchr(str, ';'); | |
| 1796 | if (!end) { | |
| 1797 | g_string_free(ret, TRUE); | |
| 1798 | while ((tag = g_queue_pop_head(q))) | |
| 1799 | g_free(tag); | |
| 1800 | g_queue_free(q); | |
| 1801 | ||
| 1802 | return NULL; | |
| 1803 | } | |
| 1804 | ||
| 1805 | if (z >= x) | |
| 1806 | g_string_append_len(ret, str, end - str + 1); | |
| 1807 | ||
| 1808 | z++; | |
| 1809 | str = end; | |
| 1810 | } else { | |
| 1811 | if (z >= x) | |
| 1812 | g_string_append_unichar(ret, c); | |
| 1813 | z++; | |
| 1814 | } | |
| 1815 | ||
| 1816 | str = g_utf8_next_char(str); | |
| 1817 | } | |
| 1818 | ||
| 1819 | while ((tag = g_queue_pop_head(q))) { | |
| 1820 | char *name; | |
| 1821 | ||
| 1822 | name = gaim_markup_get_tag_name(tag); | |
| 1823 | g_string_append_printf(ret, "</%s>", name); | |
| 1824 | g_free(name); | |
| 1825 | g_free(tag); | |
| 1826 | } | |
| 1827 | ||
| 1828 | g_queue_free(q); | |
| 1829 | return g_string_free(ret, FALSE); | |
| 1830 | } | |
| 1831 | ||
| 1832 | char * | |
| 1833 | gaim_markup_get_tag_name(const char *tag) | |
| 1834 | { | |
| 1835 | int i; | |
| 1836 | g_return_val_if_fail(tag != NULL, NULL); | |
| 1837 | g_return_val_if_fail(*tag == '<', NULL); | |
| 1838 | ||
| 1839 | for (i = 1; tag[i]; i++) | |
| 1840 | if (tag[i] == '>' || tag[i] == ' ' || tag[i] == '/') | |
| 1841 | break; | |
| 1842 | ||
| 1843 | return g_strndup(tag, i); | |
| 1844 | } | |
| 1845 | ||
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1846 | /************************************************************************** |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1847 | * Path/Filename Functions |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1848 | **************************************************************************/ |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1849 | const char * |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1850 | gaim_home_dir(void) |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1851 | { |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1852 | #ifndef _WIN32 |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1853 | if(g_get_home_dir()) |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1854 | return g_get_home_dir(); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1855 | else |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1856 | return NULL; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1857 | #else |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1858 | return wgaim_data_dir(); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1859 | #endif |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1860 | } |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1861 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1862 | /* returns a string of the form ~/.gaim, where ~ is replaced by the user's home |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1863 | * dir. Note that there is no trailing slash after .gaim. */ |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1864 | char * |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1865 | gaim_user_dir(void) |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1866 | { |
| 8596 | 1867 | if (custom_home_dir != NULL && strlen(custom_home_dir) > 0) { |
| 1868 | strcpy ((char*) &home_dir, (char*) &custom_home_dir); | |
| 1869 | } else { | |
| 1870 | const gchar *hd = gaim_home_dir(); | |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1871 | |
| 8596 | 1872 | if (hd) { |
|
9916
9ccd988b02c4
[gaim-migrate @ 10808]
Daniel Atallah <datallah@pidgin.im>
parents:
9818
diff
changeset
|
1873 | g_strlcpy((char*) &home_dir, hd, sizeof(home_dir)); |
|
9ccd988b02c4
[gaim-migrate @ 10808]
Daniel Atallah <datallah@pidgin.im>
parents:
9818
diff
changeset
|
1874 | g_strlcat((char*) &home_dir, G_DIR_SEPARATOR_S ".gaim", |
|
9ccd988b02c4
[gaim-migrate @ 10808]
Daniel Atallah <datallah@pidgin.im>
parents:
9818
diff
changeset
|
1875 | sizeof(home_dir)); |
| 8596 | 1876 | } |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1877 | } |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1878 | |
| 8596 | 1879 | return home_dir; |
| 1880 | } | |
| 1881 | ||
| 1882 | void set_gaim_user_dir(const char *dir) | |
| 1883 | { | |
| 1884 | if (dir != NULL && strlen(dir) > 0) { | |
|
9916
9ccd988b02c4
[gaim-migrate @ 10808]
Daniel Atallah <datallah@pidgin.im>
parents:
9818
diff
changeset
|
1885 | g_strlcpy((char*) &custom_home_dir, dir, |
|
9ccd988b02c4
[gaim-migrate @ 10808]
Daniel Atallah <datallah@pidgin.im>
parents:
9818
diff
changeset
|
1886 | sizeof(custom_home_dir)); |
| 8596 | 1887 | } |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1888 | } |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1889 | |
| 7622 | 1890 | int gaim_build_dir (const char *path, int mode) |
| 7612 | 1891 | { |
| 1892 | char *dir, **components, delim[] = { G_DIR_SEPARATOR, '\0' }; | |
| 1893 | int cur, len; | |
| 1894 | ||
| 7632 | 1895 | g_return_val_if_fail(path != NULL, -1); |
| 7612 | 1896 | |
| 1897 | dir = g_new0(char, strlen(path) + 1); | |
| 7622 | 1898 | components = g_strsplit(path, delim, -1); |
| 7612 | 1899 | len = 0; |
| 1900 | for (cur = 0; components[cur] != NULL; cur++) { | |
| 7633 | 1901 | /* If you don't know what you're doing on both |
| 1902 | * win32 and *NIX, stay the hell away from this code */ | |
| 1903 | if(cur > 1) | |
| 1904 | dir[len++] = G_DIR_SEPARATOR; | |
| 7612 | 1905 | strcpy(dir + len, components[cur]); |
| 1906 | len += strlen(components[cur]); | |
| 7633 | 1907 | if(cur == 0) |
| 1908 | dir[len++] = G_DIR_SEPARATOR; | |
| 7632 | 1909 | |
| 1910 | if(g_file_test(dir, G_FILE_TEST_IS_DIR)) { | |
| 1911 | continue; | |
| 1912 | } else if(g_file_test(dir, G_FILE_TEST_EXISTS)) { | |
|
9716
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
1913 | gaim_debug_warning("build_dir", "bad path: %s\n", path); |
| 7612 | 1914 | g_strfreev(components); |
| 1915 | g_free(dir); | |
| 1916 | return -1; | |
| 1917 | } | |
| 1918 | ||
| 1919 | if (mkdir(dir, mode) < 0) { | |
|
9716
4011c0d5f384
[gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents:
9696
diff
changeset
|
1920 | gaim_debug_warning("build_dir", "mkdir: %s\n", strerror(errno)); |
| 7612 | 1921 | g_strfreev(components); |
| 1922 | g_free(dir); | |
| 1923 | return -1; | |
| 1924 | } | |
| 1925 | } | |
| 1926 | ||
| 1927 | g_strfreev(components); | |
| 1928 | g_free(dir); | |
| 1929 | return 0; | |
| 1930 | } | |
| 1931 | ||
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1932 | /* |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1933 | * Like mkstemp() but returns a file pointer, uses a pre-set template, |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1934 | * uses the semantics of tempnam() for the directory to use and allocates |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1935 | * the space for the filepath. |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1936 | * |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1937 | * Caller is responsible for closing the file and removing it when done, |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1938 | * as well as freeing the space pointed-to by "path" with g_free(). |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1939 | * |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1940 | * Returns NULL on failure and cleans up after itself if so. |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1941 | */ |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1942 | static const char *gaim_mkstemp_templ = {"gaimXXXXXX"}; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1943 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1944 | FILE * |
|
10203
21d6c11a53c6
[gaim-migrate @ 11324]
Herman Bloggs <herman@bluedigits.com>
parents:
10112
diff
changeset
|
1945 | gaim_mkstemp(char **fpath, gboolean binary) |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1946 | { |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1947 | const gchar *tmpdir; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1948 | #ifndef _WIN32 |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1949 | int fd; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1950 | #endif |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1951 | FILE *fp = NULL; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1952 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1953 | g_return_val_if_fail(fpath != NULL, NULL); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1954 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1955 | if((tmpdir = (gchar*)g_get_tmp_dir()) != NULL) { |
| 9427 | 1956 | if((*fpath = g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s", tmpdir, gaim_mkstemp_templ)) != NULL) { |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1957 | #ifdef _WIN32 |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1958 | char* result = _mktemp( *fpath ); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1959 | if( result == NULL ) |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1960 | gaim_debug(GAIM_DEBUG_ERROR, "gaim_mkstemp", |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1961 | "Problem creating the template\n"); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1962 | else |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1963 | { |
|
10203
21d6c11a53c6
[gaim-migrate @ 11324]
Herman Bloggs <herman@bluedigits.com>
parents:
10112
diff
changeset
|
1964 | if( (fp = fopen( result, binary?"wb+":"w+")) == NULL ) { |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1965 | gaim_debug(GAIM_DEBUG_ERROR, "gaim_mkstemp", |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1966 | "Couldn't fopen() %s\n", result); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1967 | } |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1968 | } |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1969 | #else |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1970 | if((fd = mkstemp(*fpath)) == -1) { |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1971 | gaim_debug(GAIM_DEBUG_ERROR, "gaim_mkstemp", |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1972 | "Couldn't make \"%s\", error: %d\n", |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1973 | *fpath, errno); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1974 | } else { |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1975 | if((fp = fdopen(fd, "r+")) == NULL) { |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1976 | close(fd); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1977 | gaim_debug(GAIM_DEBUG_ERROR, "gaim_mkstemp", |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1978 | "Couldn't fdopen(), error: %d\n", errno); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1979 | } |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1980 | } |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1981 | #endif |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1982 | if(!fp) { |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1983 | g_free(*fpath); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1984 | *fpath = NULL; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1985 | } |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1986 | } |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1987 | } else { |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1988 | gaim_debug(GAIM_DEBUG_ERROR, "gaim_mkstemp", |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1989 | "g_get_tmp_dir() failed!"); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1990 | } |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1991 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1992 | return fp; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1993 | } |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1994 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1995 | gboolean |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1996 | gaim_program_is_valid(const char *program) |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1997 | { |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1998 | GError *error = NULL; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1999 | char **argv; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2000 | gchar *progname; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2001 | gboolean is_valid = FALSE; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2002 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2003 | g_return_val_if_fail(program != NULL, FALSE); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2004 | g_return_val_if_fail(*program != '\0', FALSE); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2005 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2006 | if (!g_shell_parse_argv(program, NULL, &argv, &error)) { |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2007 | gaim_debug(GAIM_DEBUG_ERROR, "program_is_valid", |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2008 | "Could not parse program '%s': %s\n", |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2009 | program, error->message); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2010 | g_error_free(error); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2011 | return FALSE; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2012 | } |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2013 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2014 | if (argv == NULL) { |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2015 | return FALSE; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2016 | } |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2017 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2018 | progname = g_find_program_in_path(argv[0]); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2019 | is_valid = (progname != NULL); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2020 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2021 | g_strfreev(argv); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2022 | g_free(progname); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2023 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2024 | return is_valid; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2025 | } |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2026 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2027 | char * |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2028 | gaim_fd_get_ip(int fd) |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2029 | { |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2030 | struct sockaddr addr; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2031 | socklen_t namelen = sizeof(addr); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2032 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2033 | g_return_val_if_fail(fd != 0, NULL); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2034 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2035 | if (getsockname(fd, &addr, &namelen)) |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2036 | return NULL; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2037 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2038 | return g_strdup(inet_ntoa(((struct sockaddr_in *)&addr)->sin_addr)); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2039 | } |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2040 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2041 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2042 | /************************************************************************** |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2043 | * String Functions |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2044 | **************************************************************************/ |
| 7162 | 2045 | const char * |
| 7261 | 2046 | gaim_normalize(const GaimAccount *account, const char *s) |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2047 | { |
| 7261 | 2048 | GaimPlugin *prpl = NULL; |
| 2049 | GaimPluginProtocolInfo *prpl_info = NULL; | |
| 7430 | 2050 | const char *ret = NULL; |
| 7261 | 2051 | |
| 2052 | if(account) | |
| 7956 | 2053 | prpl = gaim_find_prpl(gaim_account_get_protocol_id(account)); |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2054 | |
| 7261 | 2055 | if(prpl) |
| 2056 | prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); | |
| 2057 | ||
| 7430 | 2058 | if(prpl_info && prpl_info->normalize) |
| 2059 | ret = prpl_info->normalize(account, s); | |
| 2060 | ||
| 2061 | if(!ret) { | |
| 7261 | 2062 | static char buf[BUF_LEN]; |
| 2063 | char *tmp; | |
| 2064 | int i, j; | |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2065 | |
| 7261 | 2066 | g_return_val_if_fail(s != NULL, NULL); |
| 2067 | ||
| 2068 | strncpy(buf, s, BUF_LEN); | |
| 2069 | for (i=0, j=0; buf[j]; i++, j++) { | |
| 2070 | while (buf[j] == ' ') | |
| 2071 | j++; | |
| 2072 | buf[i] = buf[j]; | |
| 2073 | } | |
| 2074 | buf[i] = '\0'; | |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2075 | |
| 7261 | 2076 | tmp = g_utf8_strdown(buf, -1); |
| 2077 | g_snprintf(buf, sizeof(buf), "%s", tmp); | |
| 2078 | g_free(tmp); | |
| 2079 | tmp = g_utf8_normalize(buf, -1, G_NORMALIZE_DEFAULT); | |
| 2080 | g_snprintf(buf, sizeof(buf), "%s", tmp); | |
| 2081 | g_free(tmp); | |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2082 | |
| 7430 | 2083 | ret = buf; |
| 7261 | 2084 | } |
| 7430 | 2085 | return ret; |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2086 | } |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2087 | |
|
8700
0c9288c5e40e
[gaim-migrate @ 9453]
Mark Doliner <markdoliner@pidgin.im>
parents:
8686
diff
changeset
|
2088 | gchar * |
|
0c9288c5e40e
[gaim-migrate @ 9453]
Mark Doliner <markdoliner@pidgin.im>
parents:
8686
diff
changeset
|
2089 | gaim_str_sub_away_formatters(const char *str, const char *name) |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2090 | { |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2091 | char *c; |
|
8700
0c9288c5e40e
[gaim-migrate @ 9453]
Mark Doliner <markdoliner@pidgin.im>
parents:
8686
diff
changeset
|
2092 | gchar *cpy; |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2093 | int cnt = 0; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2094 | time_t t; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2095 | struct tm *tme; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2096 | char tmp[20]; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2097 | |
|
8700
0c9288c5e40e
[gaim-migrate @ 9453]
Mark Doliner <markdoliner@pidgin.im>
parents:
8686
diff
changeset
|
2098 | g_return_val_if_fail(str != NULL, NULL); |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2099 | g_return_val_if_fail(name != NULL, NULL); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2100 | |
|
8700
0c9288c5e40e
[gaim-migrate @ 9453]
Mark Doliner <markdoliner@pidgin.im>
parents:
8686
diff
changeset
|
2101 | cpy = g_malloc(BUF_LONG); |
|
0c9288c5e40e
[gaim-migrate @ 9453]
Mark Doliner <markdoliner@pidgin.im>
parents:
8686
diff
changeset
|
2102 | |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2103 | t = time(NULL); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2104 | tme = localtime(&t); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2105 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2106 | cpy[0] = '\0'; |
|
8700
0c9288c5e40e
[gaim-migrate @ 9453]
Mark Doliner <markdoliner@pidgin.im>
parents:
8686
diff
changeset
|
2107 | c = (char *)str; |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2108 | while (*c) { |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2109 | switch (*c) { |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2110 | case '%': |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2111 | if (*(c + 1)) { |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2112 | switch (*(c + 1)) { |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2113 | case 'n': |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2114 | /* append name */ |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2115 | strcpy(cpy + cnt, name); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2116 | cnt += strlen(name); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2117 | c++; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2118 | break; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2119 | case 'd': |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2120 | /* append date */ |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2121 | strftime(tmp, 20, "%m/%d/%Y", tme); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2122 | strcpy(cpy + cnt, tmp); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2123 | cnt += strlen(tmp); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2124 | c++; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2125 | break; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2126 | case 't': |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2127 | /* append time */ |
| 7459 | 2128 | strftime(tmp, 20, "%I:%M:%S %p", tme); |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2129 | strcpy(cpy + cnt, tmp); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2130 | cnt += strlen(tmp); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2131 | c++; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2132 | break; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2133 | default: |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2134 | cpy[cnt++] = *c; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2135 | } |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2136 | } |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2137 | break; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2138 | default: |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2139 | cpy[cnt++] = *c; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2140 | } |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2141 | c++; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2142 | } |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2143 | cpy[cnt] = '\0'; |
|
8700
0c9288c5e40e
[gaim-migrate @ 9453]
Mark Doliner <markdoliner@pidgin.im>
parents:
8686
diff
changeset
|
2144 | |
|
0c9288c5e40e
[gaim-migrate @ 9453]
Mark Doliner <markdoliner@pidgin.im>
parents:
8686
diff
changeset
|
2145 | return cpy; |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2146 | } |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2147 | |
|
8341
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2148 | gchar * |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2149 | gaim_strdup_withhtml(const gchar *src) |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2150 | { |
|
8341
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2151 | gulong destsize, i, j; |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2152 | gchar *dest; |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2153 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2154 | g_return_val_if_fail(src != NULL, NULL); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2155 | |
|
8341
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2156 | /* New length is (length of src) + (number of \n's * 3) + 1 */ |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2157 | for (i = 0, j = 0; src[i] != '\0'; i++) |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2158 | if (src[i] == '\n') |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2159 | j++; |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2160 | |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2161 | destsize = i + (j * 3) + 1; |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2162 | dest = g_malloc(destsize); |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2163 | |
|
8341
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2164 | /* Copy stuff, ignoring \r's, because they are dumb */ |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2165 | for (i = 0, j = 0; src[i] != '\0'; i++) { |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2166 | if (src[i] == '\n') { |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2167 | strcpy(&dest[j], "<BR>"); |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2168 | j += 4; |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2169 | } else if (src[i] != '\r') |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2170 | dest[j++] = src[i]; |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2171 | } |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2172 | |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2173 | dest[destsize-1] = '\0'; |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2174 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2175 | return dest; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2176 | } |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2177 | |
| 7628 | 2178 | gboolean |
| 2179 | gaim_str_has_prefix(const char *s, const char *p) | |
| 2180 | { | |
| 2181 | if (!strncmp(s, p, strlen(p))) | |
| 2182 | return TRUE; | |
| 2183 | ||
| 2184 | return FALSE; | |
| 2185 | } | |
| 2186 | ||
| 2187 | gboolean | |
| 2188 | gaim_str_has_suffix(const char *s, const char *x) | |
| 2189 | { | |
| 2190 | int off = strlen(s) - strlen(x); | |
| 2191 | ||
| 2192 | if (off >= 0 && !strcmp(s + off, x)) | |
| 2193 | return TRUE; | |
| 2194 | ||
| 2195 | return FALSE; | |
| 2196 | } | |
| 2197 | ||
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2198 | char * |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2199 | gaim_str_add_cr(const char *text) |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2200 | { |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2201 | char *ret = NULL; |
| 7631 | 2202 | int count = 0, j; |
| 2203 | guint i; | |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2204 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2205 | g_return_val_if_fail(text != NULL, NULL); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2206 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2207 | if (text[0] == '\n') |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2208 | count++; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2209 | for (i = 1; i < strlen(text); i++) |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2210 | if (text[i] == '\n' && text[i - 1] != '\r') |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2211 | count++; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2212 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2213 | if (count == 0) |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2214 | return g_strdup(text); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2215 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2216 | ret = g_malloc0(strlen(text) + count + 1); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2217 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2218 | i = 0; j = 0; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2219 | if (text[i] == '\n') |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2220 | ret[j++] = '\r'; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2221 | ret[j++] = text[i++]; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2222 | for (; i < strlen(text); i++) { |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2223 | if (text[i] == '\n' && text[i - 1] != '\r') |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2224 | ret[j++] = '\r'; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2225 | ret[j++] = text[i]; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2226 | } |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2227 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2228 | gaim_debug_misc("gaim_str_add_cr", "got: %s, leaving with %s\n", |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2229 | text, ret); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2230 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2231 | return ret; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2232 | } |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2233 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2234 | void |
|
7478
a7df4df98778
[gaim-migrate @ 8091]
Herman Bloggs <herman@bluedigits.com>
parents:
7459
diff
changeset
|
2235 | gaim_str_strip_cr(char *text) |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2236 | { |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2237 | int i, j; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2238 | char *text2; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2239 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2240 | g_return_if_fail(text != NULL); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2241 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2242 | text2 = g_malloc(strlen(text) + 1); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2243 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2244 | for (i = 0, j = 0; text[i]; i++) |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2245 | if (text[i] != '\r') |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2246 | text2[j++] = text[i]; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2247 | text2[j] = '\0'; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2248 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2249 | strcpy(text, text2); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2250 | g_free(text2); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2251 | } |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2252 | |
|
8341
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2253 | gchar * |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2254 | gaim_strreplace(const char *string, const char *delimiter, |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2255 | const char *replacement) |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2256 | { |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2257 | gchar **split; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2258 | gchar *ret; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2259 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2260 | g_return_val_if_fail(string != NULL, NULL); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2261 | g_return_val_if_fail(delimiter != NULL, NULL); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2262 | g_return_val_if_fail(replacement != NULL, NULL); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2263 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2264 | split = g_strsplit(string, delimiter, 0); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2265 | ret = g_strjoinv(replacement, split); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2266 | g_strfreev(split); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2267 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2268 | return ret; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2269 | } |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2270 | |
|
8341
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2271 | gchar * |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2272 | gaim_strcasereplace(const char *string, const char *delimiter, |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2273 | const char *replacement) |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2274 | { |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2275 | gchar *ret; |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2276 | int length_del, length_rep, i, j; |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2277 | |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2278 | g_return_val_if_fail(string != NULL, NULL); |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2279 | g_return_val_if_fail(delimiter != NULL, NULL); |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2280 | g_return_val_if_fail(replacement != NULL, NULL); |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2281 | |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2282 | length_del = strlen(delimiter); |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2283 | length_rep = strlen(replacement); |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2284 | |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2285 | /* Count how many times the delimiter appears */ |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2286 | i = 0; /* position in the source string */ |
|
8735
01248ea222d3
[gaim-migrate @ 9490]
Jonathan Champ <royanee@users.sourceforge.net>
parents:
8700
diff
changeset
|
2287 | j = 0; /* number of occurrences of "delimiter" */ |
|
8341
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2288 | while (string[i] != '\0') { |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2289 | if (!strncasecmp(&string[i], delimiter, length_del)) { |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2290 | i += length_del; |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2291 | j += length_rep; |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2292 | } else { |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2293 | i++; |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2294 | j++; |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2295 | } |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2296 | } |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2297 | |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2298 | ret = g_malloc(j+1); |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2299 | |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2300 | i = 0; /* position in the source string */ |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2301 | j = 0; /* position in the destination string */ |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2302 | while (string[i] != '\0') { |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2303 | if (!strncasecmp(&string[i], delimiter, length_del)) { |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2304 | strncpy(&ret[j], replacement, length_rep); |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2305 | i += length_del; |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2306 | j += length_rep; |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2307 | } else { |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2308 | ret[j] = string[i]; |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2309 | i++; |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2310 | j++; |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2311 | } |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2312 | } |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2313 | |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2314 | ret[j] = '\0'; |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2315 | |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2316 | return ret; |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2317 | } |
|
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8163
diff
changeset
|
2318 | |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2319 | const char * |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2320 | gaim_strcasestr(const char *haystack, const char *needle) |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2321 | { |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2322 | size_t hlen, nlen; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2323 | const char *tmp, *ret; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2324 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2325 | g_return_val_if_fail(haystack != NULL, NULL); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2326 | g_return_val_if_fail(needle != NULL, NULL); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2327 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2328 | hlen = strlen(haystack); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2329 | nlen = strlen(needle); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2330 | tmp = haystack, |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2331 | ret = NULL; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2332 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2333 | g_return_val_if_fail(hlen > 0, NULL); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2334 | g_return_val_if_fail(nlen > 0, NULL); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2335 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2336 | while (*tmp && !ret) { |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2337 | if (!g_ascii_strncasecmp(needle, tmp, nlen)) |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2338 | ret = tmp; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2339 | else |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2340 | tmp++; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2341 | } |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2342 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2343 | return ret; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2344 | } |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2345 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2346 | char * |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2347 | gaim_str_size_to_units(size_t size) |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2348 | { |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2349 | static const char *size_str[4] = { "bytes", "KB", "MB", "GB" }; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2350 | float size_mag; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2351 | int size_index = 0; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2352 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2353 | if (size == -1) { |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2354 | return g_strdup(_("Calculating...")); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2355 | } |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2356 | else if (size == 0) { |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2357 | return g_strdup(_("Unknown.")); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2358 | } |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2359 | else { |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2360 | size_mag = (float)size; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2361 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2362 | while ((size_index < 4) && (size_mag > 1024)) { |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2363 | size_mag /= 1024; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2364 | size_index++; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2365 | } |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2366 | |
|
10103
5744088750bc
[gaim-migrate @ 11130]
Caleb Gilmour <caleb_gilmour@users.sourceforge.net>
parents:
9940
diff
changeset
|
2367 | if (size_index == 0) { |
| 10112 | 2368 | return g_strdup_printf("%zd %s", size, size_str[size_index]); |
|
10103
5744088750bc
[gaim-migrate @ 11130]
Caleb Gilmour <caleb_gilmour@users.sourceforge.net>
parents:
9940
diff
changeset
|
2369 | } else { |
|
5744088750bc
[gaim-migrate @ 11130]
Caleb Gilmour <caleb_gilmour@users.sourceforge.net>
parents:
9940
diff
changeset
|
2370 | return g_strdup_printf("%.2f %s", size_mag, size_str[size_index]); |
|
5744088750bc
[gaim-migrate @ 11130]
Caleb Gilmour <caleb_gilmour@users.sourceforge.net>
parents:
9940
diff
changeset
|
2371 | } |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2372 | } |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2373 | } |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2374 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2375 | char * |
|
9233
41fb39a8d21e
[gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents:
9230
diff
changeset
|
2376 | gaim_str_seconds_to_string(guint secs) |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2377 | { |
|
9233
41fb39a8d21e
[gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents:
9230
diff
changeset
|
2378 | GString *gstr; |
|
41fb39a8d21e
[gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents:
9230
diff
changeset
|
2379 | const char *prefix = ""; |
|
41fb39a8d21e
[gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents:
9230
diff
changeset
|
2380 | guint days, hrs, mins; |
|
41fb39a8d21e
[gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents:
9230
diff
changeset
|
2381 | |
| 9424 | 2382 | gstr = g_string_new(""); |
| 2383 | ||
| 2384 | if (secs < 60) | |
| 2385 | { | |
| 2386 | g_string_append_printf(gstr, "%d %s", secs, | |
| 2387 | ngettext("second", "seconds", secs)); | |
| 2388 | return g_string_free(gstr, FALSE); | |
| 2389 | } | |
| 2390 | ||
|
9233
41fb39a8d21e
[gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents:
9230
diff
changeset
|
2391 | days = secs / (60 * 60 * 24); |
|
41fb39a8d21e
[gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents:
9230
diff
changeset
|
2392 | secs = secs % (60 * 60 * 24); |
|
41fb39a8d21e
[gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents:
9230
diff
changeset
|
2393 | hrs = secs / (60 * 60); |
|
41fb39a8d21e
[gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents:
9230
diff
changeset
|
2394 | secs = secs % (60 * 60); |
|
41fb39a8d21e
[gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents:
9230
diff
changeset
|
2395 | mins = secs / 60; |
|
41fb39a8d21e
[gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents:
9230
diff
changeset
|
2396 | secs = secs % 60; |
|
41fb39a8d21e
[gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents:
9230
diff
changeset
|
2397 | |
|
41fb39a8d21e
[gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents:
9230
diff
changeset
|
2398 | if (days > 0) |
|
41fb39a8d21e
[gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents:
9230
diff
changeset
|
2399 | { |
|
41fb39a8d21e
[gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents:
9230
diff
changeset
|
2400 | g_string_append_printf(gstr, "%d %s", days, |
|
41fb39a8d21e
[gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents:
9230
diff
changeset
|
2401 | ngettext("day", "days", days)); |
|
41fb39a8d21e
[gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents:
9230
diff
changeset
|
2402 | |
|
41fb39a8d21e
[gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents:
9230
diff
changeset
|
2403 | prefix = ", "; |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2404 | } |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2405 | |
|
9233
41fb39a8d21e
[gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents:
9230
diff
changeset
|
2406 | if (hrs > 0) |
|
41fb39a8d21e
[gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents:
9230
diff
changeset
|
2407 | { |
|
41fb39a8d21e
[gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents:
9230
diff
changeset
|
2408 | g_string_append_printf(gstr, "%s%d %s", prefix, hrs, |
|
41fb39a8d21e
[gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents:
9230
diff
changeset
|
2409 | ngettext("hour", "hours", hrs)); |
|
41fb39a8d21e
[gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents:
9230
diff
changeset
|
2410 | |
|
41fb39a8d21e
[gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents:
9230
diff
changeset
|
2411 | prefix = ", "; |
|
41fb39a8d21e
[gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents:
9230
diff
changeset
|
2412 | } |
|
41fb39a8d21e
[gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents:
9230
diff
changeset
|
2413 | |
|
41fb39a8d21e
[gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents:
9230
diff
changeset
|
2414 | if (mins > 0) |
|
41fb39a8d21e
[gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents:
9230
diff
changeset
|
2415 | { |
|
41fb39a8d21e
[gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents:
9230
diff
changeset
|
2416 | g_string_append_printf(gstr, "%s%d %s", prefix, mins, |
|
41fb39a8d21e
[gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents:
9230
diff
changeset
|
2417 | ngettext("minute", "minutes", mins)); |
|
41fb39a8d21e
[gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents:
9230
diff
changeset
|
2418 | } |
|
41fb39a8d21e
[gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents:
9230
diff
changeset
|
2419 | |
|
41fb39a8d21e
[gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents:
9230
diff
changeset
|
2420 | return g_string_free(gstr, FALSE); |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2421 | } |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2422 | |
| 9277 | 2423 | |
| 2424 | char * | |
| 2425 | gaim_str_binary_to_ascii(const unsigned char *binary, guint len) | |
| 2426 | { | |
| 2427 | GString *ret; | |
| 2428 | guint i; | |
| 2429 | ||
| 2430 | g_return_val_if_fail(len > 0, NULL); | |
| 2431 | ||
| 2432 | ret = g_string_sized_new(len); | |
| 2433 | ||
| 2434 | for (i = 0; i < len; i++) | |
| 2435 | if (binary[i] < 32 || binary[i] > 126) | |
| 2436 | g_string_append_printf(ret, "\\x%02hhx", binary[i]); | |
| 2437 | else if (binary[i] == '\\') | |
| 2438 | g_string_append(ret, "\\\\"); | |
| 2439 | else | |
| 2440 | g_string_append_c(ret, binary[i]); | |
| 2441 | ||
| 2442 | return g_string_free(ret, FALSE); | |
| 2443 | } | |
| 2444 | ||
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2445 | /************************************************************************** |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2446 | * URI/URL Functions |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2447 | **************************************************************************/ |
|
7095
17d2b54254f8
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7094
diff
changeset
|
2448 | gboolean |
|
7094
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2449 | gaim_url_parse(const char *url, char **ret_host, int *ret_port, |
| 9227 | 2450 | char **ret_path, char **ret_user, char **ret_passwd) |
|
7094
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2451 | { |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2452 | char scan_info[255]; |
|
8118
7f5315bb4506
[gaim-migrate @ 8822]
Douglas Thrift <douglas@douglasthrift.net>
parents:
8088
diff
changeset
|
2453 | char port_str[6]; |
|
7094
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2454 | int f; |
| 9341 | 2455 | const char *at, *slash; |
|
7094
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2456 | const char *turl; |
| 9227 | 2457 | char host[256], path[256], user[256], passwd[256]; |
|
7094
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2458 | int port = 0; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2459 | /* hyphen at end includes it in control set */ |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2460 | static char addr_ctrl[] = "A-Za-z0-9.-"; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2461 | static char port_ctrl[] = "0-9"; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2462 | static char page_ctrl[] = "A-Za-z0-9.~_/:*!@&%%?=+^-"; |
| 9227 | 2463 | static char user_ctrl[] = "A-Za-z0-9.~_/*!&%%?=+^-"; |
| 2464 | static char passwd_ctrl[] = "A-Za-z0-9.~_/*!&%%?=+^-"; | |
|
7094
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2465 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2466 | g_return_val_if_fail(url != NULL, FALSE); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2467 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2468 | if ((turl = strstr(url, "http://")) != NULL || |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2469 | (turl = strstr(url, "HTTP://")) != NULL) |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2470 | { |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2471 | turl += 7; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2472 | url = turl; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2473 | } |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2474 | |
| 9227 | 2475 | /* parse out authentication information if supplied */ |
| 9341 | 2476 | /* Only care about @ char BEFORE the first / */ |
| 2477 | at = strchr(url, '@'); | |
| 2478 | slash = strchr(url, '/'); | |
| 2479 | if ((at != NULL) && | |
| 2480 | (((slash != NULL) && (strlen(at) > strlen(slash))) || | |
| 2481 | (slash == NULL))) { | |
| 9227 | 2482 | g_snprintf(scan_info, sizeof(scan_info), |
| 2483 | "%%255[%s]:%%255[%s]^@", user_ctrl, passwd_ctrl); | |
| 2484 | f = sscanf(url, scan_info, user, passwd); | |
| 2485 | ||
| 2486 | if (f ==1 ) { | |
| 2487 | /* No passwd, possibly just username supplied */ | |
| 2488 | g_snprintf(scan_info, sizeof(scan_info), | |
| 2489 | "%%255[%s]^@", user_ctrl); | |
| 2490 | f = sscanf(url, scan_info, user); | |
| 2491 | *passwd = '\0'; | |
| 2492 | } | |
| 2493 | ||
| 9230 | 2494 | url = at+1; /* move pointer after the @ char */ |
| 9227 | 2495 | } else { |
| 2496 | *user = '\0'; | |
| 2497 | *passwd = '\0'; | |
| 2498 | } | |
| 2499 | ||
|
7094
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2500 | g_snprintf(scan_info, sizeof(scan_info), |
|
8118
7f5315bb4506
[gaim-migrate @ 8822]
Douglas Thrift <douglas@douglasthrift.net>
parents:
8088
diff
changeset
|
2501 | "%%255[%s]:%%5[%s]/%%255[%s]", addr_ctrl, port_ctrl, page_ctrl); |
|
7094
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2502 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2503 | f = sscanf(url, scan_info, host, port_str, path); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2504 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2505 | if (f == 1) |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2506 | { |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2507 | g_snprintf(scan_info, sizeof(scan_info), |
|
8118
7f5315bb4506
[gaim-migrate @ 8822]
Douglas Thrift <douglas@douglasthrift.net>
parents:
8088
diff
changeset
|
2508 | "%%255[%s]/%%255[%s]", |
|
7094
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2509 | addr_ctrl, page_ctrl); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2510 | f = sscanf(url, scan_info, host, path); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2511 | g_snprintf(port_str, sizeof(port_str), "80"); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2512 | } |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2513 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2514 | if (f == 1) |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2515 | *path = '\0'; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2516 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2517 | sscanf(port_str, "%d", &port); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2518 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2519 | if (ret_host != NULL) *ret_host = g_strdup(host); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2520 | if (ret_port != NULL) *ret_port = port; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2521 | if (ret_path != NULL) *ret_path = g_strdup(path); |
| 9227 | 2522 | if (ret_user != NULL) *ret_user = g_strdup(user); |
| 2523 | if (ret_passwd != NULL) *ret_passwd = g_strdup(passwd); | |
|
7094
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2524 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2525 | return TRUE; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2526 | } |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2527 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2528 | static void |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2529 | destroy_fetch_url_data(GaimFetchUrlData *gfud) |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2530 | { |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2531 | if (gfud->webdata != NULL) g_free(gfud->webdata); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2532 | if (gfud->url != NULL) g_free(gfud->url); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2533 | if (gfud->user_agent != NULL) g_free(gfud->user_agent); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2534 | if (gfud->website.address != NULL) g_free(gfud->website.address); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2535 | if (gfud->website.page != NULL) g_free(gfud->website.page); |
| 9227 | 2536 | if (gfud->website.user != NULL) g_free(gfud->website.user); |
| 2537 | if (gfud->website.passwd != NULL) g_free(gfud->website.passwd); | |
|
7094
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2538 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2539 | g_free(gfud); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2540 | } |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2541 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2542 | static gboolean |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2543 | parse_redirect(const char *data, size_t data_len, gint sock, |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2544 | GaimFetchUrlData *gfud) |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2545 | { |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2546 | gchar *s; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2547 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2548 | if ((s = g_strstr_len(data, data_len, "Location: ")) != NULL) |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2549 | { |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2550 | gchar *new_url, *temp_url, *end; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2551 | gboolean full; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2552 | int len; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2553 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2554 | s += strlen("Location: "); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2555 | end = strchr(s, '\r'); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2556 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2557 | /* Just in case :) */ |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2558 | if (end == NULL) |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2559 | end = strchr(s, '\n'); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2560 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2561 | len = end - s; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2562 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2563 | new_url = g_malloc(len + 1); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2564 | strncpy(new_url, s, len); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2565 | new_url[len] = '\0'; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2566 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2567 | full = gfud->full; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2568 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2569 | if (*new_url == '/' || g_strstr_len(new_url, len, "://") == NULL) |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2570 | { |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2571 | temp_url = new_url; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2572 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2573 | new_url = g_strdup_printf("%s:%d%s", gfud->website.address, |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2574 | gfud->website.port, temp_url); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2575 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2576 | g_free(temp_url); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2577 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2578 | full = FALSE; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2579 | } |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2580 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2581 | /* Close the existing stuff. */ |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2582 | gaim_input_remove(gfud->inpa); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2583 | close(sock); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2584 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2585 | gaim_debug_info("gaim_url_fetch", "Redirecting to %s\n", new_url); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2586 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2587 | /* Try again, with this new location. */ |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2588 | gaim_url_fetch(new_url, full, gfud->user_agent, gfud->http11, |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2589 | gfud->callback, gfud->user_data); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2590 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2591 | /* Free up. */ |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2592 | g_free(new_url); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2593 | destroy_fetch_url_data(gfud); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2594 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2595 | return TRUE; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2596 | } |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2597 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2598 | return FALSE; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2599 | } |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2600 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2601 | static size_t |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2602 | parse_content_len(const char *data, size_t data_len) |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2603 | { |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2604 | size_t content_len = 0; |
| 9240 | 2605 | const char *p = NULL; |
| 2606 | ||
| 2607 | /* This is still technically wrong, since headers are case-insensitive | |
| 2608 | * [RFC 2616, section 4.2], though this ought to catch the normal case. | |
| 2609 | * Note: data is _not_ nul-terminated. | |
| 2610 | */ | |
| 2611 | if (data_len > 16) { | |
| 2612 | p = strncmp(data, "Content-Length: ", 16) == 0? data: NULL; | |
| 2613 | if (!p) { | |
| 2614 | p = g_strstr_len(data, data_len, "\nContent-Length: "); | |
| 2615 | if (p) | |
| 2616 | p += 1; | |
| 2617 | } | |
| 2618 | } | |
| 2619 | ||
| 2620 | /* If we can find a Content-Length header at all, try to sscanf it. | |
| 2621 | * Response headers should end with at least \r\n, so sscanf is safe, | |
| 2622 | * if we make sure that there is indeed a \n in our header. | |
| 2623 | */ | |
| 2624 | if (p && g_strstr_len(p, data_len - (p - data), "\n")) { | |
| 10112 | 2625 | sscanf(p, "Content-Length: %zu", &content_len); |
|
9818
a6b6dbae39fe
[gaim-migrate @ 10689]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9804
diff
changeset
|
2626 | gaim_debug_misc("parse_content_len", "parsed %u\n", content_len); |
| 9240 | 2627 | } |
|
7094
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2628 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2629 | return content_len; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2630 | } |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2631 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2632 | static void |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2633 | url_fetched_cb(gpointer url_data, gint sock, GaimInputCondition cond) |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2634 | { |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2635 | GaimFetchUrlData *gfud = url_data; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2636 | char data; |
| 9240 | 2637 | gboolean got_eof = FALSE; |
|
7094
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2638 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2639 | if (sock == -1) |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2640 | { |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2641 | gfud->callback(gfud->user_data, NULL, 0); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2642 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2643 | destroy_fetch_url_data(gfud); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2644 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2645 | return; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2646 | } |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2647 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2648 | if (!gfud->sentreq) |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2649 | { |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2650 | char buf[1024]; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2651 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2652 | if (gfud->user_agent) |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2653 | { |
| 9240 | 2654 | /* Host header is not forbidden in HTTP/1.0 requests, and HTTP/1.1 |
| 2655 | * clients must know how to handle the "chunked" transfer encoding. | |
| 2656 | * Gaim doesn't know how to handle "chunked", so should always send | |
| 2657 | * the Host header regardless, to get around some observed problems | |
| 2658 | */ | |
| 2659 | g_snprintf(buf, sizeof(buf), | |
| 2660 | "GET %s%s HTTP/%s\r\n" | |
| 2661 | "User-Agent: %s\r\n" | |
| 2662 | "Host: %s\r\n\r\n", | |
| 2663 | (gfud->full ? "" : "/"), | |
| 2664 | (gfud->full ? gfud->url : gfud->website.page), | |
| 2665 | (gfud->http11 ? "1.1" : "1.0"), | |
| 2666 | gfud->user_agent, gfud->website.address); | |
|
7094
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2667 | } |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2668 | else |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2669 | { |
| 9240 | 2670 | g_snprintf(buf, sizeof(buf), |
| 2671 | "GET %s%s HTTP/%s\r\n" | |
| 2672 | "Host: %s\r\n\r\n", | |
| 2673 | (gfud->full ? "" : "/"), | |
| 2674 | (gfud->full ? gfud->url : gfud->website.page), | |
| 2675 | (gfud->http11 ? "1.1" : "1.0"), | |
| 2676 | gfud->website.address); | |
|
7094
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2677 | } |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2678 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2679 | gaim_debug_misc("gaim_url_fetch", "Request: %s\n", buf); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2680 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2681 | write(sock, buf, strlen(buf)); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2682 | fcntl(sock, F_SETFL, O_NONBLOCK); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2683 | gfud->sentreq = TRUE; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2684 | gfud->inpa = gaim_input_add(sock, GAIM_INPUT_READ, |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2685 | url_fetched_cb, url_data); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2686 | gfud->data_len = 4096; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2687 | gfud->webdata = g_malloc(gfud->data_len); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2688 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2689 | return; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2690 | } |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2691 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2692 | if (read(sock, &data, 1) > 0 || errno == EWOULDBLOCK) |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2693 | { |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2694 | if (errno == EWOULDBLOCK) |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2695 | { |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2696 | errno = 0; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2697 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2698 | return; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2699 | } |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2700 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2701 | gfud->len++; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2702 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2703 | if (gfud->len == gfud->data_len + 1) |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2704 | { |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2705 | gfud->data_len += (gfud->data_len) / 2; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2706 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2707 | gfud->webdata = g_realloc(gfud->webdata, gfud->data_len); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2708 | } |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2709 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2710 | gfud->webdata[gfud->len - 1] = data; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2711 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2712 | if (!gfud->startsaving) |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2713 | { |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2714 | if (data == '\r') |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2715 | return; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2716 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2717 | if (data == '\n') |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2718 | { |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2719 | if (gfud->newline) |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2720 | { |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2721 | size_t content_len; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2722 | gfud->startsaving = TRUE; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2723 | |
| 9240 | 2724 | gaim_debug_misc("gaim_url_fetch", "Response headers: '%*.*s'\n", gfud->len, gfud->len, gfud->webdata); |
| 2725 | ||
|
7094
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2726 | /* See if we can find a redirect. */ |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2727 | if (parse_redirect(gfud->webdata, gfud->len, sock, gfud)) |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2728 | return; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2729 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2730 | /* No redirect. See if we can find a content length. */ |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2731 | content_len = parse_content_len(gfud->webdata, gfud->len); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2732 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2733 | if (content_len == 0) |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2734 | { |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2735 | /* We'll stick with an initial 8192 */ |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2736 | content_len = 8192; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2737 | } |
| 9240 | 2738 | else |
| 2739 | { | |
| 2740 | gfud->has_explicit_data_len = TRUE; | |
| 2741 | } | |
|
7094
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2742 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2743 | /* Out with the old... */ |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2744 | gfud->len = 0; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2745 | g_free(gfud->webdata); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2746 | gfud->webdata = NULL; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2747 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2748 | /* In with the new. */ |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2749 | gfud->data_len = content_len; |
|
9818
a6b6dbae39fe
[gaim-migrate @ 10689]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9804
diff
changeset
|
2750 | gfud->webdata = g_try_malloc(gfud->data_len); |
|
a6b6dbae39fe
[gaim-migrate @ 10689]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9804
diff
changeset
|
2751 | if (gfud->webdata == NULL) { |
|
a6b6dbae39fe
[gaim-migrate @ 10689]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9804
diff
changeset
|
2752 | gaim_debug_error("gaim_url_fetch", "Failed to allocate %u bytes: %s\n", gfud->data_len, strerror(errno)); |
|
a6b6dbae39fe
[gaim-migrate @ 10689]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9804
diff
changeset
|
2753 | gaim_input_remove(gfud->inpa); |
|
a6b6dbae39fe
[gaim-migrate @ 10689]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9804
diff
changeset
|
2754 | close(sock); |
|
a6b6dbae39fe
[gaim-migrate @ 10689]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9804
diff
changeset
|
2755 | gfud->callback(gfud->user_data, NULL, 0); |
|
a6b6dbae39fe
[gaim-migrate @ 10689]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9804
diff
changeset
|
2756 | destroy_fetch_url_data(gfud); |
|
a6b6dbae39fe
[gaim-migrate @ 10689]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
9804
diff
changeset
|
2757 | } |
|
7094
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2758 | } |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2759 | else |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2760 | gfud->newline = TRUE; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2761 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2762 | return; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2763 | } |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2764 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2765 | gfud->newline = FALSE; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2766 | } |
| 9240 | 2767 | else if (gfud->has_explicit_data_len && gfud->len == gfud->data_len) |
| 2768 | { | |
| 2769 | got_eof = TRUE; | |
| 2770 | } | |
|
7094
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2771 | } |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2772 | else if (errno != ETIMEDOUT) |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2773 | { |
| 9240 | 2774 | got_eof = TRUE; |
| 2775 | } | |
| 2776 | else | |
| 2777 | { | |
| 2778 | gaim_input_remove(gfud->inpa); | |
| 2779 | close(sock); | |
| 2780 | ||
| 2781 | gfud->callback(gfud->user_data, NULL, 0); | |
| 2782 | ||
| 2783 | destroy_fetch_url_data(gfud); | |
| 2784 | } | |
| 2785 | ||
| 2786 | if (got_eof) { | |
|
7094
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2787 | gfud->webdata = g_realloc(gfud->webdata, gfud->len + 1); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2788 | gfud->webdata[gfud->len] = 0; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2789 | |
| 9311 | 2790 | /* gaim_debug_misc("gaim_url_fetch", "Received: '%s'\n", gfud->webdata); */ |
|
7094
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2791 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2792 | gaim_input_remove(gfud->inpa); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2793 | close(sock); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2794 | gfud->callback(gfud->user_data, gfud->webdata, gfud->len); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2795 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2796 | destroy_fetch_url_data(gfud); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2797 | } |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2798 | } |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2799 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2800 | void |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2801 | gaim_url_fetch(const char *url, gboolean full, |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2802 | const char *user_agent, gboolean http11, |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2803 | void (*cb)(gpointer, const char *, size_t), |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2804 | void *user_data) |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2805 | { |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2806 | int sock; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2807 | GaimFetchUrlData *gfud; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2808 | |
| 9257 | 2809 | g_return_if_fail(url != NULL); |
| 2810 | g_return_if_fail(cb != NULL); | |
| 9311 | 2811 | |
| 9240 | 2812 | gaim_debug_info("gaim_url_fetch", |
| 2813 | "requested to fetch (%s), full=%d, user_agent=(%s), http11=%d\n", | |
| 9257 | 2814 | url, full, user_agent?user_agent:"(null)", http11); |
|
7094
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2815 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2816 | gfud = g_new0(GaimFetchUrlData, 1); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2817 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2818 | gfud->callback = cb; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2819 | gfud->user_data = user_data; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2820 | gfud->url = g_strdup(url); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2821 | gfud->user_agent = (user_agent != NULL ? g_strdup(user_agent) : NULL); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2822 | gfud->http11 = http11; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2823 | gfud->full = full; |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2824 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2825 | gaim_url_parse(url, &gfud->website.address, &gfud->website.port, |
| 9227 | 2826 | &gfud->website.page, &gfud->website.user, &gfud->website.passwd); |
|
7094
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2827 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2828 | if ((sock = gaim_proxy_connect(NULL, gfud->website.address, |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2829 | gfud->website.port, url_fetched_cb, |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2830 | gfud)) < 0) |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2831 | { |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2832 | destroy_fetch_url_data(gfud); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2833 | |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2834 | cb(user_data, g_strdup(_("g003: Error opening connection.\n")), 0); |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2835 | } |
|
8f9588491993
[gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents:
7078
diff
changeset
|
2836 | } |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2837 | |
| 7162 | 2838 | const char * |
| 7134 | 2839 | gaim_url_decode(const char *str) |
| 2840 | { | |
| 2841 | static char buf[BUF_LEN]; | |
| 7631 | 2842 | guint i, j = 0; |
| 7134 | 2843 | char *bum; |
|
9804
1fbe747c77aa
[gaim-migrate @ 10672]
Mark Doliner <markdoliner@pidgin.im>
parents:
9786
diff
changeset
|
2844 | char hex[3]; |
| 7134 | 2845 | |
| 2846 | g_return_val_if_fail(str != NULL, NULL); | |
| 2847 | ||
|
9804
1fbe747c77aa
[gaim-migrate @ 10672]
Mark Doliner <markdoliner@pidgin.im>
parents:
9786
diff
changeset
|
2848 | /* |
|
1fbe747c77aa
[gaim-migrate @ 10672]
Mark Doliner <markdoliner@pidgin.im>
parents:
9786
diff
changeset
|
2849 | * XXX - This check could be removed and buf could be made |
|
1fbe747c77aa
[gaim-migrate @ 10672]
Mark Doliner <markdoliner@pidgin.im>
parents:
9786
diff
changeset
|
2850 | * dynamically allocated, but this is easier. |
|
1fbe747c77aa
[gaim-migrate @ 10672]
Mark Doliner <markdoliner@pidgin.im>
parents:
9786
diff
changeset
|
2851 | */ |
|
1fbe747c77aa
[gaim-migrate @ 10672]
Mark Doliner <markdoliner@pidgin.im>
parents:
9786
diff
changeset
|
2852 | if (strlen(str) >= BUF_LEN) |
|
1fbe747c77aa
[gaim-migrate @ 10672]
Mark Doliner <markdoliner@pidgin.im>
parents:
9786
diff
changeset
|
2853 | return NULL; |
|
1fbe747c77aa
[gaim-migrate @ 10672]
Mark Doliner <markdoliner@pidgin.im>
parents:
9786
diff
changeset
|
2854 | |
| 7134 | 2855 | for (i = 0; i < strlen(str); i++) { |
| 2856 | ||
| 2857 | if (str[i] != '%') | |
| 2858 | buf[j++] = str[i]; | |
| 2859 | else { | |
| 2860 | strncpy(hex, str + ++i, 2); | |
| 2861 | hex[2] = '\0'; | |
| 2862 | ||
| 2863 | /* i is pointing to the start of the number */ | |
| 2864 | i++; | |
| 2865 | ||
| 2866 | /* | |
| 2867 | * Now it's at the end and at the start of the for loop | |
| 2868 | * will be at the next character. | |
| 2869 | */ | |
| 2870 | buf[j++] = strtol(hex, NULL, 16); | |
| 2871 | } | |
| 2872 | } | |
| 2873 | ||
| 2874 | buf[j] = '\0'; | |
| 2875 | ||
| 2876 | if (!g_utf8_validate(buf, -1, (const char **)&bum)) | |
| 2877 | *bum = '\0'; | |
| 2878 | ||
| 2879 | return buf; | |
| 2880 | } | |
| 2881 | ||
| 7162 | 2882 | const char * |
| 7134 | 2883 | gaim_url_encode(const char *str) |
| 2884 | { | |
| 2885 | static char buf[BUF_LEN]; | |
| 7631 | 2886 | guint i, j = 0; |
| 7134 | 2887 | |
| 2888 | g_return_val_if_fail(str != NULL, NULL); | |
| 2889 | ||
| 9940 | 2890 | for (i = 0; i < strlen(str) && j < (BUF_LEN - 1); i++) { |
| 7134 | 2891 | if (isalnum(str[i])) |
| 2892 | buf[j++] = str[i]; | |
| 2893 | else { | |
| 9940 | 2894 | if (j > (BUF_LEN - 4)) |
| 2895 | break; | |
| 7134 | 2896 | sprintf(buf + j, "%%%02x", (unsigned char)str[i]); |
| 2897 | j += 3; | |
| 2898 | } | |
| 2899 | } | |
| 2900 | ||
| 2901 | buf[j] = '\0'; | |
| 2902 | ||
| 2903 | return buf; | |
| 2904 | } | |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
2905 | |
| 9054 | 2906 | /* Originally lifted from |
| 2907 | * http://www.oreillynet.com/pub/a/network/excerpt/spcookbook_chap03/index3.html | |
| 2908 | * ... and slightly modified to be a bit more rfc822 compliant | |
| 2909 | * ... and modified a bit more to make domain checking rfc1035 compliant | |
| 2910 | * with the exception permitted in rfc1101 for domains to start with digit | |
| 2911 | * but not completely checking to avoid conflicts with IP addresses | |
| 2912 | */ | |
| 9045 | 2913 | gboolean |
| 2914 | gaim_email_is_valid(const char *address) | |
| 2915 | { | |
| 2916 | const char *c, *domain; | |
| 2917 | static char *rfc822_specials = "()<>@,;:\\\"[]"; | |
| 2918 | ||
| 9054 | 2919 | /* first we validate the name portion (name@domain) (rfc822)*/ |
| 9045 | 2920 | for (c = address; *c; c++) { |
| 2921 | if (*c == '\"' && (c == address || *(c - 1) == '.' || *(c - 1) == '\"')) { | |
| 2922 | while (*++c) { | |
| 9054 | 2923 | if (*c == '\\') { |
| 2924 | if (*c++ && *c < 127 && *c != '\n' && *c != '\r') continue; | |
| 2925 | else return FALSE; | |
| 2926 | } | |
| 9045 | 2927 | if (*c == '\"') break; |
| 9054 | 2928 | if (*c < ' ' || *c >= 127) return FALSE; |
| 9045 | 2929 | } |
| 2930 | if (!*c++) return FALSE; | |
| 2931 | if (*c == '@') break; | |
| 2932 | if (*c != '.') return FALSE; | |
| 2933 | continue; | |
| 2934 | } | |
| 2935 | if (*c == '@') break; | |
| 2936 | if (*c <= ' ' || *c >= 127) return FALSE; | |
| 2937 | if (strchr(rfc822_specials, *c)) return FALSE; | |
| 2938 | } | |
| 9054 | 2939 | /* strictly we should return false if (*(c - 1) == '.') too, but I think |
| 2940 | * we should permit user.@domain type addresses - they do work :) */ | |
| 2941 | if (c == address) return FALSE; | |
| 2942 | ||
| 2943 | /* next we validate the domain portion (name@domain) (rfc1035 & rfc1011) */ | |
| 9045 | 2944 | if (!*(domain = ++c)) return FALSE; |
| 2945 | do { | |
| 9054 | 2946 | if (*c == '.' && (c == domain || *(c - 1) == '.' || *(c - 1) == '-')) |
| 2947 | return FALSE; | |
| 2948 | if (*c == '-' && *(c - 1) == '.') return FALSE; | |
| 2949 | if ((*c < '0' && *c != '-' && *c != '.') || (*c > '9' && *c < 'A') || | |
| 2950 | (*c > 'Z' && *c < 'a') || (*c > 'z')) return FALSE; | |
| 9045 | 2951 | } while (*++c); |
| 2952 | ||
| 9054 | 2953 | if (*(c - 1) == '-') return FALSE; |
| 2954 | ||
| 2955 | return ((c - domain) > 3 ? TRUE : FALSE); | |
| 9045 | 2956 | } |
| 2957 | ||
|
9670
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
2958 | /** Stolen from gnome_uri_list_extract_uris **/ |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
2959 | GList* gaim_uri_list_extract_uris (const gchar* uri_list) { |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
2960 | const gchar *p, *q; |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
2961 | gchar *retval; |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
2962 | GList *result = NULL; |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
2963 | |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
2964 | g_return_val_if_fail (uri_list != NULL, NULL); |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
2965 | |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
2966 | p = uri_list; |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
2967 | |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
2968 | /* We don't actually try to validate the URI according to RFC |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
2969 | * 2396, or even check for allowed characters - we just ignore |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
2970 | * comments and trim whitespace off the ends. We also |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
2971 | * allow LF delimination as well as the specified CRLF. |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
2972 | */ |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
2973 | while (p) { |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
2974 | if (*p != '#') { |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
2975 | while (isspace(*p)) |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
2976 | p++; |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
2977 | |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
2978 | q = p; |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
2979 | while (*q && (*q != '\n') && (*q != '\r')) |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
2980 | q++; |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
2981 | |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
2982 | if (q > p) { |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
2983 | q--; |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
2984 | while (q > p && isspace(*q)) |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
2985 | q--; |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
2986 | |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
2987 | retval = (gchar*)g_malloc (q - p + 2); |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
2988 | strncpy (retval, p, q - p + 1); |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
2989 | retval[q - p + 1] = '\0'; |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
2990 | |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
2991 | result = g_list_prepend (result, retval); |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
2992 | } |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
2993 | } |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
2994 | p = strchr (p, '\n'); |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
2995 | if (p) |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
2996 | p++; |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
2997 | } |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
2998 | |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
2999 | return g_list_reverse (result); |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
3000 | } |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
3001 | |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
3002 | |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
3003 | /** Stolen from gaim_uri_list_extract_filenames **/ |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
3004 | GList* gaim_uri_list_extract_filenames (const gchar* uri_list) { |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
3005 | GList *tmp_list, *node, *result; |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
3006 | |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
3007 | g_return_val_if_fail (uri_list != NULL, NULL); |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
3008 | |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
3009 | result = gaim_uri_list_extract_uris (uri_list); |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
3010 | |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
3011 | tmp_list = result; |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
3012 | while (tmp_list) { |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
3013 | gchar *s = (gchar*)tmp_list->data; |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
3014 | |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
3015 | node = tmp_list; |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
3016 | tmp_list = tmp_list->next; |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
3017 | |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
3018 | if (!strncmp (s, "file:", 5)) { |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
3019 | node->data = g_filename_from_uri (s, NULL, NULL); |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
3020 | /* not sure if this fallback is useful at all */ |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
3021 | if (!node->data) node->data = g_strdup (s+5); |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
3022 | } else { |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
3023 | result = g_list_remove_link(result, node); |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
3024 | g_list_free_1 (node); |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
3025 | } |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
3026 | g_free (s); |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
3027 | } |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
3028 | return result; |
|
4e8cb7ef72ab
[gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents:
9642
diff
changeset
|
3029 | } |
| 9054 | 3030 | |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3031 | /************************************************************************** |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3032 | * UTF8 String Functions |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3033 | **************************************************************************/ |
|
9642
ec0b88cf9161
[gaim-migrate @ 10490]
Mark Doliner <markdoliner@pidgin.im>
parents:
9427
diff
changeset
|
3034 | gchar * |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3035 | gaim_utf8_try_convert(const char *str) |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3036 | { |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3037 | gsize converted; |
|
9642
ec0b88cf9161
[gaim-migrate @ 10490]
Mark Doliner <markdoliner@pidgin.im>
parents:
9427
diff
changeset
|
3038 | gchar *utf8; |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3039 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3040 | g_return_val_if_fail(str != NULL, NULL); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3041 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3042 | if (g_utf8_validate(str, -1, NULL)) { |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3043 | return g_strdup(str); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3044 | } |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3045 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3046 | utf8 = g_locale_to_utf8(str, -1, &converted, NULL, NULL); |
|
9642
ec0b88cf9161
[gaim-migrate @ 10490]
Mark Doliner <markdoliner@pidgin.im>
parents:
9427
diff
changeset
|
3047 | if (utf8 != NULL) |
|
ec0b88cf9161
[gaim-migrate @ 10490]
Mark Doliner <markdoliner@pidgin.im>
parents:
9427
diff
changeset
|
3048 | return utf8; |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3049 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3050 | utf8 = g_convert(str, -1, "UTF-8", "ISO-8859-15", &converted, NULL, NULL); |
|
9642
ec0b88cf9161
[gaim-migrate @ 10490]
Mark Doliner <markdoliner@pidgin.im>
parents:
9427
diff
changeset
|
3051 | if ((utf8 != NULL) && (converted == strlen(str))) |
|
ec0b88cf9161
[gaim-migrate @ 10490]
Mark Doliner <markdoliner@pidgin.im>
parents:
9427
diff
changeset
|
3052 | return utf8; |
|
ec0b88cf9161
[gaim-migrate @ 10490]
Mark Doliner <markdoliner@pidgin.im>
parents:
9427
diff
changeset
|
3053 | |
|
ec0b88cf9161
[gaim-migrate @ 10490]
Mark Doliner <markdoliner@pidgin.im>
parents:
9427
diff
changeset
|
3054 | if (utf8 != NULL) |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3055 | g_free(utf8); |
|
9642
ec0b88cf9161
[gaim-migrate @ 10490]
Mark Doliner <markdoliner@pidgin.im>
parents:
9427
diff
changeset
|
3056 | |
|
ec0b88cf9161
[gaim-migrate @ 10490]
Mark Doliner <markdoliner@pidgin.im>
parents:
9427
diff
changeset
|
3057 | return NULL; |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3058 | } |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3059 | |
| 10258 | 3060 | #define utf8_first(x) ((x & 0x80) == 0 || (x & 0xe0) == 0xc0 \ |
| 3061 | || (x & 0xf0) == 0xe0 || (x & 0xf8) == 0xf) | |
| 3062 | gchar * | |
| 3063 | gaim_utf8_salvage(const char *str) | |
| 3064 | { | |
| 3065 | GString *workstr; | |
| 3066 | const char *end; | |
| 3067 | ||
| 3068 | g_return_val_if_fail(str != NULL, NULL); | |
| 3069 | ||
| 3070 | workstr = g_string_sized_new(strlen(str)); | |
| 3071 | ||
| 3072 | do { | |
| 3073 | g_utf8_validate(str, -1, &end); | |
| 3074 | workstr = g_string_append_len(workstr, str, end - str); | |
| 3075 | str = end; | |
| 3076 | if (*str == '\0') | |
| 3077 | break; | |
| 3078 | do { | |
| 3079 | workstr = g_string_append_c(workstr, '?'); | |
| 3080 | str++; | |
| 3081 | } while (!utf8_first(*str)); | |
| 3082 | } while (*str != '\0'); | |
| 3083 | ||
| 3084 | return g_string_free(workstr, FALSE); | |
| 3085 | } | |
| 3086 | ||
| 9161 | 3087 | char * |
| 3088 | gaim_utf8_ncr_decode(const char *in) | |
| 3089 | { | |
| 3090 | GString *out = g_string_new(""); | |
| 3091 | int i; | |
| 3092 | ||
| 3093 | g_return_val_if_fail(in != NULL, NULL); | |
| 3094 | g_return_val_if_fail(g_utf8_validate(in, -1, NULL), NULL); | |
| 3095 | ||
| 3096 | for (i = 0; in[i]; i += 1) { | |
| 3097 | gboolean ncr_found_p = FALSE; | |
| 3098 | if (in[i] == '&' && in[i + 1] == '#' && isdigit(in[i + 2])) { | |
| 3099 | gunichar wc; | |
| 3100 | int j; | |
| 3101 | for (wc = 0, j = i + 2; isdigit(in[j]); j += 1) { | |
| 3102 | wc *= 10; | |
| 3103 | wc += in[j] - '0'; | |
| 3104 | } | |
| 3105 | if (in[j] == ';') { /* Technically not completely correct */ | |
| 3106 | g_string_append_unichar(out, wc); | |
| 3107 | i = j; | |
| 3108 | ncr_found_p = TRUE; | |
| 3109 | } | |
| 3110 | } | |
| 3111 | if (!ncr_found_p) { | |
| 3112 | g_string_append_c(out, in[i]); | |
| 3113 | } | |
| 3114 | } | |
| 3115 | return g_string_free(out, FALSE); | |
| 3116 | } | |
| 3117 | ||
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3118 | int |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3119 | gaim_utf8_strcasecmp(const char *a, const char *b) |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3120 | { |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3121 | char *a_norm = NULL; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3122 | char *b_norm = NULL; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3123 | int ret = -1; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3124 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3125 | if(!a && b) |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3126 | return -1; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3127 | else if(!b && a) |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3128 | return 1; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3129 | else if(!a && !b) |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3130 | return 0; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3131 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3132 | if(!g_utf8_validate(a, -1, NULL) || !g_utf8_validate(b, -1, NULL)) |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3133 | { |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3134 | gaim_debug_error("gaim_utf8_strcasecmp", |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3135 | "One or both parameters are invalid UTF8\n"); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3136 | return ret; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3137 | } |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3138 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3139 | a_norm = g_utf8_casefold(a, -1); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3140 | b_norm = g_utf8_casefold(b, -1); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3141 | ret = g_utf8_collate(a_norm, b_norm); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3142 | g_free(a_norm); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3143 | g_free(b_norm); |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3144 | |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3145 | return ret; |
|
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
3146 | } |
| 7162 | 3147 | |
| 7564 | 3148 | gboolean gaim_message_meify(char *message, size_t len) |
| 3149 | { | |
| 3150 | char *c; | |
| 3151 | gboolean inside_html = FALSE; | |
| 3152 | ||
| 3153 | g_return_val_if_fail(message != NULL, FALSE); | |
| 3154 | ||
| 3155 | if(len == -1) | |
| 3156 | len = strlen(message); | |
| 3157 | ||
| 3158 | for (c = message; *c; c++, len--) { | |
| 3159 | if(inside_html) { | |
| 3160 | if(*c == '>') | |
| 3161 | inside_html = FALSE; | |
| 3162 | } else { | |
| 3163 | if(*c == '<') | |
| 3164 | inside_html = TRUE; | |
| 3165 | else | |
| 3166 | break; | |
| 3167 | } | |
| 3168 | } | |
| 3169 | ||
| 3170 | if(*c && !g_ascii_strncasecmp(c, "/me ", 4)) { | |
| 3171 | memmove(c, c+4, len-3); | |
| 3172 | return TRUE; | |
| 3173 | } | |
| 3174 | ||
| 3175 | return FALSE; | |
| 3176 | } | |
| 3177 | ||
| 7889 | 3178 | char *gaim_text_strip_mnemonic(const char *in) |
| 3179 | { | |
| 3180 | char *out; | |
| 3181 | char *a; | |
| 8561 | 3182 | char *a0; |
| 7889 | 3183 | const char *b; |
| 3184 | ||
| 3185 | g_return_val_if_fail(in != NULL, NULL); | |
| 3186 | ||
| 3187 | out = g_malloc(strlen(in)+1); | |
| 3188 | a = out; | |
| 3189 | b = in; | |
| 3190 | ||
| 8561 | 3191 | a0 = a; /* The last non-space char seen so far, or the first char */ |
| 3192 | ||
| 7889 | 3193 | while(*b) { |
| 3194 | if(*b == '_') { | |
| 8561 | 3195 | if(a > out && b > in && *(b-1) == '(' && *(b+1) && !(*(b+1) & 0x80) && *(b+2) == ')') { |
| 3196 | /* Detected CJK style shortcut (Bug 875311) */ | |
| 3197 | a = a0; /* undo the left parenthesis */ | |
| 3198 | b += 3; /* and skip the whole mess */ | |
| 3199 | } else if(*(b+1) == '_') { | |
| 7889 | 3200 | *(a++) = '_'; |
| 3201 | b += 2; | |
| 8561 | 3202 | a0 = a; |
| 7889 | 3203 | } else { |
| 3204 | b++; | |
| 3205 | } | |
| 8561 | 3206 | /* We don't want to corrupt the middle of UTF-8 characters */ |
| 3207 | } else if (!(*b & 0x80)) { /* other 1-byte char */ | |
| 3208 | if (*b != ' ') | |
| 3209 | a0 = a; | |
| 3210 | *(a++) = *(b++); | |
| 7889 | 3211 | } else { |
| 8561 | 3212 | /* Multibyte utf8 char, don't look for _ inside these */ |
| 3213 | int n = 0; | |
| 3214 | int i; | |
| 3215 | if ((*b & 0xe0) == 0xc0) { | |
| 3216 | n = 2; | |
| 3217 | } else if ((*b & 0xf0) == 0xe0) { | |
| 3218 | n = 3; | |
| 3219 | } else if ((*b & 0xf8) == 0xf0) { | |
| 3220 | n = 4; | |
| 3221 | } else if ((*b & 0xfc) == 0xf8) { | |
| 3222 | n = 5; | |
| 3223 | } else if ((*b & 0xfe) == 0xfc) { | |
| 3224 | n = 6; | |
| 3225 | } else { /* Illegal utf8 */ | |
| 3226 | n = 1; | |
| 3227 | } | |
| 3228 | a0 = a; /* unless we want to delete CJK spaces too */ | |
| 3229 | for (i = 0; i < n && *b; i += 1) { | |
| 3230 | *(a++) = *(b++); | |
| 3231 | } | |
| 7889 | 3232 | } |
| 3233 | } | |
| 3234 | *a = '\0'; | |
| 3235 | ||
| 3236 | return out; | |
| 3237 | } | |
| 3238 | ||
| 9926 | 3239 | const char* gaim_unescape_filename(const char *escaped) { |
| 3240 | return gaim_url_decode(escaped); | |
| 3241 | } | |
| 3242 | ||
| 3243 | ||
| 3244 | /* this is almost identical to gaim_url_encode (hence gaim_url_decode | |
| 3245 | * being used above), but we want to keep certain characters unescaped | |
| 3246 | * for compat reasons */ | |
| 3247 | const char * | |
| 3248 | gaim_escape_filename(const char *str) | |
| 3249 | { | |
| 3250 | static char buf[BUF_LEN]; | |
| 3251 | guint i, j = 0; | |
| 3252 | ||
| 3253 | g_return_val_if_fail(str != NULL, NULL); | |
| 3254 | ||
| 9940 | 3255 | for (i = 0; i < strlen(str) && j < (BUF_LEN - 1); i++) { |
| 9934 | 3256 | if (isalnum(str[i]) || str[i] == '@' || str[i] == '-' || |
| 3257 | str[i] == '_' || str[i] == '.' || str[i] == '#') | |
| 9926 | 3258 | buf[j++] = str[i]; |
| 3259 | else { | |
| 9940 | 3260 | if (j > (BUF_LEN - 4)) |
| 3261 | break; | |
| 9926 | 3262 | sprintf(buf + j, "%%%02x", (unsigned char)str[i]); |
| 3263 | j += 3; | |
| 3264 | } | |
| 3265 | } | |
| 3266 | ||
| 3267 | buf[j] = '\0'; | |
| 3268 | ||
| 3269 | return buf; | |
| 3270 | } | |
| 3271 | ||
| 3272 |