annotate src/util.c @ 11111:f03dce7ea408

[gaim-migrate @ 13163] Patch #1234440, from sadrul "Mark blocked users in the buddy-list" Patch #1234197, from sadrul "New API fn gaim_privacy_check" Plus changes by me. (Read as: blame me if it's busted, thank sadrul if it works) Basically, all this stuff boils down to the following: We composite a new blocked.png onto the prpl icon in the buddy list if the user is blocked. MSN was the only prpl that used the old blocked.png. However, it looks bad to overlay both icons, so I removed the use of blocked.png from the MSN prpl. As an MSN user, I think the result is intuitive. committer: Tailor Script <tailor@pidgin.im>
author Richard Laager <rlaager@wiktel.com>
date Sun, 17 Jul 2005 23:36:34 +0000
parents a8a7730db73c
children 719779387f96
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 /*
7094
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2 * @file util.h Utility Functions
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3 * @ingroup core
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
4 *
8046
fa6395637e2c [gaim-migrate @ 8730]
Sean Egan <seanegan@gmail.com>
parents: 8026
diff changeset
5 * Gaim is the legal property of its developers, whose names are too numerous
fa6395637e2c [gaim-migrate @ 8730]
Sean Egan <seanegan@gmail.com>
parents: 8026
diff changeset
6 * to list here. Please refer to the COPYRIGHT file distributed with this
fa6395637e2c [gaim-migrate @ 8730]
Sean Egan <seanegan@gmail.com>
parents: 8026
diff changeset
7 * source distribution.
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
8 *
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
9 * This program is free software; you can redistribute it and/or modify
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
10 * 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
11 * the Free Software Foundation; either version 2 of the License, or
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
12 * (at your option) any later version.
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
13 *
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
14 * This program is distributed in the hope that it will be useful,
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
17 * GNU General Public License for more details.
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
18 *
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
19 * You should have received a copy of the GNU General Public License
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
20 * along with this program; if not, write to the Free Software
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
22 */
5872
059d95c67cda [gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents: 5826
diff changeset
23 #include "internal.h"
3630
9682c0e022c6 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3572
diff changeset
24
5872
059d95c67cda [gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents: 5826
diff changeset
25 #include "conversation.h"
059d95c67cda [gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents: 5826
diff changeset
26 #include "debug.h"
10425
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
27 #include "notify.h"
1575
427e1409917c [gaim-migrate @ 1585]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1560
diff changeset
28 #include "prpl.h"
5545
7a64114641c3 [gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents: 5532
diff changeset
29 #include "prefs.h"
7094
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
30 #include "util.h"
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
31
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
32 typedef struct
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
33 {
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
34 void (*callback)(void *, const char *, size_t);
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
35 void *user_data;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
36
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
37 struct
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
38 {
9227
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9222
diff changeset
39 char *user;
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9222
diff changeset
40 char *passwd;
7094
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
41 char *address;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
42 int port;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
43 char *page;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
44
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
45 } website;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
46
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
47 char *url;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
48 gboolean full;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
49 char *user_agent;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
50 gboolean http11;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
51
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
52 int inpa;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
53
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
54 gboolean sentreq;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
55 gboolean newline;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
56 gboolean startsaving;
9240
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
57 gboolean has_explicit_data_len;
7094
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
58 char *webdata;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
59 unsigned long len;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
60 unsigned long data_len;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
61
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
62 } GaimFetchUrlData;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
63
8596
56360561af5e [gaim-migrate @ 9347]
Luke Schierer <lschiere@pidgin.im>
parents: 8577
diff changeset
64 static char custom_home_dir[MAXPATHLEN];
3630
9682c0e022c6 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3572
diff changeset
65 static char home_dir[MAXPATHLEN];
9682c0e022c6 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3572
diff changeset
66
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
67 /**************************************************************************
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
68 * Base16 Functions
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
69 **************************************************************************/
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
70 unsigned char *
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
71 gaim_base16_encode(const unsigned char *data, int length)
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
72 {
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
73 int i;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
74 unsigned char *ascii = NULL;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
75
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
76 g_return_val_if_fail(data != NULL, NULL);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
77 g_return_val_if_fail(length > 0, NULL);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
78
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
79 ascii = g_malloc(length * 2 + 1);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
80
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
81 for (i = 0; i < length; i++)
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
82 snprintf(&ascii[i * 2], 3, "%02hhx", data[i]);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
83
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
84 return ascii;
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
85 }
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
86
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
87 int
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
88 gaim_base16_decode(const char *ascii, unsigned char **raw)
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
89 {
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
90 int len, i, accumulator = 0;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
91 unsigned char *data;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
92
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
93 g_return_val_if_fail(ascii != NULL, 0);
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
94
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
95 len = strlen(ascii);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
96
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
97 g_return_val_if_fail(strlen(ascii) > 0, 0);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
98 g_return_val_if_fail(len % 2 > 0, 0);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
99
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
100 data = g_malloc(len / 2);
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
101
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
102 for (i = 0; i < len; i++)
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
103 {
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
104 if ((i % 2) == 0)
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
105 accumulator = 0;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
106 else
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
107 accumulator <<= 4;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
109 if (isdigit(ascii[i]))
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
110 accumulator |= ascii[i] - 48;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
111 else
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
112 {
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
113 switch(ascii[i])
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
114 {
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
115 case 'a': case 'A': accumulator |= 10; break;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
116 case 'b': case 'B': accumulator |= 11; break;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
117 case 'c': case 'C': accumulator |= 12; break;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
118 case 'd': case 'D': accumulator |= 13; break;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
119 case 'e': case 'E': accumulator |= 14; break;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
120 case 'f': case 'F': accumulator |= 15; break;
1826
7f889cdfa03e [gaim-migrate @ 1836]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
121 }
1252
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
122 }
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
123
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
124 if (i % 2)
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
125 data[(i - 1) / 2] = accumulator;
1252
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
126 }
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
127
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
128 *raw = data;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
129
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
130 return (len / 2);
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
131 }
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
132
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
133 /**************************************************************************
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
134 * Base64 Functions
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
135 **************************************************************************/
4888
912294585edf [gaim-migrate @ 5218]
Christian Hammond <chipx86@chipx86.com>
parents: 4853
diff changeset
136 static const char alphabet[] =
912294585edf [gaim-migrate @ 5218]
Christian Hammond <chipx86@chipx86.com>
parents: 4853
diff changeset
137 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
912294585edf [gaim-migrate @ 5218]
Christian Hammond <chipx86@chipx86.com>
parents: 4853
diff changeset
138 "0123456789+/";
1252
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
139
8929
54eba3833e34 [gaim-migrate @ 9699]
Ethan Blanton <elb@pidgin.im>
parents: 8918
diff changeset
140 static const char xdigits[] =
54eba3833e34 [gaim-migrate @ 9699]
Ethan Blanton <elb@pidgin.im>
parents: 8918
diff changeset
141 "0123456789abcdef";
54eba3833e34 [gaim-migrate @ 9699]
Ethan Blanton <elb@pidgin.im>
parents: 8918
diff changeset
142
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
143 unsigned char *
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
144 gaim_base64_encode(const unsigned char *in, size_t inlen)
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
145 {
6872
dd0eecfbe413 [gaim-migrate @ 7418]
Nathan Walp <nwalp@pidgin.im>
parents: 6861
diff changeset
146 char *out, *rv;
1252
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
147
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
148 g_return_val_if_fail(in != NULL, NULL);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
149 g_return_val_if_fail(inlen > 0, NULL);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
150
7265
d565594c1bae [gaim-migrate @ 7842]
Nathan Walp <nwalp@pidgin.im>
parents: 7262
diff changeset
151 rv = out = g_malloc(((inlen/3)+1)*4 + 1);
1238
78c4f497db2b [gaim-migrate @ 1248]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1202
diff changeset
152
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
153 for (; inlen >= 3; inlen -= 3)
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
154 {
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
155 *out++ = alphabet[in[0] >> 2];
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
156 *out++ = alphabet[((in[0] << 4) & 0x30) | (in[1] >> 4)];
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
157 *out++ = alphabet[((in[1] << 2) & 0x3c) | (in[2] >> 6)];
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
158 *out++ = alphabet[in[2] & 0x3f];
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
159 in += 3;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
160 }
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
161
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
162 if (inlen > 0)
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
163 {
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
164 unsigned char fragment;
6872
dd0eecfbe413 [gaim-migrate @ 7418]
Nathan Walp <nwalp@pidgin.im>
parents: 6861
diff changeset
165
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
166 *out++ = alphabet[in[0] >> 2];
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
167 fragment = (in[0] << 4) & 0x30;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
168
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
169 if (inlen > 1)
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
170 fragment |= in[1] >> 4;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
171
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
172 *out++ = alphabet[fragment];
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
173 *out++ = (inlen < 2) ? '=' : alphabet[(in[1] << 2) & 0x3c];
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
174 *out++ = '=';
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
175 }
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
176
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
177 *out = '\0';
5426
8d8bf0d31a23 [gaim-migrate @ 5805]
Nathan Walp <nwalp@pidgin.im>
parents: 5341
diff changeset
178
8d8bf0d31a23 [gaim-migrate @ 5805]
Nathan Walp <nwalp@pidgin.im>
parents: 5341
diff changeset
179 return rv;
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
180 }
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
181
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
182 void
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
183 gaim_base64_decode(const char *text, char **data, int *size)
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
184 {
1252
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
185 char *out = NULL;
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
186 char tmp = 0;
1920
5bed3bc833b5 [gaim-migrate @ 1930]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1878
diff changeset
187 const char *c;
1252
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
188 gint32 tmp2 = 0;
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
189 int len = 0, n = 0;
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
190
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
191 g_return_if_fail(text != NULL);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
192 g_return_if_fail(data != NULL);
1920
5bed3bc833b5 [gaim-migrate @ 1930]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1878
diff changeset
193
1252
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
194 c = text;
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
195
1252
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
196 while (*c) {
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
197 if (*c >= 'A' && *c <= 'Z') {
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
198 tmp = *c - 'A';
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
199 } else if (*c >= 'a' && *c <= 'z') {
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
200 tmp = 26 + (*c - 'a');
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
201 } else if (*c >= '0' && *c <= 57) {
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
202 tmp = 52 + (*c - '0');
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
203 } else if (*c == '+') {
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
204 tmp = 62;
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
205 } else if (*c == '/') {
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
206 tmp = 63;
5289
cfbd0cb3f18b [gaim-migrate @ 5661]
Nathan Walp <nwalp@pidgin.im>
parents: 5247
diff changeset
207 } else if (*c == '\r' || *c == '\n') {
cfbd0cb3f18b [gaim-migrate @ 5661]
Nathan Walp <nwalp@pidgin.im>
parents: 5247
diff changeset
208 c++;
cfbd0cb3f18b [gaim-migrate @ 5661]
Nathan Walp <nwalp@pidgin.im>
parents: 5247
diff changeset
209 continue;
1252
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
210 } else if (*c == '=') {
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
211 if (n == 3) {
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
212 out = g_realloc(out, len + 2);
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
213 out[len] = (char)(tmp2 >> 10) & 0xff;
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
214 len++;
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
215 out[len] = (char)(tmp2 >> 2) & 0xff;
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
216 len++;
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
217 } else if (n == 2) {
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
218 out = g_realloc(out, len + 1);
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
219 out[len] = (char)(tmp2 >> 4) & 0xff;
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
220 len++;
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
221 }
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
222 break;
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
223 }
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
224 tmp2 = ((tmp2 << 6) | (tmp & 0xff));
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
225 n++;
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
226 if (n == 4) {
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
227 out = g_realloc(out, len + 3);
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
228 out[len] = (char)((tmp2 >> 16) & 0xff);
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
229 len++;
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
230 out[len] = (char)((tmp2 >> 8) & 0xff);
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
231 len++;
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
232 out[len] = (char)(tmp2 & 0xff);
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
233 len++;
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
234 tmp2 = 0;
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
235 n = 0;
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
236 }
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
237 c++;
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
238 }
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
239
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
240 out = g_realloc(out, len + 1);
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
241 out[len] = 0;
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
242
1920
5bed3bc833b5 [gaim-migrate @ 1930]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1878
diff changeset
243 *data = out;
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
244
1920
5bed3bc833b5 [gaim-migrate @ 1930]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1878
diff changeset
245 if (size)
5bed3bc833b5 [gaim-migrate @ 1930]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1878
diff changeset
246 *size = len;
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
247 }
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
248
7679
1363f91da9cc [gaim-migrate @ 8323]
Mark Doliner <mark@kingant.net>
parents: 7675
diff changeset
249 /**************************************************************************
8929
54eba3833e34 [gaim-migrate @ 9699]
Ethan Blanton <elb@pidgin.im>
parents: 8918
diff changeset
250 * Quoted Printable Functions (see RFC 1341)
7679
1363f91da9cc [gaim-migrate @ 8323]
Mark Doliner <mark@kingant.net>
parents: 7675
diff changeset
251 **************************************************************************/
1363f91da9cc [gaim-migrate @ 8323]
Mark Doliner <mark@kingant.net>
parents: 7675
diff changeset
252 void
1363f91da9cc [gaim-migrate @ 8323]
Mark Doliner <mark@kingant.net>
parents: 7675
diff changeset
253 gaim_quotedp_decode(const char *str, char **ret_str, int *ret_len)
1363f91da9cc [gaim-migrate @ 8323]
Mark Doliner <mark@kingant.net>
parents: 7675
diff changeset
254 {
8125
abbfed0b0050 [gaim-migrate @ 8829]
Nathan Walp <nwalp@pidgin.im>
parents: 8123
diff changeset
255 char *n, *new;
abbfed0b0050 [gaim-migrate @ 8829]
Nathan Walp <nwalp@pidgin.im>
parents: 8123
diff changeset
256 const char *end, *p;
7722
db1542e84ee6 [gaim-migrate @ 8367]
Nathan Walp <nwalp@pidgin.im>
parents: 7679
diff changeset
257
8005
3bdfb4308d10 [gaim-migrate @ 8682]
Christian Hammond <chipx86@chipx86.com>
parents: 7956
diff changeset
258 n = new = g_malloc(strlen (str) + 1);
8125
abbfed0b0050 [gaim-migrate @ 8829]
Nathan Walp <nwalp@pidgin.im>
parents: 8123
diff changeset
259 end = str + strlen(str);
7679
1363f91da9cc [gaim-migrate @ 8323]
Mark Doliner <mark@kingant.net>
parents: 7675
diff changeset
260
8125
abbfed0b0050 [gaim-migrate @ 8829]
Nathan Walp <nwalp@pidgin.im>
parents: 8123
diff changeset
261 for (p = str; p < end; p++, n++) {
7679
1363f91da9cc [gaim-migrate @ 8323]
Mark Doliner <mark@kingant.net>
parents: 7675
diff changeset
262 if (*p == '=') {
8929
54eba3833e34 [gaim-migrate @ 9699]
Ethan Blanton <elb@pidgin.im>
parents: 8918
diff changeset
263 if (p[1] == '\r' && p[2] == '\n') { /* 5.1 #5 */
54eba3833e34 [gaim-migrate @ 9699]
Ethan Blanton <elb@pidgin.im>
parents: 8918
diff changeset
264 n -= 1;
54eba3833e34 [gaim-migrate @ 9699]
Ethan Blanton <elb@pidgin.im>
parents: 8918
diff changeset
265 p += 2;
54eba3833e34 [gaim-migrate @ 9699]
Ethan Blanton <elb@pidgin.im>
parents: 8918
diff changeset
266 } else if (p[1] == '\n') { /* fuzzy case for 5.1 #5 */
54eba3833e34 [gaim-migrate @ 9699]
Ethan Blanton <elb@pidgin.im>
parents: 8918
diff changeset
267 n -= 1;
54eba3833e34 [gaim-migrate @ 9699]
Ethan Blanton <elb@pidgin.im>
parents: 8918
diff changeset
268 p += 1;
54eba3833e34 [gaim-migrate @ 9699]
Ethan Blanton <elb@pidgin.im>
parents: 8918
diff changeset
269 } else if (p[1] && p[2]) {
54eba3833e34 [gaim-migrate @ 9699]
Ethan Blanton <elb@pidgin.im>
parents: 8918
diff changeset
270 char *nibble1 = strchr(xdigits, tolower(p[1]));
54eba3833e34 [gaim-migrate @ 9699]
Ethan Blanton <elb@pidgin.im>
parents: 8918
diff changeset
271 char *nibble2 = strchr(xdigits, tolower(p[2]));
54eba3833e34 [gaim-migrate @ 9699]
Ethan Blanton <elb@pidgin.im>
parents: 8918
diff changeset
272 if (nibble1 && nibble2) { /* 5.1 #1 */
54eba3833e34 [gaim-migrate @ 9699]
Ethan Blanton <elb@pidgin.im>
parents: 8918
diff changeset
273 *n = ((nibble1 - xdigits) << 4) | (nibble2 - xdigits);
54eba3833e34 [gaim-migrate @ 9699]
Ethan Blanton <elb@pidgin.im>
parents: 8918
diff changeset
274 p += 2;
54eba3833e34 [gaim-migrate @ 9699]
Ethan Blanton <elb@pidgin.im>
parents: 8918
diff changeset
275 } else { /* This should never happen */
54eba3833e34 [gaim-migrate @ 9699]
Ethan Blanton <elb@pidgin.im>
parents: 8918
diff changeset
276 *n = *p;
54eba3833e34 [gaim-migrate @ 9699]
Ethan Blanton <elb@pidgin.im>
parents: 8918
diff changeset
277 }
54eba3833e34 [gaim-migrate @ 9699]
Ethan Blanton <elb@pidgin.im>
parents: 8918
diff changeset
278 } else { /* This should never happen */
54eba3833e34 [gaim-migrate @ 9699]
Ethan Blanton <elb@pidgin.im>
parents: 8918
diff changeset
279 *n = *p;
54eba3833e34 [gaim-migrate @ 9699]
Ethan Blanton <elb@pidgin.im>
parents: 8918
diff changeset
280 }
7679
1363f91da9cc [gaim-migrate @ 8323]
Mark Doliner <mark@kingant.net>
parents: 7675
diff changeset
281 }
1363f91da9cc [gaim-migrate @ 8323]
Mark Doliner <mark@kingant.net>
parents: 7675
diff changeset
282 else if (*p == '_')
1363f91da9cc [gaim-migrate @ 8323]
Mark Doliner <mark@kingant.net>
parents: 7675
diff changeset
283 *n = ' ';
1363f91da9cc [gaim-migrate @ 8323]
Mark Doliner <mark@kingant.net>
parents: 7675
diff changeset
284 else
1363f91da9cc [gaim-migrate @ 8323]
Mark Doliner <mark@kingant.net>
parents: 7675
diff changeset
285 *n = *p;
1363f91da9cc [gaim-migrate @ 8323]
Mark Doliner <mark@kingant.net>
parents: 7675
diff changeset
286 }
1363f91da9cc [gaim-migrate @ 8323]
Mark Doliner <mark@kingant.net>
parents: 7675
diff changeset
287
1363f91da9cc [gaim-migrate @ 8323]
Mark Doliner <mark@kingant.net>
parents: 7675
diff changeset
288 *n = '\0';
1363f91da9cc [gaim-migrate @ 8323]
Mark Doliner <mark@kingant.net>
parents: 7675
diff changeset
289
1363f91da9cc [gaim-migrate @ 8323]
Mark Doliner <mark@kingant.net>
parents: 7675
diff changeset
290 if (ret_len)
1363f91da9cc [gaim-migrate @ 8323]
Mark Doliner <mark@kingant.net>
parents: 7675
diff changeset
291 *ret_len = n - new;
7722
db1542e84ee6 [gaim-migrate @ 8367]
Nathan Walp <nwalp@pidgin.im>
parents: 7679
diff changeset
292
7679
1363f91da9cc [gaim-migrate @ 8323]
Mark Doliner <mark@kingant.net>
parents: 7675
diff changeset
293 /* Resize to take less space */
1363f91da9cc [gaim-migrate @ 8323]
Mark Doliner <mark@kingant.net>
parents: 7675
diff changeset
294 /* new = realloc(new, n - new); */
1363f91da9cc [gaim-migrate @ 8323]
Mark Doliner <mark@kingant.net>
parents: 7675
diff changeset
295
1363f91da9cc [gaim-migrate @ 8323]
Mark Doliner <mark@kingant.net>
parents: 7675
diff changeset
296 *ret_str = new;
1363f91da9cc [gaim-migrate @ 8323]
Mark Doliner <mark@kingant.net>
parents: 7675
diff changeset
297 }
1363f91da9cc [gaim-migrate @ 8323]
Mark Doliner <mark@kingant.net>
parents: 7675
diff changeset
298
1363f91da9cc [gaim-migrate @ 8323]
Mark Doliner <mark@kingant.net>
parents: 7675
diff changeset
299 /**************************************************************************
1363f91da9cc [gaim-migrate @ 8323]
Mark Doliner <mark@kingant.net>
parents: 7675
diff changeset
300 * MIME Functions
1363f91da9cc [gaim-migrate @ 8323]
Mark Doliner <mark@kingant.net>
parents: 7675
diff changeset
301 **************************************************************************/
1363f91da9cc [gaim-migrate @ 8323]
Mark Doliner <mark@kingant.net>
parents: 7675
diff changeset
302 char *
1363f91da9cc [gaim-migrate @ 8323]
Mark Doliner <mark@kingant.net>
parents: 7675
diff changeset
303 gaim_mime_decode_field(const char *str)
1363f91da9cc [gaim-migrate @ 8323]
Mark Doliner <mark@kingant.net>
parents: 7675
diff changeset
304 {
7858
1ce040412bd5 [gaim-migrate @ 8512]
Mark Doliner <mark@kingant.net>
parents: 7840
diff changeset
305 /*
8958
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
306 * This is wing's version, partially based on revo/shx's version
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
307 * See RFC2047 [which apparently obsoletes RFC1342]
7858
1ce040412bd5 [gaim-migrate @ 8512]
Mark Doliner <mark@kingant.net>
parents: 7840
diff changeset
308 */
8958
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
309 typedef enum {
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
310 state_start, state_equal1, state_question1,
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
311 state_charset, state_question2,
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
312 state_encoding, state_question3,
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
313 state_encoded_text, state_question4, state_equal2 = state_start
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
314 } encoded_word_state_t;
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
315 encoded_word_state_t state = state_start;
7858
1ce040412bd5 [gaim-migrate @ 8512]
Mark Doliner <mark@kingant.net>
parents: 7840
diff changeset
316 const char *cur, *mark;
8958
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
317 const char *charset0 = NULL, *encoding0 = NULL, *encoded_text0 = NULL;
7858
1ce040412bd5 [gaim-migrate @ 8512]
Mark Doliner <mark@kingant.net>
parents: 7840
diff changeset
318 char *n, *new;
1ce040412bd5 [gaim-migrate @ 8512]
Mark Doliner <mark@kingant.net>
parents: 7840
diff changeset
319
8976
6f21aa413b18 [gaim-migrate @ 9750]
Mark Doliner <mark@kingant.net>
parents: 8958
diff changeset
320 /* token can be any CHAR (supposedly ISO8859-1/ISO2022), not just ASCII */
8958
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
321 #define token_char_p(c) \
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
322 (c != ' ' && !iscntrl(c) && !strchr("()<>@,;:\"/[]?.=", c))
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
323
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
324 /* But encoded-text must be ASCII; alas, isascii() may not exist */
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
325 #define encoded_text_char_p(c) \
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
326 ((c & 0x80) == 0 && c != '?' && c != ' ' && isgraph(c))
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
327
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
328 #define RECOVER_MARKED_TEXT strncpy(n, mark, cur - mark + 1); \
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
329 n += cur - mark + 1
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
330
8976
6f21aa413b18 [gaim-migrate @ 9750]
Mark Doliner <mark@kingant.net>
parents: 8958
diff changeset
331 g_return_val_if_fail(str != NULL, NULL);
6f21aa413b18 [gaim-migrate @ 9750]
Mark Doliner <mark@kingant.net>
parents: 8958
diff changeset
332
6f21aa413b18 [gaim-migrate @ 9750]
Mark Doliner <mark@kingant.net>
parents: 8958
diff changeset
333 /* NOTE: Assuming that we need just strlen(str)+1 *may* be wrong.
6f21aa413b18 [gaim-migrate @ 9750]
Mark Doliner <mark@kingant.net>
parents: 8958
diff changeset
334 * It would be wrong if one byte (in some unknown encoding) could
6f21aa413b18 [gaim-migrate @ 9750]
Mark Doliner <mark@kingant.net>
parents: 8958
diff changeset
335 * expand to >=4 bytes of UTF-8; I don't know if there are such things.
6f21aa413b18 [gaim-migrate @ 9750]
Mark Doliner <mark@kingant.net>
parents: 8958
diff changeset
336 */
7858
1ce040412bd5 [gaim-migrate @ 8512]
Mark Doliner <mark@kingant.net>
parents: 7840
diff changeset
337 n = new = g_malloc(strlen(str) + 1);
1ce040412bd5 [gaim-migrate @ 8512]
Mark Doliner <mark@kingant.net>
parents: 7840
diff changeset
338
1ce040412bd5 [gaim-migrate @ 8512]
Mark Doliner <mark@kingant.net>
parents: 7840
diff changeset
339 /* Here we will be looking for encoded words and if they seem to be
1ce040412bd5 [gaim-migrate @ 8512]
Mark Doliner <mark@kingant.net>
parents: 7840
diff changeset
340 * valid then decode them.
1ce040412bd5 [gaim-migrate @ 8512]
Mark Doliner <mark@kingant.net>
parents: 7840
diff changeset
341 * They are of this form: =?charset?encoding?text?=
1ce040412bd5 [gaim-migrate @ 8512]
Mark Doliner <mark@kingant.net>
parents: 7840
diff changeset
342 */
1ce040412bd5 [gaim-migrate @ 8512]
Mark Doliner <mark@kingant.net>
parents: 7840
diff changeset
343
8958
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
344 for (cur = str, mark = NULL; *cur; cur += 1) {
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
345 switch (state) {
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
346 case state_equal1:
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
347 if (*cur == '?') {
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
348 state = state_question1;
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
349 } else {
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
350 RECOVER_MARKED_TEXT;
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
351 state = state_start;
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
352 }
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
353 break;
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
354 case state_question1:
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
355 if (token_char_p(*cur)) {
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
356 charset0 = cur;
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
357 state = state_charset;
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
358 } else { /* This should never happen */
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
359 RECOVER_MARKED_TEXT;
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
360 state = state_start;
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
361 }
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
362 break;
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
363 case state_charset:
7858
1ce040412bd5 [gaim-migrate @ 8512]
Mark Doliner <mark@kingant.net>
parents: 7840
diff changeset
364 if (*cur == '?') {
8958
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
365 state = state_question2;
8976
6f21aa413b18 [gaim-migrate @ 9750]
Mark Doliner <mark@kingant.net>
parents: 8958
diff changeset
366 } else if (!token_char_p(*cur)) { /* This should never happen */
8958
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
367 RECOVER_MARKED_TEXT;
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
368 state = state_start;
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
369 }
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
370 break;
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
371 case state_question2:
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
372 if (token_char_p(*cur)) {
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
373 encoding0 = cur;
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
374 state = state_encoding;
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
375 } else { /* This should never happen */
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
376 RECOVER_MARKED_TEXT;
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
377 state = state_start;
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
378 }
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
379 break;
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
380 case state_encoding:
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
381 if (*cur == '?') {
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
382 state = state_question3;
8976
6f21aa413b18 [gaim-migrate @ 9750]
Mark Doliner <mark@kingant.net>
parents: 8958
diff changeset
383 } else if (!token_char_p(*cur)) { /* This should never happen */
8958
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
384 RECOVER_MARKED_TEXT;
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
385 state = state_start;
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
386 }
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
387 break;
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
388 case state_question3:
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
389 if (encoded_text_char_p(*cur)) {
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
390 encoded_text0 = cur;
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
391 state = state_encoded_text;
8976
6f21aa413b18 [gaim-migrate @ 9750]
Mark Doliner <mark@kingant.net>
parents: 8958
diff changeset
392 } else if (*cur == '?') { /* empty string */
6f21aa413b18 [gaim-migrate @ 9750]
Mark Doliner <mark@kingant.net>
parents: 8958
diff changeset
393 encoded_text0 = cur;
6f21aa413b18 [gaim-migrate @ 9750]
Mark Doliner <mark@kingant.net>
parents: 8958
diff changeset
394 state = state_question4;
8958
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
395 } else { /* This should never happen */
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
396 RECOVER_MARKED_TEXT;
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
397 state = state_start;
7858
1ce040412bd5 [gaim-migrate @ 8512]
Mark Doliner <mark@kingant.net>
parents: 7840
diff changeset
398 }
8958
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
399 break;
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
400 case state_encoded_text:
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
401 if (*cur == '?') {
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
402 state = state_question4;
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
403 } else if (!encoded_text_char_p(*cur)) {
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
404 RECOVER_MARKED_TEXT;
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
405 state = state_start;
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
406 }
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
407 break;
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
408 case state_question4:
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
409 if (*cur == '=') { /* Got the whole encoded-word */
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
410 char *charset = g_strndup(charset0, encoding0 - charset0 - 1);
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
411 char *encoding = g_strndup(encoding0, encoded_text0 - encoding0 - 1);
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
412 char *encoded_text = g_strndup(encoded_text0, cur - encoded_text0 - 1);
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
413 char *decoded = NULL;
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
414 int dec_len;
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
415 if (g_ascii_strcasecmp(encoding, "Q") == 0)
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
416 gaim_quotedp_decode(encoded_text, &decoded, &dec_len);
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
417 else if (g_ascii_strcasecmp(encoding, "B") == 0)
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
418 gaim_base64_decode(encoded_text, &decoded, &dec_len);
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
419 else
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
420 decoded = NULL;
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
421 if (decoded) {
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
422 gsize len;
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
423 char *converted = g_convert(decoded, dec_len, "utf-8", charset, NULL, &len, NULL);
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
424
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
425 if (converted) {
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
426 n = strncpy(n, converted, len) + len;
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
427 g_free(converted);
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
428 }
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
429 g_free(decoded);
7858
1ce040412bd5 [gaim-migrate @ 8512]
Mark Doliner <mark@kingant.net>
parents: 7840
diff changeset
430 }
8958
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
431 g_free(charset);
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
432 g_free(encoding);
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
433 g_free(encoded_text);
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
434 state = state_equal2; /* Restart the FSM */
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
435 } else { /* This should never happen */
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
436 RECOVER_MARKED_TEXT;
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
437 state = state_start;
7858
1ce040412bd5 [gaim-migrate @ 8512]
Mark Doliner <mark@kingant.net>
parents: 7840
diff changeset
438 }
8958
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
439 break;
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
440 default:
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
441 if (*cur == '=') {
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
442 mark = cur;
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
443 state = state_equal1;
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
444 } else {
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
445 /* Some unencoded text. */
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
446 *n = *cur;
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
447 n += 1;
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
448 }
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
449 break;
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
450 } /* switch */
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
451 } /* for */
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
452
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
453 if (state != state_start) {
60a47725df97 [gaim-migrate @ 9732]
Luke Schierer <lschiere@pidgin.im>
parents: 8929
diff changeset
454 RECOVER_MARKED_TEXT;
7858
1ce040412bd5 [gaim-migrate @ 8512]
Mark Doliner <mark@kingant.net>
parents: 7840
diff changeset
455 }
1ce040412bd5 [gaim-migrate @ 8512]
Mark Doliner <mark@kingant.net>
parents: 7840
diff changeset
456 *n = '\0';
1ce040412bd5 [gaim-migrate @ 8512]
Mark Doliner <mark@kingant.net>
parents: 7840
diff changeset
457
1ce040412bd5 [gaim-migrate @ 8512]
Mark Doliner <mark@kingant.net>
parents: 7840
diff changeset
458 return new;
7840
13334c29799b [gaim-migrate @ 8493]
Mark Doliner <mark@kingant.net>
parents: 7824
diff changeset
459 }
7824
1663c076a744 [gaim-migrate @ 8476]
Mark Doliner <mark@kingant.net>
parents: 7820
diff changeset
460
7679
1363f91da9cc [gaim-migrate @ 8323]
Mark Doliner <mark@kingant.net>
parents: 7675
diff changeset
461
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
462 /**************************************************************************
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
463 * Date/Time Functions
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
464 **************************************************************************/
7162
d14e026611c0 [gaim-migrate @ 7729]
Nathan Walp <nwalp@pidgin.im>
parents: 7134
diff changeset
465 const char *
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
466 gaim_date(void)
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
467 {
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
468 static char date[80];
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
469 time_t tme;
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
470
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
471 time(&tme);
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
472 strftime(date, sizeof(date), "%H:%M:%S", localtime(&tme));
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
473
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
474 return date;
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
475 }
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
476
7162
d14e026611c0 [gaim-migrate @ 7729]
Nathan Walp <nwalp@pidgin.im>
parents: 7134
diff changeset
477 const char *
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
478 gaim_date_full(void)
1252
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
479 {
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
480 char *date;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
481 time_t tme;
1252
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1250
diff changeset
482
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
483 time(&tme);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
484 date = ctime(&tme);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
485 date[strlen(date) - 1] = '\0';
1100
f168625b63fe [gaim-migrate @ 1110]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1087
diff changeset
486
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
487 return date;
3630
9682c0e022c6 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3572
diff changeset
488 }
9682c0e022c6 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3572
diff changeset
489
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
490 time_t
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
491 gaim_time_build(int year, int month, int day, int hour, int min, int sec)
1805
caa605e70917 [gaim-migrate @ 1815]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1753
diff changeset
492 {
caa605e70917 [gaim-migrate @ 1815]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1753
diff changeset
493 struct tm tm;
caa605e70917 [gaim-migrate @ 1815]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1753
diff changeset
494
caa605e70917 [gaim-migrate @ 1815]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1753
diff changeset
495 tm.tm_year = year - 1900;
caa605e70917 [gaim-migrate @ 1815]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1753
diff changeset
496 tm.tm_mon = month - 1;
caa605e70917 [gaim-migrate @ 1815]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1753
diff changeset
497 tm.tm_mday = day;
caa605e70917 [gaim-migrate @ 1815]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1753
diff changeset
498 tm.tm_hour = hour;
caa605e70917 [gaim-migrate @ 1815]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1753
diff changeset
499 tm.tm_min = min;
caa605e70917 [gaim-migrate @ 1815]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1753
diff changeset
500 tm.tm_sec = sec >= 0 ? sec : time(NULL) % 60;
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
501
1805
caa605e70917 [gaim-migrate @ 1815]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1753
diff changeset
502 return mktime(&tm);
caa605e70917 [gaim-migrate @ 1815]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1753
diff changeset
503 }
3230
d05dc05bde8a [gaim-migrate @ 3247]
Jim Seymour <jseymour>
parents: 3153
diff changeset
504
8577
599d6ac9bbfe [gaim-migrate @ 9326]
Nathan Walp <nwalp@pidgin.im>
parents: 8561
diff changeset
505 time_t
599d6ac9bbfe [gaim-migrate @ 9326]
Nathan Walp <nwalp@pidgin.im>
parents: 8561
diff changeset
506 gaim_str_to_time(const char *timestamp, gboolean utc)
599d6ac9bbfe [gaim-migrate @ 9326]
Nathan Walp <nwalp@pidgin.im>
parents: 8561
diff changeset
507 {
9722
25866d09063d [gaim-migrate @ 10583]
Mark Doliner <mark@kingant.net>
parents: 9716
diff changeset
508 time_t retval = 0;
9716
8158d148b3c2 [gaim-migrate @ 10577]
Mark Doliner <mark@kingant.net>
parents: 9696
diff changeset
509 struct tm *t;
8158d148b3c2 [gaim-migrate @ 10577]
Mark Doliner <mark@kingant.net>
parents: 9696
diff changeset
510 char buf[32];
8158d148b3c2 [gaim-migrate @ 10577]
Mark Doliner <mark@kingant.net>
parents: 9696
diff changeset
511 char *c;
8158d148b3c2 [gaim-migrate @ 10577]
Mark Doliner <mark@kingant.net>
parents: 9696
diff changeset
512 int tzoff = 0;
8158d148b3c2 [gaim-migrate @ 10577]
Mark Doliner <mark@kingant.net>
parents: 9696
diff changeset
513
8158d148b3c2 [gaim-migrate @ 10577]
Mark Doliner <mark@kingant.net>
parents: 9696
diff changeset
514 time(&retval);
8158d148b3c2 [gaim-migrate @ 10577]
Mark Doliner <mark@kingant.net>
parents: 9696
diff changeset
515 t = localtime(&retval);
8158d148b3c2 [gaim-migrate @ 10577]
Mark Doliner <mark@kingant.net>
parents: 9696
diff changeset
516
8158d148b3c2 [gaim-migrate @ 10577]
Mark Doliner <mark@kingant.net>
parents: 9696
diff changeset
517 snprintf(buf, sizeof(buf), "%s", timestamp);
8158d148b3c2 [gaim-migrate @ 10577]
Mark Doliner <mark@kingant.net>
parents: 9696
diff changeset
518 c = buf;
8158d148b3c2 [gaim-migrate @ 10577]
Mark Doliner <mark@kingant.net>
parents: 9696
diff changeset
519
8158d148b3c2 [gaim-migrate @ 10577]
Mark Doliner <mark@kingant.net>
parents: 9696
diff changeset
520 /* 4 digit year */
8158d148b3c2 [gaim-migrate @ 10577]
Mark Doliner <mark@kingant.net>
parents: 9696
diff changeset
521 if (!sscanf(c, "%04d", &t->tm_year)) return 0;
8158d148b3c2 [gaim-migrate @ 10577]
Mark Doliner <mark@kingant.net>
parents: 9696
diff changeset
522 c += 4;
8158d148b3c2 [gaim-migrate @ 10577]
Mark Doliner <mark@kingant.net>
parents: 9696
diff changeset
523 if (*c == '-')
8158d148b3c2 [gaim-migrate @ 10577]
Mark Doliner <mark@kingant.net>
parents: 9696
diff changeset
524 c++;
8158d148b3c2 [gaim-migrate @ 10577]
Mark Doliner <mark@kingant.net>
parents: 9696
diff changeset
525
8158d148b3c2 [gaim-migrate @ 10577]
Mark Doliner <mark@kingant.net>
parents: 9696
diff changeset
526 t->tm_year -= 1900;
8577
599d6ac9bbfe [gaim-migrate @ 9326]
Nathan Walp <nwalp@pidgin.im>
parents: 8561
diff changeset
527
599d6ac9bbfe [gaim-migrate @ 9326]
Nathan Walp <nwalp@pidgin.im>
parents: 8561
diff changeset
528 /* 2 digit month */
9716
8158d148b3c2 [gaim-migrate @ 10577]
Mark Doliner <mark@kingant.net>
parents: 9696
diff changeset
529 if (!sscanf(c, "%02d", &t->tm_mon)) return 0;
8158d148b3c2 [gaim-migrate @ 10577]
Mark Doliner <mark@kingant.net>
parents: 9696
diff changeset
530 c += 2;
8158d148b3c2 [gaim-migrate @ 10577]
Mark Doliner <mark@kingant.net>
parents: 9696
diff changeset
531 if (*c == '-')
8577
599d6ac9bbfe [gaim-migrate @ 9326]
Nathan Walp <nwalp@pidgin.im>
parents: 8561
diff changeset
532 c++;
599d6ac9bbfe [gaim-migrate @ 9326]
Nathan Walp <nwalp@pidgin.im>
parents: 8561
diff changeset
533
9716
8158d148b3c2 [gaim-migrate @ 10577]
Mark Doliner <mark@kingant.net>
parents: 9696
diff changeset
534 t->tm_mon -= 1;
8158d148b3c2 [gaim-migrate @ 10577]
Mark Doliner <mark@kingant.net>
parents: 9696
diff changeset
535
8158d148b3c2 [gaim-migrate @ 10577]
Mark Doliner <mark@kingant.net>
parents: 9696
diff changeset
536 /* 2 digit day */
8158d148b3c2 [gaim-migrate @ 10577]
Mark Doliner <mark@kingant.net>
parents: 9696
diff changeset
537 if (!sscanf(c, "%02d", &t->tm_mday)) return 0;
8158d148b3c2 [gaim-migrate @ 10577]
Mark Doliner <mark@kingant.net>
parents: 9696
diff changeset
538 c += 2;
8158d148b3c2 [gaim-migrate @ 10577]
Mark Doliner <mark@kingant.net>
parents: 9696
diff changeset
539 if (*c == 'T' || *c == '.') { /* we have more than a date, keep going */
9725
242a5a97c952 [gaim-migrate @ 10586]
Mark Doliner <mark@kingant.net>
parents: 9722
diff changeset
540 c++; /* skip the "T" */
242a5a97c952 [gaim-migrate @ 10586]
Mark Doliner <mark@kingant.net>
parents: 9722
diff changeset
541
242a5a97c952 [gaim-migrate @ 10586]
Mark Doliner <mark@kingant.net>
parents: 9722
diff changeset
542 /* 2 digit hour */
242a5a97c952 [gaim-migrate @ 10586]
Mark Doliner <mark@kingant.net>
parents: 9722
diff changeset
543 if (sscanf(c, "%02d:%02d:%02d", &t->tm_hour, &t->tm_min, &t->tm_sec) == 3 ||
242a5a97c952 [gaim-migrate @ 10586]
Mark Doliner <mark@kingant.net>
parents: 9722
diff changeset
544 sscanf(c, "%02d%02d%02d", &t->tm_hour, &t->tm_min, &t->tm_sec) == 3) {
242a5a97c952 [gaim-migrate @ 10586]
Mark Doliner <mark@kingant.net>
parents: 9722
diff changeset
545 int tzhrs, tzmins;
242a5a97c952 [gaim-migrate @ 10586]
Mark Doliner <mark@kingant.net>
parents: 9722
diff changeset
546 c += 8;
242a5a97c952 [gaim-migrate @ 10586]
Mark Doliner <mark@kingant.net>
parents: 9722
diff changeset
547 if (*c == '.') /* dealing with precision we don't care about */
242a5a97c952 [gaim-migrate @ 10586]
Mark Doliner <mark@kingant.net>
parents: 9722
diff changeset
548 c += 4;
242a5a97c952 [gaim-migrate @ 10586]
Mark Doliner <mark@kingant.net>
parents: 9722
diff changeset
549 if ((*c == '+' || *c == '-') &&
242a5a97c952 [gaim-migrate @ 10586]
Mark Doliner <mark@kingant.net>
parents: 9722
diff changeset
550 sscanf(c+1, "%02d:%02d", &tzhrs, &tzmins)) {
242a5a97c952 [gaim-migrate @ 10586]
Mark Doliner <mark@kingant.net>
parents: 9722
diff changeset
551 tzoff = tzhrs*60*60 + tzmins*60;
242a5a97c952 [gaim-migrate @ 10586]
Mark Doliner <mark@kingant.net>
parents: 9722
diff changeset
552 if (*c == '+')
242a5a97c952 [gaim-migrate @ 10586]
Mark Doliner <mark@kingant.net>
parents: 9722
diff changeset
553 tzoff *= -1;
9716
8158d148b3c2 [gaim-migrate @ 10577]
Mark Doliner <mark@kingant.net>
parents: 9696
diff changeset
554 }
8158d148b3c2 [gaim-migrate @ 10577]
Mark Doliner <mark@kingant.net>
parents: 9696
diff changeset
555
10876
4fdc8a1102c0 [gaim-migrate @ 12567]
Nathan Walp <nwalp@pidgin.im>
parents: 10871
diff changeset
556 t->tm_isdst = -1;
4fdc8a1102c0 [gaim-migrate @ 12567]
Nathan Walp <nwalp@pidgin.im>
parents: 10871
diff changeset
557
9716
8158d148b3c2 [gaim-migrate @ 10577]
Mark Doliner <mark@kingant.net>
parents: 9696
diff changeset
558 if (tzoff || utc) {
10987
a8a7730db73c [gaim-migrate @ 12824]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10948
diff changeset
559 #ifdef _WIN32
a8a7730db73c [gaim-migrate @ 12824]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10948
diff changeset
560 TIME_ZONE_INFORMATION tzi;
a8a7730db73c [gaim-migrate @ 12824]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10948
diff changeset
561 DWORD ret;
a8a7730db73c [gaim-migrate @ 12824]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10948
diff changeset
562 if ((ret = GetTimeZoneInformation(&tzi))
a8a7730db73c [gaim-migrate @ 12824]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10948
diff changeset
563 != TIME_ZONE_ID_INVALID) {
a8a7730db73c [gaim-migrate @ 12824]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10948
diff changeset
564 tzoff -= tzi.Bias * 60;
a8a7730db73c [gaim-migrate @ 12824]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10948
diff changeset
565 if (ret == TIME_ZONE_ID_DAYLIGHT) {
a8a7730db73c [gaim-migrate @ 12824]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10948
diff changeset
566 tzoff -= tzi.DaylightBias * 60;
a8a7730db73c [gaim-migrate @ 12824]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10948
diff changeset
567 }
a8a7730db73c [gaim-migrate @ 12824]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10948
diff changeset
568 }
a8a7730db73c [gaim-migrate @ 12824]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10948
diff changeset
569 #else
8577
599d6ac9bbfe [gaim-migrate @ 9326]
Nathan Walp <nwalp@pidgin.im>
parents: 8561
diff changeset
570 #ifdef HAVE_TM_GMTOFF
9716
8158d148b3c2 [gaim-migrate @ 10577]
Mark Doliner <mark@kingant.net>
parents: 9696
diff changeset
571 tzoff += t->tm_gmtoff;
8577
599d6ac9bbfe [gaim-migrate @ 9326]
Nathan Walp <nwalp@pidgin.im>
parents: 8561
diff changeset
572 #else
9716
8158d148b3c2 [gaim-migrate @ 10577]
Mark Doliner <mark@kingant.net>
parents: 9696
diff changeset
573 # ifdef HAVE_TIMEZONE
8158d148b3c2 [gaim-migrate @ 10577]
Mark Doliner <mark@kingant.net>
parents: 9696
diff changeset
574 tzset(); /* making sure */
8158d148b3c2 [gaim-migrate @ 10577]
Mark Doliner <mark@kingant.net>
parents: 9696
diff changeset
575 tzoff -= timezone;
10876
4fdc8a1102c0 [gaim-migrate @ 12567]
Nathan Walp <nwalp@pidgin.im>
parents: 10871
diff changeset
576 t->tm_isdst = 0; /* I think this might fix it */
9716
8158d148b3c2 [gaim-migrate @ 10577]
Mark Doliner <mark@kingant.net>
parents: 9696
diff changeset
577 # endif
8577
599d6ac9bbfe [gaim-migrate @ 9326]
Nathan Walp <nwalp@pidgin.im>
parents: 8561
diff changeset
578 #endif
10987
a8a7730db73c [gaim-migrate @ 12824]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10948
diff changeset
579 #endif /* _WIN32 */
8577
599d6ac9bbfe [gaim-migrate @ 9326]
Nathan Walp <nwalp@pidgin.im>
parents: 8561
diff changeset
580 }
9716
8158d148b3c2 [gaim-migrate @ 10577]
Mark Doliner <mark@kingant.net>
parents: 9696
diff changeset
581 }
8158d148b3c2 [gaim-migrate @ 10577]
Mark Doliner <mark@kingant.net>
parents: 9696
diff changeset
582 }
8158d148b3c2 [gaim-migrate @ 10577]
Mark Doliner <mark@kingant.net>
parents: 9696
diff changeset
583
8158d148b3c2 [gaim-migrate @ 10577]
Mark Doliner <mark@kingant.net>
parents: 9696
diff changeset
584 retval = mktime(t);
8158d148b3c2 [gaim-migrate @ 10577]
Mark Doliner <mark@kingant.net>
parents: 9696
diff changeset
585 retval += tzoff;
8158d148b3c2 [gaim-migrate @ 10577]
Mark Doliner <mark@kingant.net>
parents: 9696
diff changeset
586
8158d148b3c2 [gaim-migrate @ 10577]
Mark Doliner <mark@kingant.net>
parents: 9696
diff changeset
587 return retval;
8577
599d6ac9bbfe [gaim-migrate @ 9326]
Nathan Walp <nwalp@pidgin.im>
parents: 8561
diff changeset
588 }
599d6ac9bbfe [gaim-migrate @ 9326]
Nathan Walp <nwalp@pidgin.im>
parents: 8561
diff changeset
589
10636
0f5c5e6fb27f [gaim-migrate @ 12118]
Sean Egan <seanegan@gmail.com>
parents: 10623
diff changeset
590 size_t gaim_strftime(char *s, size_t max, const char *format, const struct tm *tm)
0f5c5e6fb27f [gaim-migrate @ 12118]
Sean Egan <seanegan@gmail.com>
parents: 10623
diff changeset
591 {
0f5c5e6fb27f [gaim-migrate @ 12118]
Sean Egan <seanegan@gmail.com>
parents: 10623
diff changeset
592 return strftime(s, max, format, tm);
0f5c5e6fb27f [gaim-migrate @ 12118]
Sean Egan <seanegan@gmail.com>
parents: 10623
diff changeset
593 }
8577
599d6ac9bbfe [gaim-migrate @ 9326]
Nathan Walp <nwalp@pidgin.im>
parents: 8561
diff changeset
594
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
595 /**************************************************************************
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
596 * Markup Functions
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
597 **************************************************************************/
7094
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
598 gboolean
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
599 gaim_markup_find_tag(const char *needle, const char *haystack,
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
600 const char **start, const char **end, GData **attributes)
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
601 {
6982
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
602 GData *attribs;
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
603 const char *cur = haystack;
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
604 char *name = NULL;
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
605 gboolean found = FALSE;
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
606 gboolean in_tag = FALSE;
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
607 gboolean in_attr = FALSE;
7094
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
608 const char *in_quotes = NULL;
7804
622c9149609c [gaim-migrate @ 8451]
Nathan Walp <nwalp@pidgin.im>
parents: 7722
diff changeset
609 size_t needlelen;
6982
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
610
7804
622c9149609c [gaim-migrate @ 8451]
Nathan Walp <nwalp@pidgin.im>
parents: 7722
diff changeset
611 g_return_val_if_fail( needle != NULL, FALSE);
622c9149609c [gaim-migrate @ 8451]
Nathan Walp <nwalp@pidgin.im>
parents: 7722
diff changeset
612 g_return_val_if_fail( *needle != '\0', FALSE);
622c9149609c [gaim-migrate @ 8451]
Nathan Walp <nwalp@pidgin.im>
parents: 7722
diff changeset
613 g_return_val_if_fail( haystack != NULL, FALSE);
622c9149609c [gaim-migrate @ 8451]
Nathan Walp <nwalp@pidgin.im>
parents: 7722
diff changeset
614 g_return_val_if_fail( *haystack != '\0', FALSE);
622c9149609c [gaim-migrate @ 8451]
Nathan Walp <nwalp@pidgin.im>
parents: 7722
diff changeset
615 g_return_val_if_fail( start != NULL, FALSE);
622c9149609c [gaim-migrate @ 8451]
Nathan Walp <nwalp@pidgin.im>
parents: 7722
diff changeset
616 g_return_val_if_fail( end != NULL, FALSE);
622c9149609c [gaim-migrate @ 8451]
Nathan Walp <nwalp@pidgin.im>
parents: 7722
diff changeset
617 g_return_val_if_fail(attributes != NULL, FALSE);
622c9149609c [gaim-migrate @ 8451]
Nathan Walp <nwalp@pidgin.im>
parents: 7722
diff changeset
618
622c9149609c [gaim-migrate @ 8451]
Nathan Walp <nwalp@pidgin.im>
parents: 7722
diff changeset
619 needlelen = strlen(needle);
6982
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
620 g_datalist_init(&attribs);
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
621
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
622 while (*cur && !found) {
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
623 if (in_tag) {
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
624 if (in_quotes) {
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
625 const char *close = cur;
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
626
7078
acd2a66e59ed [gaim-migrate @ 7643]
Nathan Walp <nwalp@pidgin.im>
parents: 7000
diff changeset
627 while (*close && *close != *in_quotes)
6982
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
628 close++;
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
629
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
630 /* if we got the close quote, store the value and carry on from *
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
631 * after it. if we ran to the end of the string, point to the NULL *
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
632 * and we're outta here */
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
633 if (*close) {
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
634 /* only store a value if we have an attribute name */
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
635 if (name) {
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
636 size_t len = close - cur;
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
637 char *val = g_strndup(cur, len);
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
638
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
639 g_datalist_set_data_full(&attribs, name, val, g_free);
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
640 g_free(name);
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
641 name = NULL;
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
642 }
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
643
7078
acd2a66e59ed [gaim-migrate @ 7643]
Nathan Walp <nwalp@pidgin.im>
parents: 7000
diff changeset
644 in_quotes = NULL;
6982
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
645 cur = close + 1;
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
646 } else {
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
647 cur = close;
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
648 }
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
649 } else if (in_attr) {
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
650 const char *close = cur;
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
651
7078
acd2a66e59ed [gaim-migrate @ 7643]
Nathan Walp <nwalp@pidgin.im>
parents: 7000
diff changeset
652 while (*close && *close != '>' && *close != '"' &&
acd2a66e59ed [gaim-migrate @ 7643]
Nathan Walp <nwalp@pidgin.im>
parents: 7000
diff changeset
653 *close != '\'' && *close != ' ' && *close != '=')
6982
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
654 close++;
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
655
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
656 /* if we got the equals, store the name of the attribute. if we got
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
657 * the quote, save the attribute and go straight to quote mode.
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
658 * otherwise the tag closed or we reached the end of the string,
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
659 * so we can get outta here */
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
660 switch (*close) {
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
661 case '"':
7078
acd2a66e59ed [gaim-migrate @ 7643]
Nathan Walp <nwalp@pidgin.im>
parents: 7000
diff changeset
662 case '\'':
acd2a66e59ed [gaim-migrate @ 7643]
Nathan Walp <nwalp@pidgin.im>
parents: 7000
diff changeset
663 in_quotes = close;
6982
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
664 case '=':
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
665 {
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
666 size_t len = close - cur;
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
667
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
668 /* don't store a blank attribute name */
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
669 if (len) {
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
670 if (name)
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
671 g_free(name);
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
672 name = g_ascii_strdown(cur, len);
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
673 }
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
674
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
675 in_attr = FALSE;
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
676 cur = close + 1;
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
677 break;
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
678 }
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
679 case ' ':
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
680 case '>':
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
681 in_attr = FALSE;
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
682 default:
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
683 cur = close;
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
684 break;
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
685 }
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
686 } else {
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
687 switch (*cur) {
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
688 case ' ':
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
689 /* swallow extra spaces inside tag */
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
690 while (*cur && *cur == ' ') cur++;
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
691 in_attr = TRUE;
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
692 break;
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
693 case '>':
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
694 found = TRUE;
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
695 *end = cur;
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
696 break;
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
697 case '"':
7078
acd2a66e59ed [gaim-migrate @ 7643]
Nathan Walp <nwalp@pidgin.im>
parents: 7000
diff changeset
698 case '\'':
acd2a66e59ed [gaim-migrate @ 7643]
Nathan Walp <nwalp@pidgin.im>
parents: 7000
diff changeset
699 in_quotes = cur;
6982
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
700 default:
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
701 cur++;
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
702 break;
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
703 }
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
704 }
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
705 } else {
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
706 /* if we hit a < followed by the name of our tag... */
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
707 if (*cur == '<' && !g_ascii_strncasecmp(cur + 1, needle, needlelen)) {
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
708 *start = cur;
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
709 cur = cur + needlelen + 1;
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
710
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
711 /* if we're pointing at a space or a >, we found the right tag. if *
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
712 * we're not, we've found a longer tag, so we need to skip to the *
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
713 * >, but not being distracted by >s inside quotes. */
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
714 if (*cur == ' ' || *cur == '>') {
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
715 in_tag = TRUE;
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
716 } else {
7804
622c9149609c [gaim-migrate @ 8451]
Nathan Walp <nwalp@pidgin.im>
parents: 7722
diff changeset
717 while (*cur && *cur != '"' && *cur != '\'' && *cur != '>') {
6982
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
718 if (*cur == '"') {
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
719 cur++;
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
720 while (*cur && *cur != '"')
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
721 cur++;
7804
622c9149609c [gaim-migrate @ 8451]
Nathan Walp <nwalp@pidgin.im>
parents: 7722
diff changeset
722 } else if (*cur == '\'') {
622c9149609c [gaim-migrate @ 8451]
Nathan Walp <nwalp@pidgin.im>
parents: 7722
diff changeset
723 cur++;
622c9149609c [gaim-migrate @ 8451]
Nathan Walp <nwalp@pidgin.im>
parents: 7722
diff changeset
724 while (*cur && *cur != '\'')
622c9149609c [gaim-migrate @ 8451]
Nathan Walp <nwalp@pidgin.im>
parents: 7722
diff changeset
725 cur++;
6982
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
726 } else {
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
727 cur++;
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
728 }
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
729 }
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
730 }
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
731 } else {
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
732 cur++;
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
733 }
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
734 }
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
735 }
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
736
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
737 /* clean up any attribute name from a premature termination */
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
738 if (name)
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
739 g_free(name);
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
740
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
741 if (found) {
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
742 *attributes = attribs;
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
743 } else {
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
744 *start = NULL;
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
745 *end = NULL;
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
746 *attributes = NULL;
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
747 }
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
748
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
749 return found;
083d1e4a9c78 [gaim-migrate @ 7538]
Mark Doliner <mark@kingant.net>
parents: 6872
diff changeset
750 }
7094
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
751
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
752 gboolean
7675
66d9440db6ec [gaim-migrate @ 8319]
Luke Schierer <lschiere@pidgin.im>
parents: 7673
diff changeset
753 gaim_markup_extract_info_field(const char *str, int len, GString *dest,
7095
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
754 const char *start_token, int skip,
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
755 const char *end_token, char check_value,
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
756 const char *no_value_token,
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
757 const char *display_name, gboolean is_link,
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
758 const char *link_prefix)
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
759 {
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
760 const char *p, *q;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
761
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
762 g_return_val_if_fail(str != NULL, FALSE);
7675
66d9440db6ec [gaim-migrate @ 8319]
Luke Schierer <lschiere@pidgin.im>
parents: 7673
diff changeset
763 g_return_val_if_fail(dest != NULL, FALSE);
7095
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
764 g_return_val_if_fail(start_token != NULL, FALSE);
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
765 g_return_val_if_fail(end_token != NULL, FALSE);
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
766 g_return_val_if_fail(display_name != NULL, FALSE);
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
767
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
768 p = strstr(str, start_token);
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
769
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
770 if (p == NULL)
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
771 return FALSE;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
772
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
773 p += strlen(start_token) + skip;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
774
7675
66d9440db6ec [gaim-migrate @ 8319]
Luke Schierer <lschiere@pidgin.im>
parents: 7673
diff changeset
775 if (p >= str + len)
66d9440db6ec [gaim-migrate @ 8319]
Luke Schierer <lschiere@pidgin.im>
parents: 7673
diff changeset
776 return FALSE;
66d9440db6ec [gaim-migrate @ 8319]
Luke Schierer <lschiere@pidgin.im>
parents: 7673
diff changeset
777
7095
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
778 if (check_value != '\0' && *p == check_value)
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
779 return FALSE;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
780
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
781 q = strstr(p, end_token);
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
782
9161
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
783 /* Trim leading blanks */
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
784 while (*p != '\n' && g_ascii_isspace(*p)) {
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
785 p += 1;
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
786 }
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
787
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
788 /* Trim trailing blanks */
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
789 while (q > p && g_ascii_isspace(*(q - 1))) {
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
790 q -= 1;
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
791 }
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
792
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
793 /* Don't bother with null strings */
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
794 if (p == q)
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
795 return FALSE;
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
796
7095
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
797 if (q != NULL && (!no_value_token ||
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
798 (no_value_token && strncmp(p, no_value_token,
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
799 strlen(no_value_token)))))
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
800 {
9220
f0488214826f [gaim-migrate @ 10016]
Tim Ringenbach <marv@pidgin.im>
parents: 9175
diff changeset
801 g_string_append_printf(dest, _("<b>%s:</b> "), display_name);
7095
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
802
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
803 if (is_link)
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
804 {
7675
66d9440db6ec [gaim-migrate @ 8319]
Luke Schierer <lschiere@pidgin.im>
parents: 7673
diff changeset
805 g_string_append(dest, "<br><a href=\"");
7095
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
806
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
807 if (link_prefix)
7675
66d9440db6ec [gaim-migrate @ 8319]
Luke Schierer <lschiere@pidgin.im>
parents: 7673
diff changeset
808 g_string_append(dest, link_prefix);
7095
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
809
7675
66d9440db6ec [gaim-migrate @ 8319]
Luke Schierer <lschiere@pidgin.im>
parents: 7673
diff changeset
810 g_string_append_len(dest, p, q - p);
66d9440db6ec [gaim-migrate @ 8319]
Luke Schierer <lschiere@pidgin.im>
parents: 7673
diff changeset
811 g_string_append(dest, "\">");
7095
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
812
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
813 if (link_prefix)
7675
66d9440db6ec [gaim-migrate @ 8319]
Luke Schierer <lschiere@pidgin.im>
parents: 7673
diff changeset
814 g_string_append(dest, link_prefix);
7095
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
815
7675
66d9440db6ec [gaim-migrate @ 8319]
Luke Schierer <lschiere@pidgin.im>
parents: 7673
diff changeset
816 g_string_append_len(dest, p, q - p);
66d9440db6ec [gaim-migrate @ 8319]
Luke Schierer <lschiere@pidgin.im>
parents: 7673
diff changeset
817 g_string_append(dest, "</a>");
7095
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
818 }
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
819 else
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
820 {
7675
66d9440db6ec [gaim-migrate @ 8319]
Luke Schierer <lschiere@pidgin.im>
parents: 7673
diff changeset
821 g_string_append_len(dest, p, q - p);
7095
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
822 }
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
823
7675
66d9440db6ec [gaim-migrate @ 8319]
Luke Schierer <lschiere@pidgin.im>
parents: 7673
diff changeset
824 g_string_append(dest, "<br>\n");
7095
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
825
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
826 return TRUE;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
827 }
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
828
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
829 return FALSE;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
830 }
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
831
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
832 struct gaim_parse_tag {
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
833 char *src_tag;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
834 char *dest_tag;
8064
9b6bc1010054 [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
835 gboolean ignore;
7095
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
836 };
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
837
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
838 #define ALLOW_TAG_ALT(x, y) if(!g_ascii_strncasecmp(c, "<" x " ", strlen("<" x " "))) { \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
839 const char *o = c + strlen("<" x); \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
840 const char *p = NULL, *q = NULL, *r = NULL; \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
841 GString *innards = g_string_new(""); \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
842 while(o && *o) { \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
843 if(!q && (*o == '\"' || *o == '\'') ) { \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
844 q = o; \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
845 } else if(q) { \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
846 if(*o == *q) { \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
847 char *unescaped = g_strndup(q+1, o-q-1); \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
848 char *escaped = g_markup_escape_text(unescaped, -1); \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
849 g_string_append_printf(innards, "%c%s%c", *q, escaped, *q); \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
850 g_free(unescaped); \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
851 g_free(escaped); \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
852 q = NULL; \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
853 } else if(*c == '\\') { \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
854 o++; \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
855 } \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
856 } else if(*o == '<') { \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
857 r = o; \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
858 } else if(*o == '>') { \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
859 p = o; \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
860 break; \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
861 } else { \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
862 innards = g_string_append_c(innards, *o); \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
863 } \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
864 o++; \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
865 } \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
866 if(p && !r) { \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
867 if(*(p-1) != '/') { \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
868 struct gaim_parse_tag *pt = g_new0(struct gaim_parse_tag, 1); \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
869 pt->src_tag = x; \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
870 pt->dest_tag = y; \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
871 tags = g_list_prepend(tags, pt); \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
872 } \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
873 xhtml = g_string_append(xhtml, "<" y); \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
874 c += strlen("<" x ); \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
875 xhtml = g_string_append(xhtml, innards->str); \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
876 xhtml = g_string_append_c(xhtml, '>'); \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
877 c = p + 1; \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
878 } else { \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
879 xhtml = g_string_append(xhtml, "&lt;"); \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
880 plain = g_string_append_c(plain, '<'); \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
881 c++; \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
882 } \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
883 g_string_free(innards, TRUE); \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
884 continue; \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
885 } \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
886 if(!g_ascii_strncasecmp(c, "<" x, strlen("<" x)) && \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
887 (*(c+strlen("<" x)) == '>' || \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
888 !g_ascii_strncasecmp(c+strlen("<" x), "/>", 2))) { \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
889 xhtml = g_string_append(xhtml, "<" y); \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
890 c += strlen("<" x); \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
891 if(*c != '/') { \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
892 struct gaim_parse_tag *pt = g_new0(struct gaim_parse_tag, 1); \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
893 pt->src_tag = x; \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
894 pt->dest_tag = y; \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
895 tags = g_list_prepend(tags, pt); \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
896 xhtml = g_string_append_c(xhtml, '>'); \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
897 } else { \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
898 xhtml = g_string_append(xhtml, "/>");\
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
899 } \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
900 c = strchr(c, '>') + 1; \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
901 continue; \
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
902 }
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
903 #define ALLOW_TAG(x) ALLOW_TAG_ALT(x, x)
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
904 void
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
905 gaim_markup_html_to_xhtml(const char *html, char **xhtml_out,
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
906 char **plain_out)
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
907 {
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
908 GString *xhtml = g_string_new("");
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
909 GString *plain = g_string_new("");
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
910 GList *tags = NULL, *tag;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
911 const char *c = html;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
912
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
913 while(c && *c) {
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
914 if(*c == '<') {
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
915 if(*(c+1) == '/') { /* closing tag */
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
916 tag = tags;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
917 while(tag) {
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
918 struct gaim_parse_tag *pt = tag->data;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
919 if(!g_ascii_strncasecmp((c+2), pt->src_tag, strlen(pt->src_tag)) && *(c+strlen(pt->src_tag)+2) == '>') {
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
920 c += strlen(pt->src_tag) + 3;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
921 break;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
922 }
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
923 tag = tag->next;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
924 }
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
925 if(tag) {
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
926 while(tags) {
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
927 struct gaim_parse_tag *pt = tags->data;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
928 g_string_append_printf(xhtml, "</%s>", pt->dest_tag);
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
929 if(tags == tag)
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
930 break;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
931 tags = g_list_remove(tags, pt);
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
932 g_free(pt);
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
933 }
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
934 g_free(tag->data);
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
935 tags = g_list_remove(tags, tag->data);
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
936 } else {
8534
389e2b9dae6a [gaim-migrate @ 9273]
Nathan Walp <nwalp@pidgin.im>
parents: 8517
diff changeset
937 /* a closing tag we weren't expecting...
389e2b9dae6a [gaim-migrate @ 9273]
Nathan Walp <nwalp@pidgin.im>
parents: 8517
diff changeset
938 * we'll let it slide, if it's really a tag...if it's
389e2b9dae6a [gaim-migrate @ 9273]
Nathan Walp <nwalp@pidgin.im>
parents: 8517
diff changeset
939 * just a </ we'll escape it properly */
389e2b9dae6a [gaim-migrate @ 9273]
Nathan Walp <nwalp@pidgin.im>
parents: 8517
diff changeset
940 const char *end = c+2;
389e2b9dae6a [gaim-migrate @ 9273]
Nathan Walp <nwalp@pidgin.im>
parents: 8517
diff changeset
941 while(*end && g_ascii_isalpha(*end))
389e2b9dae6a [gaim-migrate @ 9273]
Nathan Walp <nwalp@pidgin.im>
parents: 8517
diff changeset
942 end++;
389e2b9dae6a [gaim-migrate @ 9273]
Nathan Walp <nwalp@pidgin.im>
parents: 8517
diff changeset
943 if(*end == '>') {
389e2b9dae6a [gaim-migrate @ 9273]
Nathan Walp <nwalp@pidgin.im>
parents: 8517
diff changeset
944 c = end+1;
389e2b9dae6a [gaim-migrate @ 9273]
Nathan Walp <nwalp@pidgin.im>
parents: 8517
diff changeset
945 } else {
389e2b9dae6a [gaim-migrate @ 9273]
Nathan Walp <nwalp@pidgin.im>
parents: 8517
diff changeset
946 xhtml = g_string_append(xhtml, "&lt;");
389e2b9dae6a [gaim-migrate @ 9273]
Nathan Walp <nwalp@pidgin.im>
parents: 8517
diff changeset
947 plain = g_string_append_c(plain, '<');
389e2b9dae6a [gaim-migrate @ 9273]
Nathan Walp <nwalp@pidgin.im>
parents: 8517
diff changeset
948 c++;
389e2b9dae6a [gaim-migrate @ 9273]
Nathan Walp <nwalp@pidgin.im>
parents: 8517
diff changeset
949 }
7095
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
950 }
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
951 } else { /* opening tag */
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
952 ALLOW_TAG("a");
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
953 ALLOW_TAG_ALT("b", "strong");
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
954 ALLOW_TAG("blockquote");
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
955 ALLOW_TAG_ALT("bold", "strong");
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
956 ALLOW_TAG("cite");
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
957 ALLOW_TAG("div");
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
958 ALLOW_TAG("em");
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
959 ALLOW_TAG("h1");
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
960 ALLOW_TAG("h2");
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
961 ALLOW_TAG("h3");
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
962 ALLOW_TAG("h4");
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
963 ALLOW_TAG("h5");
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
964 ALLOW_TAG("h6");
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
965 /* we only allow html to start the message */
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
966 if(c == html)
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
967 ALLOW_TAG("html");
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
968 ALLOW_TAG_ALT("i", "em");
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
969 ALLOW_TAG_ALT("italic", "em");
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
970 ALLOW_TAG("li");
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
971 ALLOW_TAG("ol");
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
972 ALLOW_TAG("p");
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
973 ALLOW_TAG("pre");
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
974 ALLOW_TAG("q");
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
975 ALLOW_TAG("span");
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
976 ALLOW_TAG("strong");
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
977 ALLOW_TAG("ul");
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
978
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
979 /* we skip <HR> because it's not legal in XHTML-IM. However,
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
980 * we still want to send something sensible, so we put a
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
981 * linebreak in its place. <BR> also needs special handling
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
982 * because putting a </BR> to close it would just be dumb. */
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
983 if((!g_ascii_strncasecmp(c, "<br", 3)
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
984 || !g_ascii_strncasecmp(c, "<hr", 3))
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
985 && (*(c+3) == '>' ||
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
986 !g_ascii_strncasecmp(c+3, "/>", 2) ||
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
987 !g_ascii_strncasecmp(c+3, " />", 3))) {
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
988 c = strchr(c, '>') + 1;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
989 xhtml = g_string_append(xhtml, "<br/>");
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
990 if(*c != '\n')
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
991 plain = g_string_append_c(plain, '\n');
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
992 continue;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
993 }
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
994 if(!g_ascii_strncasecmp(c, "<u>", 3) || !g_ascii_strncasecmp(c, "<underline>", strlen("<underline>"))) {
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
995 struct gaim_parse_tag *pt = g_new0(struct gaim_parse_tag, 1);
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
996 pt->src_tag = *(c+2) == '>' ? "u" : "underline";
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
997 pt->dest_tag = "span";
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
998 tags = g_list_prepend(tags, pt);
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
999 c = strchr(c, '>') + 1;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1000 xhtml = g_string_append(xhtml, "<span style='text-decoration: underline;'>");
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1001 continue;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1002 }
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1003 if(!g_ascii_strncasecmp(c, "<s>", 3) || !g_ascii_strncasecmp(c, "<strike>", strlen("<strike>"))) {
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1004 struct gaim_parse_tag *pt = g_new0(struct gaim_parse_tag, 1);
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1005 pt->src_tag = *(c+2) == '>' ? "s" : "strike";
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1006 pt->dest_tag = "span";
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1007 tags = g_list_prepend(tags, pt);
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1008 c = strchr(c, '>') + 1;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1009 xhtml = g_string_append(xhtml, "<span style='text-decoration: line-through;'>");
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1010 continue;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1011 }
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1012 if(!g_ascii_strncasecmp(c, "<sub>", 5)) {
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1013 struct gaim_parse_tag *pt = g_new0(struct gaim_parse_tag, 1);
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1014 pt->src_tag = "sub";
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1015 pt->dest_tag = "span";
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1016 tags = g_list_prepend(tags, pt);
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1017 c = strchr(c, '>') + 1;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1018 xhtml = g_string_append(xhtml, "<span style='vertical-align:sub;'>");
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1019 continue;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1020 }
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1021 if(!g_ascii_strncasecmp(c, "<sup>", 5)) {
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1022 struct gaim_parse_tag *pt = g_new0(struct gaim_parse_tag, 1);
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1023 pt->src_tag = "sup";
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1024 pt->dest_tag = "span";
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1025 tags = g_list_prepend(tags, pt);
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1026 c = strchr(c, '>') + 1;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1027 xhtml = g_string_append(xhtml, "<span style='vertical-align:super;'>");
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1028 continue;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1029 }
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1030 if(!g_ascii_strncasecmp(c, "<font", 5) && (*(c+5) == '>' || *(c+5) == ' ')) {
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1031 const char *p = c;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1032 GString *style = g_string_new("");
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1033 struct gaim_parse_tag *pt;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1034 while(*p && *p != '>') {
8064
9b6bc1010054 [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1035 if(!g_ascii_strncasecmp(p, "back=", strlen("back="))) {
9b6bc1010054 [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1036 const char *q = p + strlen("back=");
9b6bc1010054 [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1037 GString *color = g_string_new("");
9b6bc1010054 [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1038 if(*q == '\'' || *q == '\"')
9b6bc1010054 [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1039 q++;
9b6bc1010054 [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1040 while(*q && *q != '\"' && *q != '\'' && *q != ' ') {
9b6bc1010054 [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1041 color = g_string_append_c(color, *q);
9b6bc1010054 [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1042 q++;
9b6bc1010054 [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1043 }
9b6bc1010054 [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1044 g_string_append_printf(style, "background: %s; ", color->str);
9b6bc1010054 [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1045 g_string_free(color, TRUE);
9b6bc1010054 [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1046 p = q;
9b6bc1010054 [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1047 } else if(!g_ascii_strncasecmp(p, "color=", strlen("color="))) {
7095
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1048 const char *q = p + strlen("color=");
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1049 GString *color = g_string_new("");
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1050 if(*q == '\'' || *q == '\"')
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1051 q++;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1052 while(*q && *q != '\"' && *q != '\'' && *q != ' ') {
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1053 color = g_string_append_c(color, *q);
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1054 q++;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1055 }
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1056 g_string_append_printf(style, "color: %s; ", color->str);
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1057 g_string_free(color, TRUE);
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1058 p = q;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1059 } else if(!g_ascii_strncasecmp(p, "face=", strlen("face="))) {
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1060 const char *q = p + strlen("face=");
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1061 gboolean space_allowed = FALSE;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1062 GString *face = g_string_new("");
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1063 if(*q == '\'' || *q == '\"') {
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1064 space_allowed = TRUE;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1065 q++;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1066 }
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1067 while(*q && *q != '\"' && *q != '\'' && (space_allowed || *q != ' ')) {
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1068 face = g_string_append_c(face, *q);
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1069 q++;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1070 }
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1071 g_string_append_printf(style, "font-family: %s; ", face->str);
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1072 g_string_free(face, TRUE);
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1073 p = q;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1074 } else if(!g_ascii_strncasecmp(p, "size=", strlen("size="))) {
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1075 const char *q = p + strlen("size=");
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1076 int sz;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1077 const char *size = "medium";
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1078 if(*q == '\'' || *q == '\"')
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1079 q++;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1080 sz = atoi(q);
8686
140b0d020c43 [gaim-migrate @ 9439]
Luke Schierer <lschiere@pidgin.im>
parents: 8625
diff changeset
1081 switch (sz)
140b0d020c43 [gaim-migrate @ 9439]
Luke Schierer <lschiere@pidgin.im>
parents: 8625
diff changeset
1082 {
140b0d020c43 [gaim-migrate @ 9439]
Luke Schierer <lschiere@pidgin.im>
parents: 8625
diff changeset
1083 case 1:
140b0d020c43 [gaim-migrate @ 9439]
Luke Schierer <lschiere@pidgin.im>
parents: 8625
diff changeset
1084 size = "xx-small";
140b0d020c43 [gaim-migrate @ 9439]
Luke Schierer <lschiere@pidgin.im>
parents: 8625
diff changeset
1085 break;
140b0d020c43 [gaim-migrate @ 9439]
Luke Schierer <lschiere@pidgin.im>
parents: 8625
diff changeset
1086 case 2:
140b0d020c43 [gaim-migrate @ 9439]
Luke Schierer <lschiere@pidgin.im>
parents: 8625
diff changeset
1087 size = "x-small";
140b0d020c43 [gaim-migrate @ 9439]
Luke Schierer <lschiere@pidgin.im>
parents: 8625
diff changeset
1088 break;
140b0d020c43 [gaim-migrate @ 9439]
Luke Schierer <lschiere@pidgin.im>
parents: 8625
diff changeset
1089 case 3:
140b0d020c43 [gaim-migrate @ 9439]
Luke Schierer <lschiere@pidgin.im>
parents: 8625
diff changeset
1090 size = "small";
140b0d020c43 [gaim-migrate @ 9439]
Luke Schierer <lschiere@pidgin.im>
parents: 8625
diff changeset
1091 break;
140b0d020c43 [gaim-migrate @ 9439]
Luke Schierer <lschiere@pidgin.im>
parents: 8625
diff changeset
1092 case 4:
140b0d020c43 [gaim-migrate @ 9439]
Luke Schierer <lschiere@pidgin.im>
parents: 8625
diff changeset
1093 size = "medium";
140b0d020c43 [gaim-migrate @ 9439]
Luke Schierer <lschiere@pidgin.im>
parents: 8625
diff changeset
1094 break;
140b0d020c43 [gaim-migrate @ 9439]
Luke Schierer <lschiere@pidgin.im>
parents: 8625
diff changeset
1095 case 5:
140b0d020c43 [gaim-migrate @ 9439]
Luke Schierer <lschiere@pidgin.im>
parents: 8625
diff changeset
1096 size = "large";
140b0d020c43 [gaim-migrate @ 9439]
Luke Schierer <lschiere@pidgin.im>
parents: 8625
diff changeset
1097 break;
140b0d020c43 [gaim-migrate @ 9439]
Luke Schierer <lschiere@pidgin.im>
parents: 8625
diff changeset
1098 case 6:
140b0d020c43 [gaim-migrate @ 9439]
Luke Schierer <lschiere@pidgin.im>
parents: 8625
diff changeset
1099 size = "x-large";
140b0d020c43 [gaim-migrate @ 9439]
Luke Schierer <lschiere@pidgin.im>
parents: 8625
diff changeset
1100 break;
140b0d020c43 [gaim-migrate @ 9439]
Luke Schierer <lschiere@pidgin.im>
parents: 8625
diff changeset
1101 case 7:
140b0d020c43 [gaim-migrate @ 9439]
Luke Schierer <lschiere@pidgin.im>
parents: 8625
diff changeset
1102 size = "xx-large";
140b0d020c43 [gaim-migrate @ 9439]
Luke Schierer <lschiere@pidgin.im>
parents: 8625
diff changeset
1103 break;
140b0d020c43 [gaim-migrate @ 9439]
Luke Schierer <lschiere@pidgin.im>
parents: 8625
diff changeset
1104 default:
140b0d020c43 [gaim-migrate @ 9439]
Luke Schierer <lschiere@pidgin.im>
parents: 8625
diff changeset
1105 break;
140b0d020c43 [gaim-migrate @ 9439]
Luke Schierer <lschiere@pidgin.im>
parents: 8625
diff changeset
1106 }
7095
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1107 g_string_append_printf(style, "font-size: %s; ", size);
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1108 p = q;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1109 }
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1110 p++;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1111 }
10593
ffabeb0fdc64 [gaim-migrate @ 12005]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10589
diff changeset
1112 if ((c = strchr(c, '>')) != NULL)
ffabeb0fdc64 [gaim-migrate @ 12005]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10589
diff changeset
1113 c++;
ffabeb0fdc64 [gaim-migrate @ 12005]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10589
diff changeset
1114 else
ffabeb0fdc64 [gaim-migrate @ 12005]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10589
diff changeset
1115 c = p;
8064
9b6bc1010054 [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1116 pt = g_new0(struct gaim_parse_tag, 1);
9b6bc1010054 [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1117 pt->src_tag = "font";
9b6bc1010054 [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1118 pt->dest_tag = "span";
9b6bc1010054 [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1119 tags = g_list_prepend(tags, pt);
9b6bc1010054 [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1120 if(style->len)
8026
17b90334f3cc [gaim-migrate @ 8706]
Nathan Walp <nwalp@pidgin.im>
parents: 8005
diff changeset
1121 g_string_append_printf(xhtml, "<span style='%s'>", style->str);
8064
9b6bc1010054 [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1122 else
9b6bc1010054 [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1123 pt->ignore = TRUE;
7095
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1124 g_string_free(style, TRUE);
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1125 continue;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1126 }
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1127 if(!g_ascii_strncasecmp(c, "<body ", 6)) {
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1128 const char *p = c;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1129 gboolean did_something = FALSE;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1130 while(*p && *p != '>') {
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1131 if(!g_ascii_strncasecmp(p, "bgcolor=", strlen("bgcolor="))) {
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1132 const char *q = p + strlen("bgcolor=");
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1133 struct gaim_parse_tag *pt = g_new0(struct gaim_parse_tag, 1);
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1134 GString *color = g_string_new("");
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1135 if(*q == '\'' || *q == '\"')
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1136 q++;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1137 while(*q && *q != '\"' && *q != '\'' && *q != ' ') {
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1138 color = g_string_append_c(color, *q);
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1139 q++;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1140 }
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1141 g_string_append_printf(xhtml, "<span style='background: %s;'>", color->str);
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1142 g_string_free(color, TRUE);
10623
14c32196fcfd [gaim-migrate @ 12094]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10614
diff changeset
1143 if ((c = strchr(c, '>')) != NULL)
14c32196fcfd [gaim-migrate @ 12094]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10614
diff changeset
1144 c++;
14c32196fcfd [gaim-migrate @ 12094]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10614
diff changeset
1145 else
14c32196fcfd [gaim-migrate @ 12094]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10614
diff changeset
1146 c = p;
7095
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1147 pt->src_tag = "body";
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1148 pt->dest_tag = "span";
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1149 tags = g_list_prepend(tags, pt);
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1150 did_something = TRUE;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1151 break;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1152 }
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1153 p++;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1154 }
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1155 if(did_something) continue;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1156 }
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1157 /* this has to come after the special case for bgcolor */
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1158 ALLOW_TAG("body");
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1159 if(!g_ascii_strncasecmp(c, "<!--", strlen("<!--"))) {
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1160 char *p = strstr(c + strlen("<!--"), "-->");
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1161 if(p) {
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1162 xhtml = g_string_append(xhtml, "<!--");
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1163 c += strlen("<!--");
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1164 continue;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1165 }
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1166 }
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1167
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1168 xhtml = g_string_append(xhtml, "&lt;");
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1169 plain = g_string_append_c(plain, '<');
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1170 c++;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1171 }
7287
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1172 } else if(*c == '&') {
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1173 char buf[7];
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1174 char *pln;
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1175 int len = 1;
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1176 guint pound;
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1177 if(!g_ascii_strncasecmp(c, "&amp;", 5)) {
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1178 pln = "&";
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1179 len = 5;
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1180 } else if(!g_ascii_strncasecmp(c, "&lt;", 4)) {
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1181 pln = "<";
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1182 len = 4;
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1183 } else if(!g_ascii_strncasecmp(c, "&gt;", 4)) {
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1184 pln = ">";
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1185 len = 4;
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1186 } else if(!g_ascii_strncasecmp(c, "&nbsp;", 6)) {
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1187 pln = " ";
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1188 len = 6;
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1189 } else if(!g_ascii_strncasecmp(c, "&copy;", 6)) {
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1190 pln = "©";
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1191 len = 6;
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1192 } else if(!g_ascii_strncasecmp(c, "&quot;", 6)) {
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1193 pln = "\"";
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1194 len = 6;
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1195 } else if(!g_ascii_strncasecmp(c, "&reg;", 5)) {
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1196 pln = "®";
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1197 len = 5;
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1198 } else if(!g_ascii_strncasecmp(c, "&apos;", 6)) {
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1199 pln = "\'";
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1200 len = 6;
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1201 } else if(*(c+1) == '#' && (sscanf(c, "&#%u;", &pound) == 1) &&
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1202 pound != 0 && *(c+3+(gint)log10(pound)) == ';') {
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1203 int buflen = g_unichar_to_utf8((gunichar)pound, buf);
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1204 buf[buflen] = '\0';
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1205 pln = buf;
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1206
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1207
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1208 len = 2;
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1209 while(isdigit((gint) c [len])) len++;
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1210 if(c [len] == ';') len++;
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1211 } else {
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1212 len = 1;
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1213 g_snprintf(buf, sizeof(buf), "%c", *c);
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1214 pln = buf;
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1215 }
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1216 xhtml = g_string_append_len(xhtml, c, len);
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1217 plain = g_string_append(plain, pln);
3a41c3f80228 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1218 c += len;
7095
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1219 } else {
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1220 xhtml = g_string_append_c(xhtml, *c);
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1221 plain = g_string_append_c(plain, *c);
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1222 c++;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1223 }
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1224 }
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1225 tag = tags;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1226 while(tag) {
8064
9b6bc1010054 [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1227 struct gaim_parse_tag *pt = tag->data;
9b6bc1010054 [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1228 if(!pt->ignore)
9b6bc1010054 [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1229 g_string_append_printf(xhtml, "</%s>", pt->dest_tag);
7095
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1230 tag = tag->next;
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1231 }
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1232 g_list_free(tags);
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1233 if(xhtml_out)
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1234 *xhtml_out = g_strdup(xhtml->str);
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1235 if(plain_out)
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1236 *plain_out = g_strdup(plain->str);
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1237 g_string_free(xhtml, TRUE);
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1238 g_string_free(plain, TRUE);
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1239 }
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1240
9161
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1241 /* The following are probably reasonable changes:
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1242 * - \n should be converted to a normal space
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1243 * - in addition to <br>, <p> and <div> etc. should also be converted into \n
9241
5e9018c81bd9 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1244 * - We want to turn </td>#whitespace<td> sequences into a single tab
5e9018c81bd9 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1245 * - We want to turn <td> into a single tab (for msn profile "parsing")
9161
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1246 * - We want to turn </tr>#whitespace<tr> sequences into a single \n
9241
5e9018c81bd9 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1247 * - <script>...</script> and <style>...</style> should be completely removed
9161
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1248 */
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1249
7095
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1250 char *
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1251 gaim_markup_strip_html(const char *str)
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1252 {
7103
5dc4ed905a1a [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1253 int i, j, k;
5dc4ed905a1a [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1254 gboolean visible = TRUE;
9161
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1255 gboolean closing_td_p = FALSE;
7103
5dc4ed905a1a [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1256 gchar *str2;
9241
5e9018c81bd9 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1257 const gchar *cdata_close_tag = NULL;
7103
5dc4ed905a1a [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1258
7110
b003397b16fe [gaim-migrate @ 7676]
Nathan Walp <nwalp@pidgin.im>
parents: 7108
diff changeset
1259 if(!str)
b003397b16fe [gaim-migrate @ 7676]
Nathan Walp <nwalp@pidgin.im>
parents: 7108
diff changeset
1260 return NULL;
7103
5dc4ed905a1a [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1261
5dc4ed905a1a [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1262 str2 = g_strdup(str);
5dc4ed905a1a [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1263
5dc4ed905a1a [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1264 for (i = 0, j = 0; str2[i]; i++)
5dc4ed905a1a [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1265 {
5dc4ed905a1a [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1266 if (str2[i] == '<')
5dc4ed905a1a [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1267 {
9241
5e9018c81bd9 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1268 if (cdata_close_tag)
9161
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1269 {
9241
5e9018c81bd9 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1270 /* Note: Don't even assume any other tag is a tag in CDATA */
5e9018c81bd9 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1271 if (strncasecmp(str2 + i, cdata_close_tag,
5e9018c81bd9 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1272 strlen(cdata_close_tag)) == 0)
5e9018c81bd9 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1273 {
5e9018c81bd9 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1274 i += strlen(cdata_close_tag) - 1;
5e9018c81bd9 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1275 cdata_close_tag = NULL;
5e9018c81bd9 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1276 }
5e9018c81bd9 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1277 continue;
5e9018c81bd9 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1278 }
5e9018c81bd9 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1279 else if (strncasecmp(str2 + i, "<td", 3) == 0 && closing_td_p)
5e9018c81bd9 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1280 {
5e9018c81bd9 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1281 str2[j++] = '\t';
9161
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1282 visible = TRUE;
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1283 }
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1284 else if (strncasecmp(str2 + i, "</td>", 5) == 0)
8517
5cb93726e4d5 [gaim-migrate @ 9256]
Luke Schierer <lschiere@pidgin.im>
parents: 8511
diff changeset
1285 {
9161
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1286 closing_td_p = TRUE;
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1287 visible = FALSE;
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1288 }
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1289 else
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1290 {
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1291 closing_td_p = FALSE;
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1292 visible = TRUE;
8517
5cb93726e4d5 [gaim-migrate @ 9256]
Luke Schierer <lschiere@pidgin.im>
parents: 8511
diff changeset
1293 }
5cb93726e4d5 [gaim-migrate @ 9256]
Luke Schierer <lschiere@pidgin.im>
parents: 8511
diff changeset
1294
7103
5dc4ed905a1a [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1295 k = i + 1;
5dc4ed905a1a [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1296
5dc4ed905a1a [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1297 if(g_ascii_isspace(str2[k]))
5dc4ed905a1a [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1298 visible = TRUE;
9170
456ef1f4ba19 [gaim-migrate @ 9955]
Tim Ringenbach <marv@pidgin.im>
parents: 9161
diff changeset
1299 else if (str2[k])
7103
5dc4ed905a1a [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1300 {
9161
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1301 /* Scan until we end the tag either implicitly (closed start
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1302 * tag) or explicitly, using a sloppy method (i.e., < or >
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1303 * inside quoted attributes will screw us up)
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1304 */
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1305 while (str2[k] && str2[k] != '<' && str2[k] != '>')
7103
5dc4ed905a1a [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1306 {
5dc4ed905a1a [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1307 k++;
5dc4ed905a1a [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1308 }
9241
5e9018c81bd9 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1309
9161
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1310 /* Check for tags which should be mapped to newline */
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1311 if (strncasecmp(str2 + i, "<p>", 3) == 0
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1312 || strncasecmp(str2 + i, "<tr", 3) == 0
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1313 || strncasecmp(str2 + i, "<br", 3) == 0
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1314 || strncasecmp(str2 + i, "<li", 3) == 0
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1315 || strncasecmp(str2 + i, "<div", 4) == 0
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1316 || strncasecmp(str2 + i, "</table>", 8) == 0)
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1317 {
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1318 str2[j++] = '\n';
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1319 }
9241
5e9018c81bd9 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1320 /* Check for tags which begin CDATA and need to be closed */
5e9018c81bd9 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1321 #if 0 /* FIXME.. option is end tag optional, we can't handle this right now */
5e9018c81bd9 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1322 else if (strncasecmp(str2 + i, "<option", 7) == 0)
5e9018c81bd9 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1323 {
5e9018c81bd9 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1324 /* FIXME: We should not do this if the OPTION is SELECT'd */
5e9018c81bd9 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1325 cdata_close_tag = "</option>";
5e9018c81bd9 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1326 }
5e9018c81bd9 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1327 #endif
5e9018c81bd9 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1328 else if (strncasecmp(str2 + i, "<script", 7) == 0)
5e9018c81bd9 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1329 {
5e9018c81bd9 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1330 cdata_close_tag = "</script>";
5e9018c81bd9 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1331 }
5e9018c81bd9 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1332 else if (strncasecmp(str2 + i, "<style", 6) == 0)
5e9018c81bd9 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1333 {
5e9018c81bd9 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1334 cdata_close_tag = "</style>";
5e9018c81bd9 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1335 }
9161
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1336 /* Update the index and continue checking after the tag */
10731
783ca1f1ebdb [gaim-migrate @ 12333]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10700
diff changeset
1337 i = (str2[k] == '<' || str2[k] == '\0')? k - 1: k;
9161
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1338 continue;
7103
5dc4ed905a1a [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1339 }
5dc4ed905a1a [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1340 }
9241
5e9018c81bd9 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1341 else if (cdata_close_tag)
5e9018c81bd9 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1342 {
5e9018c81bd9 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1343 continue;
5e9018c81bd9 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1344 }
9161
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1345 else if (!g_ascii_isspace(str2[i]))
7103
5dc4ed905a1a [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1346 {
5dc4ed905a1a [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1347 visible = TRUE;
5dc4ed905a1a [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1348 }
5dc4ed905a1a [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1349
9273
227d3d6c6565 [gaim-migrate @ 10076]
Nathan Walp <nwalp@pidgin.im>
parents: 9257
diff changeset
1350 /* XXX: This sucks. We need to be un-escaping all entities, which
227d3d6c6565 [gaim-migrate @ 10076]
Nathan Walp <nwalp@pidgin.im>
parents: 9257
diff changeset
1351 * includes these, as well as the &#num; ones */
227d3d6c6565 [gaim-migrate @ 10076]
Nathan Walp <nwalp@pidgin.im>
parents: 9257
diff changeset
1352
7103
5dc4ed905a1a [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1353 if (str2[i] == '&' && strncasecmp(str2 + i, "&quot;", 6) == 0)
5dc4ed905a1a [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1354 {
5dc4ed905a1a [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1355 str2[j++] = '\"';
5dc4ed905a1a [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1356 i = i + 5;
5dc4ed905a1a [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1357 continue;
5dc4ed905a1a [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1358 }
5dc4ed905a1a [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1359
8517
5cb93726e4d5 [gaim-migrate @ 9256]
Luke Schierer <lschiere@pidgin.im>
parents: 8511
diff changeset
1360 if (str2[i] == '&' && strncasecmp(str2 + i, "&amp;", 5) == 0)
5cb93726e4d5 [gaim-migrate @ 9256]
Luke Schierer <lschiere@pidgin.im>
parents: 8511
diff changeset
1361 {
5cb93726e4d5 [gaim-migrate @ 9256]
Luke Schierer <lschiere@pidgin.im>
parents: 8511
diff changeset
1362 str2[j++] = '&';
5cb93726e4d5 [gaim-migrate @ 9256]
Luke Schierer <lschiere@pidgin.im>
parents: 8511
diff changeset
1363 i = i + 4;
5cb93726e4d5 [gaim-migrate @ 9256]
Luke Schierer <lschiere@pidgin.im>
parents: 8511
diff changeset
1364 continue;
5cb93726e4d5 [gaim-migrate @ 9256]
Luke Schierer <lschiere@pidgin.im>
parents: 8511
diff changeset
1365 }
5cb93726e4d5 [gaim-migrate @ 9256]
Luke Schierer <lschiere@pidgin.im>
parents: 8511
diff changeset
1366
5cb93726e4d5 [gaim-migrate @ 9256]
Luke Schierer <lschiere@pidgin.im>
parents: 8511
diff changeset
1367 if (str2[i] == '&' && strncasecmp(str2 + i, "&lt;", 4) == 0)
5cb93726e4d5 [gaim-migrate @ 9256]
Luke Schierer <lschiere@pidgin.im>
parents: 8511
diff changeset
1368 {
5cb93726e4d5 [gaim-migrate @ 9256]
Luke Schierer <lschiere@pidgin.im>
parents: 8511
diff changeset
1369 str2[j++] = '<';
5cb93726e4d5 [gaim-migrate @ 9256]
Luke Schierer <lschiere@pidgin.im>
parents: 8511
diff changeset
1370 i = i + 3;
5cb93726e4d5 [gaim-migrate @ 9256]
Luke Schierer <lschiere@pidgin.im>
parents: 8511
diff changeset
1371 continue;
5cb93726e4d5 [gaim-migrate @ 9256]
Luke Schierer <lschiere@pidgin.im>
parents: 8511
diff changeset
1372 }
5cb93726e4d5 [gaim-migrate @ 9256]
Luke Schierer <lschiere@pidgin.im>
parents: 8511
diff changeset
1373
5cb93726e4d5 [gaim-migrate @ 9256]
Luke Schierer <lschiere@pidgin.im>
parents: 8511
diff changeset
1374 if (str2[i] == '&' && strncasecmp(str2 + i, "&gt;", 4) == 0)
5cb93726e4d5 [gaim-migrate @ 9256]
Luke Schierer <lschiere@pidgin.im>
parents: 8511
diff changeset
1375 {
5cb93726e4d5 [gaim-migrate @ 9256]
Luke Schierer <lschiere@pidgin.im>
parents: 8511
diff changeset
1376 str2[j++] = '>';
5cb93726e4d5 [gaim-migrate @ 9256]
Luke Schierer <lschiere@pidgin.im>
parents: 8511
diff changeset
1377 i = i + 3;
5cb93726e4d5 [gaim-migrate @ 9256]
Luke Schierer <lschiere@pidgin.im>
parents: 8511
diff changeset
1378 continue;
5cb93726e4d5 [gaim-migrate @ 9256]
Luke Schierer <lschiere@pidgin.im>
parents: 8511
diff changeset
1379 }
5cb93726e4d5 [gaim-migrate @ 9256]
Luke Schierer <lschiere@pidgin.im>
parents: 8511
diff changeset
1380
9273
227d3d6c6565 [gaim-migrate @ 10076]
Nathan Walp <nwalp@pidgin.im>
parents: 9257
diff changeset
1381 if (str2[i] == '&' && strncasecmp(str2 + i, "&apos;", 6) == 0)
227d3d6c6565 [gaim-migrate @ 10076]
Nathan Walp <nwalp@pidgin.im>
parents: 9257
diff changeset
1382 {
227d3d6c6565 [gaim-migrate @ 10076]
Nathan Walp <nwalp@pidgin.im>
parents: 9257
diff changeset
1383 str2[j++] = '\'';
227d3d6c6565 [gaim-migrate @ 10076]
Nathan Walp <nwalp@pidgin.im>
parents: 9257
diff changeset
1384 i = i + 5;
227d3d6c6565 [gaim-migrate @ 10076]
Nathan Walp <nwalp@pidgin.im>
parents: 9257
diff changeset
1385 continue;
227d3d6c6565 [gaim-migrate @ 10076]
Nathan Walp <nwalp@pidgin.im>
parents: 9257
diff changeset
1386 }
227d3d6c6565 [gaim-migrate @ 10076]
Nathan Walp <nwalp@pidgin.im>
parents: 9257
diff changeset
1387
7103
5dc4ed905a1a [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1388 if (visible)
9161
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1389 str2[j++] = g_ascii_isspace(str2[i])? ' ': str2[i];
7103
5dc4ed905a1a [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1390 }
5dc4ed905a1a [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1391
5dc4ed905a1a [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1392 str2[j] = '\0';
5dc4ed905a1a [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1393
5dc4ed905a1a [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1394 return str2;
7095
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1395 }
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1396
10461
e94802fe3eaf [gaim-migrate @ 11733]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10459
diff changeset
1397 static gboolean
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1398 badchar(char c)
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1399 {
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1400 switch (c) {
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1401 case ' ':
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1402 case ',':
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1403 case '\0':
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1404 case '\n':
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1405 case '<':
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1406 case '>':
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1407 case '"':
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1408 case '\'':
10461
e94802fe3eaf [gaim-migrate @ 11733]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10459
diff changeset
1409 return TRUE;
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1410 default:
10461
e94802fe3eaf [gaim-migrate @ 11733]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10459
diff changeset
1411 return FALSE;
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1412 }
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1413 }
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1414
10461
e94802fe3eaf [gaim-migrate @ 11733]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10459
diff changeset
1415 static gboolean
e94802fe3eaf [gaim-migrate @ 11733]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10459
diff changeset
1416 badentity(const char *c)
e94802fe3eaf [gaim-migrate @ 11733]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10459
diff changeset
1417 {
e94802fe3eaf [gaim-migrate @ 11733]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10459
diff changeset
1418 if (!g_ascii_strncasecmp(c, "&lt;", 4) ||
e94802fe3eaf [gaim-migrate @ 11733]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10459
diff changeset
1419 !g_ascii_strncasecmp(c, "&gt;", 4) ||
e94802fe3eaf [gaim-migrate @ 11733]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10459
diff changeset
1420 !g_ascii_strncasecmp(c, "&quot;", 6)) {
e94802fe3eaf [gaim-migrate @ 11733]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10459
diff changeset
1421 return TRUE;
e94802fe3eaf [gaim-migrate @ 11733]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10459
diff changeset
1422 }
e94802fe3eaf [gaim-migrate @ 11733]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10459
diff changeset
1423 return FALSE;
e94802fe3eaf [gaim-migrate @ 11733]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10459
diff changeset
1424 }
e94802fe3eaf [gaim-migrate @ 11733]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10459
diff changeset
1425
7107
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1426 char *
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1427 gaim_markup_linkify(const char *text)
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1428 {
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1429 const char *c, *t, *q = NULL;
10902
acaf64c659b9 [gaim-migrate @ 12624]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10876
diff changeset
1430 char *tmp, *tmpurlbuf, *url_buf;
9222
316b1afb5974 [gaim-migrate @ 10018]
Tim Ringenbach <marv@pidgin.im>
parents: 9220
diff changeset
1431 gunichar g;
8538
848dfa9fe9d4 [gaim-migrate @ 9279]
Nathan Walp <nwalp@pidgin.im>
parents: 8534
diff changeset
1432 gboolean inside_html = FALSE;
9222
316b1afb5974 [gaim-migrate @ 10018]
Tim Ringenbach <marv@pidgin.im>
parents: 9220
diff changeset
1433 int inside_paren = 0;
7107
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1434 GString *ret = g_string_new("");
10372
618a330c0260 [gaim-migrate @ 11595]
Luke Schierer <lschiere@pidgin.im>
parents: 10332
diff changeset
1435 /* Assumes you have a buffer able to carry at least BUF_LEN * 2 bytes */
7107
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1436
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1437 c = text;
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1438 while (*c) {
9222
316b1afb5974 [gaim-migrate @ 10018]
Tim Ringenbach <marv@pidgin.im>
parents: 9220
diff changeset
1439
316b1afb5974 [gaim-migrate @ 10018]
Tim Ringenbach <marv@pidgin.im>
parents: 9220
diff changeset
1440 if(*c == '(' && !inside_html) {
316b1afb5974 [gaim-migrate @ 10018]
Tim Ringenbach <marv@pidgin.im>
parents: 9220
diff changeset
1441 inside_paren++;
316b1afb5974 [gaim-migrate @ 10018]
Tim Ringenbach <marv@pidgin.im>
parents: 9220
diff changeset
1442 ret = g_string_append_c(ret, *c);
316b1afb5974 [gaim-migrate @ 10018]
Tim Ringenbach <marv@pidgin.im>
parents: 9220
diff changeset
1443 c++;
316b1afb5974 [gaim-migrate @ 10018]
Tim Ringenbach <marv@pidgin.im>
parents: 9220
diff changeset
1444 }
316b1afb5974 [gaim-migrate @ 10018]
Tim Ringenbach <marv@pidgin.im>
parents: 9220
diff changeset
1445
8538
848dfa9fe9d4 [gaim-migrate @ 9279]
Nathan Walp <nwalp@pidgin.im>
parents: 8534
diff changeset
1446 if(inside_html) {
848dfa9fe9d4 [gaim-migrate @ 9279]
Nathan Walp <nwalp@pidgin.im>
parents: 8534
diff changeset
1447 if(*c == '>') {
848dfa9fe9d4 [gaim-migrate @ 9279]
Nathan Walp <nwalp@pidgin.im>
parents: 8534
diff changeset
1448 inside_html = FALSE;
848dfa9fe9d4 [gaim-migrate @ 9279]
Nathan Walp <nwalp@pidgin.im>
parents: 8534
diff changeset
1449 } else if(!q && (*c == '\"' || *c == '\'')) {
848dfa9fe9d4 [gaim-migrate @ 9279]
Nathan Walp <nwalp@pidgin.im>
parents: 8534
diff changeset
1450 q = c;
848dfa9fe9d4 [gaim-migrate @ 9279]
Nathan Walp <nwalp@pidgin.im>
parents: 8534
diff changeset
1451 } else if(q) {
848dfa9fe9d4 [gaim-migrate @ 9279]
Nathan Walp <nwalp@pidgin.im>
parents: 8534
diff changeset
1452 if(*c == *q)
848dfa9fe9d4 [gaim-migrate @ 9279]
Nathan Walp <nwalp@pidgin.im>
parents: 8534
diff changeset
1453 q = NULL;
848dfa9fe9d4 [gaim-migrate @ 9279]
Nathan Walp <nwalp@pidgin.im>
parents: 8534
diff changeset
1454 }
848dfa9fe9d4 [gaim-migrate @ 9279]
Nathan Walp <nwalp@pidgin.im>
parents: 8534
diff changeset
1455 } else if(*c == '<') {
848dfa9fe9d4 [gaim-migrate @ 9279]
Nathan Walp <nwalp@pidgin.im>
parents: 8534
diff changeset
1456 inside_html = TRUE;
9077
13e809489beb [gaim-migrate @ 9853]
Tim Ringenbach <marv@pidgin.im>
parents: 9054
diff changeset
1457 if (!g_ascii_strncasecmp(c, "<A", 2)) {
13e809489beb [gaim-migrate @ 9853]
Tim Ringenbach <marv@pidgin.im>
parents: 9054
diff changeset
1458 while (1) {
13e809489beb [gaim-migrate @ 9853]
Tim Ringenbach <marv@pidgin.im>
parents: 9054
diff changeset
1459 if (!g_ascii_strncasecmp(c, "/A>", 3)) {
13e809489beb [gaim-migrate @ 9853]
Tim Ringenbach <marv@pidgin.im>
parents: 9054
diff changeset
1460 inside_html = FALSE;
13e809489beb [gaim-migrate @ 9853]
Tim Ringenbach <marv@pidgin.im>
parents: 9054
diff changeset
1461 break;
13e809489beb [gaim-migrate @ 9853]
Tim Ringenbach <marv@pidgin.im>
parents: 9054
diff changeset
1462 }
13e809489beb [gaim-migrate @ 9853]
Tim Ringenbach <marv@pidgin.im>
parents: 9054
diff changeset
1463 ret = g_string_append_c(ret, *c);
13e809489beb [gaim-migrate @ 9853]
Tim Ringenbach <marv@pidgin.im>
parents: 9054
diff changeset
1464 c++;
13e809489beb [gaim-migrate @ 9853]
Tim Ringenbach <marv@pidgin.im>
parents: 9054
diff changeset
1465 if (!(*c))
13e809489beb [gaim-migrate @ 9853]
Tim Ringenbach <marv@pidgin.im>
parents: 9054
diff changeset
1466 break;
7107
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1467 }
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1468 }
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1469 } else if ((*c=='h') && (!g_ascii_strncasecmp(c, "http://", 7) ||
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1470 (!g_ascii_strncasecmp(c, "https://", 8)))) {
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1471 t = c;
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1472 while (1) {
10461
e94802fe3eaf [gaim-migrate @ 11733]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10459
diff changeset
1473 if (badchar(*t) || badentity(t)) {
7107
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1474
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1475 if (*(t) == ',' && (*(t + 1) != ' ')) {
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1476 t++;
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1477 continue;
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1478 }
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1479
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1480 if (*(t - 1) == '.')
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1481 t--;
9222
316b1afb5974 [gaim-migrate @ 10018]
Tim Ringenbach <marv@pidgin.im>
parents: 9220
diff changeset
1482 if ((*(t - 1) == ')' && (inside_paren > 0))) {
316b1afb5974 [gaim-migrate @ 10018]
Tim Ringenbach <marv@pidgin.im>
parents: 9220
diff changeset
1483 t--;
316b1afb5974 [gaim-migrate @ 10018]
Tim Ringenbach <marv@pidgin.im>
parents: 9220
diff changeset
1484 }
10461
e94802fe3eaf [gaim-migrate @ 11733]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10459
diff changeset
1485
10902
acaf64c659b9 [gaim-migrate @ 12624]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10876
diff changeset
1486 url_buf = g_strndup(c, t - c);
8918
c34e4e6128f3 [gaim-migrate @ 9688]
Luke Schierer <lschiere@pidgin.im>
parents: 8907
diff changeset
1487 tmpurlbuf = gaim_unescape_html(url_buf);
7107
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1488 g_string_append_printf(ret, "<A HREF=\"%s\">%s</A>",
8918
c34e4e6128f3 [gaim-migrate @ 9688]
Luke Schierer <lschiere@pidgin.im>
parents: 8907
diff changeset
1489 tmpurlbuf, url_buf);
10902
acaf64c659b9 [gaim-migrate @ 12624]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10876
diff changeset
1490 g_free(url_buf);
8918
c34e4e6128f3 [gaim-migrate @ 9688]
Luke Schierer <lschiere@pidgin.im>
parents: 8907
diff changeset
1491 g_free(tmpurlbuf);
7107
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1492 c = t;
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1493 break;
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1494 }
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1495 if (!t)
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1496 break;
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1497 t++;
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1498
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1499 }
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1500 } else if (!g_ascii_strncasecmp(c, "www.", 4)) {
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1501 if (c[4] != '.') {
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1502 t = c;
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1503 while (1) {
10461
e94802fe3eaf [gaim-migrate @ 11733]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10459
diff changeset
1504 if (badchar(*t) || badentity(t)) {
7107
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1505 if (t - c == 4) {
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1506 break;
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1507 }
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1508
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1509 if (*(t) == ',' && (*(t + 1) != ' ')) {
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1510 t++;
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1511 continue;
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1512 }
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1513
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1514 if (*(t - 1) == '.')
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1515 t--;
9222
316b1afb5974 [gaim-migrate @ 10018]
Tim Ringenbach <marv@pidgin.im>
parents: 9220
diff changeset
1516 if ((*(t - 1) == ')' && (inside_paren > 0))) {
316b1afb5974 [gaim-migrate @ 10018]
Tim Ringenbach <marv@pidgin.im>
parents: 9220
diff changeset
1517 t--;
316b1afb5974 [gaim-migrate @ 10018]
Tim Ringenbach <marv@pidgin.im>
parents: 9220
diff changeset
1518 }
10902
acaf64c659b9 [gaim-migrate @ 12624]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10876
diff changeset
1519 url_buf = g_strndup(c, t - c);
8918
c34e4e6128f3 [gaim-migrate @ 9688]
Luke Schierer <lschiere@pidgin.im>
parents: 8907
diff changeset
1520 tmpurlbuf = gaim_unescape_html(url_buf);
7107
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1521 g_string_append_printf(ret,
8918
c34e4e6128f3 [gaim-migrate @ 9688]
Luke Schierer <lschiere@pidgin.im>
parents: 8907
diff changeset
1522 "<A HREF=\"http://%s\">%s</A>", tmpurlbuf,
7107
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1523 url_buf);
10902
acaf64c659b9 [gaim-migrate @ 12624]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10876
diff changeset
1524 g_free(url_buf);
8918
c34e4e6128f3 [gaim-migrate @ 9688]
Luke Schierer <lschiere@pidgin.im>
parents: 8907
diff changeset
1525 g_free(tmpurlbuf);
7107
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1526 c = t;
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1527 break;
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1528 }
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1529 if (!t)
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1530 break;
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1531 t++;
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1532 }
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1533 }
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1534 } else if (!g_ascii_strncasecmp(c, "ftp://", 6)) {
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1535 t = c;
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1536 while (1) {
10461
e94802fe3eaf [gaim-migrate @ 11733]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10459
diff changeset
1537 if (badchar(*t) || badentity(t)) {
7107
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1538 if (*(t - 1) == '.')
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1539 t--;
9222
316b1afb5974 [gaim-migrate @ 10018]
Tim Ringenbach <marv@pidgin.im>
parents: 9220
diff changeset
1540 if ((*(t - 1) == ')' && (inside_paren > 0))) {
316b1afb5974 [gaim-migrate @ 10018]
Tim Ringenbach <marv@pidgin.im>
parents: 9220
diff changeset
1541 t--;
316b1afb5974 [gaim-migrate @ 10018]
Tim Ringenbach <marv@pidgin.im>
parents: 9220
diff changeset
1542 }
10905
d41e285af79e [gaim-migrate @ 12634]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10902
diff changeset
1543 url_buf = g_strndup(c, t - c);
8918
c34e4e6128f3 [gaim-migrate @ 9688]
Luke Schierer <lschiere@pidgin.im>
parents: 8907
diff changeset
1544 tmpurlbuf = gaim_unescape_html(url_buf);
7107
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1545 g_string_append_printf(ret, "<A HREF=\"%s\">%s</A>",
8918
c34e4e6128f3 [gaim-migrate @ 9688]
Luke Schierer <lschiere@pidgin.im>
parents: 8907
diff changeset
1546 tmpurlbuf, url_buf);
10902
acaf64c659b9 [gaim-migrate @ 12624]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10876
diff changeset
1547 g_free(url_buf);
8918
c34e4e6128f3 [gaim-migrate @ 9688]
Luke Schierer <lschiere@pidgin.im>
parents: 8907
diff changeset
1548 g_free(tmpurlbuf);
7107
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1549 c = t;
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1550 break;
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1551 }
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1552 if (!t)
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1553 break;
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1554 t++;
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1555
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1556 }
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1557 } else if (!g_ascii_strncasecmp(c, "ftp.", 4)) {
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1558 if (c[4] != '.') {
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1559 t = c;
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1560 while (1) {
10461
e94802fe3eaf [gaim-migrate @ 11733]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10459
diff changeset
1561 if (badchar(*t) || badentity(t)) {
7107
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1562 if (t - c == 4) {
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1563 break;
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1564 }
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1565 if (*(t - 1) == '.')
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1566 t--;
9222
316b1afb5974 [gaim-migrate @ 10018]
Tim Ringenbach <marv@pidgin.im>
parents: 9220
diff changeset
1567 if ((*(t - 1) == ')' && (inside_paren > 0))) {
316b1afb5974 [gaim-migrate @ 10018]
Tim Ringenbach <marv@pidgin.im>
parents: 9220
diff changeset
1568 t--;
316b1afb5974 [gaim-migrate @ 10018]
Tim Ringenbach <marv@pidgin.im>
parents: 9220
diff changeset
1569 }
10902
acaf64c659b9 [gaim-migrate @ 12624]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10876
diff changeset
1570 url_buf = g_strndup(c, t - c);
8918
c34e4e6128f3 [gaim-migrate @ 9688]
Luke Schierer <lschiere@pidgin.im>
parents: 8907
diff changeset
1571 tmpurlbuf = gaim_unescape_html(url_buf);
7107
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1572 g_string_append_printf(ret,
8918
c34e4e6128f3 [gaim-migrate @ 9688]
Luke Schierer <lschiere@pidgin.im>
parents: 8907
diff changeset
1573 "<A HREF=\"ftp://%s\">%s</A>", tmpurlbuf,
7107
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1574 url_buf);
10902
acaf64c659b9 [gaim-migrate @ 12624]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10876
diff changeset
1575 g_free(url_buf);
8918
c34e4e6128f3 [gaim-migrate @ 9688]
Luke Schierer <lschiere@pidgin.im>
parents: 8907
diff changeset
1576 g_free(tmpurlbuf);
7107
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1577 c = t;
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1578 break;
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1579 }
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1580 if (!t)
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1581 break;
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1582 t++;
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1583 }
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1584 }
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1585 } else if (!g_ascii_strncasecmp(c, "mailto:", 7)) {
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1586 t = c;
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1587 while (1) {
10461
e94802fe3eaf [gaim-migrate @ 11733]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10459
diff changeset
1588 if (badchar(*t) || badentity(t)) {
7107
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1589 if (*(t - 1) == '.')
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1590 t--;
10902
acaf64c659b9 [gaim-migrate @ 12624]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10876
diff changeset
1591 url_buf = g_strndup(c, t - c);
8918
c34e4e6128f3 [gaim-migrate @ 9688]
Luke Schierer <lschiere@pidgin.im>
parents: 8907
diff changeset
1592 tmpurlbuf = gaim_unescape_html(url_buf);
7107
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1593 g_string_append_printf(ret, "<A HREF=\"%s\">%s</A>",
8918
c34e4e6128f3 [gaim-migrate @ 9688]
Luke Schierer <lschiere@pidgin.im>
parents: 8907
diff changeset
1594 tmpurlbuf, url_buf);
10902
acaf64c659b9 [gaim-migrate @ 12624]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10876
diff changeset
1595 g_free(url_buf);
8918
c34e4e6128f3 [gaim-migrate @ 9688]
Luke Schierer <lschiere@pidgin.im>
parents: 8907
diff changeset
1596 g_free(tmpurlbuf);
7107
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1597 c = t;
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1598 break;
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1599 }
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1600 if (!t)
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1601 break;
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1602 t++;
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1603
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1604 }
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1605 } else if (c != text && (*c == '@')) {
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1606 int flag;
10905
d41e285af79e [gaim-migrate @ 12634]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10902
diff changeset
1607 GString *gurl_buf = NULL;
7107
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1608 const char illegal_chars[] = "!@#$%^&*()[]{}/|\\<>\":;\r\n \0";
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1609
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1610 if (strchr(illegal_chars,*(c - 1)) || strchr(illegal_chars, *(c + 1)))
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1611 flag = 0;
10902
acaf64c659b9 [gaim-migrate @ 12624]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10876
diff changeset
1612 else {
7107
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1613 flag = 1;
10902
acaf64c659b9 [gaim-migrate @ 12624]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10876
diff changeset
1614 gurl_buf = g_string_new("");
acaf64c659b9 [gaim-migrate @ 12624]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10876
diff changeset
1615 }
7107
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1616
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1617 t = c;
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1618 while (flag) {
9222
316b1afb5974 [gaim-migrate @ 10018]
Tim Ringenbach <marv@pidgin.im>
parents: 9220
diff changeset
1619 /* iterate backwards grabbing the local part of an email address */
316b1afb5974 [gaim-migrate @ 10018]
Tim Ringenbach <marv@pidgin.im>
parents: 9220
diff changeset
1620 g = g_utf8_get_char(t);
316b1afb5974 [gaim-migrate @ 10018]
Tim Ringenbach <marv@pidgin.im>
parents: 9220
diff changeset
1621 if (badchar(*t) || (g >= 127) || (*t == '(') ||
316b1afb5974 [gaim-migrate @ 10018]
Tim Ringenbach <marv@pidgin.im>
parents: 9220
diff changeset
1622 ((*t == ';') && (t > (text+2)) && !g_ascii_strncasecmp(t - 3, "&lt;", 4))) {
316b1afb5974 [gaim-migrate @ 10018]
Tim Ringenbach <marv@pidgin.im>
parents: 9220
diff changeset
1623 /* local part will already be part of ret, strip it out */
316b1afb5974 [gaim-migrate @ 10018]
Tim Ringenbach <marv@pidgin.im>
parents: 9220
diff changeset
1624 ret = g_string_truncate(ret, ret->len - (c - t));
316b1afb5974 [gaim-migrate @ 10018]
Tim Ringenbach <marv@pidgin.im>
parents: 9220
diff changeset
1625 ret = g_string_append_unichar(ret, g);
7107
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1626 break;
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1627 } else {
9222
316b1afb5974 [gaim-migrate @ 10018]
Tim Ringenbach <marv@pidgin.im>
parents: 9220
diff changeset
1628 g_string_prepend_unichar(gurl_buf, g);
316b1afb5974 [gaim-migrate @ 10018]
Tim Ringenbach <marv@pidgin.im>
parents: 9220
diff changeset
1629 t = g_utf8_find_prev_char(text, t);
7107
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1630 if (t < text) {
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1631 ret = g_string_assign(ret, "");
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1632 break;
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1633 }
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1634 }
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1635 }
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1636
9222
316b1afb5974 [gaim-migrate @ 10018]
Tim Ringenbach <marv@pidgin.im>
parents: 9220
diff changeset
1637 t = g_utf8_find_next_char(c, NULL);
7107
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1638
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1639 while (flag) {
9222
316b1afb5974 [gaim-migrate @ 10018]
Tim Ringenbach <marv@pidgin.im>
parents: 9220
diff changeset
1640 /* iterate forwards grabbing the domain part of an email address */
316b1afb5974 [gaim-migrate @ 10018]
Tim Ringenbach <marv@pidgin.im>
parents: 9220
diff changeset
1641 g = g_utf8_get_char(t);
10461
e94802fe3eaf [gaim-migrate @ 11733]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10459
diff changeset
1642 if (badchar(*t) || (g >= 127) || (*t == ')') || badentity(t)) {
7107
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1643 char *d;
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1644
10902
acaf64c659b9 [gaim-migrate @ 12624]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10876
diff changeset
1645 url_buf = g_string_free(gurl_buf, FALSE);
9222
316b1afb5974 [gaim-migrate @ 10018]
Tim Ringenbach <marv@pidgin.im>
parents: 9220
diff changeset
1646
316b1afb5974 [gaim-migrate @ 10018]
Tim Ringenbach <marv@pidgin.im>
parents: 9220
diff changeset
1647 /* strip off trailing periods */
10902
acaf64c659b9 [gaim-migrate @ 12624]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10876
diff changeset
1648 if (strlen(url_buf) > 0) {
acaf64c659b9 [gaim-migrate @ 12624]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10876
diff changeset
1649 for (d = url_buf + strlen(url_buf) - 1; *d == '.'; d--, t--)
acaf64c659b9 [gaim-migrate @ 12624]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10876
diff changeset
1650 *d = '\0';
acaf64c659b9 [gaim-migrate @ 12624]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10876
diff changeset
1651 }
7107
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1652
8918
c34e4e6128f3 [gaim-migrate @ 9688]
Luke Schierer <lschiere@pidgin.im>
parents: 8907
diff changeset
1653 tmpurlbuf = gaim_unescape_html(url_buf);
9045
38d022e5eb19 [gaim-migrate @ 9821]
Tim Ringenbach <marv@pidgin.im>
parents: 8976
diff changeset
1654 if (gaim_email_is_valid(tmpurlbuf)) {
38d022e5eb19 [gaim-migrate @ 9821]
Tim Ringenbach <marv@pidgin.im>
parents: 8976
diff changeset
1655 g_string_append_printf(ret, "<A HREF=\"mailto:%s\">%s</A>",
38d022e5eb19 [gaim-migrate @ 9821]
Tim Ringenbach <marv@pidgin.im>
parents: 8976
diff changeset
1656 tmpurlbuf, url_buf);
38d022e5eb19 [gaim-migrate @ 9821]
Tim Ringenbach <marv@pidgin.im>
parents: 8976
diff changeset
1657 } else {
38d022e5eb19 [gaim-migrate @ 9821]
Tim Ringenbach <marv@pidgin.im>
parents: 8976
diff changeset
1658 g_string_append(ret, url_buf);
38d022e5eb19 [gaim-migrate @ 9821]
Tim Ringenbach <marv@pidgin.im>
parents: 8976
diff changeset
1659 }
10902
acaf64c659b9 [gaim-migrate @ 12624]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10876
diff changeset
1660 g_free(url_buf);
8918
c34e4e6128f3 [gaim-migrate @ 9688]
Luke Schierer <lschiere@pidgin.im>
parents: 8907
diff changeset
1661 g_free(tmpurlbuf);
7107
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1662 c = t;
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1663
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1664 break;
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1665 } else {
9222
316b1afb5974 [gaim-migrate @ 10018]
Tim Ringenbach <marv@pidgin.im>
parents: 9220
diff changeset
1666 g_string_append_unichar(gurl_buf, g);
316b1afb5974 [gaim-migrate @ 10018]
Tim Ringenbach <marv@pidgin.im>
parents: 9220
diff changeset
1667 t = g_utf8_find_next_char(t, NULL);
7107
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1668 }
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1669 }
9222
316b1afb5974 [gaim-migrate @ 10018]
Tim Ringenbach <marv@pidgin.im>
parents: 9220
diff changeset
1670 }
316b1afb5974 [gaim-migrate @ 10018]
Tim Ringenbach <marv@pidgin.im>
parents: 9220
diff changeset
1671
316b1afb5974 [gaim-migrate @ 10018]
Tim Ringenbach <marv@pidgin.im>
parents: 9220
diff changeset
1672 if(*c == ')' && !inside_html) {
316b1afb5974 [gaim-migrate @ 10018]
Tim Ringenbach <marv@pidgin.im>
parents: 9220
diff changeset
1673 inside_paren--;
316b1afb5974 [gaim-migrate @ 10018]
Tim Ringenbach <marv@pidgin.im>
parents: 9220
diff changeset
1674 ret = g_string_append_c(ret, *c);
316b1afb5974 [gaim-migrate @ 10018]
Tim Ringenbach <marv@pidgin.im>
parents: 9220
diff changeset
1675 c++;
7107
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1676 }
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1677
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1678 if (*c == 0)
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1679 break;
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1680
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1681 ret = g_string_append_c(ret, *c);
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1682 c++;
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1683
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1684 }
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1685 tmp = ret->str;
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1686 g_string_free(ret, FALSE);
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1687 return tmp;
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1688 }
9220c7490cd1 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1689
8163
da57fb60680a [gaim-migrate @ 8875]
Ethan Blanton <elb@pidgin.im>
parents: 8125
diff changeset
1690 char *
8442
3d0178c4f390 [gaim-migrate @ 9172]
Luke Schierer <lschiere@pidgin.im>
parents: 8433
diff changeset
1691 gaim_unescape_html(const char *html) {
3d0178c4f390 [gaim-migrate @ 9172]
Luke Schierer <lschiere@pidgin.im>
parents: 8433
diff changeset
1692 char *unescaped = NULL;
3d0178c4f390 [gaim-migrate @ 9172]
Luke Schierer <lschiere@pidgin.im>
parents: 8433
diff changeset
1693
3d0178c4f390 [gaim-migrate @ 9172]
Luke Schierer <lschiere@pidgin.im>
parents: 8433
diff changeset
1694 if (html != NULL) {
3d0178c4f390 [gaim-migrate @ 9172]
Luke Schierer <lschiere@pidgin.im>
parents: 8433
diff changeset
1695 const char *c = html;
3d0178c4f390 [gaim-migrate @ 9172]
Luke Schierer <lschiere@pidgin.im>
parents: 8433
diff changeset
1696 GString *ret = g_string_new("");
3d0178c4f390 [gaim-migrate @ 9172]
Luke Schierer <lschiere@pidgin.im>
parents: 8433
diff changeset
1697 while (*c) {
3d0178c4f390 [gaim-migrate @ 9172]
Luke Schierer <lschiere@pidgin.im>
parents: 8433
diff changeset
1698 if (!strncmp(c, "&amp;", 5)) {
3d0178c4f390 [gaim-migrate @ 9172]
Luke Schierer <lschiere@pidgin.im>
parents: 8433
diff changeset
1699 ret = g_string_append_c(ret, '&');
3d0178c4f390 [gaim-migrate @ 9172]
Luke Schierer <lschiere@pidgin.im>
parents: 8433
diff changeset
1700 c += 5;
3d0178c4f390 [gaim-migrate @ 9172]
Luke Schierer <lschiere@pidgin.im>
parents: 8433
diff changeset
1701 } else if (!strncmp(c, "&lt;", 4)) {
3d0178c4f390 [gaim-migrate @ 9172]
Luke Schierer <lschiere@pidgin.im>
parents: 8433
diff changeset
1702 ret = g_string_append_c(ret, '<');
3d0178c4f390 [gaim-migrate @ 9172]
Luke Schierer <lschiere@pidgin.im>
parents: 8433
diff changeset
1703 c += 4;
3d0178c4f390 [gaim-migrate @ 9172]
Luke Schierer <lschiere@pidgin.im>
parents: 8433
diff changeset
1704 } else if (!strncmp(c, "&gt;", 4)) {
3d0178c4f390 [gaim-migrate @ 9172]
Luke Schierer <lschiere@pidgin.im>
parents: 8433
diff changeset
1705 ret = g_string_append_c(ret, '>');
3d0178c4f390 [gaim-migrate @ 9172]
Luke Schierer <lschiere@pidgin.im>
parents: 8433
diff changeset
1706 c += 4;
3d0178c4f390 [gaim-migrate @ 9172]
Luke Schierer <lschiere@pidgin.im>
parents: 8433
diff changeset
1707 } else if (!strncmp(c, "&quot;", 6)) {
3d0178c4f390 [gaim-migrate @ 9172]
Luke Schierer <lschiere@pidgin.im>
parents: 8433
diff changeset
1708 ret = g_string_append_c(ret, '"');
3d0178c4f390 [gaim-migrate @ 9172]
Luke Schierer <lschiere@pidgin.im>
parents: 8433
diff changeset
1709 c += 6;
8625
afff7b6ae29f [gaim-migrate @ 9376]
Nathan Walp <nwalp@pidgin.im>
parents: 8596
diff changeset
1710 } else if (!strncmp(c, "&apos;", 6)) {
afff7b6ae29f [gaim-migrate @ 9376]
Nathan Walp <nwalp@pidgin.im>
parents: 8596
diff changeset
1711 ret = g_string_append_c(ret, '\'');
afff7b6ae29f [gaim-migrate @ 9376]
Nathan Walp <nwalp@pidgin.im>
parents: 8596
diff changeset
1712 c += 6;
8500
a6748565835a [gaim-migrate @ 9236]
Mark Doliner <mark@kingant.net>
parents: 8442
diff changeset
1713 } else if (!strncmp(c, "<br>", 4)) {
a6748565835a [gaim-migrate @ 9236]
Mark Doliner <mark@kingant.net>
parents: 8442
diff changeset
1714 ret = g_string_append_c(ret, '\n');
a6748565835a [gaim-migrate @ 9236]
Mark Doliner <mark@kingant.net>
parents: 8442
diff changeset
1715 c += 4;
8442
3d0178c4f390 [gaim-migrate @ 9172]
Luke Schierer <lschiere@pidgin.im>
parents: 8433
diff changeset
1716 } else {
3d0178c4f390 [gaim-migrate @ 9172]
Luke Schierer <lschiere@pidgin.im>
parents: 8433
diff changeset
1717 ret = g_string_append_c(ret, *c);
3d0178c4f390 [gaim-migrate @ 9172]
Luke Schierer <lschiere@pidgin.im>
parents: 8433
diff changeset
1718 c++;
3d0178c4f390 [gaim-migrate @ 9172]
Luke Schierer <lschiere@pidgin.im>
parents: 8433
diff changeset
1719 }
3d0178c4f390 [gaim-migrate @ 9172]
Luke Schierer <lschiere@pidgin.im>
parents: 8433
diff changeset
1720 }
3d0178c4f390 [gaim-migrate @ 9172]
Luke Schierer <lschiere@pidgin.im>
parents: 8433
diff changeset
1721
3d0178c4f390 [gaim-migrate @ 9172]
Luke Schierer <lschiere@pidgin.im>
parents: 8433
diff changeset
1722 unescaped = ret->str;
3d0178c4f390 [gaim-migrate @ 9172]
Luke Schierer <lschiere@pidgin.im>
parents: 8433
diff changeset
1723 g_string_free(ret, FALSE);
3d0178c4f390 [gaim-migrate @ 9172]
Luke Schierer <lschiere@pidgin.im>
parents: 8433
diff changeset
1724 }
3d0178c4f390 [gaim-migrate @ 9172]
Luke Schierer <lschiere@pidgin.im>
parents: 8433
diff changeset
1725 return unescaped;
3d0178c4f390 [gaim-migrate @ 9172]
Luke Schierer <lschiere@pidgin.im>
parents: 8433
diff changeset
1726
3d0178c4f390 [gaim-migrate @ 9172]
Luke Schierer <lschiere@pidgin.im>
parents: 8433
diff changeset
1727 }
3d0178c4f390 [gaim-migrate @ 9172]
Luke Schierer <lschiere@pidgin.im>
parents: 8433
diff changeset
1728
9175
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1729 char *
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1730 gaim_markup_slice(const char *str, guint x, guint y)
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1731 {
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1732 GString *ret;
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1733 GQueue *q;
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1734 guint z = 0;
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1735 gboolean appended = FALSE;
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1736 gunichar c;
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1737 char *tag;
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1738
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1739 g_return_val_if_fail(x <= y, NULL);
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1740
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1741 if (x == y)
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1742 return g_strdup("");
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1743
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1744 ret = g_string_new("");
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1745 q = g_queue_new();
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1746
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1747 while (*str && (z < y)) {
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1748 c = g_utf8_get_char(str);
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1749
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1750 if (c == '<') {
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1751 char *end = strchr(str, '>');
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1752
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1753 if (!end) {
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1754 g_string_free(ret, TRUE);
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1755 while ((tag = g_queue_pop_head(q)))
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1756 g_free(tag);
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1757 g_queue_free(q);
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1758 return NULL;
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1759 }
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1760
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1761 if (!g_ascii_strncasecmp(str, "<img ", 5)) {
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1762 z += strlen("[Image]");
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1763 } else if (!g_ascii_strncasecmp(str, "<br", 3)) {
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1764 z += 1;
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1765 } else if (!g_ascii_strncasecmp(str, "<hr>", 4)) {
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1766 z += strlen("\n---\n");
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1767 } else if (!g_ascii_strncasecmp(str, "</", 2)) {
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1768 /* pop stack */
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1769 char *tmp;
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1770
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1771 tmp = g_queue_pop_head(q);
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1772 if (tmp)
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1773 g_free(tmp);
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1774 /* z += 0; */
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1775 } else {
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1776 /* push it unto the stack */
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1777 char *tmp;
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1778
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1779 tmp = g_strndup(str, end - str + 1);
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1780 g_queue_push_head(q, tmp);
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1781 /* z += 0; */
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1782 }
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1783
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1784 if (z == x && !appended) {
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1785 GList *l = q->tail;
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1786
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1787 while (l) {
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1788 tag = l->data;
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1789 g_string_append(ret, tag);
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1790 l = l->prev;
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1791 }
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1792 appended = TRUE;
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1793 } else if (z >= x) {
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1794 g_string_append_len(ret, str, end - str + 1);
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1795 }
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1796
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1797 str = end;
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1798 } else if (c == '&') {
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1799 char *end = strchr(str, ';');
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1800 if (!end) {
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1801 g_string_free(ret, TRUE);
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1802 while ((tag = g_queue_pop_head(q)))
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1803 g_free(tag);
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1804 g_queue_free(q);
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1805
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1806 return NULL;
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1807 }
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1808
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1809 if (z >= x)
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1810 g_string_append_len(ret, str, end - str + 1);
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1811
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1812 z++;
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1813 str = end;
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1814 } else {
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1815 if (z >= x)
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1816 g_string_append_unichar(ret, c);
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1817 z++;
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1818 }
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1819
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1820 str = g_utf8_next_char(str);
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1821 }
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1822
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1823 while ((tag = g_queue_pop_head(q))) {
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1824 char *name;
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1825
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1826 name = gaim_markup_get_tag_name(tag);
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1827 g_string_append_printf(ret, "</%s>", name);
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1828 g_free(name);
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1829 g_free(tag);
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1830 }
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1831
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1832 g_queue_free(q);
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1833 return g_string_free(ret, FALSE);
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1834 }
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1835
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1836 char *
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1837 gaim_markup_get_tag_name(const char *tag)
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1838 {
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1839 int i;
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1840 g_return_val_if_fail(tag != NULL, NULL);
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1841 g_return_val_if_fail(*tag == '<', NULL);
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1842
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1843 for (i = 1; tag[i]; i++)
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1844 if (tag[i] == '>' || tag[i] == ' ' || tag[i] == '/')
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1845 break;
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1846
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1847 return g_strndup(tag, i);
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1848 }
3e2ea5b69605 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1849
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1850 /**************************************************************************
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1851 * Path/Filename Functions
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1852 **************************************************************************/
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1853 const char *
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1854 gaim_home_dir(void)
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1855 {
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1856 #ifndef _WIN32
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1857 if(g_get_home_dir())
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1858 return g_get_home_dir();
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1859 else
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1860 return NULL;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1861 #else
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1862 return wgaim_data_dir();
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1863 #endif
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1864 }
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1865
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1866 /* returns a string of the form ~/.gaim, where ~ is replaced by the user's home
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1867 * dir. Note that there is no trailing slash after .gaim. */
10332
8d42237564f6 [gaim-migrate @ 11539]
Mark Doliner <mark@kingant.net>
parents: 10258
diff changeset
1868 const char *
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1869 gaim_user_dir(void)
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1870 {
8596
56360561af5e [gaim-migrate @ 9347]
Luke Schierer <lschiere@pidgin.im>
parents: 8577
diff changeset
1871 if (custom_home_dir != NULL && strlen(custom_home_dir) > 0) {
56360561af5e [gaim-migrate @ 9347]
Luke Schierer <lschiere@pidgin.im>
parents: 8577
diff changeset
1872 strcpy ((char*) &home_dir, (char*) &custom_home_dir);
56360561af5e [gaim-migrate @ 9347]
Luke Schierer <lschiere@pidgin.im>
parents: 8577
diff changeset
1873 } else {
56360561af5e [gaim-migrate @ 9347]
Luke Schierer <lschiere@pidgin.im>
parents: 8577
diff changeset
1874 const gchar *hd = gaim_home_dir();
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1875
8596
56360561af5e [gaim-migrate @ 9347]
Luke Schierer <lschiere@pidgin.im>
parents: 8577
diff changeset
1876 if (hd) {
9916
4d17a945aab3 [gaim-migrate @ 10808]
Luke Schierer <lschiere@pidgin.im>
parents: 9818
diff changeset
1877 g_strlcpy((char*) &home_dir, hd, sizeof(home_dir));
4d17a945aab3 [gaim-migrate @ 10808]
Luke Schierer <lschiere@pidgin.im>
parents: 9818
diff changeset
1878 g_strlcat((char*) &home_dir, G_DIR_SEPARATOR_S ".gaim",
4d17a945aab3 [gaim-migrate @ 10808]
Luke Schierer <lschiere@pidgin.im>
parents: 9818
diff changeset
1879 sizeof(home_dir));
8596
56360561af5e [gaim-migrate @ 9347]
Luke Schierer <lschiere@pidgin.im>
parents: 8577
diff changeset
1880 }
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1881 }
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1882
8596
56360561af5e [gaim-migrate @ 9347]
Luke Schierer <lschiere@pidgin.im>
parents: 8577
diff changeset
1883 return home_dir;
56360561af5e [gaim-migrate @ 9347]
Luke Schierer <lschiere@pidgin.im>
parents: 8577
diff changeset
1884 }
56360561af5e [gaim-migrate @ 9347]
Luke Schierer <lschiere@pidgin.im>
parents: 8577
diff changeset
1885
10871
6240d7fd5b2c [gaim-migrate @ 12558]
Mark Doliner <mark@kingant.net>
parents: 10800
diff changeset
1886 void gaim_util_set_user_dir(const char *dir)
8596
56360561af5e [gaim-migrate @ 9347]
Luke Schierer <lschiere@pidgin.im>
parents: 8577
diff changeset
1887 {
56360561af5e [gaim-migrate @ 9347]
Luke Schierer <lschiere@pidgin.im>
parents: 8577
diff changeset
1888 if (dir != NULL && strlen(dir) > 0) {
9916
4d17a945aab3 [gaim-migrate @ 10808]
Luke Schierer <lschiere@pidgin.im>
parents: 9818
diff changeset
1889 g_strlcpy((char*) &custom_home_dir, dir,
4d17a945aab3 [gaim-migrate @ 10808]
Luke Schierer <lschiere@pidgin.im>
parents: 9818
diff changeset
1890 sizeof(custom_home_dir));
8596
56360561af5e [gaim-migrate @ 9347]
Luke Schierer <lschiere@pidgin.im>
parents: 8577
diff changeset
1891 }
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1892 }
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1893
7622
072feee65244 [gaim-migrate @ 8246]
Nathan Walp <nwalp@pidgin.im>
parents: 7617
diff changeset
1894 int gaim_build_dir (const char *path, int mode)
7612
3ae88e96dde2 [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
1895 {
3ae88e96dde2 [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
1896 char *dir, **components, delim[] = { G_DIR_SEPARATOR, '\0' };
3ae88e96dde2 [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
1897 int cur, len;
3ae88e96dde2 [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
1898
7632
925c3ad6531b [gaim-migrate @ 8257]
Nathan Walp <nwalp@pidgin.im>
parents: 7631
diff changeset
1899 g_return_val_if_fail(path != NULL, -1);
7612
3ae88e96dde2 [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
1900
3ae88e96dde2 [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
1901 dir = g_new0(char, strlen(path) + 1);
7622
072feee65244 [gaim-migrate @ 8246]
Nathan Walp <nwalp@pidgin.im>
parents: 7617
diff changeset
1902 components = g_strsplit(path, delim, -1);
7612
3ae88e96dde2 [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
1903 len = 0;
3ae88e96dde2 [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
1904 for (cur = 0; components[cur] != NULL; cur++) {
7633
ee6c31982350 [gaim-migrate @ 8258]
Nathan Walp <nwalp@pidgin.im>
parents: 7632
diff changeset
1905 /* If you don't know what you're doing on both
ee6c31982350 [gaim-migrate @ 8258]
Nathan Walp <nwalp@pidgin.im>
parents: 7632
diff changeset
1906 * win32 and *NIX, stay the hell away from this code */
ee6c31982350 [gaim-migrate @ 8258]
Nathan Walp <nwalp@pidgin.im>
parents: 7632
diff changeset
1907 if(cur > 1)
ee6c31982350 [gaim-migrate @ 8258]
Nathan Walp <nwalp@pidgin.im>
parents: 7632
diff changeset
1908 dir[len++] = G_DIR_SEPARATOR;
7612
3ae88e96dde2 [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
1909 strcpy(dir + len, components[cur]);
3ae88e96dde2 [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
1910 len += strlen(components[cur]);
7633
ee6c31982350 [gaim-migrate @ 8258]
Nathan Walp <nwalp@pidgin.im>
parents: 7632
diff changeset
1911 if(cur == 0)
ee6c31982350 [gaim-migrate @ 8258]
Nathan Walp <nwalp@pidgin.im>
parents: 7632
diff changeset
1912 dir[len++] = G_DIR_SEPARATOR;
7632
925c3ad6531b [gaim-migrate @ 8257]
Nathan Walp <nwalp@pidgin.im>
parents: 7631
diff changeset
1913
925c3ad6531b [gaim-migrate @ 8257]
Nathan Walp <nwalp@pidgin.im>
parents: 7631
diff changeset
1914 if(g_file_test(dir, G_FILE_TEST_IS_DIR)) {
925c3ad6531b [gaim-migrate @ 8257]
Nathan Walp <nwalp@pidgin.im>
parents: 7631
diff changeset
1915 continue;
10948
747ef488c600 [gaim-migrate @ 12747]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10905
diff changeset
1916 #ifdef _WIN32
747ef488c600 [gaim-migrate @ 12747]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10905
diff changeset
1917 /* allow us to create subdirs on UNC paths
747ef488c600 [gaim-migrate @ 12747]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10905
diff changeset
1918 * (\\machinename\path\to\blah)
747ef488c600 [gaim-migrate @ 12747]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10905
diff changeset
1919 * g_file_test() doesn't work on "\\machinename" */
747ef488c600 [gaim-migrate @ 12747]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10905
diff changeset
1920 } else if (cur == 2 && dir[0] == '\\' && dir[1] == '\\'
747ef488c600 [gaim-migrate @ 12747]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10905
diff changeset
1921 && components[cur + 1] != NULL) {
747ef488c600 [gaim-migrate @ 12747]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10905
diff changeset
1922 continue;
747ef488c600 [gaim-migrate @ 12747]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10905
diff changeset
1923 #endif
7632
925c3ad6531b [gaim-migrate @ 8257]
Nathan Walp <nwalp@pidgin.im>
parents: 7631
diff changeset
1924 } else if(g_file_test(dir, G_FILE_TEST_EXISTS)) {
9716
8158d148b3c2 [gaim-migrate @ 10577]
Mark Doliner <mark@kingant.net>
parents: 9696
diff changeset
1925 gaim_debug_warning("build_dir", "bad path: %s\n", path);
7612
3ae88e96dde2 [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
1926 g_strfreev(components);
3ae88e96dde2 [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
1927 g_free(dir);
3ae88e96dde2 [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
1928 return -1;
3ae88e96dde2 [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
1929 }
3ae88e96dde2 [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
1930
10589
0f7452b1f777 [gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10569
diff changeset
1931 if (g_mkdir(dir, mode) < 0) {
9716
8158d148b3c2 [gaim-migrate @ 10577]
Mark Doliner <mark@kingant.net>
parents: 9696
diff changeset
1932 gaim_debug_warning("build_dir", "mkdir: %s\n", strerror(errno));
7612
3ae88e96dde2 [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
1933 g_strfreev(components);
3ae88e96dde2 [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
1934 g_free(dir);
3ae88e96dde2 [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
1935 return -1;
3ae88e96dde2 [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
1936 }
3ae88e96dde2 [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
1937 }
3ae88e96dde2 [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
1938
3ae88e96dde2 [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
1939 g_strfreev(components);
3ae88e96dde2 [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
1940 g_free(dir);
3ae88e96dde2 [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
1941 return 0;
3ae88e96dde2 [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
1942 }
3ae88e96dde2 [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
1943
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1944 /*
10414
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1945 * This function is long and beautiful, like my--um, yeah. Anyway,
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1946 * it includes lots of error checking so as we don't overwrite
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1947 * people's settings if there is a problem writing the new values.
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1948 */
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1949 gboolean
10415
5b7a74d397cc [gaim-migrate @ 11665]
Mark Doliner <mark@kingant.net>
parents: 10414
diff changeset
1950 gaim_util_write_data_to_file(const char *filename, const char *data, size_t size)
10414
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1951 {
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1952 const char *user_dir = gaim_user_dir();
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1953 gchar *filename_temp, *filename_full;
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1954 FILE *file;
10415
5b7a74d397cc [gaim-migrate @ 11665]
Mark Doliner <mark@kingant.net>
parents: 10414
diff changeset
1955 size_t real_size, byteswritten;
10414
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1956 struct stat st;
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1957
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1958 g_return_val_if_fail(user_dir != NULL, FALSE);
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1959
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1960 gaim_debug_info("util", "Writing file %s to directory %s\n",
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1961 filename, user_dir);
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1962
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1963 /* Ensure the user directory exists */
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1964 if (!g_file_test(user_dir, G_FILE_TEST_IS_DIR))
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1965 {
10589
0f7452b1f777 [gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10569
diff changeset
1966 if (g_mkdir(user_dir, S_IRUSR | S_IWUSR | S_IXUSR) == -1)
10414
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1967 {
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1968 gaim_debug_error("util", "Error creating directory %s: %s\n",
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1969 user_dir, strerror(errno));
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1970 return FALSE;
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1971 }
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1972 }
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1973
10415
5b7a74d397cc [gaim-migrate @ 11665]
Mark Doliner <mark@kingant.net>
parents: 10414
diff changeset
1974 filename_full = g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s", user_dir, filename);
10414
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1975 filename_temp = g_strdup_printf("%s.save", filename_full);
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1976
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1977 /* Remove an old temporary file, if one exists */
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1978 if (g_file_test(filename_temp, G_FILE_TEST_EXISTS))
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1979 {
10589
0f7452b1f777 [gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10569
diff changeset
1980 if (g_unlink(filename_temp) == -1)
10414
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1981 {
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1982 gaim_debug_error("util", "Error removing old file %s: %s\n",
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1983 filename_temp, strerror(errno));
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1984 }
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1985 }
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1986
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1987 /* Open file */
10589
0f7452b1f777 [gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10569
diff changeset
1988 file = g_fopen(filename_temp, "wb");
10414
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1989 if (file == NULL)
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1990 {
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1991 gaim_debug_error("util", "Error opening file %s for writing: %s\n",
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1992 filename_temp, strerror(errno));
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1993 g_free(filename_full);
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1994 g_free(filename_temp);
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1995 return FALSE;
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1996 }
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1997
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
1998 /* Write to file */
10415
5b7a74d397cc [gaim-migrate @ 11665]
Mark Doliner <mark@kingant.net>
parents: 10414
diff changeset
1999 real_size = (size == -1) ? strlen(data) : size;
5b7a74d397cc [gaim-migrate @ 11665]
Mark Doliner <mark@kingant.net>
parents: 10414
diff changeset
2000 byteswritten = fwrite(data, 1, real_size, file);
10414
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2001
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2002 /* Close file */
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2003 if (fclose(file) != 0)
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2004 {
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2005 gaim_debug_error("util", "Error closing file %s: %s\n",
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2006 filename_temp, strerror(errno));
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2007 g_free(filename_full);
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2008 g_free(filename_temp);
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2009 return FALSE;
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2010 }
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2011
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2012 /* Ensure the file is the correct size */
10415
5b7a74d397cc [gaim-migrate @ 11665]
Mark Doliner <mark@kingant.net>
parents: 10414
diff changeset
2013 if (byteswritten != real_size)
10414
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2014 {
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2015 gaim_debug_error("util", "Error writing to file %s: Wrote %z bytes "
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2016 "but should have written %z; is your disk full?\n",
10415
5b7a74d397cc [gaim-migrate @ 11665]
Mark Doliner <mark@kingant.net>
parents: 10414
diff changeset
2017 filename_temp, byteswritten, real_size);
10414
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2018 g_free(filename_full);
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2019 g_free(filename_temp);
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2020 return FALSE;
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2021 }
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2022 /* Use stat to be absolutely sure. */
10589
0f7452b1f777 [gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10569
diff changeset
2023 if ((g_stat(filename_temp, &st) == -1) || (st.st_size != real_size))
10414
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2024 {
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2025 gaim_debug_error("util", "Error writing data to file %s: "
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2026 "Incomplete file written; is your disk full?\n",
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2027 filename_temp);
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2028 g_free(filename_full);
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2029 g_free(filename_temp);
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2030 return FALSE;
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2031 }
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2032
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2033 /* Set file permissions */
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2034 if (chmod(filename_temp, S_IRUSR | S_IWUSR) == -1)
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2035 {
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2036 gaim_debug_error("util", "Error setting permissions of file %s: %s\n",
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2037 filename_temp, strerror(errno));
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2038 }
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2039
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2040 /* Remove the old file, if it exists */
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2041 if (g_file_test(filename_full, G_FILE_TEST_EXISTS))
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2042 {
10589
0f7452b1f777 [gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10569
diff changeset
2043 if (g_unlink(filename_full) == -1)
10414
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2044 {
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2045 gaim_debug_error("util", "Error removing old file %s: %s\n",
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2046 filename_full, strerror(errno));
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2047 }
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2048 }
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2049
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2050 /* Rename to the REAL name */
10589
0f7452b1f777 [gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10569
diff changeset
2051 if (g_rename(filename_temp, filename_full) == -1)
10414
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2052 {
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2053 gaim_debug_error("util", "Error renaming %s to %s: %s\n",
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2054 filename_temp, filename_full, strerror(errno));
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2055 }
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2056
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2057 g_free(filename_full);
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2058 g_free(filename_temp);
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2059
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2060 return TRUE;
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2061 }
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2062
10425
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2063 xmlnode *
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2064 gaim_util_read_xml_from_file(const char *filename, const char *description)
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2065 {
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2066 const char *user_dir = gaim_user_dir();
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2067 gchar *filename_full;
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2068 GError *error;
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2069 gchar *contents = NULL;
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2070 gsize length;
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2071 xmlnode *node = NULL;
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2072
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2073 g_return_val_if_fail(user_dir != NULL, NULL);
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2074
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2075 gaim_debug_info("util", "Reading file %s from directory %s\n",
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2076 filename, user_dir);
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2077
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2078 filename_full = g_build_filename(user_dir, filename, NULL);
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2079
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2080 if (!g_file_test(filename_full, G_FILE_TEST_EXISTS))
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2081 {
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2082 gaim_debug_info("util", "File %s does not exist (this is not "
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2083 "necessarily an error)\n", filename_full);
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2084 g_free(filename_full);
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2085 return NULL;
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2086 }
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2087
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2088 if (!g_file_get_contents(filename_full, &contents, &length, &error))
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2089 {
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2090 gaim_debug_error("util", "Error reading file %s: %s\n",
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2091 filename_full, error->message);
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2092 g_error_free(error);
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2093 }
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2094
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2095 if ((contents != NULL) && (length > 0))
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2096 {
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2097 node = xmlnode_from_str(contents, length);
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2098
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2099 /* If we were unable to parse the file then save its contents to a backup file */
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2100 if (node == NULL)
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2101 {
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2102 gchar *filename_temp;
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2103
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2104 filename_temp = g_strdup_printf("%s~", filename);
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2105 gaim_debug_error("util", "Error parsing file %s. Rrenaming old "
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2106 "file to %s\n", filename_full, filename_temp);
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2107 gaim_util_write_data_to_file(filename_temp, contents, length);
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2108 g_free(filename_temp);
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2109 }
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2110
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2111 g_free(contents);
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2112 }
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2113
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2114 /* If we could not parse the file then show the user an error message */
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2115 if (node == NULL)
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2116 {
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2117 gchar *title, *msg;
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2118 title = g_strdup_printf(_("Error Reading %s"), filename);
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2119 msg = g_strdup_printf(_("An error was encountered reading your "
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2120 "%s. They have not been loaded, and the old file "
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2121 "been renamed to %s~."), description, filename_full);
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2122 gaim_notify_error(NULL, NULL, title, msg);
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2123 g_free(title);
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2124 g_free(msg);
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2125 }
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2126
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2127 g_free(filename_full);
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2128
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2129 return node;
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2130 }
9903182f2aac [gaim-migrate @ 11677]
Mark Doliner <mark@kingant.net>
parents: 10415
diff changeset
2131
10414
26eac2362c32 [gaim-migrate @ 11664]
Mark Doliner <mark@kingant.net>
parents: 10372
diff changeset
2132 /*
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2133 * Like mkstemp() but returns a file pointer, uses a pre-set template,
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2134 * uses the semantics of tempnam() for the directory to use and allocates
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2135 * the space for the filepath.
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2136 *
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2137 * Caller is responsible for closing the file and removing it when done,
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2138 * as well as freeing the space pointed-to by "path" with g_free().
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2139 *
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2140 * Returns NULL on failure and cleans up after itself if so.
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2141 */
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2142 static const char *gaim_mkstemp_templ = {"gaimXXXXXX"};
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2143
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2144 FILE *
10203
7ff9b8b22e7d [gaim-migrate @ 11324]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10112
diff changeset
2145 gaim_mkstemp(char **fpath, gboolean binary)
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2146 {
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2147 const gchar *tmpdir;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2148 #ifndef _WIN32
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2149 int fd;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2150 #endif
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2151 FILE *fp = NULL;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2152
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2153 g_return_val_if_fail(fpath != NULL, NULL);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2154
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2155 if((tmpdir = (gchar*)g_get_tmp_dir()) != NULL) {
9427
66b3f54527e6 [gaim-migrate @ 10245]
Luke Schierer <lschiere@pidgin.im>
parents: 9426
diff changeset
2156 if((*fpath = g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s", tmpdir, gaim_mkstemp_templ)) != NULL) {
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2157 #ifdef _WIN32
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2158 char* result = _mktemp( *fpath );
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2159 if( result == NULL )
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2160 gaim_debug(GAIM_DEBUG_ERROR, "gaim_mkstemp",
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2161 "Problem creating the template\n");
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2162 else
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2163 {
10589
0f7452b1f777 [gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10569
diff changeset
2164 if( (fp = g_fopen( result, binary?"wb+":"w+")) == NULL ) {
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2165 gaim_debug(GAIM_DEBUG_ERROR, "gaim_mkstemp",
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2166 "Couldn't fopen() %s\n", result);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2167 }
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2168 }
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2169 #else
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2170 if((fd = mkstemp(*fpath)) == -1) {
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2171 gaim_debug(GAIM_DEBUG_ERROR, "gaim_mkstemp",
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2172 "Couldn't make \"%s\", error: %d\n",
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2173 *fpath, errno);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2174 } else {
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2175 if((fp = fdopen(fd, "r+")) == NULL) {
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2176 close(fd);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2177 gaim_debug(GAIM_DEBUG_ERROR, "gaim_mkstemp",
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2178 "Couldn't fdopen(), error: %d\n", errno);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2179 }
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2180 }
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2181 #endif
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2182 if(!fp) {
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2183 g_free(*fpath);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2184 *fpath = NULL;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2185 }
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2186 }
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2187 } else {
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2188 gaim_debug(GAIM_DEBUG_ERROR, "gaim_mkstemp",
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2189 "g_get_tmp_dir() failed!");
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2190 }
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2191
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2192 return fp;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2193 }
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2194
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2195 gboolean
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2196 gaim_program_is_valid(const char *program)
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2197 {
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2198 GError *error = NULL;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2199 char **argv;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2200 gchar *progname;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2201 gboolean is_valid = FALSE;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2202
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2203 g_return_val_if_fail(program != NULL, FALSE);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2204 g_return_val_if_fail(*program != '\0', FALSE);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2205
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2206 if (!g_shell_parse_argv(program, NULL, &argv, &error)) {
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2207 gaim_debug(GAIM_DEBUG_ERROR, "program_is_valid",
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2208 "Could not parse program '%s': %s\n",
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2209 program, error->message);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2210 g_error_free(error);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2211 return FALSE;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2212 }
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2213
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2214 if (argv == NULL) {
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2215 return FALSE;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2216 }
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2217
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2218 progname = g_find_program_in_path(argv[0]);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2219 is_valid = (progname != NULL);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2220
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2221 g_strfreev(argv);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2222 g_free(progname);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2223
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2224 return is_valid;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2225 }
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2226
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2227 char *
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2228 gaim_fd_get_ip(int fd)
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2229 {
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2230 struct sockaddr addr;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2231 socklen_t namelen = sizeof(addr);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2232
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2233 g_return_val_if_fail(fd != 0, NULL);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2234
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2235 if (getsockname(fd, &addr, &namelen))
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2236 return NULL;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2237
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2238 return g_strdup(inet_ntoa(((struct sockaddr_in *)&addr)->sin_addr));
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2239 }
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2240
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2241
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2242 /**************************************************************************
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2243 * String Functions
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2244 **************************************************************************/
7162
d14e026611c0 [gaim-migrate @ 7729]
Nathan Walp <nwalp@pidgin.im>
parents: 7134
diff changeset
2245 const char *
7261
1930e3d00ecd [gaim-migrate @ 7838]
Nathan Walp <nwalp@pidgin.im>
parents: 7162
diff changeset
2246 gaim_normalize(const GaimAccount *account, const char *s)
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2247 {
7261
1930e3d00ecd [gaim-migrate @ 7838]
Nathan Walp <nwalp@pidgin.im>
parents: 7162
diff changeset
2248 GaimPlugin *prpl = NULL;
1930e3d00ecd [gaim-migrate @ 7838]
Nathan Walp <nwalp@pidgin.im>
parents: 7162
diff changeset
2249 GaimPluginProtocolInfo *prpl_info = NULL;
7430
783eea64614c [gaim-migrate @ 8034]
Nathan Walp <nwalp@pidgin.im>
parents: 7386
diff changeset
2250 const char *ret = NULL;
7261
1930e3d00ecd [gaim-migrate @ 7838]
Nathan Walp <nwalp@pidgin.im>
parents: 7162
diff changeset
2251
1930e3d00ecd [gaim-migrate @ 7838]
Nathan Walp <nwalp@pidgin.im>
parents: 7162
diff changeset
2252 if(account)
7956
1b8261f374ea [gaim-migrate @ 8631]
Nathan Walp <nwalp@pidgin.im>
parents: 7889
diff changeset
2253 prpl = gaim_find_prpl(gaim_account_get_protocol_id(account));
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2254
7261
1930e3d00ecd [gaim-migrate @ 7838]
Nathan Walp <nwalp@pidgin.im>
parents: 7162
diff changeset
2255 if(prpl)
1930e3d00ecd [gaim-migrate @ 7838]
Nathan Walp <nwalp@pidgin.im>
parents: 7162
diff changeset
2256 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl);
1930e3d00ecd [gaim-migrate @ 7838]
Nathan Walp <nwalp@pidgin.im>
parents: 7162
diff changeset
2257
7430
783eea64614c [gaim-migrate @ 8034]
Nathan Walp <nwalp@pidgin.im>
parents: 7386
diff changeset
2258 if(prpl_info && prpl_info->normalize)
783eea64614c [gaim-migrate @ 8034]
Nathan Walp <nwalp@pidgin.im>
parents: 7386
diff changeset
2259 ret = prpl_info->normalize(account, s);
783eea64614c [gaim-migrate @ 8034]
Nathan Walp <nwalp@pidgin.im>
parents: 7386
diff changeset
2260
783eea64614c [gaim-migrate @ 8034]
Nathan Walp <nwalp@pidgin.im>
parents: 7386
diff changeset
2261 if(!ret) {
7261
1930e3d00ecd [gaim-migrate @ 7838]
Nathan Walp <nwalp@pidgin.im>
parents: 7162
diff changeset
2262 static char buf[BUF_LEN];
1930e3d00ecd [gaim-migrate @ 7838]
Nathan Walp <nwalp@pidgin.im>
parents: 7162
diff changeset
2263 char *tmp;
1930e3d00ecd [gaim-migrate @ 7838]
Nathan Walp <nwalp@pidgin.im>
parents: 7162
diff changeset
2264 int i, j;
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2265
7261
1930e3d00ecd [gaim-migrate @ 7838]
Nathan Walp <nwalp@pidgin.im>
parents: 7162
diff changeset
2266 g_return_val_if_fail(s != NULL, NULL);
1930e3d00ecd [gaim-migrate @ 7838]
Nathan Walp <nwalp@pidgin.im>
parents: 7162
diff changeset
2267
1930e3d00ecd [gaim-migrate @ 7838]
Nathan Walp <nwalp@pidgin.im>
parents: 7162
diff changeset
2268 strncpy(buf, s, BUF_LEN);
1930e3d00ecd [gaim-migrate @ 7838]
Nathan Walp <nwalp@pidgin.im>
parents: 7162
diff changeset
2269 for (i=0, j=0; buf[j]; i++, j++) {
1930e3d00ecd [gaim-migrate @ 7838]
Nathan Walp <nwalp@pidgin.im>
parents: 7162
diff changeset
2270 while (buf[j] == ' ')
1930e3d00ecd [gaim-migrate @ 7838]
Nathan Walp <nwalp@pidgin.im>
parents: 7162
diff changeset
2271 j++;
1930e3d00ecd [gaim-migrate @ 7838]
Nathan Walp <nwalp@pidgin.im>
parents: 7162
diff changeset
2272 buf[i] = buf[j];
1930e3d00ecd [gaim-migrate @ 7838]
Nathan Walp <nwalp@pidgin.im>
parents: 7162
diff changeset
2273 }
1930e3d00ecd [gaim-migrate @ 7838]
Nathan Walp <nwalp@pidgin.im>
parents: 7162
diff changeset
2274 buf[i] = '\0';
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2275
7261
1930e3d00ecd [gaim-migrate @ 7838]
Nathan Walp <nwalp@pidgin.im>
parents: 7162
diff changeset
2276 tmp = g_utf8_strdown(buf, -1);
1930e3d00ecd [gaim-migrate @ 7838]
Nathan Walp <nwalp@pidgin.im>
parents: 7162
diff changeset
2277 g_snprintf(buf, sizeof(buf), "%s", tmp);
1930e3d00ecd [gaim-migrate @ 7838]
Nathan Walp <nwalp@pidgin.im>
parents: 7162
diff changeset
2278 g_free(tmp);
1930e3d00ecd [gaim-migrate @ 7838]
Nathan Walp <nwalp@pidgin.im>
parents: 7162
diff changeset
2279 tmp = g_utf8_normalize(buf, -1, G_NORMALIZE_DEFAULT);
1930e3d00ecd [gaim-migrate @ 7838]
Nathan Walp <nwalp@pidgin.im>
parents: 7162
diff changeset
2280 g_snprintf(buf, sizeof(buf), "%s", tmp);
1930e3d00ecd [gaim-migrate @ 7838]
Nathan Walp <nwalp@pidgin.im>
parents: 7162
diff changeset
2281 g_free(tmp);
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2282
7430
783eea64614c [gaim-migrate @ 8034]
Nathan Walp <nwalp@pidgin.im>
parents: 7386
diff changeset
2283 ret = buf;
7261
1930e3d00ecd [gaim-migrate @ 7838]
Nathan Walp <nwalp@pidgin.im>
parents: 7162
diff changeset
2284 }
7430
783eea64614c [gaim-migrate @ 8034]
Nathan Walp <nwalp@pidgin.im>
parents: 7386
diff changeset
2285 return ret;
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2286 }
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2287
8700
ddd2bf87fe8d [gaim-migrate @ 9453]
Mark Doliner <mark@kingant.net>
parents: 8686
diff changeset
2288 gchar *
ddd2bf87fe8d [gaim-migrate @ 9453]
Mark Doliner <mark@kingant.net>
parents: 8686
diff changeset
2289 gaim_str_sub_away_formatters(const char *str, const char *name)
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2290 {
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2291 char *c;
8700
ddd2bf87fe8d [gaim-migrate @ 9453]
Mark Doliner <mark@kingant.net>
parents: 8686
diff changeset
2292 gchar *cpy;
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2293 int cnt = 0;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2294 time_t t;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2295 struct tm *tme;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2296 char tmp[20];
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2297
8700
ddd2bf87fe8d [gaim-migrate @ 9453]
Mark Doliner <mark@kingant.net>
parents: 8686
diff changeset
2298 g_return_val_if_fail(str != NULL, NULL);
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2299 g_return_val_if_fail(name != NULL, NULL);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2300
8700
ddd2bf87fe8d [gaim-migrate @ 9453]
Mark Doliner <mark@kingant.net>
parents: 8686
diff changeset
2301 cpy = g_malloc(BUF_LONG);
ddd2bf87fe8d [gaim-migrate @ 9453]
Mark Doliner <mark@kingant.net>
parents: 8686
diff changeset
2302
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2303 t = time(NULL);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2304 tme = localtime(&t);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2305
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2306 cpy[0] = '\0';
8700
ddd2bf87fe8d [gaim-migrate @ 9453]
Mark Doliner <mark@kingant.net>
parents: 8686
diff changeset
2307 c = (char *)str;
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2308 while (*c) {
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2309 switch (*c) {
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2310 case '%':
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2311 if (*(c + 1)) {
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2312 switch (*(c + 1)) {
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2313 case 'n':
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2314 /* append name */
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2315 strcpy(cpy + cnt, name);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2316 cnt += strlen(name);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2317 c++;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2318 break;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2319 case 'd':
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2320 /* append date */
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2321 strftime(tmp, 20, "%m/%d/%Y", tme);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2322 strcpy(cpy + cnt, tmp);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2323 cnt += strlen(tmp);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2324 c++;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2325 break;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2326 case 't':
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2327 /* append time */
7459
825351e3b01b [gaim-migrate @ 8072]
Christian Hammond <chipx86@chipx86.com>
parents: 7430
diff changeset
2328 strftime(tmp, 20, "%I:%M:%S %p", tme);
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2329 strcpy(cpy + cnt, tmp);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2330 cnt += strlen(tmp);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2331 c++;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2332 break;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2333 default:
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2334 cpy[cnt++] = *c;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2335 }
10614
522b719ea774 [gaim-migrate @ 12074]
Mark Doliner <mark@kingant.net>
parents: 10593
diff changeset
2336 } else {
522b719ea774 [gaim-migrate @ 12074]
Mark Doliner <mark@kingant.net>
parents: 10593
diff changeset
2337 cpy[cnt++] = *c;
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2338 }
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2339 break;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2340 default:
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2341 cpy[cnt++] = *c;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2342 }
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2343 c++;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2344 }
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2345 cpy[cnt] = '\0';
8700
ddd2bf87fe8d [gaim-migrate @ 9453]
Mark Doliner <mark@kingant.net>
parents: 8686
diff changeset
2346
ddd2bf87fe8d [gaim-migrate @ 9453]
Mark Doliner <mark@kingant.net>
parents: 8686
diff changeset
2347 return cpy;
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2348 }
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2349
8341
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2350 gchar *
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2351 gaim_strdup_withhtml(const gchar *src)
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2352 {
8341
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2353 gulong destsize, i, j;
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2354 gchar *dest;
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2355
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2356 g_return_val_if_fail(src != NULL, NULL);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2357
8341
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2358 /* New length is (length of src) + (number of \n's * 3) + 1 */
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2359 for (i = 0, j = 0; src[i] != '\0'; i++)
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2360 if (src[i] == '\n')
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2361 j++;
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2362
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2363 destsize = i + (j * 3) + 1;
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2364 dest = g_malloc(destsize);
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2365
8341
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2366 /* Copy stuff, ignoring \r's, because they are dumb */
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2367 for (i = 0, j = 0; src[i] != '\0'; i++) {
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2368 if (src[i] == '\n') {
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2369 strcpy(&dest[j], "<BR>");
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2370 j += 4;
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2371 } else if (src[i] != '\r')
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2372 dest[j++] = src[i];
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2373 }
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2374
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2375 dest[destsize-1] = '\0';
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2376
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2377 return dest;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2378 }
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2379
7628
e293d0c42ccb [gaim-migrate @ 8252]
Ethan Blanton <elb@pidgin.im>
parents: 7622
diff changeset
2380 gboolean
e293d0c42ccb [gaim-migrate @ 8252]
Ethan Blanton <elb@pidgin.im>
parents: 7622
diff changeset
2381 gaim_str_has_prefix(const char *s, const char *p)
e293d0c42ccb [gaim-migrate @ 8252]
Ethan Blanton <elb@pidgin.im>
parents: 7622
diff changeset
2382 {
e293d0c42ccb [gaim-migrate @ 8252]
Ethan Blanton <elb@pidgin.im>
parents: 7622
diff changeset
2383 if (!strncmp(s, p, strlen(p)))
e293d0c42ccb [gaim-migrate @ 8252]
Ethan Blanton <elb@pidgin.im>
parents: 7622
diff changeset
2384 return TRUE;
e293d0c42ccb [gaim-migrate @ 8252]
Ethan Blanton <elb@pidgin.im>
parents: 7622
diff changeset
2385
e293d0c42ccb [gaim-migrate @ 8252]
Ethan Blanton <elb@pidgin.im>
parents: 7622
diff changeset
2386 return FALSE;
e293d0c42ccb [gaim-migrate @ 8252]
Ethan Blanton <elb@pidgin.im>
parents: 7622
diff changeset
2387 }
e293d0c42ccb [gaim-migrate @ 8252]
Ethan Blanton <elb@pidgin.im>
parents: 7622
diff changeset
2388
e293d0c42ccb [gaim-migrate @ 8252]
Ethan Blanton <elb@pidgin.im>
parents: 7622
diff changeset
2389 gboolean
e293d0c42ccb [gaim-migrate @ 8252]
Ethan Blanton <elb@pidgin.im>
parents: 7622
diff changeset
2390 gaim_str_has_suffix(const char *s, const char *x)
e293d0c42ccb [gaim-migrate @ 8252]
Ethan Blanton <elb@pidgin.im>
parents: 7622
diff changeset
2391 {
e293d0c42ccb [gaim-migrate @ 8252]
Ethan Blanton <elb@pidgin.im>
parents: 7622
diff changeset
2392 int off = strlen(s) - strlen(x);
e293d0c42ccb [gaim-migrate @ 8252]
Ethan Blanton <elb@pidgin.im>
parents: 7622
diff changeset
2393
e293d0c42ccb [gaim-migrate @ 8252]
Ethan Blanton <elb@pidgin.im>
parents: 7622
diff changeset
2394 if (off >= 0 && !strcmp(s + off, x))
e293d0c42ccb [gaim-migrate @ 8252]
Ethan Blanton <elb@pidgin.im>
parents: 7622
diff changeset
2395 return TRUE;
e293d0c42ccb [gaim-migrate @ 8252]
Ethan Blanton <elb@pidgin.im>
parents: 7622
diff changeset
2396
e293d0c42ccb [gaim-migrate @ 8252]
Ethan Blanton <elb@pidgin.im>
parents: 7622
diff changeset
2397 return FALSE;
e293d0c42ccb [gaim-migrate @ 8252]
Ethan Blanton <elb@pidgin.im>
parents: 7622
diff changeset
2398 }
e293d0c42ccb [gaim-migrate @ 8252]
Ethan Blanton <elb@pidgin.im>
parents: 7622
diff changeset
2399
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2400 char *
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2401 gaim_str_add_cr(const char *text)
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2402 {
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2403 char *ret = NULL;
7631
ea2d07ad05a9 [gaim-migrate @ 8255]
Nathan Walp <nwalp@pidgin.im>
parents: 7628
diff changeset
2404 int count = 0, j;
ea2d07ad05a9 [gaim-migrate @ 8255]
Nathan Walp <nwalp@pidgin.im>
parents: 7628
diff changeset
2405 guint i;
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2406
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2407 g_return_val_if_fail(text != NULL, NULL);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2408
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2409 if (text[0] == '\n')
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2410 count++;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2411 for (i = 1; i < strlen(text); i++)
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2412 if (text[i] == '\n' && text[i - 1] != '\r')
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2413 count++;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2414
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2415 if (count == 0)
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2416 return g_strdup(text);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2417
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2418 ret = g_malloc0(strlen(text) + count + 1);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2419
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2420 i = 0; j = 0;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2421 if (text[i] == '\n')
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2422 ret[j++] = '\r';
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2423 ret[j++] = text[i++];
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2424 for (; i < strlen(text); i++) {
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2425 if (text[i] == '\n' && text[i - 1] != '\r')
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2426 ret[j++] = '\r';
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2427 ret[j++] = text[i];
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2428 }
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2429
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2430 gaim_debug_misc("gaim_str_add_cr", "got: %s, leaving with %s\n",
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2431 text, ret);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2432
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2433 return ret;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2434 }
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2435
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2436 void
7478
3c21f3084ff0 [gaim-migrate @ 8091]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 7459
diff changeset
2437 gaim_str_strip_cr(char *text)
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2438 {
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2439 int i, j;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2440 char *text2;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2441
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2442 g_return_if_fail(text != NULL);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2443
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2444 text2 = g_malloc(strlen(text) + 1);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2445
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2446 for (i = 0, j = 0; text[i]; i++)
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2447 if (text[i] != '\r')
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2448 text2[j++] = text[i];
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2449 text2[j] = '\0';
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2450
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2451 strcpy(text, text2);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2452 g_free(text2);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2453 }
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2454
8341
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2455 gchar *
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2456 gaim_strreplace(const char *string, const char *delimiter,
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2457 const char *replacement)
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2458 {
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2459 gchar **split;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2460 gchar *ret;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2461
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2462 g_return_val_if_fail(string != NULL, NULL);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2463 g_return_val_if_fail(delimiter != NULL, NULL);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2464 g_return_val_if_fail(replacement != NULL, NULL);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2465
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2466 split = g_strsplit(string, delimiter, 0);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2467 ret = g_strjoinv(replacement, split);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2468 g_strfreev(split);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2469
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2470 return ret;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2471 }
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2472
8341
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2473 gchar *
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2474 gaim_strcasereplace(const char *string, const char *delimiter,
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2475 const char *replacement)
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2476 {
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2477 gchar *ret;
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2478 int length_del, length_rep, i, j;
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2479
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2480 g_return_val_if_fail(string != NULL, NULL);
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2481 g_return_val_if_fail(delimiter != NULL, NULL);
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2482 g_return_val_if_fail(replacement != NULL, NULL);
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2483
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2484 length_del = strlen(delimiter);
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2485 length_rep = strlen(replacement);
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2486
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2487 /* Count how many times the delimiter appears */
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2488 i = 0; /* position in the source string */
8735
92cbf9713795 [gaim-migrate @ 9490]
Christian Hammond <chipx86@chipx86.com>
parents: 8700
diff changeset
2489 j = 0; /* number of occurrences of "delimiter" */
8341
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2490 while (string[i] != '\0') {
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2491 if (!strncasecmp(&string[i], delimiter, length_del)) {
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2492 i += length_del;
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2493 j += length_rep;
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2494 } else {
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2495 i++;
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2496 j++;
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2497 }
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2498 }
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2499
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2500 ret = g_malloc(j+1);
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2501
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2502 i = 0; /* position in the source string */
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2503 j = 0; /* position in the destination string */
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2504 while (string[i] != '\0') {
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2505 if (!strncasecmp(&string[i], delimiter, length_del)) {
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2506 strncpy(&ret[j], replacement, length_rep);
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2507 i += length_del;
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2508 j += length_rep;
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2509 } else {
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2510 ret[j] = string[i];
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2511 i++;
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2512 j++;
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2513 }
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2514 }
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2515
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2516 ret[j] = '\0';
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2517
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2518 return ret;
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2519 }
fec4c1fb2ac8 [gaim-migrate @ 9065]
Mark Doliner <mark@kingant.net>
parents: 8163
diff changeset
2520
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2521 const char *
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2522 gaim_strcasestr(const char *haystack, const char *needle)
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2523 {
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2524 size_t hlen, nlen;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2525 const char *tmp, *ret;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2526
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2527 g_return_val_if_fail(haystack != NULL, NULL);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2528 g_return_val_if_fail(needle != NULL, NULL);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2529
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2530 hlen = strlen(haystack);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2531 nlen = strlen(needle);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2532 tmp = haystack,
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2533 ret = NULL;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2534
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2535 g_return_val_if_fail(hlen > 0, NULL);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2536 g_return_val_if_fail(nlen > 0, NULL);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2537
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2538 while (*tmp && !ret) {
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2539 if (!g_ascii_strncasecmp(needle, tmp, nlen))
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2540 ret = tmp;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2541 else
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2542 tmp++;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2543 }
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2544
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2545 return ret;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2546 }
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2547
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2548 char *
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2549 gaim_str_size_to_units(size_t size)
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2550 {
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2551 static const char *size_str[4] = { "bytes", "KB", "MB", "GB" };
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2552 float size_mag;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2553 int size_index = 0;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2554
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2555 if (size == -1) {
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2556 return g_strdup(_("Calculating..."));
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2557 }
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2558 else if (size == 0) {
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2559 return g_strdup(_("Unknown."));
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2560 }
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2561 else {
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2562 size_mag = (float)size;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2563
10569
12349012610b [gaim-migrate @ 11957]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10506
diff changeset
2564 while ((size_index < 3) && (size_mag > 1024)) {
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2565 size_mag /= 1024;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2566 size_index++;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2567 }
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2568
10103
a9521c791afe [gaim-migrate @ 11130]
Luke Schierer <lschiere@pidgin.im>
parents: 9940
diff changeset
2569 if (size_index == 0) {
10112
1a91e814e9d8 [gaim-migrate @ 11145]
Nathan Walp <nwalp@pidgin.im>
parents: 10103
diff changeset
2570 return g_strdup_printf("%zd %s", size, size_str[size_index]);
10103
a9521c791afe [gaim-migrate @ 11130]
Luke Schierer <lschiere@pidgin.im>
parents: 9940
diff changeset
2571 } else {
a9521c791afe [gaim-migrate @ 11130]
Luke Schierer <lschiere@pidgin.im>
parents: 9940
diff changeset
2572 return g_strdup_printf("%.2f %s", size_mag, size_str[size_index]);
a9521c791afe [gaim-migrate @ 11130]
Luke Schierer <lschiere@pidgin.im>
parents: 9940
diff changeset
2573 }
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2574 }
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2575 }
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2576
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2577 char *
9233
0c352d0e4ddc [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2578 gaim_str_seconds_to_string(guint secs)
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2579 {
9233
0c352d0e4ddc [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2580 GString *gstr;
0c352d0e4ddc [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2581 const char *prefix = "";
0c352d0e4ddc [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2582 guint days, hrs, mins;
0c352d0e4ddc [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2583
9424
79c4acbac4cd [gaim-migrate @ 10242]
Luke Schierer <lschiere@pidgin.im>
parents: 9341
diff changeset
2584 gstr = g_string_new("");
79c4acbac4cd [gaim-migrate @ 10242]
Luke Schierer <lschiere@pidgin.im>
parents: 9341
diff changeset
2585
79c4acbac4cd [gaim-migrate @ 10242]
Luke Schierer <lschiere@pidgin.im>
parents: 9341
diff changeset
2586 if (secs < 60)
79c4acbac4cd [gaim-migrate @ 10242]
Luke Schierer <lschiere@pidgin.im>
parents: 9341
diff changeset
2587 {
79c4acbac4cd [gaim-migrate @ 10242]
Luke Schierer <lschiere@pidgin.im>
parents: 9341
diff changeset
2588 g_string_append_printf(gstr, "%d %s", secs,
79c4acbac4cd [gaim-migrate @ 10242]
Luke Schierer <lschiere@pidgin.im>
parents: 9341
diff changeset
2589 ngettext("second", "seconds", secs));
79c4acbac4cd [gaim-migrate @ 10242]
Luke Schierer <lschiere@pidgin.im>
parents: 9341
diff changeset
2590 return g_string_free(gstr, FALSE);
79c4acbac4cd [gaim-migrate @ 10242]
Luke Schierer <lschiere@pidgin.im>
parents: 9341
diff changeset
2591 }
79c4acbac4cd [gaim-migrate @ 10242]
Luke Schierer <lschiere@pidgin.im>
parents: 9341
diff changeset
2592
9233
0c352d0e4ddc [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2593 days = secs / (60 * 60 * 24);
0c352d0e4ddc [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2594 secs = secs % (60 * 60 * 24);
0c352d0e4ddc [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2595 hrs = secs / (60 * 60);
0c352d0e4ddc [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2596 secs = secs % (60 * 60);
0c352d0e4ddc [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2597 mins = secs / 60;
0c352d0e4ddc [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2598 secs = secs % 60;
0c352d0e4ddc [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2599
0c352d0e4ddc [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2600 if (days > 0)
0c352d0e4ddc [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2601 {
0c352d0e4ddc [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2602 g_string_append_printf(gstr, "%d %s", days,
0c352d0e4ddc [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2603 ngettext("day", "days", days));
0c352d0e4ddc [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2604
0c352d0e4ddc [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2605 prefix = ", ";
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2606 }
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2607
9233
0c352d0e4ddc [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2608 if (hrs > 0)
0c352d0e4ddc [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2609 {
0c352d0e4ddc [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2610 g_string_append_printf(gstr, "%s%d %s", prefix, hrs,
0c352d0e4ddc [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2611 ngettext("hour", "hours", hrs));
0c352d0e4ddc [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2612
0c352d0e4ddc [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2613 prefix = ", ";
0c352d0e4ddc [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2614 }
0c352d0e4ddc [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2615
0c352d0e4ddc [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2616 if (mins > 0)
0c352d0e4ddc [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2617 {
0c352d0e4ddc [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2618 g_string_append_printf(gstr, "%s%d %s", prefix, mins,
0c352d0e4ddc [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2619 ngettext("minute", "minutes", mins));
0c352d0e4ddc [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2620 }
0c352d0e4ddc [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2621
0c352d0e4ddc [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2622 return g_string_free(gstr, FALSE);
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2623 }
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2624
9277
185fbd8b5998 [gaim-migrate @ 10080]
Tim Ringenbach <marv@pidgin.im>
parents: 9273
diff changeset
2625
185fbd8b5998 [gaim-migrate @ 10080]
Tim Ringenbach <marv@pidgin.im>
parents: 9273
diff changeset
2626 char *
185fbd8b5998 [gaim-migrate @ 10080]
Tim Ringenbach <marv@pidgin.im>
parents: 9273
diff changeset
2627 gaim_str_binary_to_ascii(const unsigned char *binary, guint len)
185fbd8b5998 [gaim-migrate @ 10080]
Tim Ringenbach <marv@pidgin.im>
parents: 9273
diff changeset
2628 {
185fbd8b5998 [gaim-migrate @ 10080]
Tim Ringenbach <marv@pidgin.im>
parents: 9273
diff changeset
2629 GString *ret;
185fbd8b5998 [gaim-migrate @ 10080]
Tim Ringenbach <marv@pidgin.im>
parents: 9273
diff changeset
2630 guint i;
185fbd8b5998 [gaim-migrate @ 10080]
Tim Ringenbach <marv@pidgin.im>
parents: 9273
diff changeset
2631
185fbd8b5998 [gaim-migrate @ 10080]
Tim Ringenbach <marv@pidgin.im>
parents: 9273
diff changeset
2632 g_return_val_if_fail(len > 0, NULL);
185fbd8b5998 [gaim-migrate @ 10080]
Tim Ringenbach <marv@pidgin.im>
parents: 9273
diff changeset
2633
185fbd8b5998 [gaim-migrate @ 10080]
Tim Ringenbach <marv@pidgin.im>
parents: 9273
diff changeset
2634 ret = g_string_sized_new(len);
185fbd8b5998 [gaim-migrate @ 10080]
Tim Ringenbach <marv@pidgin.im>
parents: 9273
diff changeset
2635
185fbd8b5998 [gaim-migrate @ 10080]
Tim Ringenbach <marv@pidgin.im>
parents: 9273
diff changeset
2636 for (i = 0; i < len; i++)
185fbd8b5998 [gaim-migrate @ 10080]
Tim Ringenbach <marv@pidgin.im>
parents: 9273
diff changeset
2637 if (binary[i] < 32 || binary[i] > 126)
185fbd8b5998 [gaim-migrate @ 10080]
Tim Ringenbach <marv@pidgin.im>
parents: 9273
diff changeset
2638 g_string_append_printf(ret, "\\x%02hhx", binary[i]);
185fbd8b5998 [gaim-migrate @ 10080]
Tim Ringenbach <marv@pidgin.im>
parents: 9273
diff changeset
2639 else if (binary[i] == '\\')
185fbd8b5998 [gaim-migrate @ 10080]
Tim Ringenbach <marv@pidgin.im>
parents: 9273
diff changeset
2640 g_string_append(ret, "\\\\");
185fbd8b5998 [gaim-migrate @ 10080]
Tim Ringenbach <marv@pidgin.im>
parents: 9273
diff changeset
2641 else
185fbd8b5998 [gaim-migrate @ 10080]
Tim Ringenbach <marv@pidgin.im>
parents: 9273
diff changeset
2642 g_string_append_c(ret, binary[i]);
185fbd8b5998 [gaim-migrate @ 10080]
Tim Ringenbach <marv@pidgin.im>
parents: 9273
diff changeset
2643
185fbd8b5998 [gaim-migrate @ 10080]
Tim Ringenbach <marv@pidgin.im>
parents: 9273
diff changeset
2644 return g_string_free(ret, FALSE);
185fbd8b5998 [gaim-migrate @ 10080]
Tim Ringenbach <marv@pidgin.im>
parents: 9273
diff changeset
2645 }
185fbd8b5998 [gaim-migrate @ 10080]
Tim Ringenbach <marv@pidgin.im>
parents: 9273
diff changeset
2646
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2647 /**************************************************************************
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2648 * URI/URL Functions
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2649 **************************************************************************/
7095
c8bf2da398e3 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
2650 gboolean
7094
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2651 gaim_url_parse(const char *url, char **ret_host, int *ret_port,
9227
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9222
diff changeset
2652 char **ret_path, char **ret_user, char **ret_passwd)
7094
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2653 {
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2654 char scan_info[255];
8118
52089b055c12 [gaim-migrate @ 8822]
Luke Schierer <lschiere@pidgin.im>
parents: 8088
diff changeset
2655 char port_str[6];
7094
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2656 int f;
9341
cf5b5b63228d [gaim-migrate @ 10149]
Tim Ringenbach <marv@pidgin.im>
parents: 9311
diff changeset
2657 const char *at, *slash;
7094
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2658 const char *turl;
9227
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9222
diff changeset
2659 char host[256], path[256], user[256], passwd[256];
7094
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2660 int port = 0;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2661 /* hyphen at end includes it in control set */
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2662 static char addr_ctrl[] = "A-Za-z0-9.-";
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2663 static char port_ctrl[] = "0-9";
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2664 static char page_ctrl[] = "A-Za-z0-9.~_/:*!@&%%?=+^-";
9227
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9222
diff changeset
2665 static char user_ctrl[] = "A-Za-z0-9.~_/*!&%%?=+^-";
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9222
diff changeset
2666 static char passwd_ctrl[] = "A-Za-z0-9.~_/*!&%%?=+^-";
7094
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2667
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2668 g_return_val_if_fail(url != NULL, FALSE);
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2669
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2670 if ((turl = strstr(url, "http://")) != NULL ||
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2671 (turl = strstr(url, "HTTP://")) != NULL)
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2672 {
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2673 turl += 7;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2674 url = turl;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2675 }
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2676
9227
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9222
diff changeset
2677 /* parse out authentication information if supplied */
9341
cf5b5b63228d [gaim-migrate @ 10149]
Tim Ringenbach <marv@pidgin.im>
parents: 9311
diff changeset
2678 /* Only care about @ char BEFORE the first / */
cf5b5b63228d [gaim-migrate @ 10149]
Tim Ringenbach <marv@pidgin.im>
parents: 9311
diff changeset
2679 at = strchr(url, '@');
cf5b5b63228d [gaim-migrate @ 10149]
Tim Ringenbach <marv@pidgin.im>
parents: 9311
diff changeset
2680 slash = strchr(url, '/');
cf5b5b63228d [gaim-migrate @ 10149]
Tim Ringenbach <marv@pidgin.im>
parents: 9311
diff changeset
2681 if ((at != NULL) &&
cf5b5b63228d [gaim-migrate @ 10149]
Tim Ringenbach <marv@pidgin.im>
parents: 9311
diff changeset
2682 (((slash != NULL) && (strlen(at) > strlen(slash))) ||
cf5b5b63228d [gaim-migrate @ 10149]
Tim Ringenbach <marv@pidgin.im>
parents: 9311
diff changeset
2683 (slash == NULL))) {
9227
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9222
diff changeset
2684 g_snprintf(scan_info, sizeof(scan_info),
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9222
diff changeset
2685 "%%255[%s]:%%255[%s]^@", user_ctrl, passwd_ctrl);
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9222
diff changeset
2686 f = sscanf(url, scan_info, user, passwd);
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9222
diff changeset
2687
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9222
diff changeset
2688 if (f ==1 ) {
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9222
diff changeset
2689 /* No passwd, possibly just username supplied */
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9222
diff changeset
2690 g_snprintf(scan_info, sizeof(scan_info),
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9222
diff changeset
2691 "%%255[%s]^@", user_ctrl);
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9222
diff changeset
2692 f = sscanf(url, scan_info, user);
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9222
diff changeset
2693 *passwd = '\0';
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9222
diff changeset
2694 }
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9222
diff changeset
2695
9230
b83905afbb55 [gaim-migrate @ 10026]
Nathan Walp <nwalp@pidgin.im>
parents: 9227
diff changeset
2696 url = at+1; /* move pointer after the @ char */
9227
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9222
diff changeset
2697 } else {
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9222
diff changeset
2698 *user = '\0';
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9222
diff changeset
2699 *passwd = '\0';
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9222
diff changeset
2700 }
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9222
diff changeset
2701
7094
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2702 g_snprintf(scan_info, sizeof(scan_info),
8118
52089b055c12 [gaim-migrate @ 8822]
Luke Schierer <lschiere@pidgin.im>
parents: 8088
diff changeset
2703 "%%255[%s]:%%5[%s]/%%255[%s]", addr_ctrl, port_ctrl, page_ctrl);
7094
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2704
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2705 f = sscanf(url, scan_info, host, port_str, path);
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2706
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2707 if (f == 1)
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2708 {
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2709 g_snprintf(scan_info, sizeof(scan_info),
8118
52089b055c12 [gaim-migrate @ 8822]
Luke Schierer <lschiere@pidgin.im>
parents: 8088
diff changeset
2710 "%%255[%s]/%%255[%s]",
7094
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2711 addr_ctrl, page_ctrl);
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2712 f = sscanf(url, scan_info, host, path);
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2713 g_snprintf(port_str, sizeof(port_str), "80");
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2714 }
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2715
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2716 if (f == 1)
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2717 *path = '\0';
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2718
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2719 sscanf(port_str, "%d", &port);
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2720
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2721 if (ret_host != NULL) *ret_host = g_strdup(host);
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2722 if (ret_port != NULL) *ret_port = port;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2723 if (ret_path != NULL) *ret_path = g_strdup(path);
9227
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9222
diff changeset
2724 if (ret_user != NULL) *ret_user = g_strdup(user);
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9222
diff changeset
2725 if (ret_passwd != NULL) *ret_passwd = g_strdup(passwd);
7094
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2726
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2727 return TRUE;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2728 }
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2729
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2730 static void
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2731 destroy_fetch_url_data(GaimFetchUrlData *gfud)
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2732 {
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2733 if (gfud->webdata != NULL) g_free(gfud->webdata);
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2734 if (gfud->url != NULL) g_free(gfud->url);
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2735 if (gfud->user_agent != NULL) g_free(gfud->user_agent);
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2736 if (gfud->website.address != NULL) g_free(gfud->website.address);
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2737 if (gfud->website.page != NULL) g_free(gfud->website.page);
9227
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9222
diff changeset
2738 if (gfud->website.user != NULL) g_free(gfud->website.user);
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9222
diff changeset
2739 if (gfud->website.passwd != NULL) g_free(gfud->website.passwd);
7094
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2740
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2741 g_free(gfud);
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2742 }
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2743
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2744 static gboolean
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2745 parse_redirect(const char *data, size_t data_len, gint sock,
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2746 GaimFetchUrlData *gfud)
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2747 {
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2748 gchar *s;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2749
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2750 if ((s = g_strstr_len(data, data_len, "Location: ")) != NULL)
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2751 {
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2752 gchar *new_url, *temp_url, *end;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2753 gboolean full;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2754 int len;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2755
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2756 s += strlen("Location: ");
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2757 end = strchr(s, '\r');
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2758
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2759 /* Just in case :) */
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2760 if (end == NULL)
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2761 end = strchr(s, '\n');
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2762
10623
14c32196fcfd [gaim-migrate @ 12094]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10614
diff changeset
2763 if (end == NULL)
14c32196fcfd [gaim-migrate @ 12094]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10614
diff changeset
2764 return FALSE;
14c32196fcfd [gaim-migrate @ 12094]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10614
diff changeset
2765
7094
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2766 len = end - s;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2767
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2768 new_url = g_malloc(len + 1);
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2769 strncpy(new_url, s, len);
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2770 new_url[len] = '\0';
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2771
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2772 full = gfud->full;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2773
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2774 if (*new_url == '/' || g_strstr_len(new_url, len, "://") == NULL)
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2775 {
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2776 temp_url = new_url;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2777
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2778 new_url = g_strdup_printf("%s:%d%s", gfud->website.address,
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2779 gfud->website.port, temp_url);
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2780
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2781 g_free(temp_url);
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2782
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2783 full = FALSE;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2784 }
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2785
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2786 /* Close the existing stuff. */
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2787 gaim_input_remove(gfud->inpa);
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2788 close(sock);
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2789
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2790 gaim_debug_info("gaim_url_fetch", "Redirecting to %s\n", new_url);
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2791
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2792 /* Try again, with this new location. */
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2793 gaim_url_fetch(new_url, full, gfud->user_agent, gfud->http11,
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2794 gfud->callback, gfud->user_data);
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2795
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2796 /* Free up. */
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2797 g_free(new_url);
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2798 destroy_fetch_url_data(gfud);
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2799
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2800 return TRUE;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2801 }
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2802
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2803 return FALSE;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2804 }
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2805
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2806 static size_t
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2807 parse_content_len(const char *data, size_t data_len)
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2808 {
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2809 size_t content_len = 0;
9240
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2810 const char *p = NULL;
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2811
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2812 /* This is still technically wrong, since headers are case-insensitive
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2813 * [RFC 2616, section 4.2], though this ought to catch the normal case.
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2814 * Note: data is _not_ nul-terminated.
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2815 */
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2816 if (data_len > 16) {
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2817 p = strncmp(data, "Content-Length: ", 16) == 0? data: NULL;
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2818 if (!p) {
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2819 p = g_strstr_len(data, data_len, "\nContent-Length: ");
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2820 if (p)
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2821 p += 1;
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2822 }
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2823 }
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2824
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2825 /* If we can find a Content-Length header at all, try to sscanf it.
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2826 * Response headers should end with at least \r\n, so sscanf is safe,
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2827 * if we make sure that there is indeed a \n in our header.
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2828 */
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2829 if (p && g_strstr_len(p, data_len - (p - data), "\n")) {
10112
1a91e814e9d8 [gaim-migrate @ 11145]
Nathan Walp <nwalp@pidgin.im>
parents: 10103
diff changeset
2830 sscanf(p, "Content-Length: %zu", &content_len);
9818
5206fb21e358 [gaim-migrate @ 10689]
Mark Doliner <mark@kingant.net>
parents: 9804
diff changeset
2831 gaim_debug_misc("parse_content_len", "parsed %u\n", content_len);
9240
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2832 }
7094
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2833
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2834 return content_len;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2835 }
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2836
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2837 static void
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2838 url_fetched_cb(gpointer url_data, gint sock, GaimInputCondition cond)
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2839 {
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2840 GaimFetchUrlData *gfud = url_data;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2841 char data;
9240
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2842 gboolean got_eof = FALSE;
7094
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2843
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2844 if (sock == -1)
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2845 {
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2846 gfud->callback(gfud->user_data, NULL, 0);
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2847
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2848 destroy_fetch_url_data(gfud);
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2849
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2850 return;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2851 }
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2852
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2853 if (!gfud->sentreq)
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2854 {
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2855 char buf[1024];
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2856
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2857 if (gfud->user_agent)
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2858 {
9240
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2859 /* Host header is not forbidden in HTTP/1.0 requests, and HTTP/1.1
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2860 * clients must know how to handle the "chunked" transfer encoding.
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2861 * Gaim doesn't know how to handle "chunked", so should always send
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2862 * the Host header regardless, to get around some observed problems
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2863 */
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2864 g_snprintf(buf, sizeof(buf),
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2865 "GET %s%s HTTP/%s\r\n"
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2866 "User-Agent: %s\r\n"
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2867 "Host: %s\r\n\r\n",
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2868 (gfud->full ? "" : "/"),
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2869 (gfud->full ? gfud->url : gfud->website.page),
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2870 (gfud->http11 ? "1.1" : "1.0"),
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2871 gfud->user_agent, gfud->website.address);
7094
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2872 }
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2873 else
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2874 {
9240
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2875 g_snprintf(buf, sizeof(buf),
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2876 "GET %s%s HTTP/%s\r\n"
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2877 "Host: %s\r\n\r\n",
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2878 (gfud->full ? "" : "/"),
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2879 (gfud->full ? gfud->url : gfud->website.page),
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2880 (gfud->http11 ? "1.1" : "1.0"),
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2881 gfud->website.address);
7094
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2882 }
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2883
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2884 gaim_debug_misc("gaim_url_fetch", "Request: %s\n", buf);
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2885
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2886 write(sock, buf, strlen(buf));
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2887 fcntl(sock, F_SETFL, O_NONBLOCK);
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2888 gfud->sentreq = TRUE;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2889 gfud->inpa = gaim_input_add(sock, GAIM_INPUT_READ,
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2890 url_fetched_cb, url_data);
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2891 gfud->data_len = 4096;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2892 gfud->webdata = g_malloc(gfud->data_len);
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2893
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2894 return;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2895 }
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2896
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2897 if (read(sock, &data, 1) > 0 || errno == EWOULDBLOCK)
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2898 {
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2899 if (errno == EWOULDBLOCK)
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2900 {
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2901 errno = 0;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2902
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2903 return;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2904 }
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2905
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2906 gfud->len++;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2907
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2908 if (gfud->len == gfud->data_len + 1)
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2909 {
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2910 gfud->data_len += (gfud->data_len) / 2;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2911
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2912 gfud->webdata = g_realloc(gfud->webdata, gfud->data_len);
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2913 }
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2914
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2915 gfud->webdata[gfud->len - 1] = data;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2916
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2917 if (!gfud->startsaving)
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2918 {
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2919 if (data == '\r')
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2920 return;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2921
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2922 if (data == '\n')
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2923 {
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2924 if (gfud->newline)
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2925 {
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2926 size_t content_len;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2927 gfud->startsaving = TRUE;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2928
9240
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2929 gaim_debug_misc("gaim_url_fetch", "Response headers: '%*.*s'\n", gfud->len, gfud->len, gfud->webdata);
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2930
7094
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2931 /* See if we can find a redirect. */
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2932 if (parse_redirect(gfud->webdata, gfud->len, sock, gfud))
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2933 return;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2934
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2935 /* No redirect. See if we can find a content length. */
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2936 content_len = parse_content_len(gfud->webdata, gfud->len);
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2937
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2938 if (content_len == 0)
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2939 {
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2940 /* We'll stick with an initial 8192 */
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2941 content_len = 8192;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2942 }
9240
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2943 else
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2944 {
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2945 gfud->has_explicit_data_len = TRUE;
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2946 }
7094
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2947
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2948 /* Out with the old... */
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2949 gfud->len = 0;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2950 g_free(gfud->webdata);
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2951 gfud->webdata = NULL;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2952
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2953 /* In with the new. */
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2954 gfud->data_len = content_len;
9818
5206fb21e358 [gaim-migrate @ 10689]
Mark Doliner <mark@kingant.net>
parents: 9804
diff changeset
2955 gfud->webdata = g_try_malloc(gfud->data_len);
5206fb21e358 [gaim-migrate @ 10689]
Mark Doliner <mark@kingant.net>
parents: 9804
diff changeset
2956 if (gfud->webdata == NULL) {
5206fb21e358 [gaim-migrate @ 10689]
Mark Doliner <mark@kingant.net>
parents: 9804
diff changeset
2957 gaim_debug_error("gaim_url_fetch", "Failed to allocate %u bytes: %s\n", gfud->data_len, strerror(errno));
5206fb21e358 [gaim-migrate @ 10689]
Mark Doliner <mark@kingant.net>
parents: 9804
diff changeset
2958 gaim_input_remove(gfud->inpa);
5206fb21e358 [gaim-migrate @ 10689]
Mark Doliner <mark@kingant.net>
parents: 9804
diff changeset
2959 close(sock);
5206fb21e358 [gaim-migrate @ 10689]
Mark Doliner <mark@kingant.net>
parents: 9804
diff changeset
2960 gfud->callback(gfud->user_data, NULL, 0);
5206fb21e358 [gaim-migrate @ 10689]
Mark Doliner <mark@kingant.net>
parents: 9804
diff changeset
2961 destroy_fetch_url_data(gfud);
5206fb21e358 [gaim-migrate @ 10689]
Mark Doliner <mark@kingant.net>
parents: 9804
diff changeset
2962 }
7094
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2963 }
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2964 else
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2965 gfud->newline = TRUE;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2966
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2967 return;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2968 }
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2969
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2970 gfud->newline = FALSE;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2971 }
9240
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2972 else if (gfud->has_explicit_data_len && gfud->len == gfud->data_len)
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2973 {
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2974 got_eof = TRUE;
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2975 }
7094
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2976 }
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2977 else if (errno != ETIMEDOUT)
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2978 {
9240
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2979 got_eof = TRUE;
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2980 }
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2981 else
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2982 {
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2983 gaim_input_remove(gfud->inpa);
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2984 close(sock);
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2985
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2986 gfud->callback(gfud->user_data, NULL, 0);
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2987
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2988 destroy_fetch_url_data(gfud);
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2989 }
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2990
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
2991 if (got_eof) {
7094
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2992 gfud->webdata = g_realloc(gfud->webdata, gfud->len + 1);
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2993 gfud->webdata[gfud->len] = 0;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2994
9311
c5fdff22b252 [gaim-migrate @ 10119]
Tim Ringenbach <marv@pidgin.im>
parents: 9277
diff changeset
2995 /* gaim_debug_misc("gaim_url_fetch", "Received: '%s'\n", gfud->webdata); */
7094
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2996
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2997 gaim_input_remove(gfud->inpa);
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2998 close(sock);
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2999 gfud->callback(gfud->user_data, gfud->webdata, gfud->len);
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3000
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3001 destroy_fetch_url_data(gfud);
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3002 }
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3003 }
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3004
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3005 void
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3006 gaim_url_fetch(const char *url, gboolean full,
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3007 const char *user_agent, gboolean http11,
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3008 void (*cb)(gpointer, const char *, size_t),
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3009 void *user_data)
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3010 {
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3011 int sock;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3012 GaimFetchUrlData *gfud;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3013
9257
15d516d07d57 [gaim-migrate @ 10056]
Tim Ringenbach <marv@pidgin.im>
parents: 9241
diff changeset
3014 g_return_if_fail(url != NULL);
15d516d07d57 [gaim-migrate @ 10056]
Tim Ringenbach <marv@pidgin.im>
parents: 9241
diff changeset
3015 g_return_if_fail(cb != NULL);
9311
c5fdff22b252 [gaim-migrate @ 10119]
Tim Ringenbach <marv@pidgin.im>
parents: 9277
diff changeset
3016
9240
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
3017 gaim_debug_info("gaim_url_fetch",
f1d87ab17e41 [gaim-migrate @ 10039]
Tim Ringenbach <marv@pidgin.im>
parents: 9233
diff changeset
3018 "requested to fetch (%s), full=%d, user_agent=(%s), http11=%d\n",
9257
15d516d07d57 [gaim-migrate @ 10056]
Tim Ringenbach <marv@pidgin.im>
parents: 9241
diff changeset
3019 url, full, user_agent?user_agent:"(null)", http11);
7094
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3020
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3021 gfud = g_new0(GaimFetchUrlData, 1);
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3022
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3023 gfud->callback = cb;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3024 gfud->user_data = user_data;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3025 gfud->url = g_strdup(url);
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3026 gfud->user_agent = (user_agent != NULL ? g_strdup(user_agent) : NULL);
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3027 gfud->http11 = http11;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3028 gfud->full = full;
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3029
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3030 gaim_url_parse(url, &gfud->website.address, &gfud->website.port,
9227
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9222
diff changeset
3031 &gfud->website.page, &gfud->website.user, &gfud->website.passwd);
7094
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3032
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3033 if ((sock = gaim_proxy_connect(NULL, gfud->website.address,
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3034 gfud->website.port, url_fetched_cb,
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3035 gfud)) < 0)
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3036 {
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3037 destroy_fetch_url_data(gfud);
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3038
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3039 cb(user_data, g_strdup(_("g003: Error opening connection.\n")), 0);
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3040 }
2343c3aa1dec [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3041 }
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3042
7162
d14e026611c0 [gaim-migrate @ 7729]
Nathan Walp <nwalp@pidgin.im>
parents: 7134
diff changeset
3043 const char *
7134
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3044 gaim_url_decode(const char *str)
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3045 {
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3046 static char buf[BUF_LEN];
7631
ea2d07ad05a9 [gaim-migrate @ 8255]
Nathan Walp <nwalp@pidgin.im>
parents: 7628
diff changeset
3047 guint i, j = 0;
7134
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3048 char *bum;
9804
fe268cb602cb [gaim-migrate @ 10672]
Mark Doliner <mark@kingant.net>
parents: 9786
diff changeset
3049 char hex[3];
7134
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3050
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3051 g_return_val_if_fail(str != NULL, NULL);
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3052
9804
fe268cb602cb [gaim-migrate @ 10672]
Mark Doliner <mark@kingant.net>
parents: 9786
diff changeset
3053 /*
fe268cb602cb [gaim-migrate @ 10672]
Mark Doliner <mark@kingant.net>
parents: 9786
diff changeset
3054 * XXX - This check could be removed and buf could be made
fe268cb602cb [gaim-migrate @ 10672]
Mark Doliner <mark@kingant.net>
parents: 9786
diff changeset
3055 * dynamically allocated, but this is easier.
fe268cb602cb [gaim-migrate @ 10672]
Mark Doliner <mark@kingant.net>
parents: 9786
diff changeset
3056 */
fe268cb602cb [gaim-migrate @ 10672]
Mark Doliner <mark@kingant.net>
parents: 9786
diff changeset
3057 if (strlen(str) >= BUF_LEN)
fe268cb602cb [gaim-migrate @ 10672]
Mark Doliner <mark@kingant.net>
parents: 9786
diff changeset
3058 return NULL;
fe268cb602cb [gaim-migrate @ 10672]
Mark Doliner <mark@kingant.net>
parents: 9786
diff changeset
3059
7134
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3060 for (i = 0; i < strlen(str); i++) {
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3061
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3062 if (str[i] != '%')
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3063 buf[j++] = str[i];
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3064 else {
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3065 strncpy(hex, str + ++i, 2);
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3066 hex[2] = '\0';
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3067
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3068 /* i is pointing to the start of the number */
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3069 i++;
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3070
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3071 /*
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3072 * Now it's at the end and at the start of the for loop
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3073 * will be at the next character.
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3074 */
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3075 buf[j++] = strtol(hex, NULL, 16);
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3076 }
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3077 }
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3078
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3079 buf[j] = '\0';
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3080
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3081 if (!g_utf8_validate(buf, -1, (const char **)&bum))
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3082 *bum = '\0';
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3083
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3084 return buf;
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3085 }
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3086
7162
d14e026611c0 [gaim-migrate @ 7729]
Nathan Walp <nwalp@pidgin.im>
parents: 7134
diff changeset
3087 const char *
7134
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3088 gaim_url_encode(const char *str)
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3089 {
10700
9505695acff8 [gaim-migrate @ 12273]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10636
diff changeset
3090 const char *iter;
7134
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3091 static char buf[BUF_LEN];
10700
9505695acff8 [gaim-migrate @ 12273]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10636
diff changeset
3092 char utf_char[6];
7631
ea2d07ad05a9 [gaim-migrate @ 8255]
Nathan Walp <nwalp@pidgin.im>
parents: 7628
diff changeset
3093 guint i, j = 0;
7134
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3094
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3095 g_return_val_if_fail(str != NULL, NULL);
10700
9505695acff8 [gaim-migrate @ 12273]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10636
diff changeset
3096 g_return_val_if_fail(g_utf8_validate(str, -1, NULL), NULL);
9505695acff8 [gaim-migrate @ 12273]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10636
diff changeset
3097
9505695acff8 [gaim-migrate @ 12273]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10636
diff changeset
3098 iter = str;
9505695acff8 [gaim-migrate @ 12273]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10636
diff changeset
3099 for (; *iter && j < (BUF_LEN - 1) ; iter = g_utf8_next_char(iter)) {
9505695acff8 [gaim-migrate @ 12273]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10636
diff changeset
3100 gunichar c = g_utf8_get_char(iter);
10800
8002e95c0809 [gaim-migrate @ 12446]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10732
diff changeset
3101 /* If the character is an ASCII character and is alphanumeric
8002e95c0809 [gaim-migrate @ 12446]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10732
diff changeset
3102 * no need to escape */
8002e95c0809 [gaim-migrate @ 12446]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10732
diff changeset
3103 if (c < 128 && isalnum(c)) {
10700
9505695acff8 [gaim-migrate @ 12273]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10636
diff changeset
3104 buf[j++] = c;
9505695acff8 [gaim-migrate @ 12273]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10636
diff changeset
3105 } else {
9505695acff8 [gaim-migrate @ 12273]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10636
diff changeset
3106 int bytes = g_unichar_to_utf8(c, utf_char);
9505695acff8 [gaim-migrate @ 12273]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10636
diff changeset
3107 for (i = 0; i < bytes; i++) {
9505695acff8 [gaim-migrate @ 12273]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10636
diff changeset
3108 if (j > (BUF_LEN - 4))
9505695acff8 [gaim-migrate @ 12273]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10636
diff changeset
3109 break;
9505695acff8 [gaim-migrate @ 12273]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10636
diff changeset
3110 sprintf(buf + j, "%%%02x", utf_char[i] & 0xff);
9505695acff8 [gaim-migrate @ 12273]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10636
diff changeset
3111 j += 3;
9505695acff8 [gaim-migrate @ 12273]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10636
diff changeset
3112 }
7134
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3113 }
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3114 }
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3115
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3116 buf[j] = '\0';
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3117
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3118 return buf;
67f9b43c402a [gaim-migrate @ 7701]
Sean Egan <seanegan@gmail.com>
parents: 7110
diff changeset
3119 }
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3120
9054
96415a3aa93c [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3121 /* Originally lifted from
96415a3aa93c [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3122 * http://www.oreillynet.com/pub/a/network/excerpt/spcookbook_chap03/index3.html
96415a3aa93c [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3123 * ... and slightly modified to be a bit more rfc822 compliant
96415a3aa93c [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3124 * ... and modified a bit more to make domain checking rfc1035 compliant
96415a3aa93c [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3125 * with the exception permitted in rfc1101 for domains to start with digit
96415a3aa93c [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3126 * but not completely checking to avoid conflicts with IP addresses
96415a3aa93c [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3127 */
9045
38d022e5eb19 [gaim-migrate @ 9821]
Tim Ringenbach <marv@pidgin.im>
parents: 8976
diff changeset
3128 gboolean
38d022e5eb19 [gaim-migrate @ 9821]
Tim Ringenbach <marv@pidgin.im>
parents: 8976
diff changeset
3129 gaim_email_is_valid(const char *address)
38d022e5eb19 [gaim-migrate @ 9821]
Tim Ringenbach <marv@pidgin.im>
parents: 8976
diff changeset
3130 {
38d022e5eb19 [gaim-migrate @ 9821]
Tim Ringenbach <marv@pidgin.im>
parents: 8976
diff changeset
3131 const char *c, *domain;
38d022e5eb19 [gaim-migrate @ 9821]
Tim Ringenbach <marv@pidgin.im>
parents: 8976
diff changeset
3132 static char *rfc822_specials = "()<>@,;:\\\"[]";
38d022e5eb19 [gaim-migrate @ 9821]
Tim Ringenbach <marv@pidgin.im>
parents: 8976
diff changeset
3133
9054
96415a3aa93c [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3134 /* first we validate the name portion (name@domain) (rfc822)*/
9045
38d022e5eb19 [gaim-migrate @ 9821]
Tim Ringenbach <marv@pidgin.im>
parents: 8976
diff changeset
3135 for (c = address; *c; c++) {
38d022e5eb19 [gaim-migrate @ 9821]
Tim Ringenbach <marv@pidgin.im>
parents: 8976
diff changeset
3136 if (*c == '\"' && (c == address || *(c - 1) == '.' || *(c - 1) == '\"')) {
38d022e5eb19 [gaim-migrate @ 9821]
Tim Ringenbach <marv@pidgin.im>
parents: 8976
diff changeset
3137 while (*++c) {
9054
96415a3aa93c [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3138 if (*c == '\\') {
96415a3aa93c [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3139 if (*c++ && *c < 127 && *c != '\n' && *c != '\r') continue;
96415a3aa93c [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3140 else return FALSE;
96415a3aa93c [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3141 }
9045
38d022e5eb19 [gaim-migrate @ 9821]
Tim Ringenbach <marv@pidgin.im>
parents: 8976
diff changeset
3142 if (*c == '\"') break;
9054
96415a3aa93c [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3143 if (*c < ' ' || *c >= 127) return FALSE;
9045
38d022e5eb19 [gaim-migrate @ 9821]
Tim Ringenbach <marv@pidgin.im>
parents: 8976
diff changeset
3144 }
38d022e5eb19 [gaim-migrate @ 9821]
Tim Ringenbach <marv@pidgin.im>
parents: 8976
diff changeset
3145 if (!*c++) return FALSE;
38d022e5eb19 [gaim-migrate @ 9821]
Tim Ringenbach <marv@pidgin.im>
parents: 8976
diff changeset
3146 if (*c == '@') break;
38d022e5eb19 [gaim-migrate @ 9821]
Tim Ringenbach <marv@pidgin.im>
parents: 8976
diff changeset
3147 if (*c != '.') return FALSE;
38d022e5eb19 [gaim-migrate @ 9821]
Tim Ringenbach <marv@pidgin.im>
parents: 8976
diff changeset
3148 continue;
38d022e5eb19 [gaim-migrate @ 9821]
Tim Ringenbach <marv@pidgin.im>
parents: 8976
diff changeset
3149 }
38d022e5eb19 [gaim-migrate @ 9821]
Tim Ringenbach <marv@pidgin.im>
parents: 8976
diff changeset
3150 if (*c == '@') break;
38d022e5eb19 [gaim-migrate @ 9821]
Tim Ringenbach <marv@pidgin.im>
parents: 8976
diff changeset
3151 if (*c <= ' ' || *c >= 127) return FALSE;
38d022e5eb19 [gaim-migrate @ 9821]
Tim Ringenbach <marv@pidgin.im>
parents: 8976
diff changeset
3152 if (strchr(rfc822_specials, *c)) return FALSE;
38d022e5eb19 [gaim-migrate @ 9821]
Tim Ringenbach <marv@pidgin.im>
parents: 8976
diff changeset
3153 }
9054
96415a3aa93c [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3154 /* strictly we should return false if (*(c - 1) == '.') too, but I think
96415a3aa93c [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3155 * we should permit user.@domain type addresses - they do work :) */
96415a3aa93c [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3156 if (c == address) return FALSE;
96415a3aa93c [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3157
96415a3aa93c [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3158 /* next we validate the domain portion (name@domain) (rfc1035 & rfc1011) */
9045
38d022e5eb19 [gaim-migrate @ 9821]
Tim Ringenbach <marv@pidgin.im>
parents: 8976
diff changeset
3159 if (!*(domain = ++c)) return FALSE;
38d022e5eb19 [gaim-migrate @ 9821]
Tim Ringenbach <marv@pidgin.im>
parents: 8976
diff changeset
3160 do {
9054
96415a3aa93c [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3161 if (*c == '.' && (c == domain || *(c - 1) == '.' || *(c - 1) == '-'))
96415a3aa93c [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3162 return FALSE;
96415a3aa93c [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3163 if (*c == '-' && *(c - 1) == '.') return FALSE;
96415a3aa93c [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3164 if ((*c < '0' && *c != '-' && *c != '.') || (*c > '9' && *c < 'A') ||
96415a3aa93c [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3165 (*c > 'Z' && *c < 'a') || (*c > 'z')) return FALSE;
9045
38d022e5eb19 [gaim-migrate @ 9821]
Tim Ringenbach <marv@pidgin.im>
parents: 8976
diff changeset
3166 } while (*++c);
38d022e5eb19 [gaim-migrate @ 9821]
Tim Ringenbach <marv@pidgin.im>
parents: 8976
diff changeset
3167
9054
96415a3aa93c [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3168 if (*(c - 1) == '-') return FALSE;
96415a3aa93c [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3169
96415a3aa93c [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3170 return ((c - domain) > 3 ? TRUE : FALSE);
9045
38d022e5eb19 [gaim-migrate @ 9821]
Tim Ringenbach <marv@pidgin.im>
parents: 8976
diff changeset
3171 }
38d022e5eb19 [gaim-migrate @ 9821]
Tim Ringenbach <marv@pidgin.im>
parents: 8976
diff changeset
3172
9670
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3173 /** Stolen from gnome_uri_list_extract_uris **/
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3174 GList* gaim_uri_list_extract_uris (const gchar* uri_list) {
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3175 const gchar *p, *q;
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3176 gchar *retval;
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3177 GList *result = NULL;
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3178
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3179 g_return_val_if_fail (uri_list != NULL, NULL);
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3180
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3181 p = uri_list;
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3182
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3183 /* We don't actually try to validate the URI according to RFC
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3184 * 2396, or even check for allowed characters - we just ignore
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3185 * comments and trim whitespace off the ends. We also
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3186 * allow LF delimination as well as the specified CRLF.
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3187 */
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3188 while (p) {
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3189 if (*p != '#') {
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3190 while (isspace(*p))
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3191 p++;
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3192
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3193 q = p;
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3194 while (*q && (*q != '\n') && (*q != '\r'))
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3195 q++;
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3196
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3197 if (q > p) {
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3198 q--;
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3199 while (q > p && isspace(*q))
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3200 q--;
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3201
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3202 retval = (gchar*)g_malloc (q - p + 2);
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3203 strncpy (retval, p, q - p + 1);
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3204 retval[q - p + 1] = '\0';
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3205
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3206 result = g_list_prepend (result, retval);
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3207 }
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3208 }
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3209 p = strchr (p, '\n');
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3210 if (p)
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3211 p++;
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3212 }
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3213
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3214 return g_list_reverse (result);
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3215 }
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3216
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3217
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3218 /** Stolen from gaim_uri_list_extract_filenames **/
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3219 GList* gaim_uri_list_extract_filenames (const gchar* uri_list) {
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3220 GList *tmp_list, *node, *result;
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3221
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3222 g_return_val_if_fail (uri_list != NULL, NULL);
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3223
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3224 result = gaim_uri_list_extract_uris (uri_list);
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3225
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3226 tmp_list = result;
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3227 while (tmp_list) {
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3228 gchar *s = (gchar*)tmp_list->data;
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3229
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3230 node = tmp_list;
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3231 tmp_list = tmp_list->next;
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3232
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3233 if (!strncmp (s, "file:", 5)) {
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3234 node->data = g_filename_from_uri (s, NULL, NULL);
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3235 /* not sure if this fallback is useful at all */
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3236 if (!node->data) node->data = g_strdup (s+5);
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3237 } else {
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3238 result = g_list_remove_link(result, node);
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3239 g_list_free_1 (node);
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3240 }
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3241 g_free (s);
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3242 }
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3243 return result;
ed3bbf36de75 [gaim-migrate @ 10522]
Luke Schierer <lschiere@pidgin.im>
parents: 9642
diff changeset
3244 }
9054
96415a3aa93c [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3245
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3246 /**************************************************************************
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3247 * UTF8 String Functions
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3248 **************************************************************************/
9642
8901ef16f310 [gaim-migrate @ 10490]
Mark Doliner <mark@kingant.net>
parents: 9427
diff changeset
3249 gchar *
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3250 gaim_utf8_try_convert(const char *str)
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3251 {
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3252 gsize converted;
9642
8901ef16f310 [gaim-migrate @ 10490]
Mark Doliner <mark@kingant.net>
parents: 9427
diff changeset
3253 gchar *utf8;
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3254
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3255 g_return_val_if_fail(str != NULL, NULL);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3256
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3257 if (g_utf8_validate(str, -1, NULL)) {
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3258 return g_strdup(str);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3259 }
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3260
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3261 utf8 = g_locale_to_utf8(str, -1, &converted, NULL, NULL);
9642
8901ef16f310 [gaim-migrate @ 10490]
Mark Doliner <mark@kingant.net>
parents: 9427
diff changeset
3262 if (utf8 != NULL)
8901ef16f310 [gaim-migrate @ 10490]
Mark Doliner <mark@kingant.net>
parents: 9427
diff changeset
3263 return utf8;
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3264
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3265 utf8 = g_convert(str, -1, "UTF-8", "ISO-8859-15", &converted, NULL, NULL);
9642
8901ef16f310 [gaim-migrate @ 10490]
Mark Doliner <mark@kingant.net>
parents: 9427
diff changeset
3266 if ((utf8 != NULL) && (converted == strlen(str)))
8901ef16f310 [gaim-migrate @ 10490]
Mark Doliner <mark@kingant.net>
parents: 9427
diff changeset
3267 return utf8;
8901ef16f310 [gaim-migrate @ 10490]
Mark Doliner <mark@kingant.net>
parents: 9427
diff changeset
3268
8901ef16f310 [gaim-migrate @ 10490]
Mark Doliner <mark@kingant.net>
parents: 9427
diff changeset
3269 if (utf8 != NULL)
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3270 g_free(utf8);
9642
8901ef16f310 [gaim-migrate @ 10490]
Mark Doliner <mark@kingant.net>
parents: 9427
diff changeset
3271
8901ef16f310 [gaim-migrate @ 10490]
Mark Doliner <mark@kingant.net>
parents: 9427
diff changeset
3272 return NULL;
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3273 }
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3274
10258
357d4fa1bfbe [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3275 #define utf8_first(x) ((x & 0x80) == 0 || (x & 0xe0) == 0xc0 \
357d4fa1bfbe [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3276 || (x & 0xf0) == 0xe0 || (x & 0xf8) == 0xf)
357d4fa1bfbe [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3277 gchar *
357d4fa1bfbe [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3278 gaim_utf8_salvage(const char *str)
357d4fa1bfbe [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3279 {
357d4fa1bfbe [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3280 GString *workstr;
357d4fa1bfbe [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3281 const char *end;
357d4fa1bfbe [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3282
357d4fa1bfbe [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3283 g_return_val_if_fail(str != NULL, NULL);
357d4fa1bfbe [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3284
357d4fa1bfbe [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3285 workstr = g_string_sized_new(strlen(str));
357d4fa1bfbe [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3286
357d4fa1bfbe [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3287 do {
357d4fa1bfbe [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3288 g_utf8_validate(str, -1, &end);
357d4fa1bfbe [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3289 workstr = g_string_append_len(workstr, str, end - str);
357d4fa1bfbe [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3290 str = end;
357d4fa1bfbe [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3291 if (*str == '\0')
357d4fa1bfbe [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3292 break;
357d4fa1bfbe [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3293 do {
357d4fa1bfbe [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3294 workstr = g_string_append_c(workstr, '?');
357d4fa1bfbe [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3295 str++;
357d4fa1bfbe [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3296 } while (!utf8_first(*str));
357d4fa1bfbe [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3297 } while (*str != '\0');
357d4fa1bfbe [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3298
357d4fa1bfbe [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3299 return g_string_free(workstr, FALSE);
357d4fa1bfbe [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3300 }
357d4fa1bfbe [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3301
9161
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
3302 char *
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
3303 gaim_utf8_ncr_decode(const char *in)
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
3304 {
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
3305 GString *out = g_string_new("");
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
3306 int i;
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
3307
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
3308 g_return_val_if_fail(in != NULL, NULL);
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
3309 g_return_val_if_fail(g_utf8_validate(in, -1, NULL), NULL);
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
3310
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
3311 for (i = 0; in[i]; i += 1) {
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
3312 gboolean ncr_found_p = FALSE;
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
3313 if (in[i] == '&' && in[i + 1] == '#' && isdigit(in[i + 2])) {
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
3314 gunichar wc;
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
3315 int j;
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
3316 for (wc = 0, j = i + 2; isdigit(in[j]); j += 1) {
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
3317 wc *= 10;
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
3318 wc += in[j] - '0';
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
3319 }
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
3320 if (in[j] == ';') { /* Technically not completely correct */
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
3321 g_string_append_unichar(out, wc);
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
3322 i = j;
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
3323 ncr_found_p = TRUE;
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
3324 }
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
3325 }
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
3326 if (!ncr_found_p) {
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
3327 g_string_append_c(out, in[i]);
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
3328 }
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
3329 }
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
3330 return g_string_free(out, FALSE);
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
3331 }
c3fa2ad099a2 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
3332
7108
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3333 int
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3334 gaim_utf8_strcasecmp(const char *a, const char *b)
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3335 {
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3336 char *a_norm = NULL;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3337 char *b_norm = NULL;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3338 int ret = -1;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3339
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3340 if(!a && b)
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3341 return -1;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3342 else if(!b && a)
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3343 return 1;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3344 else if(!a && !b)
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3345 return 0;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3346
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3347 if(!g_utf8_validate(a, -1, NULL) || !g_utf8_validate(b, -1, NULL))
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3348 {
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3349 gaim_debug_error("gaim_utf8_strcasecmp",
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3350 "One or both parameters are invalid UTF8\n");
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3351 return ret;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3352 }
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3353
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3354 a_norm = g_utf8_casefold(a, -1);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3355 b_norm = g_utf8_casefold(b, -1);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3356 ret = g_utf8_collate(a_norm, b_norm);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3357 g_free(a_norm);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3358 g_free(b_norm);
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3359
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3360 return ret;
6faeeecab0dc [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3361 }
7162
d14e026611c0 [gaim-migrate @ 7729]
Nathan Walp <nwalp@pidgin.im>
parents: 7134
diff changeset
3362
7564
54b370f7d9bf [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3363 gboolean gaim_message_meify(char *message, size_t len)
54b370f7d9bf [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3364 {
54b370f7d9bf [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3365 char *c;
54b370f7d9bf [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3366 gboolean inside_html = FALSE;
54b370f7d9bf [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3367
54b370f7d9bf [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3368 g_return_val_if_fail(message != NULL, FALSE);
54b370f7d9bf [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3369
54b370f7d9bf [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3370 if(len == -1)
54b370f7d9bf [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3371 len = strlen(message);
54b370f7d9bf [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3372
54b370f7d9bf [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3373 for (c = message; *c; c++, len--) {
54b370f7d9bf [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3374 if(inside_html) {
54b370f7d9bf [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3375 if(*c == '>')
54b370f7d9bf [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3376 inside_html = FALSE;
54b370f7d9bf [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3377 } else {
54b370f7d9bf [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3378 if(*c == '<')
54b370f7d9bf [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3379 inside_html = TRUE;
54b370f7d9bf [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3380 else
54b370f7d9bf [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3381 break;
54b370f7d9bf [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3382 }
54b370f7d9bf [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3383 }
54b370f7d9bf [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3384
54b370f7d9bf [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3385 if(*c && !g_ascii_strncasecmp(c, "/me ", 4)) {
54b370f7d9bf [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3386 memmove(c, c+4, len-3);
54b370f7d9bf [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3387 return TRUE;
54b370f7d9bf [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3388 }
54b370f7d9bf [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3389
54b370f7d9bf [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3390 return FALSE;
54b370f7d9bf [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3391 }
54b370f7d9bf [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3392
7889
7e1bb4deca24 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3393 char *gaim_text_strip_mnemonic(const char *in)
7e1bb4deca24 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3394 {
7e1bb4deca24 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3395 char *out;
7e1bb4deca24 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3396 char *a;
8561
2d4ccd94e298 [gaim-migrate @ 9305]
Luke Schierer <lschiere@pidgin.im>
parents: 8538
diff changeset
3397 char *a0;
7889
7e1bb4deca24 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3398 const char *b;
7e1bb4deca24 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3399
7e1bb4deca24 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3400 g_return_val_if_fail(in != NULL, NULL);
7e1bb4deca24 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3401
7e1bb4deca24 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3402 out = g_malloc(strlen(in)+1);
7e1bb4deca24 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3403 a = out;
7e1bb4deca24 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3404 b = in;
7e1bb4deca24 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3405
8561
2d4ccd94e298 [gaim-migrate @ 9305]
Luke Schierer <lschiere@pidgin.im>
parents: 8538
diff changeset
3406 a0 = a; /* The last non-space char seen so far, or the first char */
2d4ccd94e298 [gaim-migrate @ 9305]
Luke Schierer <lschiere@pidgin.im>
parents: 8538
diff changeset
3407
7889
7e1bb4deca24 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3408 while(*b) {
7e1bb4deca24 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3409 if(*b == '_') {
8561
2d4ccd94e298 [gaim-migrate @ 9305]
Luke Schierer <lschiere@pidgin.im>
parents: 8538
diff changeset
3410 if(a > out && b > in && *(b-1) == '(' && *(b+1) && !(*(b+1) & 0x80) && *(b+2) == ')') {
2d4ccd94e298 [gaim-migrate @ 9305]
Luke Schierer <lschiere@pidgin.im>
parents: 8538
diff changeset
3411 /* Detected CJK style shortcut (Bug 875311) */
2d4ccd94e298 [gaim-migrate @ 9305]
Luke Schierer <lschiere@pidgin.im>
parents: 8538
diff changeset
3412 a = a0; /* undo the left parenthesis */
2d4ccd94e298 [gaim-migrate @ 9305]
Luke Schierer <lschiere@pidgin.im>
parents: 8538
diff changeset
3413 b += 3; /* and skip the whole mess */
2d4ccd94e298 [gaim-migrate @ 9305]
Luke Schierer <lschiere@pidgin.im>
parents: 8538
diff changeset
3414 } else if(*(b+1) == '_') {
7889
7e1bb4deca24 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3415 *(a++) = '_';
7e1bb4deca24 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3416 b += 2;
8561
2d4ccd94e298 [gaim-migrate @ 9305]
Luke Schierer <lschiere@pidgin.im>
parents: 8538
diff changeset
3417 a0 = a;
7889
7e1bb4deca24 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3418 } else {
7e1bb4deca24 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3419 b++;
7e1bb4deca24 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3420 }
8561
2d4ccd94e298 [gaim-migrate @ 9305]
Luke Schierer <lschiere@pidgin.im>
parents: 8538
diff changeset
3421 /* We don't want to corrupt the middle of UTF-8 characters */
2d4ccd94e298 [gaim-migrate @ 9305]
Luke Schierer <lschiere@pidgin.im>
parents: 8538
diff changeset
3422 } else if (!(*b & 0x80)) { /* other 1-byte char */
2d4ccd94e298 [gaim-migrate @ 9305]
Luke Schierer <lschiere@pidgin.im>
parents: 8538
diff changeset
3423 if (*b != ' ')
2d4ccd94e298 [gaim-migrate @ 9305]
Luke Schierer <lschiere@pidgin.im>
parents: 8538
diff changeset
3424 a0 = a;
2d4ccd94e298 [gaim-migrate @ 9305]
Luke Schierer <lschiere@pidgin.im>
parents: 8538
diff changeset
3425 *(a++) = *(b++);
7889
7e1bb4deca24 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3426 } else {
8561
2d4ccd94e298 [gaim-migrate @ 9305]
Luke Schierer <lschiere@pidgin.im>
parents: 8538
diff changeset
3427 /* Multibyte utf8 char, don't look for _ inside these */
2d4ccd94e298 [gaim-migrate @ 9305]
Luke Schierer <lschiere@pidgin.im>
parents: 8538
diff changeset
3428 int n = 0;
2d4ccd94e298 [gaim-migrate @ 9305]
Luke Schierer <lschiere@pidgin.im>
parents: 8538
diff changeset
3429 int i;
2d4ccd94e298 [gaim-migrate @ 9305]
Luke Schierer <lschiere@pidgin.im>
parents: 8538
diff changeset
3430 if ((*b & 0xe0) == 0xc0) {
2d4ccd94e298 [gaim-migrate @ 9305]
Luke Schierer <lschiere@pidgin.im>
parents: 8538
diff changeset
3431 n = 2;
2d4ccd94e298 [gaim-migrate @ 9305]
Luke Schierer <lschiere@pidgin.im>
parents: 8538
diff changeset
3432 } else if ((*b & 0xf0) == 0xe0) {
2d4ccd94e298 [gaim-migrate @ 9305]
Luke Schierer <lschiere@pidgin.im>
parents: 8538
diff changeset
3433 n = 3;
2d4ccd94e298 [gaim-migrate @ 9305]
Luke Schierer <lschiere@pidgin.im>
parents: 8538
diff changeset
3434 } else if ((*b & 0xf8) == 0xf0) {
2d4ccd94e298 [gaim-migrate @ 9305]
Luke Schierer <lschiere@pidgin.im>
parents: 8538
diff changeset
3435 n = 4;
2d4ccd94e298 [gaim-migrate @ 9305]
Luke Schierer <lschiere@pidgin.im>
parents: 8538
diff changeset
3436 } else if ((*b & 0xfc) == 0xf8) {
2d4ccd94e298 [gaim-migrate @ 9305]
Luke Schierer <lschiere@pidgin.im>
parents: 8538
diff changeset
3437 n = 5;
2d4ccd94e298 [gaim-migrate @ 9305]
Luke Schierer <lschiere@pidgin.im>
parents: 8538
diff changeset
3438 } else if ((*b & 0xfe) == 0xfc) {
2d4ccd94e298 [gaim-migrate @ 9305]
Luke Schierer <lschiere@pidgin.im>
parents: 8538
diff changeset
3439 n = 6;
2d4ccd94e298 [gaim-migrate @ 9305]
Luke Schierer <lschiere@pidgin.im>
parents: 8538
diff changeset
3440 } else { /* Illegal utf8 */
2d4ccd94e298 [gaim-migrate @ 9305]
Luke Schierer <lschiere@pidgin.im>
parents: 8538
diff changeset
3441 n = 1;
2d4ccd94e298 [gaim-migrate @ 9305]
Luke Schierer <lschiere@pidgin.im>
parents: 8538
diff changeset
3442 }
2d4ccd94e298 [gaim-migrate @ 9305]
Luke Schierer <lschiere@pidgin.im>
parents: 8538
diff changeset
3443 a0 = a; /* unless we want to delete CJK spaces too */
2d4ccd94e298 [gaim-migrate @ 9305]
Luke Schierer <lschiere@pidgin.im>
parents: 8538
diff changeset
3444 for (i = 0; i < n && *b; i += 1) {
2d4ccd94e298 [gaim-migrate @ 9305]
Luke Schierer <lschiere@pidgin.im>
parents: 8538
diff changeset
3445 *(a++) = *(b++);
2d4ccd94e298 [gaim-migrate @ 9305]
Luke Schierer <lschiere@pidgin.im>
parents: 8538
diff changeset
3446 }
7889
7e1bb4deca24 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3447 }
7e1bb4deca24 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3448 }
7e1bb4deca24 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3449 *a = '\0';
7e1bb4deca24 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3450
7e1bb4deca24 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3451 return out;
7e1bb4deca24 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3452 }
7e1bb4deca24 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3453
9926
b23e70bd1215 [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3454 const char* gaim_unescape_filename(const char *escaped) {
b23e70bd1215 [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3455 return gaim_url_decode(escaped);
b23e70bd1215 [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3456 }
b23e70bd1215 [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3457
b23e70bd1215 [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3458
b23e70bd1215 [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3459 /* this is almost identical to gaim_url_encode (hence gaim_url_decode
b23e70bd1215 [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3460 * being used above), but we want to keep certain characters unescaped
b23e70bd1215 [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3461 * for compat reasons */
b23e70bd1215 [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3462 const char *
b23e70bd1215 [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3463 gaim_escape_filename(const char *str)
b23e70bd1215 [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3464 {
10700
9505695acff8 [gaim-migrate @ 12273]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10636
diff changeset
3465 const char *iter;
9926
b23e70bd1215 [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3466 static char buf[BUF_LEN];
10700
9505695acff8 [gaim-migrate @ 12273]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10636
diff changeset
3467 char utf_char[6];
9926
b23e70bd1215 [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3468 guint i, j = 0;
b23e70bd1215 [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3469
b23e70bd1215 [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3470 g_return_val_if_fail(str != NULL, NULL);
10700
9505695acff8 [gaim-migrate @ 12273]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10636
diff changeset
3471 g_return_val_if_fail(g_utf8_validate(str, -1, NULL), NULL);
9505695acff8 [gaim-migrate @ 12273]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10636
diff changeset
3472
9505695acff8 [gaim-migrate @ 12273]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10636
diff changeset
3473 iter = str;
9505695acff8 [gaim-migrate @ 12273]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10636
diff changeset
3474 for (; *iter && j < (BUF_LEN - 1) ; iter = g_utf8_next_char(iter)) {
9505695acff8 [gaim-migrate @ 12273]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10636
diff changeset
3475 gunichar c = g_utf8_get_char(iter);
9505695acff8 [gaim-migrate @ 12273]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10636
diff changeset
3476 /* If the character is an ASCII character and is alphanumeric,
9505695acff8 [gaim-migrate @ 12273]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10636
diff changeset
3477 * or one of the specified values, no need to escape */
10800
8002e95c0809 [gaim-migrate @ 12446]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10732
diff changeset
3478 if (c < 128 && (isalnum(c) || c == '@' || c == '-' ||
10700
9505695acff8 [gaim-migrate @ 12273]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10636
diff changeset
3479 c == '_' || c == '.' || c == '#')) {
9505695acff8 [gaim-migrate @ 12273]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10636
diff changeset
3480 buf[j++] = c;
9505695acff8 [gaim-migrate @ 12273]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10636
diff changeset
3481 } else {
9505695acff8 [gaim-migrate @ 12273]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10636
diff changeset
3482 int bytes = g_unichar_to_utf8(c, utf_char);
9505695acff8 [gaim-migrate @ 12273]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10636
diff changeset
3483 for (i = 0; i < bytes; i++) {
9505695acff8 [gaim-migrate @ 12273]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10636
diff changeset
3484 if (j > (BUF_LEN - 4))
9505695acff8 [gaim-migrate @ 12273]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10636
diff changeset
3485 break;
9505695acff8 [gaim-migrate @ 12273]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10636
diff changeset
3486 sprintf(buf + j, "%%%02x", utf_char[i] & 0xff);
9505695acff8 [gaim-migrate @ 12273]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10636
diff changeset
3487 j += 3;
9505695acff8 [gaim-migrate @ 12273]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10636
diff changeset
3488 }
9926
b23e70bd1215 [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3489 }
b23e70bd1215 [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3490 }
b23e70bd1215 [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3491
b23e70bd1215 [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3492 buf[j] = '\0';
b23e70bd1215 [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3493
b23e70bd1215 [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3494 return buf;
b23e70bd1215 [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3495 }
b23e70bd1215 [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3496
b23e70bd1215 [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3497