Fri, 18 Apr 2003 02:28:06 +0000
[gaim-migrate @ 5524]
1) Added neat little protocol icons next to the set away message menu when
you have more than one account signed on. I basically just copied
Nathan's code, so it should be ok.
2) Changed the horizontal rules in the away message menu so they show up
for me. This is how horizontal rules are done in other menus, I'm
not sure why the away message menu was different.
3) Moved 2 gtkish functions from util.c to gtkutils.c. Earlier I used one
of these functions, and then earlier, but not as early, I realized that
gtkutils.c existed, so I put 2 and 2 together and realized you were
probably flying somewhere.
Well then, let's put another shrimp on the barbi'!
| 1 | 1 | /* |
| 2 | * gaim | |
| 3 | * | |
| 4 | * Copyright (C) 1998-1999, Mark Spencer <markster@marko.net> | |
| 5 | * | |
| 6 | * This program is free software; you can redistribute it and/or modify | |
| 7 | * it under the terms of the GNU General Public License as published by | |
| 8 | * the Free Software Foundation; either version 2 of the License, or | |
| 9 | * (at your option) any later version. | |
| 10 | * | |
| 11 | * This program is distributed in the hope that it will be useful, | |
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 14 | * GNU General Public License for more details. | |
| 15 | * | |
| 16 | * You should have received a copy of the GNU General Public License | |
| 17 | * along with this program; if not, write to the Free Software | |
| 18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| 19 | * | |
| 20 | */ | |
| 21 | ||
|
349
6f7d28b0f98d
[gaim-migrate @ 359]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
278
diff
changeset
|
22 | #ifdef HAVE_CONFIG_H |
|
2090
bab8b7e309db
[gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2060
diff
changeset
|
23 | #include <config.h> |
|
349
6f7d28b0f98d
[gaim-migrate @ 359]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
278
diff
changeset
|
24 | #endif |
| 1 | 25 | #include <string.h> |
| 26 | #include <stdio.h> | |
| 27 | #include <stdlib.h> | |
| 3630 | 28 | |
| 29 | #ifndef _WIN32 | |
| 1 | 30 | #include <sys/time.h> |
| 31 | #include <unistd.h> | |
| 32 | #include <sys/socket.h> | |
| 33 | #include <netdb.h> | |
| 34 | #include <netinet/in.h> | |
| 3630 | 35 | #endif |
| 36 | ||
| 37 | #include <sys/types.h> | |
|
278
4365a163c987
[gaim-migrate @ 288]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
268
diff
changeset
|
38 | #include <fcntl.h> |
|
4365a163c987
[gaim-migrate @ 288]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
268
diff
changeset
|
39 | #include <errno.h> |
| 3630 | 40 | #include "gaim.h" |
|
1092
9be1c9ea4d2c
[gaim-migrate @ 1102]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1088
diff
changeset
|
41 | #include "proxy.h" |
| 1 | 42 | |
|
3717
2fc0789e04e8
[gaim-migrate @ 3850]
Herman Bloggs <herman@bluedigits.com>
parents:
3630
diff
changeset
|
43 | #ifdef _WIN32 |
|
2fc0789e04e8
[gaim-migrate @ 3850]
Herman Bloggs <herman@bluedigits.com>
parents:
3630
diff
changeset
|
44 | #include "win32dep.h" |
|
2fc0789e04e8
[gaim-migrate @ 3850]
Herman Bloggs <herman@bluedigits.com>
parents:
3630
diff
changeset
|
45 | #endif |
|
2fc0789e04e8
[gaim-migrate @ 3850]
Herman Bloggs <herman@bluedigits.com>
parents:
3630
diff
changeset
|
46 | |
|
4359
cf899ee07d1d
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4335
diff
changeset
|
47 | gchar *strip_html(const gchar *text) |
| 1 | 48 | { |
| 1883 | 49 | int i, j, k; |
| 1 | 50 | int visible = 1; |
| 1883 | 51 | gchar *text2 = g_strdup(text); |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1092
diff
changeset
|
52 | |
| 4757 | 53 | if(!text) |
| 54 | return NULL; | |
| 4503 | 55 | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1092
diff
changeset
|
56 | for (i = 0, j = 0; text2[i]; i++) { |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1092
diff
changeset
|
57 | if (text2[i] == '<') { |
| 1883 | 58 | k = i + 1; |
| 4777 | 59 | if(g_ascii_isspace(text2[k])) { |
| 60 | visible = 1; | |
| 61 | } else { | |
| 62 | while (text2[k]) { | |
| 63 | if (text2[k] == '<') { | |
| 64 | visible = 1; | |
| 65 | break; | |
| 66 | } | |
| 67 | if (text2[k] == '>') { | |
| 68 | visible = 0; | |
| 69 | break; | |
| 70 | } | |
| 71 | k++; | |
| 1883 | 72 | } |
| 73 | } | |
| 74 | } else if (text2[i] == '>' && !visible) { | |
| 1 | 75 | visible = 1; |
| 76 | continue; | |
| 77 | } | |
| 4473 | 78 | if (text2[i] == '&' && strncasecmp(text2+i,""",6) == 0) { |
| 79 | text2[j++] = '\"'; | |
| 80 | i = i+5; | |
| 81 | continue; | |
| 82 | } | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1092
diff
changeset
|
83 | if (visible) { |
| 1 | 84 | text2[j++] = text2[i]; |
| 85 | } | |
| 86 | } | |
| 87 | text2[j] = '\0'; | |
| 88 | return text2; | |
| 89 | } | |
| 90 | ||
| 3630 | 91 | struct g_url *parse_url(char *url) |
| 1 | 92 | { |
|
2541
0afd3aaba327
[gaim-migrate @ 2554]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2417
diff
changeset
|
93 | struct g_url *test = g_new0(struct g_url, 1); |
| 1 | 94 | char scan_info[255]; |
| 95 | char port[5]; | |
| 96 | int f; | |
| 97 | ||
| 98 | if (strstr(url, "http://")) | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1092
diff
changeset
|
99 | g_snprintf(scan_info, sizeof(scan_info), |
| 2060 | 100 | "http://%%[A-Za-z0-9.]:%%[0-9]/%%[A-Za-z0-9.~_-/&%%?=+]"); |
| 1 | 101 | else |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1092
diff
changeset
|
102 | g_snprintf(scan_info, sizeof(scan_info), |
| 2060 | 103 | "%%[A-Za-z0-9.]:%%[0-9]/%%[A-Za-z0-9.~_-/&%%?=+^]"); |
|
2541
0afd3aaba327
[gaim-migrate @ 2554]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2417
diff
changeset
|
104 | f = sscanf(url, scan_info, test->address, port, test->page); |
| 1 | 105 | if (f == 1) { |
| 106 | if (strstr(url, "http://")) | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1092
diff
changeset
|
107 | g_snprintf(scan_info, sizeof(scan_info), |
| 2060 | 108 | "http://%%[A-Za-z0-9.]/%%[A-Za-z0-9.~_-/&%%?=+^]"); |
| 1 | 109 | else |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1092
diff
changeset
|
110 | g_snprintf(scan_info, sizeof(scan_info), |
| 2060 | 111 | "%%[A-Za-z0-9.]/%%[A-Za-z0-9.~_-/&%%?=+^]"); |
|
2541
0afd3aaba327
[gaim-migrate @ 2554]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2417
diff
changeset
|
112 | f = sscanf(url, scan_info, test->address, test->page); |
|
0afd3aaba327
[gaim-migrate @ 2554]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2417
diff
changeset
|
113 | g_snprintf(port, sizeof(test->port), "80"); |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1092
diff
changeset
|
114 | port[2] = 0; |
| 1 | 115 | } |
| 116 | if (f == 1) { | |
| 117 | if (strstr(url, "http://")) | |
| 118 | g_snprintf(scan_info, sizeof(scan_info), "http://%%[A-Za-z0-9.]"); | |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1092
diff
changeset
|
119 | else |
|
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1092
diff
changeset
|
120 | g_snprintf(scan_info, sizeof(scan_info), "%%[A-Za-z0-9.]"); |
|
2541
0afd3aaba327
[gaim-migrate @ 2554]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2417
diff
changeset
|
121 | f = sscanf(url, scan_info, test->address); |
|
0afd3aaba327
[gaim-migrate @ 2554]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2417
diff
changeset
|
122 | g_snprintf(test->page, sizeof(test->page), "%c", '\0'); |
| 1 | 123 | } |
| 124 | ||
|
2541
0afd3aaba327
[gaim-migrate @ 2554]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2417
diff
changeset
|
125 | sscanf(port, "%d", &test->port); |
| 1 | 126 | return test; |
| 127 | } | |
| 128 | ||
|
1840
770bc15f419c
[gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
129 | struct grab_url_data { |
| 4322 | 130 | void (* callback)(gpointer, char *, unsigned long); |
|
1840
770bc15f419c
[gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
131 | gpointer data; |
|
2541
0afd3aaba327
[gaim-migrate @ 2554]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2417
diff
changeset
|
132 | struct g_url *website; |
|
1840
770bc15f419c
[gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
133 | char *url; |
|
2584
1d2c4de26640
[gaim-migrate @ 2597]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2541
diff
changeset
|
134 | gboolean full; |
|
2369
65cbc00bf992
[gaim-migrate @ 2382]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2090
diff
changeset
|
135 | |
|
65cbc00bf992
[gaim-migrate @ 2382]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2090
diff
changeset
|
136 | int inpa; |
|
65cbc00bf992
[gaim-migrate @ 2382]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2090
diff
changeset
|
137 | |
|
65cbc00bf992
[gaim-migrate @ 2382]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2090
diff
changeset
|
138 | gboolean sentreq; |
|
2584
1d2c4de26640
[gaim-migrate @ 2597]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2541
diff
changeset
|
139 | gboolean newline; |
|
1d2c4de26640
[gaim-migrate @ 2597]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2541
diff
changeset
|
140 | gboolean startsaving; |
|
2369
65cbc00bf992
[gaim-migrate @ 2382]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2090
diff
changeset
|
141 | char *webdata; |
| 4322 | 142 | unsigned long len; |
|
4331
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
143 | unsigned long data_len; |
|
1840
770bc15f419c
[gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
144 | }; |
|
770bc15f419c
[gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
145 | |
|
4331
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
146 | static gboolean |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
147 | parse_redirect(const char *data, size_t data_len, gint sock, |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
148 | struct grab_url_data *gunk) |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
149 | { |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
150 | gchar *s; |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
151 | |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
152 | if ((s = g_strstr_len(data, data_len, "Location: ")) != NULL) { |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
153 | gchar *new_url, *end; |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
154 | int len; |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
155 | |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
156 | s += strlen("Location: "); |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
157 | end = strchr(s, '\r'); |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
158 | |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
159 | /* Just in case :) */ |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
160 | if (end == NULL) |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
161 | end = strchr(s, '\n'); |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
162 | |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
163 | len = end - s; |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
164 | |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
165 | new_url = g_malloc(len + 1); |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
166 | strncpy(new_url, s, len); |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
167 | new_url[len] = '\0'; |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
168 | |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
169 | /* Close the existing stuff. */ |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
170 | gaim_input_remove(gunk->inpa); |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
171 | close(sock); |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
172 | |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
173 | /* Try again, with this new location. */ |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
174 | grab_url(new_url, gunk->full, gunk->callback, |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
175 | gunk->data); |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
176 | |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
177 | /* Free up. */ |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
178 | g_free(new_url); |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
179 | g_free(gunk->webdata); |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
180 | g_free(gunk->website); |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
181 | g_free(gunk->url); |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
182 | g_free(gunk); |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
183 | |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
184 | return TRUE; |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
185 | } |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
186 | |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
187 | return FALSE; |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
188 | } |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
189 | |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
190 | static size_t |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
191 | parse_content_len(const char *data, size_t data_len) |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
192 | { |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
193 | size_t content_len = 0; |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
194 | |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
195 | sscanf(data, "Content-Length: %d", &content_len); |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
196 | |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
197 | return content_len; |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
198 | } |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
199 | |
|
2369
65cbc00bf992
[gaim-migrate @ 2382]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2090
diff
changeset
|
200 | static void grab_url_callback(gpointer dat, gint sock, GaimInputCondition cond) |
|
1840
770bc15f419c
[gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
201 | { |
|
770bc15f419c
[gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
202 | struct grab_url_data *gunk = dat; |
| 1 | 203 | char data; |
| 204 | ||
|
1840
770bc15f419c
[gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
205 | if (sock == -1) { |
| 4322 | 206 | gunk->callback(gunk->data, NULL, 0); |
|
2541
0afd3aaba327
[gaim-migrate @ 2554]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2417
diff
changeset
|
207 | g_free(gunk->website); |
|
1840
770bc15f419c
[gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
208 | g_free(gunk->url); |
|
770bc15f419c
[gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
209 | g_free(gunk); |
|
770bc15f419c
[gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
210 | return; |
|
1087
bc9c6b635358
[gaim-migrate @ 1097]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
691
diff
changeset
|
211 | } |
| 1 | 212 | |
|
2369
65cbc00bf992
[gaim-migrate @ 2382]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2090
diff
changeset
|
213 | if (!gunk->sentreq) { |
|
65cbc00bf992
[gaim-migrate @ 2382]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2090
diff
changeset
|
214 | char buf[256]; |
|
3717
2fc0789e04e8
[gaim-migrate @ 3850]
Herman Bloggs <herman@bluedigits.com>
parents:
3630
diff
changeset
|
215 | |
|
2584
1d2c4de26640
[gaim-migrate @ 2597]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2541
diff
changeset
|
216 | g_snprintf(buf, sizeof(buf), "GET %s%s HTTP/1.0\r\n\r\n", gunk->full ? "" : "/", |
|
1d2c4de26640
[gaim-migrate @ 2597]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2541
diff
changeset
|
217 | gunk->full ? gunk->url : gunk->website->page); |
|
2369
65cbc00bf992
[gaim-migrate @ 2382]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2090
diff
changeset
|
218 | debug_printf("Request: %s\n", buf); |
|
3717
2fc0789e04e8
[gaim-migrate @ 3850]
Herman Bloggs <herman@bluedigits.com>
parents:
3630
diff
changeset
|
219 | |
|
2369
65cbc00bf992
[gaim-migrate @ 2382]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2090
diff
changeset
|
220 | write(sock, buf, strlen(buf)); |
|
65cbc00bf992
[gaim-migrate @ 2382]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2090
diff
changeset
|
221 | fcntl(sock, F_SETFL, O_NONBLOCK); |
|
65cbc00bf992
[gaim-migrate @ 2382]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2090
diff
changeset
|
222 | gunk->sentreq = TRUE; |
|
65cbc00bf992
[gaim-migrate @ 2382]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2090
diff
changeset
|
223 | gunk->inpa = gaim_input_add(sock, GAIM_INPUT_READ, grab_url_callback, dat); |
|
4331
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
224 | gunk->data_len = 4096; |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
225 | gunk->webdata = g_malloc(gunk->data_len); |
|
2369
65cbc00bf992
[gaim-migrate @ 2382]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2090
diff
changeset
|
226 | return; |
|
65cbc00bf992
[gaim-migrate @ 2382]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2090
diff
changeset
|
227 | } |
| 1 | 228 | |
|
2369
65cbc00bf992
[gaim-migrate @ 2382]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2090
diff
changeset
|
229 | if (read(sock, &data, 1) > 0 || errno == EWOULDBLOCK) { |
|
278
4365a163c987
[gaim-migrate @ 288]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
268
diff
changeset
|
230 | if (errno == EWOULDBLOCK) { |
|
4365a163c987
[gaim-migrate @ 288]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
268
diff
changeset
|
231 | errno = 0; |
|
2369
65cbc00bf992
[gaim-migrate @ 2382]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2090
diff
changeset
|
232 | return; |
|
65cbc00bf992
[gaim-migrate @ 2382]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2090
diff
changeset
|
233 | } |
|
4331
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
234 | |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
235 | gunk->len++; |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
236 | |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
237 | if (gunk->len == gunk->data_len + 1) { |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
238 | gunk->data_len += (gunk->data_len) / 2; |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
239 | |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
240 | gunk->webdata = g_realloc(gunk->webdata, gunk->data_len); |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
241 | } |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
242 | |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
243 | gunk->webdata[gunk->len - 1] = data; |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
244 | |
|
2584
1d2c4de26640
[gaim-migrate @ 2597]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2541
diff
changeset
|
245 | if (!gunk->startsaving) { |
|
1d2c4de26640
[gaim-migrate @ 2597]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2541
diff
changeset
|
246 | if (data == '\r') |
|
1d2c4de26640
[gaim-migrate @ 2597]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2541
diff
changeset
|
247 | return; |
|
1d2c4de26640
[gaim-migrate @ 2597]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2541
diff
changeset
|
248 | if (data == '\n') { |
|
4331
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
249 | if (gunk->newline) { |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
250 | size_t content_len; |
|
2584
1d2c4de26640
[gaim-migrate @ 2597]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2541
diff
changeset
|
251 | gunk->startsaving = TRUE; |
|
4331
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
252 | |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
253 | /* See if we can find a redirect. */ |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
254 | if (parse_redirect(gunk->webdata, gunk->len, sock, gunk)) |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
255 | return; |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
256 | |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
257 | /* No redirect. See if we can find a content length. */ |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
258 | content_len = parse_content_len(gunk->webdata, gunk->len); |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
259 | |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
260 | if (content_len == 0) { |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
261 | /* We'll stick with an initial 8192 */ |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
262 | content_len = 8192; |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
263 | } |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
264 | |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
265 | /* Out with the old... */ |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
266 | gunk->len = 0; |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
267 | g_free(gunk->webdata); |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
268 | gunk->webdata = NULL; |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
269 | |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
270 | /* In with the new. */ |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
271 | gunk->data_len = content_len; |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
272 | gunk->webdata = g_malloc(gunk->data_len); |
|
5222a28cc31d
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
273 | } |
|
2584
1d2c4de26640
[gaim-migrate @ 2597]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2541
diff
changeset
|
274 | else |
|
1d2c4de26640
[gaim-migrate @ 2597]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2541
diff
changeset
|
275 | gunk->newline = TRUE; |
|
1d2c4de26640
[gaim-migrate @ 2597]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2541
diff
changeset
|
276 | return; |
|
1d2c4de26640
[gaim-migrate @ 2597]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2541
diff
changeset
|
277 | } |
|
1d2c4de26640
[gaim-migrate @ 2597]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2541
diff
changeset
|
278 | gunk->newline = FALSE; |
|
278
4365a163c987
[gaim-migrate @ 288]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
268
diff
changeset
|
279 | } |
|
2369
65cbc00bf992
[gaim-migrate @ 2382]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2090
diff
changeset
|
280 | } else if (errno != ETIMEDOUT) { |
|
65cbc00bf992
[gaim-migrate @ 2382]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2090
diff
changeset
|
281 | gunk->webdata = g_realloc(gunk->webdata, gunk->len + 1); |
|
65cbc00bf992
[gaim-migrate @ 2382]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2090
diff
changeset
|
282 | gunk->webdata[gunk->len] = 0; |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1092
diff
changeset
|
283 | |
| 3100 | 284 | debug_printf(_("Received: '%s'\n"), gunk->webdata); |
|
1250
46ac03911ab0
[gaim-migrate @ 1260]
Decklin Foster <decklin@red-bean.com>
parents:
1092
diff
changeset
|
285 | |
|
2369
65cbc00bf992
[gaim-migrate @ 2382]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2090
diff
changeset
|
286 | gaim_input_remove(gunk->inpa); |
|
65cbc00bf992
[gaim-migrate @ 2382]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2090
diff
changeset
|
287 | close(sock); |
| 4322 | 288 | gunk->callback(gunk->data, gunk->webdata, gunk->len); |
|
2369
65cbc00bf992
[gaim-migrate @ 2382]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2090
diff
changeset
|
289 | if (gunk->webdata) |
|
65cbc00bf992
[gaim-migrate @ 2382]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2090
diff
changeset
|
290 | g_free(gunk->webdata); |
|
2541
0afd3aaba327
[gaim-migrate @ 2554]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2417
diff
changeset
|
291 | g_free(gunk->website); |
|
2369
65cbc00bf992
[gaim-migrate @ 2382]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2090
diff
changeset
|
292 | g_free(gunk->url); |
|
65cbc00bf992
[gaim-migrate @ 2382]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2090
diff
changeset
|
293 | g_free(gunk); |
|
65cbc00bf992
[gaim-migrate @ 2382]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2090
diff
changeset
|
294 | } else { |
|
65cbc00bf992
[gaim-migrate @ 2382]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2090
diff
changeset
|
295 | gaim_input_remove(gunk->inpa); |
|
65cbc00bf992
[gaim-migrate @ 2382]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2090
diff
changeset
|
296 | close(sock); |
| 4322 | 297 | gunk->callback(gunk->data, NULL, 0); |
|
2369
65cbc00bf992
[gaim-migrate @ 2382]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2090
diff
changeset
|
298 | if (gunk->webdata) |
|
65cbc00bf992
[gaim-migrate @ 2382]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2090
diff
changeset
|
299 | g_free(gunk->webdata); |
|
2541
0afd3aaba327
[gaim-migrate @ 2554]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2417
diff
changeset
|
300 | g_free(gunk->website); |
|
2369
65cbc00bf992
[gaim-migrate @ 2382]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2090
diff
changeset
|
301 | g_free(gunk->url); |
|
65cbc00bf992
[gaim-migrate @ 2382]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2090
diff
changeset
|
302 | g_free(gunk); |
| 1 | 303 | } |
| 304 | } | |
|
1840
770bc15f419c
[gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
305 | |
| 4322 | 306 | void grab_url(char *url, gboolean full, void callback(gpointer, char *, unsigned long), gpointer data) |
|
1840
770bc15f419c
[gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
307 | { |
|
770bc15f419c
[gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
308 | int sock; |
|
770bc15f419c
[gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
309 | struct grab_url_data *gunk = g_new0(struct grab_url_data, 1); |
|
770bc15f419c
[gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
310 | |
|
770bc15f419c
[gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
311 | gunk->callback = callback; |
|
770bc15f419c
[gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
312 | gunk->data = data; |
|
770bc15f419c
[gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
313 | gunk->url = g_strdup(url); |
|
770bc15f419c
[gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
314 | gunk->website = parse_url(url); |
|
2584
1d2c4de26640
[gaim-migrate @ 2597]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2541
diff
changeset
|
315 | gunk->full = full; |
|
1840
770bc15f419c
[gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
316 | |
| 4634 | 317 | if ((sock = proxy_connect(NULL, gunk->website->address, gunk->website->port, |
|
2372
c24942700dfd
[gaim-migrate @ 2385]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2369
diff
changeset
|
318 | grab_url_callback, gunk)) < 0) { |
|
2541
0afd3aaba327
[gaim-migrate @ 2554]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2417
diff
changeset
|
319 | g_free(gunk->website); |
|
1881
bcd5d457cdbb
[gaim-migrate @ 1891]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1843
diff
changeset
|
320 | g_free(gunk->url); |
|
bcd5d457cdbb
[gaim-migrate @ 1891]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1843
diff
changeset
|
321 | g_free(gunk); |
| 4322 | 322 | callback(data, g_strdup(_("g003: Error opening connection.\n")), 0); |
|
1840
770bc15f419c
[gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
323 | } |
|
770bc15f419c
[gaim-migrate @ 1850]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
1250
diff
changeset
|
324 | } |
| 5093 | 325 | |
| 5104 | 326 | struct gaim_parse_tag { |
| 327 | char *src_tag; | |
| 328 | char *dest_tag; | |
| 329 | }; | |
| 330 | ||
| 5093 | 331 | #define ALLOW_TAG_ALT(x, y) if(!g_ascii_strncasecmp(c, "<" x " ", strlen("<" x " "))) { \ |
| 5141 | 332 | const char *o = c + 1; \ |
| 333 | const char *p = NULL, *q = NULL, *r = NULL; \ | |
| 334 | while(*o) { \ | |
| 335 | if(!q && (*o == '\"' || *o == '\'') ) { \ | |
| 336 | q = o; \ | |
| 337 | } else if(q) { \ | |
| 338 | if(*o == *q) { \ | |
| 339 | q = NULL; \ | |
| 340 | } else if(*c == '\\') { \ | |
| 341 | o++; \ | |
| 342 | } \ | |
| 343 | } else if(*o == '<') { \ | |
| 344 | r = o; \ | |
| 345 | } else if(*o == '>') { \ | |
| 346 | p = o; \ | |
| 347 | break; \ | |
| 348 | } \ | |
| 349 | o++; \ | |
| 350 | } \ | |
| 351 | if(p && !r) { \ | |
| 5104 | 352 | if(*(p-1) != '/') { \ |
| 353 | struct gaim_parse_tag *pt = g_new0(struct gaim_parse_tag, 1); \ | |
| 354 | pt->src_tag = x; \ | |
| 355 | pt->dest_tag = y; \ | |
| 356 | tags = g_list_prepend(tags, pt); \ | |
| 357 | } \ | |
| 5093 | 358 | xhtml = g_string_append(xhtml, "<" y); \ |
| 359 | c += strlen("<" x ); \ | |
| 360 | xhtml = g_string_append_len(xhtml, c, (p - c) + 1); \ | |
| 361 | c = p + 1; \ | |
| 362 | } else { \ | |
| 363 | xhtml = g_string_append(xhtml, "<"); \ | |
| 5110 | 364 | plain = g_string_append_c(plain, '<'); \ |
| 5093 | 365 | } \ |
| 366 | continue; \ | |
| 367 | } \ | |
| 368 | if(!g_ascii_strncasecmp(c, "<" x, strlen("<" x)) && \ | |
| 369 | (*(c+strlen("<" x)) == '>' || \ | |
| 370 | !g_ascii_strncasecmp(c+strlen("<" x), "/>", 2))) { \ | |
| 371 | xhtml = g_string_append(xhtml, "<" y); \ | |
| 372 | c += strlen("<" x); \ | |
| 5104 | 373 | if(*c != '/') { \ |
| 374 | struct gaim_parse_tag *pt = g_new0(struct gaim_parse_tag, 1); \ | |
| 375 | pt->src_tag = x; \ | |
| 376 | pt->dest_tag = y; \ | |
| 377 | tags = g_list_prepend(tags, pt); \ | |
| 5110 | 378 | xhtml = g_string_append_c(xhtml, '>'); \ |
| 379 | } else { \ | |
| 380 | xhtml = g_string_append(xhtml, "/>");\ | |
| 5104 | 381 | } \ |
| 5110 | 382 | c = strchr(c, '>') + 1; \ |
| 5093 | 383 | continue; \ |
| 384 | } | |
| 385 | #define ALLOW_TAG(x) ALLOW_TAG_ALT(x, x) | |
| 386 | ||
| 5110 | 387 | void html_to_xhtml(const char *html, char **xhtml_out, char **plain_out) { |
| 5093 | 388 | GString *xhtml = g_string_new(""); |
| 5110 | 389 | GString *plain = g_string_new(""); |
| 5093 | 390 | GList *tags = NULL, *tag; |
| 5141 | 391 | const char *c = html; |
| 5093 | 392 | while(*c) { |
| 5141 | 393 | if(*c == '<') { |
| 5093 | 394 | if(*(c+1) == '/') { /* closing tag */ |
| 395 | tag = tags; | |
| 396 | while(tag) { | |
| 5104 | 397 | struct gaim_parse_tag *pt = tag->data; |
| 398 | if(!g_ascii_strncasecmp((c+2), pt->src_tag, strlen(pt->src_tag)) && *(c+strlen(pt->src_tag)+2) == '>') { | |
| 399 | c += strlen(pt->src_tag) + 3; | |
| 5093 | 400 | break; |
| 401 | } | |
| 402 | tag = tag->next; | |
| 403 | } | |
| 404 | if(tag) { | |
| 405 | while(tags) { | |
| 5104 | 406 | struct gaim_parse_tag *pt = tags->data; |
| 407 | g_string_append_printf(xhtml, "</%s>", pt->dest_tag); | |
| 5093 | 408 | if(tags == tag) |
| 409 | break; | |
| 5104 | 410 | tags = g_list_remove(tags, pt); |
| 411 | g_free(pt); | |
| 5093 | 412 | } |
| 5104 | 413 | g_free(tag->data); |
| 5093 | 414 | tags = g_list_remove(tags, tag->data); |
| 415 | } else { | |
| 416 | /* we tried to close a tag we never opened! escape it | |
| 417 | * and move on */ | |
| 418 | xhtml = g_string_append(xhtml, "<"); | |
| 5110 | 419 | plain = g_string_append_c(plain, '<'); |
| 5093 | 420 | c++; |
| 421 | } | |
| 422 | } else { /* opening tag */ | |
| 423 | ALLOW_TAG("a"); | |
| 5101 | 424 | ALLOW_TAG_ALT("b", "strong"); |
| 5093 | 425 | ALLOW_TAG("blockquote"); |
| 5101 | 426 | ALLOW_TAG_ALT("bold", "strong"); |
| 5093 | 427 | ALLOW_TAG("br"); |
| 428 | ALLOW_TAG("cite"); | |
| 429 | ALLOW_TAG("div"); | |
| 430 | ALLOW_TAG("em"); | |
| 431 | ALLOW_TAG("h1"); | |
| 432 | ALLOW_TAG("h2"); | |
| 433 | ALLOW_TAG("h3"); | |
| 434 | ALLOW_TAG("h4"); | |
| 435 | ALLOW_TAG("h5"); | |
| 436 | ALLOW_TAG("h6"); | |
| 5101 | 437 | ALLOW_TAG("hr"); /* FIXME: not valid, need to skip?? */ |
| 5093 | 438 | ALLOW_TAG("html"); |
| 5101 | 439 | ALLOW_TAG_ALT("i", "em"); |
| 440 | ALLOW_TAG_ALT("italic", "em"); | |
| 5093 | 441 | ALLOW_TAG("li"); |
| 442 | ALLOW_TAG("ol"); | |
| 443 | ALLOW_TAG("p"); | |
| 444 | ALLOW_TAG("pre"); | |
| 445 | ALLOW_TAG("q"); | |
| 446 | ALLOW_TAG("span"); | |
| 447 | ALLOW_TAG("strong"); | |
| 448 | ALLOW_TAG("ul"); | |
| 449 | ||
| 5104 | 450 | if(!g_ascii_strncasecmp(c, "<u>", 2) || !g_ascii_strncasecmp(c, "<underline>", strlen("<underline>"))) { |
| 451 | struct gaim_parse_tag *pt = g_new0(struct gaim_parse_tag, 1); | |
| 452 | pt->src_tag = *(c+2) == '>' ? "u" : "underline"; | |
| 453 | pt->dest_tag = "span"; | |
| 454 | tags = g_list_prepend(tags, pt); | |
| 455 | c = strchr(c, '>') + 1; | |
| 456 | xhtml = g_string_append(xhtml, "<span style='text-decoration: underline;'>"); | |
| 457 | continue; | |
| 458 | } | |
| 459 | if(!g_ascii_strncasecmp(c, "<s>", 2) || !g_ascii_strncasecmp(c, "<strike>", strlen("<strike>"))) { | |
| 460 | struct gaim_parse_tag *pt = g_new0(struct gaim_parse_tag, 1); | |
| 461 | pt->src_tag = *(c+2) == '>' ? "s" : "strike"; | |
| 462 | pt->dest_tag = "span"; | |
| 463 | tags = g_list_prepend(tags, pt); | |
| 464 | c = strchr(c, '>') + 1; | |
| 465 | xhtml = g_string_append(xhtml, "<span style='text-decoration: line-through;'>"); | |
| 466 | continue; | |
| 467 | } | |
| 468 | if(!g_ascii_strncasecmp(c, "<sub>", 5)) { | |
| 469 | struct gaim_parse_tag *pt = g_new0(struct gaim_parse_tag, 1); | |
| 470 | pt->src_tag = "sub"; | |
| 471 | pt->dest_tag = "span"; | |
| 472 | tags = g_list_prepend(tags, pt); | |
| 473 | c = strchr(c, '>') + 1; | |
| 474 | xhtml = g_string_append(xhtml, "<span style='vertical-align:sub;'>"); | |
| 475 | continue; | |
| 476 | } | |
| 477 | if(!g_ascii_strncasecmp(c, "<sup>", 5)) { | |
| 478 | struct gaim_parse_tag *pt = g_new0(struct gaim_parse_tag, 1); | |
| 479 | pt->src_tag = "sup"; | |
| 480 | pt->dest_tag = "span"; | |
| 481 | tags = g_list_prepend(tags, pt); | |
| 482 | c = strchr(c, '>') + 1; | |
| 483 | xhtml = g_string_append(xhtml, "<span style='vertical-align:super;'>"); | |
| 484 | continue; | |
| 485 | } | |
| 5107 | 486 | if(!g_ascii_strncasecmp(c, "<font", 5) && (*(c+5) == '>' || *(c+5) == ' ')) { |
| 487 | const char *p = c; | |
| 488 | GString *style = g_string_new(""); | |
| 489 | struct gaim_parse_tag *pt; | |
| 490 | while(*p && *p != '>') { | |
| 491 | if(!g_ascii_strncasecmp(p, "color=", strlen("color="))) { | |
| 492 | const char *q = p + strlen("color="); | |
| 493 | GString *color = g_string_new(""); | |
| 494 | if(*q == '\'' || *q == '\"') | |
| 495 | q++; | |
| 496 | while(*q && *q != '\"' && *q != '\'' && *q != ' ') { | |
| 497 | color = g_string_append_c(color, *q); | |
| 498 | q++; | |
| 499 | } | |
| 500 | g_string_append_printf(style, "color: %s; ", color->str); | |
| 501 | g_string_free(color, TRUE); | |
| 502 | p = q; | |
| 503 | } else if(!g_ascii_strncasecmp(p, "face=", strlen("face="))) { | |
| 504 | const char *q = p + strlen("face="); | |
| 505 | gboolean space_allowed = FALSE; | |
| 506 | GString *face = g_string_new(""); | |
| 507 | if(*q == '\'' || *q == '\"') { | |
| 508 | space_allowed = TRUE; | |
| 509 | q++; | |
| 510 | } | |
| 511 | while(*q && *q != '\"' && *q != '\'' && (space_allowed || *q != ' ')) { | |
| 512 | face = g_string_append_c(face, *q); | |
| 513 | q++; | |
| 514 | } | |
| 515 | g_string_append_printf(style, "font-family: %s; ", face->str); | |
| 516 | g_string_free(face, TRUE); | |
| 517 | p = q; | |
| 518 | } else if(!g_ascii_strncasecmp(p, "size=", strlen("size="))) { | |
| 519 | const char *q = p + strlen("size="); | |
| 520 | int sz; | |
| 521 | const char *size = "medium"; | |
| 522 | if(*q == '\'' || *q == '\"') | |
| 523 | q++; | |
| 524 | sz = atoi(q); | |
| 525 | if(sz < 3) | |
| 526 | size = "smaller"; | |
| 527 | else if(sz > 3) | |
| 528 | size = "larger"; | |
| 529 | g_string_append_printf(style, "font-size: %s; ", size); | |
| 530 | p = q; | |
| 531 | } | |
| 532 | p++; | |
| 533 | } | |
| 534 | c = strchr(c, '>') + 1; | |
| 535 | pt = g_new0(struct gaim_parse_tag, 1); | |
| 536 | pt->src_tag = "font"; | |
| 537 | pt->dest_tag = "span"; | |
| 538 | tags = g_list_prepend(tags, pt); | |
| 539 | xhtml = g_string_append(xhtml, "<span"); | |
| 540 | if(style->len) | |
| 541 | g_string_append_printf(xhtml, " style='%s'", style->str); | |
| 542 | xhtml = g_string_append_c(xhtml, '>'); | |
| 543 | g_string_free(style, TRUE); | |
| 544 | continue; | |
| 545 | } | |
| 546 | if(!g_ascii_strncasecmp(c, "<body ", 6)) { | |
| 547 | const char *p = c; | |
| 548 | gboolean did_something = FALSE; | |
| 549 | while(*p && *p != '>') { | |
| 550 | if(!g_ascii_strncasecmp(p, "bgcolor=", strlen("bgcolor="))) { | |
| 551 | const char *q = p + strlen("bgcolor="); | |
| 552 | struct gaim_parse_tag *pt = g_new0(struct gaim_parse_tag, 1); | |
| 553 | GString *color = g_string_new(""); | |
| 554 | if(*q == '\'' || *q == '\"') | |
| 555 | q++; | |
| 556 | while(*q && *q != '\"' && *q != '\'' && *q != ' ') { | |
| 557 | color = g_string_append_c(color, *q); | |
| 558 | q++; | |
| 559 | } | |
| 560 | g_string_append_printf(xhtml, "<span style='background: %s;'>", color->str); | |
| 561 | g_string_free(color, TRUE); | |
| 562 | c = strchr(c, '>') + 1; | |
| 563 | pt->src_tag = "body"; | |
| 564 | pt->dest_tag = "span"; | |
| 565 | tags = g_list_prepend(tags, pt); | |
| 566 | did_something = TRUE; | |
| 567 | break; | |
| 568 | } | |
| 569 | p++; | |
| 570 | } | |
| 571 | if(did_something) continue; | |
| 572 | } | |
| 573 | /* this has to come after the special case for bgcolor */ | |
| 574 | ALLOW_TAG("body"); | |
| 5093 | 575 | if(!g_ascii_strncasecmp(c, "<!--", strlen("<!--"))) { |
| 576 | char *p = strstr(c + strlen("<!--"), "-->"); | |
| 577 | if(p) { | |
| 578 | xhtml = g_string_append(xhtml, "<!--"); | |
| 579 | c += strlen("<!--"); | |
| 580 | continue; | |
| 581 | } | |
| 582 | } | |
| 583 | ||
| 584 | xhtml = g_string_append(xhtml, "<"); | |
| 5110 | 585 | plain = g_string_append_c(plain, '<'); |
| 5093 | 586 | c++; |
| 587 | } | |
| 588 | } else { | |
| 589 | xhtml = g_string_append_c(xhtml, *c); | |
| 5110 | 590 | plain = g_string_append_c(plain, *c); |
| 5093 | 591 | c++; |
| 592 | } | |
| 593 | } | |
| 594 | tag = tags; | |
| 595 | while(tag) { | |
| 596 | g_string_append_printf(xhtml, "</%s>", (char *)tag->data); | |
| 597 | tag = tag->next; | |
| 598 | } | |
| 599 | g_list_free(tags); | |
| 5110 | 600 | if(xhtml_out) |
| 601 | *xhtml_out = g_strdup(xhtml->str); | |
| 602 | if(plain_out) | |
| 603 | *plain_out = g_strdup(plain->str); | |
| 5093 | 604 | g_string_free(xhtml, TRUE); |
| 5110 | 605 | g_string_free(plain, TRUE); |
| 5093 | 606 | } |