annotate src/html.c @ 7011:4375bf2d9020

[gaim-migrate @ 7574] The user-visible changes? Gaim now shows peep's away messages in their tooltip for AIM over oscar. Things to do: -Make sure this doesn't screw up with huge buddy lists -Replace %n with your screen name, etc. in the tooltip -Leave in b, i, u tags in the tooltip -Fix the 2 8 byte memleaks in locate.c Client authors that aren't me will want to read the following pretty closely... I made some internal libfaim changes. I desire to make libfaim cleaner. I don't know if this really helps or not. Here's what I've done: Changed all the SNAC-sending functions in info.c to NOT take a conn argument. The connection is looked up from the session. I'm trying to make oscar.c less-aware of connections. Added aim_locate_finduserinfo() - Use for getting the aim_userinfo_t for the given screenname. Added aim_locate_getinfoshort() - Use this to request that the servers send you profile info, away message, caps, or a combination of the above. It's like aim_locate_getinfo() but less rate limited. Renamed aim_bos_reqlocaterights() to aim_locate_reqrights() Renamed aim_getinfo() to aim_locate_getinfo() Renamed aim_setdirectoryinfo() to aim_locate_setdirinfo() Renamed aim_0002_000b() to aim_locate_000b() Renamed aim_setuserinterests() to aim_locate_setinterests() Removed aim_userinfo_sn() Removed aim_userinfo_flags() Removed aim_userinfo_idle() Removed aim_userinfo_warnlevel() Removed aim_userinfo_createtime() Removed aim_userinfo_membersince() Removed aim_userinfo_onlinesince() Removed aim_userinfo_sessionlen() Removed aim_userinfo_hascap() Renamed info.c to locate.c Made locate.c keep a static, linked list of nodes of sn, away message, available message, user info. This list is maintained by libfaim automatically. Now clients don't have to keep track of all this stuff themselves, and users won't have to wait for away message/info retrieval if the person is in your buddy list. libfaim uses the iChat way of retrieving stuff, which is not nearly as rate limited as the old way. I actually have a feeling WinAIM uses the same SNAC now (although I didn't check), but I like pluggin iChat because it's innovative. Moved sess->emailinfo to a static variable inside email.c. Removed evilhack from oscar.c I think that's about everything... committer: Tailor Script <tailor@pidgin.im>
author Mark Doliner <mark@kingant.net>
date Mon, 29 Sep 2003 12:30:03 +0000
parents 7c14b35bc984
children 67c4e9d39242
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
1 /*
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
2 * gaim
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
3 *
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
4 * Copyright (C) 1998-1999, Mark Spencer <markster@marko.net>
5176
6911a84cbab1 [gaim-migrate @ 5540]
Nathan Walp <nwalp@pidgin.im>
parents: 5174
diff changeset
5 * 2003, Nathan Walp <faceprint@faceprint.com>
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
6 *
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
7 * This program is free software; you can redistribute it and/or modify
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
8 * it under the terms of the GNU General Public License as published by
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
9 * the Free Software Foundation; either version 2 of the License, or
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
10 * (at your option) any later version.
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
11 *
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
12 * This program is distributed in the hope that it will be useful,
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
15 * GNU General Public License for more details.
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
16 *
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
17 * You should have received a copy of the GNU General Public License
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
18 * along with this program; if not, write to the Free Software
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
20 *
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
21 */
5872
059d95c67cda [gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents: 5681
diff changeset
22 #include "internal.h"
3630
9682c0e022c6 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3100
diff changeset
23
5872
059d95c67cda [gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents: 5681
diff changeset
24 #include "debug.h"
6115
11bedb793a44 [gaim-migrate @ 6578]
Christian Hammond <chipx86@chipx86.com>
parents: 5940
diff changeset
25 #include "html.h"
1092
a930439f29b1 [gaim-migrate @ 1102]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1088
diff changeset
26 #include "proxy.h"
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
27
5872
059d95c67cda [gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents: 5681
diff changeset
28 #include "gaim.h"
3717
988485669631 [gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 3630
diff changeset
29
4359
5fb47ec9bfe4 [gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents: 4335
diff changeset
30 gchar *strip_html(const gchar *text)
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
31 {
1883
060161a5d5f8 [gaim-migrate @ 1893]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1881
diff changeset
32 int i, j, k;
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
33 int visible = 1;
1883
060161a5d5f8 [gaim-migrate @ 1893]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1881
diff changeset
34 gchar *text2 = g_strdup(text);
1250
b5783215b245 [gaim-migrate @ 1260]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1092
diff changeset
35
4757
c4ebe1a8484b [gaim-migrate @ 5074]
Nathan Walp <nwalp@pidgin.im>
parents: 4634
diff changeset
36 if(!text)
c4ebe1a8484b [gaim-migrate @ 5074]
Nathan Walp <nwalp@pidgin.im>
parents: 4634
diff changeset
37 return NULL;
4503
fdc4ac6d1db1 [gaim-migrate @ 4778]
Nathan Walp <nwalp@pidgin.im>
parents: 4473
diff changeset
38
1250
b5783215b245 [gaim-migrate @ 1260]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1092
diff changeset
39 for (i = 0, j = 0; text2[i]; i++) {
b5783215b245 [gaim-migrate @ 1260]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1092
diff changeset
40 if (text2[i] == '<') {
1883
060161a5d5f8 [gaim-migrate @ 1893]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1881
diff changeset
41 k = i + 1;
4777
e23a7e166680 [gaim-migrate @ 5097]
Nathan Walp <nwalp@pidgin.im>
parents: 4757
diff changeset
42 if(g_ascii_isspace(text2[k])) {
e23a7e166680 [gaim-migrate @ 5097]
Nathan Walp <nwalp@pidgin.im>
parents: 4757
diff changeset
43 visible = 1;
e23a7e166680 [gaim-migrate @ 5097]
Nathan Walp <nwalp@pidgin.im>
parents: 4757
diff changeset
44 } else {
e23a7e166680 [gaim-migrate @ 5097]
Nathan Walp <nwalp@pidgin.im>
parents: 4757
diff changeset
45 while (text2[k]) {
e23a7e166680 [gaim-migrate @ 5097]
Nathan Walp <nwalp@pidgin.im>
parents: 4757
diff changeset
46 if (text2[k] == '<') {
e23a7e166680 [gaim-migrate @ 5097]
Nathan Walp <nwalp@pidgin.im>
parents: 4757
diff changeset
47 visible = 1;
e23a7e166680 [gaim-migrate @ 5097]
Nathan Walp <nwalp@pidgin.im>
parents: 4757
diff changeset
48 break;
e23a7e166680 [gaim-migrate @ 5097]
Nathan Walp <nwalp@pidgin.im>
parents: 4757
diff changeset
49 }
e23a7e166680 [gaim-migrate @ 5097]
Nathan Walp <nwalp@pidgin.im>
parents: 4757
diff changeset
50 if (text2[k] == '>') {
e23a7e166680 [gaim-migrate @ 5097]
Nathan Walp <nwalp@pidgin.im>
parents: 4757
diff changeset
51 visible = 0;
e23a7e166680 [gaim-migrate @ 5097]
Nathan Walp <nwalp@pidgin.im>
parents: 4757
diff changeset
52 break;
e23a7e166680 [gaim-migrate @ 5097]
Nathan Walp <nwalp@pidgin.im>
parents: 4757
diff changeset
53 }
e23a7e166680 [gaim-migrate @ 5097]
Nathan Walp <nwalp@pidgin.im>
parents: 4757
diff changeset
54 k++;
1883
060161a5d5f8 [gaim-migrate @ 1893]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1881
diff changeset
55 }
060161a5d5f8 [gaim-migrate @ 1893]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1881
diff changeset
56 }
060161a5d5f8 [gaim-migrate @ 1893]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1881
diff changeset
57 } else if (text2[i] == '>' && !visible) {
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
58 visible = 1;
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
59 continue;
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
60 }
4473
7b0f6537da75 [gaim-migrate @ 4748]
Luke Schierer <lschiere@pidgin.im>
parents: 4359
diff changeset
61 if (text2[i] == '&' && strncasecmp(text2+i,"&quot;",6) == 0) {
7b0f6537da75 [gaim-migrate @ 4748]
Luke Schierer <lschiere@pidgin.im>
parents: 4359
diff changeset
62 text2[j++] = '\"';
7b0f6537da75 [gaim-migrate @ 4748]
Luke Schierer <lschiere@pidgin.im>
parents: 4359
diff changeset
63 i = i+5;
7b0f6537da75 [gaim-migrate @ 4748]
Luke Schierer <lschiere@pidgin.im>
parents: 4359
diff changeset
64 continue;
7b0f6537da75 [gaim-migrate @ 4748]
Luke Schierer <lschiere@pidgin.im>
parents: 4359
diff changeset
65 }
1250
b5783215b245 [gaim-migrate @ 1260]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1092
diff changeset
66 if (visible) {
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
67 text2[j++] = text2[i];
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
68 }
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
69 }
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
70 text2[j] = '\0';
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
71 return text2;
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
72 }
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
73
3630
9682c0e022c6 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3100
diff changeset
74 struct g_url *parse_url(char *url)
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
75 {
5512
e41b04bb4afe [gaim-migrate @ 5911]
Nathan Walp <nwalp@pidgin.im>
parents: 5511
diff changeset
76 struct g_url *test = g_new0(struct g_url, 1);
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
77 char scan_info[255];
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
78 char port[5];
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
79 int f;
5501
36d2c875a822 [gaim-migrate @ 5900]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 5211
diff changeset
80 char* turl;
36d2c875a822 [gaim-migrate @ 5900]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 5211
diff changeset
81 /* hyphen at end includes it in control set */
36d2c875a822 [gaim-migrate @ 5900]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 5211
diff changeset
82 char addr_ctrl[] = "A-Za-z0-9.-";
36d2c875a822 [gaim-migrate @ 5900]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 5211
diff changeset
83 char port_ctrl[] = "0-9";
6516
7c14b35bc984 [gaim-migrate @ 7033]
Luke Schierer <lschiere@pidgin.im>
parents: 6514
diff changeset
84 char page_ctrl[] = "A-Za-z0-9.~_/:*!@&%%?=+^-";
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
85
5501
36d2c875a822 [gaim-migrate @ 5900]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 5211
diff changeset
86 if((turl=strstr(url, "http://")) || (turl=strstr(url, "HTTP://")))
36d2c875a822 [gaim-migrate @ 5900]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 5211
diff changeset
87 url=turl+=7;
36d2c875a822 [gaim-migrate @ 5900]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 5211
diff changeset
88
36d2c875a822 [gaim-migrate @ 5900]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 5211
diff changeset
89 snprintf(scan_info, sizeof(scan_info),
36d2c875a822 [gaim-migrate @ 5900]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 5211
diff changeset
90 "%%[%s]:%%[%s]/%%[%s]",
36d2c875a822 [gaim-migrate @ 5900]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 5211
diff changeset
91 addr_ctrl, port_ctrl, page_ctrl);
36d2c875a822 [gaim-migrate @ 5900]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 5211
diff changeset
92
2541
8229710b343b [gaim-migrate @ 2554]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2417
diff changeset
93 f = sscanf(url, scan_info, test->address, port, test->page);
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
94 if (f == 1) {
5501
36d2c875a822 [gaim-migrate @ 5900]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 5211
diff changeset
95 snprintf(scan_info, sizeof(scan_info),
36d2c875a822 [gaim-migrate @ 5900]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 5211
diff changeset
96 "%%[%s]/%%[%s]",
36d2c875a822 [gaim-migrate @ 5900]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 5211
diff changeset
97 addr_ctrl, page_ctrl);
2541
8229710b343b [gaim-migrate @ 2554]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2417
diff changeset
98 f = sscanf(url, scan_info, test->address, test->page);
5501
36d2c875a822 [gaim-migrate @ 5900]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 5211
diff changeset
99 snprintf(port, sizeof(port), "80");
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
100 }
5501
36d2c875a822 [gaim-migrate @ 5900]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 5211
diff changeset
101 if (f == 1)
5512
e41b04bb4afe [gaim-migrate @ 5911]
Nathan Walp <nwalp@pidgin.im>
parents: 5511
diff changeset
102 test->page[0] = '\0';
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
103
2541
8229710b343b [gaim-migrate @ 2554]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2417
diff changeset
104 sscanf(port, "%d", &test->port);
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
105 return test;
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
106 }
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
107
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
108 struct grab_url_data {
4322
a789969fc198 [gaim-migrate @ 4577]
Rob Flynn <gaim@robflynn.com>
parents: 3717
diff changeset
109 void (* callback)(gpointer, char *, unsigned long);
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
110 gpointer data;
2541
8229710b343b [gaim-migrate @ 2554]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2417
diff changeset
111 struct g_url *website;
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
112 char *url;
2584
34812d648f72 [gaim-migrate @ 2597]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2541
diff changeset
113 gboolean full;
6516
7c14b35bc984 [gaim-migrate @ 7033]
Luke Schierer <lschiere@pidgin.im>
parents: 6514
diff changeset
114 char *user_agent;
7c14b35bc984 [gaim-migrate @ 7033]
Luke Schierer <lschiere@pidgin.im>
parents: 6514
diff changeset
115 int http11;
2369
117e9f0950b6 [gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2090
diff changeset
116
117e9f0950b6 [gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2090
diff changeset
117 int inpa;
117e9f0950b6 [gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2090
diff changeset
118
117e9f0950b6 [gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2090
diff changeset
119 gboolean sentreq;
2584
34812d648f72 [gaim-migrate @ 2597]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2541
diff changeset
120 gboolean newline;
34812d648f72 [gaim-migrate @ 2597]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2541
diff changeset
121 gboolean startsaving;
2369
117e9f0950b6 [gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2090
diff changeset
122 char *webdata;
4322
a789969fc198 [gaim-migrate @ 4577]
Rob Flynn <gaim@robflynn.com>
parents: 3717
diff changeset
123 unsigned long len;
4331
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
124 unsigned long data_len;
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
125 };
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
126
4331
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
127 static gboolean
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
128 parse_redirect(const char *data, size_t data_len, gint sock,
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
129 struct grab_url_data *gunk)
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
130 {
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
131 gchar *s;
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
132
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
133 if ((s = g_strstr_len(data, data_len, "Location: ")) != NULL) {
6128
3de23c9ca1e4 [gaim-migrate @ 6602]
Christian Hammond <chipx86@chipx86.com>
parents: 6115
diff changeset
134 gchar *new_url, *temp_url, *end;
3de23c9ca1e4 [gaim-migrate @ 6602]
Christian Hammond <chipx86@chipx86.com>
parents: 6115
diff changeset
135 gboolean full;
4331
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
136 int len;
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
137
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
138 s += strlen("Location: ");
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
139 end = strchr(s, '\r');
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
140
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
141 /* Just in case :) */
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
142 if (end == NULL)
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
143 end = strchr(s, '\n');
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
144
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
145 len = end - s;
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
146
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
147 new_url = g_malloc(len + 1);
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
148 strncpy(new_url, s, len);
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
149 new_url[len] = '\0';
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
150
6128
3de23c9ca1e4 [gaim-migrate @ 6602]
Christian Hammond <chipx86@chipx86.com>
parents: 6115
diff changeset
151 full = gunk->full;
3de23c9ca1e4 [gaim-migrate @ 6602]
Christian Hammond <chipx86@chipx86.com>
parents: 6115
diff changeset
152
3de23c9ca1e4 [gaim-migrate @ 6602]
Christian Hammond <chipx86@chipx86.com>
parents: 6115
diff changeset
153 if (*new_url == '/' || g_strstr_len(new_url, len, "://") == NULL) {
3de23c9ca1e4 [gaim-migrate @ 6602]
Christian Hammond <chipx86@chipx86.com>
parents: 6115
diff changeset
154 temp_url = new_url;
3de23c9ca1e4 [gaim-migrate @ 6602]
Christian Hammond <chipx86@chipx86.com>
parents: 6115
diff changeset
155
3de23c9ca1e4 [gaim-migrate @ 6602]
Christian Hammond <chipx86@chipx86.com>
parents: 6115
diff changeset
156 new_url = g_strdup_printf("%s:%d%s", gunk->website->address,
3de23c9ca1e4 [gaim-migrate @ 6602]
Christian Hammond <chipx86@chipx86.com>
parents: 6115
diff changeset
157 gunk->website->port, temp_url);
3de23c9ca1e4 [gaim-migrate @ 6602]
Christian Hammond <chipx86@chipx86.com>
parents: 6115
diff changeset
158
3de23c9ca1e4 [gaim-migrate @ 6602]
Christian Hammond <chipx86@chipx86.com>
parents: 6115
diff changeset
159 g_free(temp_url);
3de23c9ca1e4 [gaim-migrate @ 6602]
Christian Hammond <chipx86@chipx86.com>
parents: 6115
diff changeset
160
3de23c9ca1e4 [gaim-migrate @ 6602]
Christian Hammond <chipx86@chipx86.com>
parents: 6115
diff changeset
161 full = FALSE;
3de23c9ca1e4 [gaim-migrate @ 6602]
Christian Hammond <chipx86@chipx86.com>
parents: 6115
diff changeset
162 }
3de23c9ca1e4 [gaim-migrate @ 6602]
Christian Hammond <chipx86@chipx86.com>
parents: 6115
diff changeset
163
4331
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
164 /* Close the existing stuff. */
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
165 gaim_input_remove(gunk->inpa);
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
166 close(sock);
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
167
6128
3de23c9ca1e4 [gaim-migrate @ 6602]
Christian Hammond <chipx86@chipx86.com>
parents: 6115
diff changeset
168 gaim_debug(GAIM_DEBUG_INFO, "grab_url",
3de23c9ca1e4 [gaim-migrate @ 6602]
Christian Hammond <chipx86@chipx86.com>
parents: 6115
diff changeset
169 "Redirecting to %s\n", new_url);
3de23c9ca1e4 [gaim-migrate @ 6602]
Christian Hammond <chipx86@chipx86.com>
parents: 6115
diff changeset
170
4331
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
171 /* Try again, with this new location. */
6516
7c14b35bc984 [gaim-migrate @ 7033]
Luke Schierer <lschiere@pidgin.im>
parents: 6514
diff changeset
172 grab_url(new_url, full, gunk->callback, gunk->data, gunk->user_agent, gunk->http11);
4331
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
173
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
174 /* Free up. */
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
175 g_free(new_url);
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
176 g_free(gunk->webdata);
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
177 g_free(gunk->website);
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
178 g_free(gunk->url);
6516
7c14b35bc984 [gaim-migrate @ 7033]
Luke Schierer <lschiere@pidgin.im>
parents: 6514
diff changeset
179 g_free(gunk->user_agent);
4331
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
180 g_free(gunk);
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
181
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
182 return TRUE;
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
183 }
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
184
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
185 return FALSE;
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
186 }
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
187
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
188 static size_t
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
189 parse_content_len(const char *data, size_t data_len)
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
190 {
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
191 size_t content_len = 0;
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
192
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
193 sscanf(data, "Content-Length: %d", &content_len);
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
194
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
195 return content_len;
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
196 }
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
197
2369
117e9f0950b6 [gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2090
diff changeset
198 static void grab_url_callback(gpointer dat, gint sock, GaimInputCondition cond)
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
199 {
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
200 struct grab_url_data *gunk = dat;
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
201 char data;
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
202
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
203 if (sock == -1) {
4322
a789969fc198 [gaim-migrate @ 4577]
Rob Flynn <gaim@robflynn.com>
parents: 3717
diff changeset
204 gunk->callback(gunk->data, NULL, 0);
2541
8229710b343b [gaim-migrate @ 2554]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2417
diff changeset
205 g_free(gunk->website);
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
206 g_free(gunk->url);
6516
7c14b35bc984 [gaim-migrate @ 7033]
Luke Schierer <lschiere@pidgin.im>
parents: 6514
diff changeset
207 g_free(gunk->user_agent);
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
208 g_free(gunk);
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
209 return;
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 691
diff changeset
210 }
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
211
2369
117e9f0950b6 [gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2090
diff changeset
212 if (!gunk->sentreq) {
6516
7c14b35bc984 [gaim-migrate @ 7033]
Luke Schierer <lschiere@pidgin.im>
parents: 6514
diff changeset
213 char buf[1024];
3717
988485669631 [gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 3630
diff changeset
214
6516
7c14b35bc984 [gaim-migrate @ 7033]
Luke Schierer <lschiere@pidgin.im>
parents: 6514
diff changeset
215 if(gunk->user_agent) {
7c14b35bc984 [gaim-migrate @ 7033]
Luke Schierer <lschiere@pidgin.im>
parents: 6514
diff changeset
216 if(gunk->http11)
7c14b35bc984 [gaim-migrate @ 7033]
Luke Schierer <lschiere@pidgin.im>
parents: 6514
diff changeset
217 g_snprintf(buf, sizeof(buf), "GET %s%s HTTP/1.1\r\nUser-Agent: \"%s\"\r\nHost: %s\r\n\r\n", gunk->full ? "" : "/",
7c14b35bc984 [gaim-migrate @ 7033]
Luke Schierer <lschiere@pidgin.im>
parents: 6514
diff changeset
218 gunk->full ? gunk->url : gunk->website->page, gunk->user_agent, gunk->website->address);
7c14b35bc984 [gaim-migrate @ 7033]
Luke Schierer <lschiere@pidgin.im>
parents: 6514
diff changeset
219 else
7c14b35bc984 [gaim-migrate @ 7033]
Luke Schierer <lschiere@pidgin.im>
parents: 6514
diff changeset
220 g_snprintf(buf, sizeof(buf), "GET %s%s HTTP/1.0\r\nUser-Agent: \"%s\"\r\n\r\n", gunk->full ? "" : "/",
7c14b35bc984 [gaim-migrate @ 7033]
Luke Schierer <lschiere@pidgin.im>
parents: 6514
diff changeset
221 gunk->full ? gunk->url : gunk->website->page, gunk->user_agent);
7c14b35bc984 [gaim-migrate @ 7033]
Luke Schierer <lschiere@pidgin.im>
parents: 6514
diff changeset
222 }
7c14b35bc984 [gaim-migrate @ 7033]
Luke Schierer <lschiere@pidgin.im>
parents: 6514
diff changeset
223 else {
7c14b35bc984 [gaim-migrate @ 7033]
Luke Schierer <lschiere@pidgin.im>
parents: 6514
diff changeset
224 if(gunk->http11)
7c14b35bc984 [gaim-migrate @ 7033]
Luke Schierer <lschiere@pidgin.im>
parents: 6514
diff changeset
225 g_snprintf(buf, sizeof(buf), "GET %s%s HTTP/1.1\r\nHost: %s\r\n\r\n", gunk->full ? "" : "/",
7c14b35bc984 [gaim-migrate @ 7033]
Luke Schierer <lschiere@pidgin.im>
parents: 6514
diff changeset
226 gunk->full ? gunk->url : gunk->website->page, gunk->website->address);
7c14b35bc984 [gaim-migrate @ 7033]
Luke Schierer <lschiere@pidgin.im>
parents: 6514
diff changeset
227 else
7c14b35bc984 [gaim-migrate @ 7033]
Luke Schierer <lschiere@pidgin.im>
parents: 6514
diff changeset
228 g_snprintf(buf, sizeof(buf), "GET %s%s HTTP/1.0\r\n\r\n", gunk->full ? "" : "/",
7c14b35bc984 [gaim-migrate @ 7033]
Luke Schierer <lschiere@pidgin.im>
parents: 6514
diff changeset
229 gunk->full ? gunk->url : gunk->website->page);
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 5176
diff changeset
230
6516
7c14b35bc984 [gaim-migrate @ 7033]
Luke Schierer <lschiere@pidgin.im>
parents: 6514
diff changeset
231 }
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 5176
diff changeset
232 gaim_debug(GAIM_DEBUG_MISC, "grab_url_callback",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 5176
diff changeset
233 "Request: %s\n", buf);
3717
988485669631 [gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 3630
diff changeset
234
2369
117e9f0950b6 [gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2090
diff changeset
235 write(sock, buf, strlen(buf));
117e9f0950b6 [gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2090
diff changeset
236 fcntl(sock, F_SETFL, O_NONBLOCK);
117e9f0950b6 [gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2090
diff changeset
237 gunk->sentreq = TRUE;
117e9f0950b6 [gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2090
diff changeset
238 gunk->inpa = gaim_input_add(sock, GAIM_INPUT_READ, grab_url_callback, dat);
4331
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
239 gunk->data_len = 4096;
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
240 gunk->webdata = g_malloc(gunk->data_len);
2369
117e9f0950b6 [gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2090
diff changeset
241 return;
117e9f0950b6 [gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2090
diff changeset
242 }
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
243
2369
117e9f0950b6 [gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2090
diff changeset
244 if (read(sock, &data, 1) > 0 || errno == EWOULDBLOCK) {
278
29e1669b006b [gaim-migrate @ 288]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 268
diff changeset
245 if (errno == EWOULDBLOCK) {
29e1669b006b [gaim-migrate @ 288]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 268
diff changeset
246 errno = 0;
2369
117e9f0950b6 [gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2090
diff changeset
247 return;
117e9f0950b6 [gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2090
diff changeset
248 }
4331
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
249
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
250 gunk->len++;
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
251
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
252 if (gunk->len == gunk->data_len + 1) {
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
253 gunk->data_len += (gunk->data_len) / 2;
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
254
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
255 gunk->webdata = g_realloc(gunk->webdata, gunk->data_len);
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
256 }
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
257
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
258 gunk->webdata[gunk->len - 1] = data;
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
259
2584
34812d648f72 [gaim-migrate @ 2597]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2541
diff changeset
260 if (!gunk->startsaving) {
34812d648f72 [gaim-migrate @ 2597]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2541
diff changeset
261 if (data == '\r')
34812d648f72 [gaim-migrate @ 2597]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2541
diff changeset
262 return;
34812d648f72 [gaim-migrate @ 2597]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2541
diff changeset
263 if (data == '\n') {
4331
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
264 if (gunk->newline) {
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
265 size_t content_len;
2584
34812d648f72 [gaim-migrate @ 2597]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2541
diff changeset
266 gunk->startsaving = TRUE;
4331
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
267
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
268 /* See if we can find a redirect. */
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
269 if (parse_redirect(gunk->webdata, gunk->len, sock, gunk))
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
270 return;
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
271
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
272 /* No redirect. See if we can find a content length. */
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
273 content_len = parse_content_len(gunk->webdata, gunk->len);
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
274
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
275 if (content_len == 0) {
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
276 /* We'll stick with an initial 8192 */
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
277 content_len = 8192;
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
278 }
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
279
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
280 /* Out with the old... */
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
281 gunk->len = 0;
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
282 g_free(gunk->webdata);
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
283 gunk->webdata = NULL;
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
284
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
285 /* In with the new. */
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
286 gunk->data_len = content_len;
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
287 gunk->webdata = g_malloc(gunk->data_len);
bbd7b12986a8 [gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents: 4322
diff changeset
288 }
2584
34812d648f72 [gaim-migrate @ 2597]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2541
diff changeset
289 else
34812d648f72 [gaim-migrate @ 2597]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2541
diff changeset
290 gunk->newline = TRUE;
34812d648f72 [gaim-migrate @ 2597]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2541
diff changeset
291 return;
34812d648f72 [gaim-migrate @ 2597]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2541
diff changeset
292 }
34812d648f72 [gaim-migrate @ 2597]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2541
diff changeset
293 gunk->newline = FALSE;
278
29e1669b006b [gaim-migrate @ 288]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 268
diff changeset
294 }
2369
117e9f0950b6 [gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2090
diff changeset
295 } else if (errno != ETIMEDOUT) {
117e9f0950b6 [gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2090
diff changeset
296 gunk->webdata = g_realloc(gunk->webdata, gunk->len + 1);
117e9f0950b6 [gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2090
diff changeset
297 gunk->webdata[gunk->len] = 0;
1250
b5783215b245 [gaim-migrate @ 1260]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1092
diff changeset
298
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 5176
diff changeset
299 gaim_debug(GAIM_DEBUG_MISC, "grab_url_callback",
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 5176
diff changeset
300 "Received: '%s'\n", gunk->webdata);
1250
b5783215b245 [gaim-migrate @ 1260]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1092
diff changeset
301
2369
117e9f0950b6 [gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2090
diff changeset
302 gaim_input_remove(gunk->inpa);
117e9f0950b6 [gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2090
diff changeset
303 close(sock);
4322
a789969fc198 [gaim-migrate @ 4577]
Rob Flynn <gaim@robflynn.com>
parents: 3717
diff changeset
304 gunk->callback(gunk->data, gunk->webdata, gunk->len);
2369
117e9f0950b6 [gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2090
diff changeset
305 if (gunk->webdata)
117e9f0950b6 [gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2090
diff changeset
306 g_free(gunk->webdata);
2541
8229710b343b [gaim-migrate @ 2554]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2417
diff changeset
307 g_free(gunk->website);
2369
117e9f0950b6 [gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2090
diff changeset
308 g_free(gunk->url);
6516
7c14b35bc984 [gaim-migrate @ 7033]
Luke Schierer <lschiere@pidgin.im>
parents: 6514
diff changeset
309 g_free(gunk->user_agent);
2369
117e9f0950b6 [gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2090
diff changeset
310 g_free(gunk);
117e9f0950b6 [gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2090
diff changeset
311 } else {
117e9f0950b6 [gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2090
diff changeset
312 gaim_input_remove(gunk->inpa);
117e9f0950b6 [gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2090
diff changeset
313 close(sock);
4322
a789969fc198 [gaim-migrate @ 4577]
Rob Flynn <gaim@robflynn.com>
parents: 3717
diff changeset
314 gunk->callback(gunk->data, NULL, 0);
2369
117e9f0950b6 [gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2090
diff changeset
315 if (gunk->webdata)
117e9f0950b6 [gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2090
diff changeset
316 g_free(gunk->webdata);
2541
8229710b343b [gaim-migrate @ 2554]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2417
diff changeset
317 g_free(gunk->website);
2369
117e9f0950b6 [gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2090
diff changeset
318 g_free(gunk->url);
6516
7c14b35bc984 [gaim-migrate @ 7033]
Luke Schierer <lschiere@pidgin.im>
parents: 6514
diff changeset
319 g_free(gunk->user_agent);
2369
117e9f0950b6 [gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2090
diff changeset
320 g_free(gunk);
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
321 }
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
322 }
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
323
6516
7c14b35bc984 [gaim-migrate @ 7033]
Luke Schierer <lschiere@pidgin.im>
parents: 6514
diff changeset
324 void grab_url(char *url, gboolean full, void callback(gpointer, char *, unsigned long),
7c14b35bc984 [gaim-migrate @ 7033]
Luke Schierer <lschiere@pidgin.im>
parents: 6514
diff changeset
325 gpointer data, char *user_agent, int http11)
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
326 {
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
327 int sock;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
328 struct grab_url_data *gunk = g_new0(struct grab_url_data, 1);
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
329
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
330 gunk->callback = callback;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
331 gunk->data = data;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
332 gunk->url = g_strdup(url);
6516
7c14b35bc984 [gaim-migrate @ 7033]
Luke Schierer <lschiere@pidgin.im>
parents: 6514
diff changeset
333 gunk->user_agent = (user_agent) ? g_strdup(user_agent) : NULL;
7c14b35bc984 [gaim-migrate @ 7033]
Luke Schierer <lschiere@pidgin.im>
parents: 6514
diff changeset
334 gunk->http11 = http11;
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
335 gunk->website = parse_url(url);
2584
34812d648f72 [gaim-migrate @ 2597]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2541
diff changeset
336 gunk->full = full;
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
337
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5512
diff changeset
338 if ((sock = gaim_proxy_connect(NULL, gunk->website->address,
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5512
diff changeset
339 gunk->website->port, grab_url_callback,
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5512
diff changeset
340 gunk)) < 0) {
2541
8229710b343b [gaim-migrate @ 2554]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2417
diff changeset
341 g_free(gunk->website);
1881
a02584b98823 [gaim-migrate @ 1891]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
342 g_free(gunk->url);
6516
7c14b35bc984 [gaim-migrate @ 7033]
Luke Schierer <lschiere@pidgin.im>
parents: 6514
diff changeset
343 g_free(gunk->user_agent);
1881
a02584b98823 [gaim-migrate @ 1891]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
344 g_free(gunk);
4322
a789969fc198 [gaim-migrate @ 4577]
Rob Flynn <gaim@robflynn.com>
parents: 3717
diff changeset
345 callback(data, g_strdup(_("g003: Error opening connection.\n")), 0);
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
346 }
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
347 }
5093
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
348
5104
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
349 struct gaim_parse_tag {
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
350 char *src_tag;
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
351 char *dest_tag;
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
352 };
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
353
5093
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
354 #define ALLOW_TAG_ALT(x, y) if(!g_ascii_strncasecmp(c, "<" x " ", strlen("<" x " "))) { \
5176
6911a84cbab1 [gaim-migrate @ 5540]
Nathan Walp <nwalp@pidgin.im>
parents: 5174
diff changeset
355 const char *o = c + strlen("<" x); \
5141
5736055629cb [gaim-migrate @ 5505]
Nathan Walp <nwalp@pidgin.im>
parents: 5110
diff changeset
356 const char *p = NULL, *q = NULL, *r = NULL; \
5176
6911a84cbab1 [gaim-migrate @ 5540]
Nathan Walp <nwalp@pidgin.im>
parents: 5174
diff changeset
357 GString *innards = g_string_new(""); \
6911a84cbab1 [gaim-migrate @ 5540]
Nathan Walp <nwalp@pidgin.im>
parents: 5174
diff changeset
358 while(o && *o) { \
5141
5736055629cb [gaim-migrate @ 5505]
Nathan Walp <nwalp@pidgin.im>
parents: 5110
diff changeset
359 if(!q && (*o == '\"' || *o == '\'') ) { \
5736055629cb [gaim-migrate @ 5505]
Nathan Walp <nwalp@pidgin.im>
parents: 5110
diff changeset
360 q = o; \
5736055629cb [gaim-migrate @ 5505]
Nathan Walp <nwalp@pidgin.im>
parents: 5110
diff changeset
361 } else if(q) { \
5736055629cb [gaim-migrate @ 5505]
Nathan Walp <nwalp@pidgin.im>
parents: 5110
diff changeset
362 if(*o == *q) { \
5176
6911a84cbab1 [gaim-migrate @ 5540]
Nathan Walp <nwalp@pidgin.im>
parents: 5174
diff changeset
363 char *unescaped = g_strndup(q+1, o-q-1); \
6911a84cbab1 [gaim-migrate @ 5540]
Nathan Walp <nwalp@pidgin.im>
parents: 5174
diff changeset
364 char *escaped = g_markup_escape_text(unescaped, -1); \
6911a84cbab1 [gaim-migrate @ 5540]
Nathan Walp <nwalp@pidgin.im>
parents: 5174
diff changeset
365 g_string_append_printf(innards, "%c%s%c", *q, escaped, *q); \
5940
94ad4d45346a [gaim-migrate @ 6380]
Nathan Walp <nwalp@pidgin.im>
parents: 5872
diff changeset
366 g_free(unescaped); \
94ad4d45346a [gaim-migrate @ 6380]
Nathan Walp <nwalp@pidgin.im>
parents: 5872
diff changeset
367 g_free(escaped); \
5141
5736055629cb [gaim-migrate @ 5505]
Nathan Walp <nwalp@pidgin.im>
parents: 5110
diff changeset
368 q = NULL; \
5736055629cb [gaim-migrate @ 5505]
Nathan Walp <nwalp@pidgin.im>
parents: 5110
diff changeset
369 } else if(*c == '\\') { \
5736055629cb [gaim-migrate @ 5505]
Nathan Walp <nwalp@pidgin.im>
parents: 5110
diff changeset
370 o++; \
5736055629cb [gaim-migrate @ 5505]
Nathan Walp <nwalp@pidgin.im>
parents: 5110
diff changeset
371 } \
5736055629cb [gaim-migrate @ 5505]
Nathan Walp <nwalp@pidgin.im>
parents: 5110
diff changeset
372 } else if(*o == '<') { \
5736055629cb [gaim-migrate @ 5505]
Nathan Walp <nwalp@pidgin.im>
parents: 5110
diff changeset
373 r = o; \
5736055629cb [gaim-migrate @ 5505]
Nathan Walp <nwalp@pidgin.im>
parents: 5110
diff changeset
374 } else if(*o == '>') { \
5736055629cb [gaim-migrate @ 5505]
Nathan Walp <nwalp@pidgin.im>
parents: 5110
diff changeset
375 p = o; \
5736055629cb [gaim-migrate @ 5505]
Nathan Walp <nwalp@pidgin.im>
parents: 5110
diff changeset
376 break; \
5176
6911a84cbab1 [gaim-migrate @ 5540]
Nathan Walp <nwalp@pidgin.im>
parents: 5174
diff changeset
377 } else { \
6911a84cbab1 [gaim-migrate @ 5540]
Nathan Walp <nwalp@pidgin.im>
parents: 5174
diff changeset
378 innards = g_string_append_c(innards, *o); \
5141
5736055629cb [gaim-migrate @ 5505]
Nathan Walp <nwalp@pidgin.im>
parents: 5110
diff changeset
379 } \
5736055629cb [gaim-migrate @ 5505]
Nathan Walp <nwalp@pidgin.im>
parents: 5110
diff changeset
380 o++; \
5736055629cb [gaim-migrate @ 5505]
Nathan Walp <nwalp@pidgin.im>
parents: 5110
diff changeset
381 } \
5736055629cb [gaim-migrate @ 5505]
Nathan Walp <nwalp@pidgin.im>
parents: 5110
diff changeset
382 if(p && !r) { \
5104
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
383 if(*(p-1) != '/') { \
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
384 struct gaim_parse_tag *pt = g_new0(struct gaim_parse_tag, 1); \
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
385 pt->src_tag = x; \
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
386 pt->dest_tag = y; \
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
387 tags = g_list_prepend(tags, pt); \
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
388 } \
5093
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
389 xhtml = g_string_append(xhtml, "<" y); \
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
390 c += strlen("<" x ); \
5176
6911a84cbab1 [gaim-migrate @ 5540]
Nathan Walp <nwalp@pidgin.im>
parents: 5174
diff changeset
391 xhtml = g_string_append(xhtml, innards->str); \
6911a84cbab1 [gaim-migrate @ 5540]
Nathan Walp <nwalp@pidgin.im>
parents: 5174
diff changeset
392 xhtml = g_string_append_c(xhtml, '>'); \
5093
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
393 c = p + 1; \
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
394 } else { \
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
395 xhtml = g_string_append(xhtml, "&lt;"); \
5110
496ea7c1b77b [gaim-migrate @ 5473]
Nathan Walp <nwalp@pidgin.im>
parents: 5107
diff changeset
396 plain = g_string_append_c(plain, '<'); \
5176
6911a84cbab1 [gaim-migrate @ 5540]
Nathan Walp <nwalp@pidgin.im>
parents: 5174
diff changeset
397 c++; \
5093
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
398 } \
5176
6911a84cbab1 [gaim-migrate @ 5540]
Nathan Walp <nwalp@pidgin.im>
parents: 5174
diff changeset
399 g_string_free(innards, TRUE); \
5093
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
400 continue; \
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
401 } \
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
402 if(!g_ascii_strncasecmp(c, "<" x, strlen("<" x)) && \
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
403 (*(c+strlen("<" x)) == '>' || \
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
404 !g_ascii_strncasecmp(c+strlen("<" x), "/>", 2))) { \
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
405 xhtml = g_string_append(xhtml, "<" y); \
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
406 c += strlen("<" x); \
5104
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
407 if(*c != '/') { \
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
408 struct gaim_parse_tag *pt = g_new0(struct gaim_parse_tag, 1); \
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
409 pt->src_tag = x; \
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
410 pt->dest_tag = y; \
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
411 tags = g_list_prepend(tags, pt); \
5110
496ea7c1b77b [gaim-migrate @ 5473]
Nathan Walp <nwalp@pidgin.im>
parents: 5107
diff changeset
412 xhtml = g_string_append_c(xhtml, '>'); \
496ea7c1b77b [gaim-migrate @ 5473]
Nathan Walp <nwalp@pidgin.im>
parents: 5107
diff changeset
413 } else { \
496ea7c1b77b [gaim-migrate @ 5473]
Nathan Walp <nwalp@pidgin.im>
parents: 5107
diff changeset
414 xhtml = g_string_append(xhtml, "/>");\
5104
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
415 } \
5110
496ea7c1b77b [gaim-migrate @ 5473]
Nathan Walp <nwalp@pidgin.im>
parents: 5107
diff changeset
416 c = strchr(c, '>') + 1; \
5093
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
417 continue; \
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
418 }
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
419 #define ALLOW_TAG(x) ALLOW_TAG_ALT(x, x)
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
420
5110
496ea7c1b77b [gaim-migrate @ 5473]
Nathan Walp <nwalp@pidgin.im>
parents: 5107
diff changeset
421 void html_to_xhtml(const char *html, char **xhtml_out, char **plain_out) {
5093
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
422 GString *xhtml = g_string_new("");
5110
496ea7c1b77b [gaim-migrate @ 5473]
Nathan Walp <nwalp@pidgin.im>
parents: 5107
diff changeset
423 GString *plain = g_string_new("");
5093
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
424 GList *tags = NULL, *tag;
5141
5736055629cb [gaim-migrate @ 5505]
Nathan Walp <nwalp@pidgin.im>
parents: 5110
diff changeset
425 const char *c = html;
5176
6911a84cbab1 [gaim-migrate @ 5540]
Nathan Walp <nwalp@pidgin.im>
parents: 5174
diff changeset
426
6911a84cbab1 [gaim-migrate @ 5540]
Nathan Walp <nwalp@pidgin.im>
parents: 5174
diff changeset
427 while(c && *c) {
5141
5736055629cb [gaim-migrate @ 5505]
Nathan Walp <nwalp@pidgin.im>
parents: 5110
diff changeset
428 if(*c == '<') {
5093
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
429 if(*(c+1) == '/') { /* closing tag */
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
430 tag = tags;
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
431 while(tag) {
5104
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
432 struct gaim_parse_tag *pt = tag->data;
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
433 if(!g_ascii_strncasecmp((c+2), pt->src_tag, strlen(pt->src_tag)) && *(c+strlen(pt->src_tag)+2) == '>') {
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
434 c += strlen(pt->src_tag) + 3;
5093
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
435 break;
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
436 }
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
437 tag = tag->next;
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
438 }
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
439 if(tag) {
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
440 while(tags) {
5104
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
441 struct gaim_parse_tag *pt = tags->data;
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
442 g_string_append_printf(xhtml, "</%s>", pt->dest_tag);
5093
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
443 if(tags == tag)
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
444 break;
5104
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
445 tags = g_list_remove(tags, pt);
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
446 g_free(pt);
5093
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
447 }
5104
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
448 g_free(tag->data);
5093
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
449 tags = g_list_remove(tags, tag->data);
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
450 } else {
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
451 /* we tried to close a tag we never opened! escape it
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
452 * and move on */
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
453 xhtml = g_string_append(xhtml, "&lt;");
5110
496ea7c1b77b [gaim-migrate @ 5473]
Nathan Walp <nwalp@pidgin.im>
parents: 5107
diff changeset
454 plain = g_string_append_c(plain, '<');
5093
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
455 c++;
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
456 }
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
457 } else { /* opening tag */
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
458 ALLOW_TAG("a");
5101
a7e9036cd46f [gaim-migrate @ 5464]
Nathan Walp <nwalp@pidgin.im>
parents: 5093
diff changeset
459 ALLOW_TAG_ALT("b", "strong");
5093
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
460 ALLOW_TAG("blockquote");
5101
a7e9036cd46f [gaim-migrate @ 5464]
Nathan Walp <nwalp@pidgin.im>
parents: 5093
diff changeset
461 ALLOW_TAG_ALT("bold", "strong");
5093
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
462 ALLOW_TAG("cite");
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
463 ALLOW_TAG("div");
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
464 ALLOW_TAG("em");
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
465 ALLOW_TAG("h1");
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
466 ALLOW_TAG("h2");
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
467 ALLOW_TAG("h3");
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
468 ALLOW_TAG("h4");
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
469 ALLOW_TAG("h5");
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
470 ALLOW_TAG("h6");
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
471 ALLOW_TAG("html");
5101
a7e9036cd46f [gaim-migrate @ 5464]
Nathan Walp <nwalp@pidgin.im>
parents: 5093
diff changeset
472 ALLOW_TAG_ALT("i", "em");
a7e9036cd46f [gaim-migrate @ 5464]
Nathan Walp <nwalp@pidgin.im>
parents: 5093
diff changeset
473 ALLOW_TAG_ALT("italic", "em");
5093
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
474 ALLOW_TAG("li");
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
475 ALLOW_TAG("ol");
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
476 ALLOW_TAG("p");
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
477 ALLOW_TAG("pre");
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
478 ALLOW_TAG("q");
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
479 ALLOW_TAG("span");
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
480 ALLOW_TAG("strong");
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
481 ALLOW_TAG("ul");
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
482
5174
376349b04123 [gaim-migrate @ 5538]
Nathan Walp <nwalp@pidgin.im>
parents: 5141
diff changeset
483 /* we skip <HR> because it's not legal in XHTML-IM. However,
376349b04123 [gaim-migrate @ 5538]
Nathan Walp <nwalp@pidgin.im>
parents: 5141
diff changeset
484 * we still want to send something sensible, so we put a
376349b04123 [gaim-migrate @ 5538]
Nathan Walp <nwalp@pidgin.im>
parents: 5141
diff changeset
485 * linebreak in its place. <BR> also needs special handling
376349b04123 [gaim-migrate @ 5538]
Nathan Walp <nwalp@pidgin.im>
parents: 5141
diff changeset
486 * because putting a </BR> to close it would just be dumb. */
376349b04123 [gaim-migrate @ 5538]
Nathan Walp <nwalp@pidgin.im>
parents: 5141
diff changeset
487 if((!g_ascii_strncasecmp(c, "<br", 3)
376349b04123 [gaim-migrate @ 5538]
Nathan Walp <nwalp@pidgin.im>
parents: 5141
diff changeset
488 || !g_ascii_strncasecmp(c, "<hr", 3))
376349b04123 [gaim-migrate @ 5538]
Nathan Walp <nwalp@pidgin.im>
parents: 5141
diff changeset
489 && (*(c+3) == '>' ||
376349b04123 [gaim-migrate @ 5538]
Nathan Walp <nwalp@pidgin.im>
parents: 5141
diff changeset
490 !g_ascii_strncasecmp(c+3, "/>", 2) ||
376349b04123 [gaim-migrate @ 5538]
Nathan Walp <nwalp@pidgin.im>
parents: 5141
diff changeset
491 !g_ascii_strncasecmp(c+3, " />", 3))) {
376349b04123 [gaim-migrate @ 5538]
Nathan Walp <nwalp@pidgin.im>
parents: 5141
diff changeset
492 c = strchr(c, '>') + 1;
376349b04123 [gaim-migrate @ 5538]
Nathan Walp <nwalp@pidgin.im>
parents: 5141
diff changeset
493 xhtml = g_string_append(xhtml, "<br/>");
376349b04123 [gaim-migrate @ 5538]
Nathan Walp <nwalp@pidgin.im>
parents: 5141
diff changeset
494 if(*c != '\n')
376349b04123 [gaim-migrate @ 5538]
Nathan Walp <nwalp@pidgin.im>
parents: 5141
diff changeset
495 plain = g_string_append_c(plain, '\n');
376349b04123 [gaim-migrate @ 5538]
Nathan Walp <nwalp@pidgin.im>
parents: 5141
diff changeset
496 continue;
376349b04123 [gaim-migrate @ 5538]
Nathan Walp <nwalp@pidgin.im>
parents: 5141
diff changeset
497 }
376349b04123 [gaim-migrate @ 5538]
Nathan Walp <nwalp@pidgin.im>
parents: 5141
diff changeset
498 if(!g_ascii_strncasecmp(c, "<u>", 3) || !g_ascii_strncasecmp(c, "<underline>", strlen("<underline>"))) {
5104
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
499 struct gaim_parse_tag *pt = g_new0(struct gaim_parse_tag, 1);
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
500 pt->src_tag = *(c+2) == '>' ? "u" : "underline";
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
501 pt->dest_tag = "span";
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
502 tags = g_list_prepend(tags, pt);
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
503 c = strchr(c, '>') + 1;
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
504 xhtml = g_string_append(xhtml, "<span style='text-decoration: underline;'>");
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
505 continue;
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
506 }
5174
376349b04123 [gaim-migrate @ 5538]
Nathan Walp <nwalp@pidgin.im>
parents: 5141
diff changeset
507 if(!g_ascii_strncasecmp(c, "<s>", 3) || !g_ascii_strncasecmp(c, "<strike>", strlen("<strike>"))) {
5104
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
508 struct gaim_parse_tag *pt = g_new0(struct gaim_parse_tag, 1);
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
509 pt->src_tag = *(c+2) == '>' ? "s" : "strike";
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
510 pt->dest_tag = "span";
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
511 tags = g_list_prepend(tags, pt);
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
512 c = strchr(c, '>') + 1;
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
513 xhtml = g_string_append(xhtml, "<span style='text-decoration: line-through;'>");
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
514 continue;
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
515 }
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
516 if(!g_ascii_strncasecmp(c, "<sub>", 5)) {
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
517 struct gaim_parse_tag *pt = g_new0(struct gaim_parse_tag, 1);
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
518 pt->src_tag = "sub";
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
519 pt->dest_tag = "span";
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
520 tags = g_list_prepend(tags, pt);
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
521 c = strchr(c, '>') + 1;
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
522 xhtml = g_string_append(xhtml, "<span style='vertical-align:sub;'>");
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
523 continue;
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
524 }
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
525 if(!g_ascii_strncasecmp(c, "<sup>", 5)) {
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
526 struct gaim_parse_tag *pt = g_new0(struct gaim_parse_tag, 1);
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
527 pt->src_tag = "sup";
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
528 pt->dest_tag = "span";
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
529 tags = g_list_prepend(tags, pt);
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
530 c = strchr(c, '>') + 1;
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
531 xhtml = g_string_append(xhtml, "<span style='vertical-align:super;'>");
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
532 continue;
a20a644e0da4 [gaim-migrate @ 5467]
Nathan Walp <nwalp@pidgin.im>
parents: 5101
diff changeset
533 }
5107
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
534 if(!g_ascii_strncasecmp(c, "<font", 5) && (*(c+5) == '>' || *(c+5) == ' ')) {
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
535 const char *p = c;
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
536 GString *style = g_string_new("");
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
537 struct gaim_parse_tag *pt;
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
538 while(*p && *p != '>') {
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
539 if(!g_ascii_strncasecmp(p, "color=", strlen("color="))) {
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
540 const char *q = p + strlen("color=");
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
541 GString *color = g_string_new("");
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
542 if(*q == '\'' || *q == '\"')
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
543 q++;
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
544 while(*q && *q != '\"' && *q != '\'' && *q != ' ') {
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
545 color = g_string_append_c(color, *q);
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
546 q++;
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
547 }
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
548 g_string_append_printf(style, "color: %s; ", color->str);
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
549 g_string_free(color, TRUE);
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
550 p = q;
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
551 } else if(!g_ascii_strncasecmp(p, "face=", strlen("face="))) {
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
552 const char *q = p + strlen("face=");
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
553 gboolean space_allowed = FALSE;
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
554 GString *face = g_string_new("");
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
555 if(*q == '\'' || *q == '\"') {
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
556 space_allowed = TRUE;
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
557 q++;
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
558 }
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
559 while(*q && *q != '\"' && *q != '\'' && (space_allowed || *q != ' ')) {
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
560 face = g_string_append_c(face, *q);
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
561 q++;
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
562 }
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
563 g_string_append_printf(style, "font-family: %s; ", face->str);
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
564 g_string_free(face, TRUE);
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
565 p = q;
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
566 } else if(!g_ascii_strncasecmp(p, "size=", strlen("size="))) {
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
567 const char *q = p + strlen("size=");
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
568 int sz;
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
569 const char *size = "medium";
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
570 if(*q == '\'' || *q == '\"')
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
571 q++;
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
572 sz = atoi(q);
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
573 if(sz < 3)
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
574 size = "smaller";
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
575 else if(sz > 3)
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
576 size = "larger";
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
577 g_string_append_printf(style, "font-size: %s; ", size);
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
578 p = q;
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
579 }
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
580 p++;
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
581 }
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
582 c = strchr(c, '>') + 1;
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
583 pt = g_new0(struct gaim_parse_tag, 1);
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
584 pt->src_tag = "font";
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
585 pt->dest_tag = "span";
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
586 tags = g_list_prepend(tags, pt);
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
587 xhtml = g_string_append(xhtml, "<span");
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
588 if(style->len)
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
589 g_string_append_printf(xhtml, " style='%s'", style->str);
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
590 xhtml = g_string_append_c(xhtml, '>');
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
591 g_string_free(style, TRUE);
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
592 continue;
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
593 }
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
594 if(!g_ascii_strncasecmp(c, "<body ", 6)) {
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
595 const char *p = c;
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
596 gboolean did_something = FALSE;
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
597 while(*p && *p != '>') {
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
598 if(!g_ascii_strncasecmp(p, "bgcolor=", strlen("bgcolor="))) {
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
599 const char *q = p + strlen("bgcolor=");
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
600 struct gaim_parse_tag *pt = g_new0(struct gaim_parse_tag, 1);
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
601 GString *color = g_string_new("");
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
602 if(*q == '\'' || *q == '\"')
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
603 q++;
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
604 while(*q && *q != '\"' && *q != '\'' && *q != ' ') {
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
605 color = g_string_append_c(color, *q);
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
606 q++;
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
607 }
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
608 g_string_append_printf(xhtml, "<span style='background: %s;'>", color->str);
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
609 g_string_free(color, TRUE);
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
610 c = strchr(c, '>') + 1;
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
611 pt->src_tag = "body";
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
612 pt->dest_tag = "span";
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
613 tags = g_list_prepend(tags, pt);
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
614 did_something = TRUE;
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
615 break;
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
616 }
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
617 p++;
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
618 }
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
619 if(did_something) continue;
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
620 }
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
621 /* this has to come after the special case for bgcolor */
b99910bfedd2 [gaim-migrate @ 5470]
Nathan Walp <nwalp@pidgin.im>
parents: 5104
diff changeset
622 ALLOW_TAG("body");
5093
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
623 if(!g_ascii_strncasecmp(c, "<!--", strlen("<!--"))) {
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
624 char *p = strstr(c + strlen("<!--"), "-->");
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
625 if(p) {
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
626 xhtml = g_string_append(xhtml, "<!--");
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
627 c += strlen("<!--");
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
628 continue;
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
629 }
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
630 }
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
631
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
632 xhtml = g_string_append(xhtml, "&lt;");
5110
496ea7c1b77b [gaim-migrate @ 5473]
Nathan Walp <nwalp@pidgin.im>
parents: 5107
diff changeset
633 plain = g_string_append_c(plain, '<');
5093
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
634 c++;
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
635 }
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
636 } else {
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
637 xhtml = g_string_append_c(xhtml, *c);
5110
496ea7c1b77b [gaim-migrate @ 5473]
Nathan Walp <nwalp@pidgin.im>
parents: 5107
diff changeset
638 plain = g_string_append_c(plain, *c);
5093
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
639 c++;
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
640 }
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
641 }
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
642 tag = tags;
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
643 while(tag) {
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
644 g_string_append_printf(xhtml, "</%s>", (char *)tag->data);
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
645 tag = tag->next;
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
646 }
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
647 g_list_free(tags);
5110
496ea7c1b77b [gaim-migrate @ 5473]
Nathan Walp <nwalp@pidgin.im>
parents: 5107
diff changeset
648 if(xhtml_out)
496ea7c1b77b [gaim-migrate @ 5473]
Nathan Walp <nwalp@pidgin.im>
parents: 5107
diff changeset
649 *xhtml_out = g_strdup(xhtml->str);
496ea7c1b77b [gaim-migrate @ 5473]
Nathan Walp <nwalp@pidgin.im>
parents: 5107
diff changeset
650 if(plain_out)
496ea7c1b77b [gaim-migrate @ 5473]
Nathan Walp <nwalp@pidgin.im>
parents: 5107
diff changeset
651 *plain_out = g_strdup(plain->str);
5093
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
652 g_string_free(xhtml, TRUE);
5110
496ea7c1b77b [gaim-migrate @ 5473]
Nathan Walp <nwalp@pidgin.im>
parents: 5107
diff changeset
653 g_string_free(plain, TRUE);
5093
89c0c811befa [gaim-migrate @ 5455]
Nathan Walp <nwalp@pidgin.im>
parents: 4777
diff changeset
654 }
6514
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
655
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
656 int info_extract_field(char *original, char *add_to, char *start_tok,
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
657 int skip, char *end_tok, char check_value, char *no_value_tok,
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
658 char *display_name, int islink, char *link_prefix)
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
659 {
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
660 char *p, *q;
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
661 char buf[1024];
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
662 if (!original || !add_to || !start_tok ||
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
663 !end_tok || !display_name)
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
664 return 0;
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
665 p = strstr(original, start_tok);
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
666 if (p) {
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
667 p += strlen(start_tok) + skip;
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
668 if (!check_value || (*p != check_value)) {
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
669 q = strstr(p, end_tok);
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
670 if (q && (!no_value_tok ||
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
671 (no_value_tok && strncmp(p, no_value_tok, strlen(no_value_tok))))) {
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
672 strcat(add_to, "<b>");
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
673 strcat(add_to, display_name);
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
674 strcat(add_to, ":</b> ");
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
675 if (islink) {
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
676 strcat(add_to, "<br><a href=\"");
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
677 memcpy(buf, p, q-p);
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
678 buf[q-p] = '\0';
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
679 if (link_prefix)
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
680 strcat(add_to, link_prefix);
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
681 strcat(add_to, buf);
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
682 strcat(add_to, "\">");
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
683 if (link_prefix)
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
684 strcat(add_to, link_prefix);
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
685 strcat(add_to, buf);
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
686 strcat(add_to, "</a>");
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
687 } else {
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
688 memcpy(buf, p, q-p);
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
689 buf[q-p] = '\0';
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
690 strcat(add_to, buf);
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
691 }
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
692 strcat(add_to, "<br>\n");
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
693 return 1;
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
694 } else
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
695 return 0;
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
696 } else
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
697 return 0;
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
698 } else
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
699 return 0;
64d952098596 [gaim-migrate @ 7031]
Luke Schierer <lschiere@pidgin.im>
parents: 6128
diff changeset
700 }