src/util.c

Sat, 04 Feb 2006 20:55:52 +0000

author
Richard Laager <rlaager@pidgin.im>
date
Sat, 04 Feb 2006 20:55:52 +0000
changeset 13120
c25222322810
parent 13118
e83cc0037d7d
child 13121
fa8f062ccbb2
permissions
-rw-r--r--

[gaim-migrate @ 15481]
This adds support for displaying log timestamps in their original timezone. If your OS's definition of struct tm sucks, then the log timestamps will show up in your local timezone, but converted, so the time is accurate. Yay! Anyway, this all works, as I've renamed lots of my log files locally, but currently, there's no code to save new logs in this name format. That's held up on a portability issue and backwards compatibility issue.

1
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
1 /*
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2 * @file util.h Utility Functions
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3 * @ingroup core
1
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
4 *
8046
c581b20a47d6 [gaim-migrate @ 8730]
Sean Egan <seanegan@pidgin.im>
parents: 8026
diff changeset
5 * Gaim is the legal property of its developers, whose names are too numerous
c581b20a47d6 [gaim-migrate @ 8730]
Sean Egan <seanegan@pidgin.im>
parents: 8026
diff changeset
6 * to list here. Please refer to the COPYRIGHT file distributed with this
c581b20a47d6 [gaim-migrate @ 8730]
Sean Egan <seanegan@pidgin.im>
parents: 8026
diff changeset
7 * source distribution.
1
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
8 *
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
9 * This program is free software; you can redistribute it and/or modify
efe077a7e70d [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
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
11 * the Free Software Foundation; either version 2 of the License, or
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
12 * (at your option) any later version.
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
13 *
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
14 * This program is distributed in the hope that it will be useful,
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
17 * GNU General Public License for more details.
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
18 *
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
19 * You should have received a copy of the GNU General Public License
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
20 * along with this program; if not, write to the Free Software
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
22 */
5872
754c63f29b77 [gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents: 5826
diff changeset
23 #include "internal.h"
3630
caa952062dc2 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3572
diff changeset
24
5872
754c63f29b77 [gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents: 5826
diff changeset
25 #include "conversation.h"
754c63f29b77 [gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents: 5826
diff changeset
26 #include "debug.h"
10425
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
27 #include "notify.h"
1575
220b4d845309 [gaim-migrate @ 1585]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1560
diff changeset
28 #include "prpl.h"
5545
a8b1a1262402 [gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents: 5532
diff changeset
29 #include "prefs.h"
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
30 #include "util.h"
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
31
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
32 typedef struct
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
33 {
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
34 void (*callback)(void *, const char *, size_t);
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
35 void *user_data;
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
36
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
37 struct
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
38 {
9227
95c28297b72c [gaim-migrate @ 10023]
Don Seiler <rizzo@gentoo.org>
parents: 9222
diff changeset
39 char *user;
95c28297b72c [gaim-migrate @ 10023]
Don Seiler <rizzo@gentoo.org>
parents: 9222
diff changeset
40 char *passwd;
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
41 char *address;
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
42 int port;
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
43 char *page;
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
44
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
45 } website;
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
46
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
47 char *url;
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
48 gboolean full;
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
49 char *user_agent;
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
50 gboolean http11;
12887
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
51 char *request;
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
52 gboolean include_headers;
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
53
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
54 int inpa;
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
55
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
56 gboolean sentreq;
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
57 gboolean startsaving;
9240
52f712c0c976 [gaim-migrate @ 10039]
Ambrose Li <ambrose.li@gmail.com>
parents: 9233
diff changeset
58 gboolean has_explicit_data_len;
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
59 char *webdata;
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
60 unsigned long len;
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
61 unsigned long data_len;
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
62
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
63 } GaimFetchUrlData;
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
64
8596
6d70d45b8ea6 [gaim-migrate @ 9347]
Daniel Atallah <datallah@pidgin.im>
parents: 8577
diff changeset
65 static char custom_home_dir[MAXPATHLEN];
3630
caa952062dc2 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3572
diff changeset
66 static char home_dir[MAXPATHLEN];
caa952062dc2 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3572
diff changeset
67
12919
519199cca273 [gaim-migrate @ 15272]
Etan Reisner <deryni@pidgin.im>
parents: 12907
diff changeset
68 GaimMenuAction *
13103
81ccb40de82b [gaim-migrate @ 15464]
Richard Laager <rlaager@pidgin.im>
parents: 13098
diff changeset
69 gaim_menu_action_new(const char *label, GaimCallback callback, gpointer data,
12919
519199cca273 [gaim-migrate @ 15272]
Etan Reisner <deryni@pidgin.im>
parents: 12907
diff changeset
70 GList *children)
519199cca273 [gaim-migrate @ 15272]
Etan Reisner <deryni@pidgin.im>
parents: 12907
diff changeset
71 {
519199cca273 [gaim-migrate @ 15272]
Etan Reisner <deryni@pidgin.im>
parents: 12907
diff changeset
72 GaimMenuAction *act = g_new0(GaimMenuAction, 1);
13103
81ccb40de82b [gaim-migrate @ 15464]
Richard Laager <rlaager@pidgin.im>
parents: 13098
diff changeset
73 act->label = g_strdup(label);
12919
519199cca273 [gaim-migrate @ 15272]
Etan Reisner <deryni@pidgin.im>
parents: 12907
diff changeset
74 act->callback = callback;
519199cca273 [gaim-migrate @ 15272]
Etan Reisner <deryni@pidgin.im>
parents: 12907
diff changeset
75 act->data = data;
519199cca273 [gaim-migrate @ 15272]
Etan Reisner <deryni@pidgin.im>
parents: 12907
diff changeset
76 act->children = children;
519199cca273 [gaim-migrate @ 15272]
Etan Reisner <deryni@pidgin.im>
parents: 12907
diff changeset
77 return act;
519199cca273 [gaim-migrate @ 15272]
Etan Reisner <deryni@pidgin.im>
parents: 12907
diff changeset
78 }
519199cca273 [gaim-migrate @ 15272]
Etan Reisner <deryni@pidgin.im>
parents: 12907
diff changeset
79
13103
81ccb40de82b [gaim-migrate @ 15464]
Richard Laager <rlaager@pidgin.im>
parents: 13098
diff changeset
80 void
81ccb40de82b [gaim-migrate @ 15464]
Richard Laager <rlaager@pidgin.im>
parents: 13098
diff changeset
81 gaim_menu_action_free(GaimMenuAction *act)
81ccb40de82b [gaim-migrate @ 15464]
Richard Laager <rlaager@pidgin.im>
parents: 13098
diff changeset
82 {
81ccb40de82b [gaim-migrate @ 15464]
Richard Laager <rlaager@pidgin.im>
parents: 13098
diff changeset
83 g_return_if_fail(act != NULL);
81ccb40de82b [gaim-migrate @ 15464]
Richard Laager <rlaager@pidgin.im>
parents: 13098
diff changeset
84
81ccb40de82b [gaim-migrate @ 15464]
Richard Laager <rlaager@pidgin.im>
parents: 13098
diff changeset
85 g_free(act->label);
81ccb40de82b [gaim-migrate @ 15464]
Richard Laager <rlaager@pidgin.im>
parents: 13098
diff changeset
86 g_free(act);
81ccb40de82b [gaim-migrate @ 15464]
Richard Laager <rlaager@pidgin.im>
parents: 13098
diff changeset
87 }
81ccb40de82b [gaim-migrate @ 15464]
Richard Laager <rlaager@pidgin.im>
parents: 13098
diff changeset
88
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
89 /**************************************************************************
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
90 * Base16 Functions
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
91 **************************************************************************/
11127
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
92 gchar *
11137
cf40226ddff7 [gaim-migrate @ 13201]
Mark Doliner <markdoliner@pidgin.im>
parents: 11135
diff changeset
93 gaim_base16_encode(const guchar *data, gsize len)
1
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
94 {
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
95 int i;
11127
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
96 gchar *ascii = NULL;
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
97
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
98 g_return_val_if_fail(data != NULL, NULL);
11127
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
99 g_return_val_if_fail(len > 0, NULL);
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
100
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
101 ascii = g_malloc(len * 2 + 1);
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
102
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
103 for (i = 0; i < len; i++)
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
104 snprintf(&ascii[i * 2], 3, "%02hhx", data[i]);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
105
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
106 return ascii;
1
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
107 }
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
108
11137
cf40226ddff7 [gaim-migrate @ 13201]
Mark Doliner <markdoliner@pidgin.im>
parents: 11135
diff changeset
109 guchar *
11127
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
110 gaim_base16_decode(const char *str, gsize *ret_len)
1
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
111 {
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
112 int len, i, accumulator = 0;
11137
cf40226ddff7 [gaim-migrate @ 13201]
Mark Doliner <markdoliner@pidgin.im>
parents: 11135
diff changeset
113 guchar *data;
11127
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
114
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
115 g_return_val_if_fail(str != NULL, NULL);
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
116
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
117 len = strlen(str);
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
118
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
119 g_return_val_if_fail(strlen(str) > 0, 0);
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
120 g_return_val_if_fail(len % 2 > 0, 0);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
121
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
122 data = g_malloc(len / 2);
1
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
123
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
124 for (i = 0; i < len; i++)
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
125 {
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
126 if ((i % 2) == 0)
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
127 accumulator = 0;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
128 else
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
129 accumulator <<= 4;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
130
11127
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
131 if (isdigit(str[i]))
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
132 accumulator |= str[i] - 48;
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
133 else
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
134 {
11127
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
135 switch(str[i])
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
136 {
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
137 case 'a': case 'A': accumulator |= 10; break;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
138 case 'b': case 'B': accumulator |= 11; break;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
139 case 'c': case 'C': accumulator |= 12; break;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
140 case 'd': case 'D': accumulator |= 13; break;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
141 case 'e': case 'E': accumulator |= 14; break;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
142 case 'f': case 'F': accumulator |= 15; break;
1826
2353dd376dcf [gaim-migrate @ 1836]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1815
diff changeset
143 }
1252
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
144 }
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
145
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
146 if (i % 2)
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
147 data[(i - 1) / 2] = accumulator;
1252
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
148 }
1
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
149
11127
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
150 if (ret_len != NULL)
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
151 *ret_len = len / 2;
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
152
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
153 return data;
1
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
154 }
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
155
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
156 /**************************************************************************
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
157 * Base64 Functions
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
158 **************************************************************************/
4888
09f16a932490 [gaim-migrate @ 5218]
Christian Hammond <chipx86@chipx86.com>
parents: 4853
diff changeset
159 static const char alphabet[] =
09f16a932490 [gaim-migrate @ 5218]
Christian Hammond <chipx86@chipx86.com>
parents: 4853
diff changeset
160 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
09f16a932490 [gaim-migrate @ 5218]
Christian Hammond <chipx86@chipx86.com>
parents: 4853
diff changeset
161 "0123456789+/";
1252
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
162
8929
1a83fc2e48dd [gaim-migrate @ 9699]
Ethan Blanton <elb@pidgin.im>
parents: 8918
diff changeset
163 static const char xdigits[] =
1a83fc2e48dd [gaim-migrate @ 9699]
Ethan Blanton <elb@pidgin.im>
parents: 8918
diff changeset
164 "0123456789abcdef";
1a83fc2e48dd [gaim-migrate @ 9699]
Ethan Blanton <elb@pidgin.im>
parents: 8918
diff changeset
165
11127
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
166 gchar *
11137
cf40226ddff7 [gaim-migrate @ 13201]
Mark Doliner <markdoliner@pidgin.im>
parents: 11135
diff changeset
167 gaim_base64_encode(const guchar *data, gsize len)
1
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
168 {
6872
61144295083e [gaim-migrate @ 7418]
Nathan Walp <nwalp@pidgin.im>
parents: 6861
diff changeset
169 char *out, *rv;
1252
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
170
11127
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
171 g_return_val_if_fail(data != NULL, NULL);
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
172 g_return_val_if_fail(len > 0, NULL);
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
173
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
174 rv = out = g_malloc(((len/3)+1)*4 + 1);
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
175
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
176 for (; len >= 3; len -= 3)
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
177 {
11127
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
178 *out++ = alphabet[data[0] >> 2];
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
179 *out++ = alphabet[((data[0] << 4) & 0x30) | (data[1] >> 4)];
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
180 *out++ = alphabet[((data[1] << 2) & 0x3c) | (data[2] >> 6)];
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
181 *out++ = alphabet[data[2] & 0x3f];
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
182 data += 3;
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
183 }
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
184
11127
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
185 if (len > 0)
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
186 {
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
187 unsigned char fragment;
6872
61144295083e [gaim-migrate @ 7418]
Nathan Walp <nwalp@pidgin.im>
parents: 6861
diff changeset
188
11127
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
189 *out++ = alphabet[data[0] >> 2];
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
190 fragment = (data[0] << 4) & 0x30;
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
191
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
192 if (len > 1)
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
193 fragment |= data[1] >> 4;
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
194
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
195 *out++ = alphabet[fragment];
11127
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
196 *out++ = (len < 2) ? '=' : alphabet[(data[1] << 2) & 0x3c];
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
197 *out++ = '=';
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
198 }
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
199
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
200 *out = '\0';
5426
b9b571cd1e57 [gaim-migrate @ 5805]
Nathan Walp <nwalp@pidgin.im>
parents: 5341
diff changeset
201
b9b571cd1e57 [gaim-migrate @ 5805]
Nathan Walp <nwalp@pidgin.im>
parents: 5341
diff changeset
202 return rv;
1
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
203 }
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
204
11137
cf40226ddff7 [gaim-migrate @ 13201]
Mark Doliner <markdoliner@pidgin.im>
parents: 11135
diff changeset
205 guchar *
11127
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
206 gaim_base64_decode(const char *str, gsize *ret_len)
1
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
207 {
11137
cf40226ddff7 [gaim-migrate @ 13201]
Mark Doliner <markdoliner@pidgin.im>
parents: 11135
diff changeset
208 guchar *out = NULL;
1252
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
209 char tmp = 0;
1920
8e86151db7dc [gaim-migrate @ 1930]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1878
diff changeset
210 const char *c;
1252
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
211 gint32 tmp2 = 0;
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
212 int len = 0, n = 0;
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
213
11127
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
214 g_return_val_if_fail(str != NULL, NULL);
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
215
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
216 c = str;
1
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
217
1252
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
218 while (*c) {
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
219 if (*c >= 'A' && *c <= 'Z') {
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
220 tmp = *c - 'A';
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
221 } else if (*c >= 'a' && *c <= 'z') {
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
222 tmp = 26 + (*c - 'a');
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
223 } else if (*c >= '0' && *c <= 57) {
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
224 tmp = 52 + (*c - '0');
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
225 } else if (*c == '+') {
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
226 tmp = 62;
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
227 } else if (*c == '/') {
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
228 tmp = 63;
5289
2713360bfed5 [gaim-migrate @ 5661]
Nathan Walp <nwalp@pidgin.im>
parents: 5247
diff changeset
229 } else if (*c == '\r' || *c == '\n') {
2713360bfed5 [gaim-migrate @ 5661]
Nathan Walp <nwalp@pidgin.im>
parents: 5247
diff changeset
230 c++;
2713360bfed5 [gaim-migrate @ 5661]
Nathan Walp <nwalp@pidgin.im>
parents: 5247
diff changeset
231 continue;
1252
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
232 } else if (*c == '=') {
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
233 if (n == 3) {
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
234 out = g_realloc(out, len + 2);
11137
cf40226ddff7 [gaim-migrate @ 13201]
Mark Doliner <markdoliner@pidgin.im>
parents: 11135
diff changeset
235 out[len] = (guchar)(tmp2 >> 10) & 0xff;
1252
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
236 len++;
11137
cf40226ddff7 [gaim-migrate @ 13201]
Mark Doliner <markdoliner@pidgin.im>
parents: 11135
diff changeset
237 out[len] = (guchar)(tmp2 >> 2) & 0xff;
1252
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
238 len++;
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
239 } else if (n == 2) {
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
240 out = g_realloc(out, len + 1);
11137
cf40226ddff7 [gaim-migrate @ 13201]
Mark Doliner <markdoliner@pidgin.im>
parents: 11135
diff changeset
241 out[len] = (guchar)(tmp2 >> 4) & 0xff;
1252
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
242 len++;
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
243 }
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
244 break;
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
245 }
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
246 tmp2 = ((tmp2 << 6) | (tmp & 0xff));
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
247 n++;
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
248 if (n == 4) {
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
249 out = g_realloc(out, len + 3);
11137
cf40226ddff7 [gaim-migrate @ 13201]
Mark Doliner <markdoliner@pidgin.im>
parents: 11135
diff changeset
250 out[len] = (guchar)((tmp2 >> 16) & 0xff);
1252
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
251 len++;
11137
cf40226ddff7 [gaim-migrate @ 13201]
Mark Doliner <markdoliner@pidgin.im>
parents: 11135
diff changeset
252 out[len] = (guchar)((tmp2 >> 8) & 0xff);
1252
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
253 len++;
11137
cf40226ddff7 [gaim-migrate @ 13201]
Mark Doliner <markdoliner@pidgin.im>
parents: 11135
diff changeset
254 out[len] = (guchar)(tmp2 & 0xff);
1252
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
255 len++;
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
256 tmp2 = 0;
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
257 n = 0;
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
258 }
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
259 c++;
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
260 }
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
261
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
262 out = g_realloc(out, len + 1);
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
263 out[len] = 0;
94fbface2d84 [gaim-migrate @ 1262]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1250
diff changeset
264
11127
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
265 if (ret_len != NULL)
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
266 *ret_len = len;
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
267
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
268 return out;
1
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
269 }
efe077a7e70d [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
270
7679
c9804d02dcab [gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7675
diff changeset
271 /**************************************************************************
11132
eeb2afd70f70 [gaim-migrate @ 13189]
Mark Doliner <markdoliner@pidgin.im>
parents: 11127
diff changeset
272 * Quoted Printable Functions (see RFC 2045).
7679
c9804d02dcab [gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7675
diff changeset
273 **************************************************************************/
11137
cf40226ddff7 [gaim-migrate @ 13201]
Mark Doliner <markdoliner@pidgin.im>
parents: 11135
diff changeset
274 guchar *
11132
eeb2afd70f70 [gaim-migrate @ 13189]
Mark Doliner <markdoliner@pidgin.im>
parents: 11127
diff changeset
275 gaim_quotedp_decode(const char *str, gsize *ret_len)
7679
c9804d02dcab [gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7675
diff changeset
276 {
8125
d172f84dbfe2 [gaim-migrate @ 8829]
Nathan Walp <nwalp@pidgin.im>
parents: 8123
diff changeset
277 char *n, *new;
d172f84dbfe2 [gaim-migrate @ 8829]
Nathan Walp <nwalp@pidgin.im>
parents: 8123
diff changeset
278 const char *end, *p;
7722
ddcc8366697e [gaim-migrate @ 8367]
Nathan Walp <nwalp@pidgin.im>
parents: 7679
diff changeset
279
8005
de2b2ad34ee5 [gaim-migrate @ 8682]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7956
diff changeset
280 n = new = g_malloc(strlen (str) + 1);
8125
d172f84dbfe2 [gaim-migrate @ 8829]
Nathan Walp <nwalp@pidgin.im>
parents: 8123
diff changeset
281 end = str + strlen(str);
7679
c9804d02dcab [gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7675
diff changeset
282
8125
d172f84dbfe2 [gaim-migrate @ 8829]
Nathan Walp <nwalp@pidgin.im>
parents: 8123
diff changeset
283 for (p = str; p < end; p++, n++) {
7679
c9804d02dcab [gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7675
diff changeset
284 if (*p == '=') {
8929
1a83fc2e48dd [gaim-migrate @ 9699]
Ethan Blanton <elb@pidgin.im>
parents: 8918
diff changeset
285 if (p[1] == '\r' && p[2] == '\n') { /* 5.1 #5 */
1a83fc2e48dd [gaim-migrate @ 9699]
Ethan Blanton <elb@pidgin.im>
parents: 8918
diff changeset
286 n -= 1;
1a83fc2e48dd [gaim-migrate @ 9699]
Ethan Blanton <elb@pidgin.im>
parents: 8918
diff changeset
287 p += 2;
1a83fc2e48dd [gaim-migrate @ 9699]
Ethan Blanton <elb@pidgin.im>
parents: 8918
diff changeset
288 } else if (p[1] == '\n') { /* fuzzy case for 5.1 #5 */
1a83fc2e48dd [gaim-migrate @ 9699]
Ethan Blanton <elb@pidgin.im>
parents: 8918
diff changeset
289 n -= 1;
1a83fc2e48dd [gaim-migrate @ 9699]
Ethan Blanton <elb@pidgin.im>
parents: 8918
diff changeset
290 p += 1;
1a83fc2e48dd [gaim-migrate @ 9699]
Ethan Blanton <elb@pidgin.im>
parents: 8918
diff changeset
291 } else if (p[1] && p[2]) {
1a83fc2e48dd [gaim-migrate @ 9699]
Ethan Blanton <elb@pidgin.im>
parents: 8918
diff changeset
292 char *nibble1 = strchr(xdigits, tolower(p[1]));
1a83fc2e48dd [gaim-migrate @ 9699]
Ethan Blanton <elb@pidgin.im>
parents: 8918
diff changeset
293 char *nibble2 = strchr(xdigits, tolower(p[2]));
1a83fc2e48dd [gaim-migrate @ 9699]
Ethan Blanton <elb@pidgin.im>
parents: 8918
diff changeset
294 if (nibble1 && nibble2) { /* 5.1 #1 */
1a83fc2e48dd [gaim-migrate @ 9699]
Ethan Blanton <elb@pidgin.im>
parents: 8918
diff changeset
295 *n = ((nibble1 - xdigits) << 4) | (nibble2 - xdigits);
1a83fc2e48dd [gaim-migrate @ 9699]
Ethan Blanton <elb@pidgin.im>
parents: 8918
diff changeset
296 p += 2;
1a83fc2e48dd [gaim-migrate @ 9699]
Ethan Blanton <elb@pidgin.im>
parents: 8918
diff changeset
297 } else { /* This should never happen */
1a83fc2e48dd [gaim-migrate @ 9699]
Ethan Blanton <elb@pidgin.im>
parents: 8918
diff changeset
298 *n = *p;
1a83fc2e48dd [gaim-migrate @ 9699]
Ethan Blanton <elb@pidgin.im>
parents: 8918
diff changeset
299 }
1a83fc2e48dd [gaim-migrate @ 9699]
Ethan Blanton <elb@pidgin.im>
parents: 8918
diff changeset
300 } else { /* This should never happen */
1a83fc2e48dd [gaim-migrate @ 9699]
Ethan Blanton <elb@pidgin.im>
parents: 8918
diff changeset
301 *n = *p;
1a83fc2e48dd [gaim-migrate @ 9699]
Ethan Blanton <elb@pidgin.im>
parents: 8918
diff changeset
302 }
7679
c9804d02dcab [gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7675
diff changeset
303 }
c9804d02dcab [gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7675
diff changeset
304 else if (*p == '_')
c9804d02dcab [gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7675
diff changeset
305 *n = ' ';
c9804d02dcab [gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7675
diff changeset
306 else
c9804d02dcab [gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7675
diff changeset
307 *n = *p;
c9804d02dcab [gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7675
diff changeset
308 }
c9804d02dcab [gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7675
diff changeset
309
c9804d02dcab [gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7675
diff changeset
310 *n = '\0';
c9804d02dcab [gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7675
diff changeset
311
11132
eeb2afd70f70 [gaim-migrate @ 13189]
Mark Doliner <markdoliner@pidgin.im>
parents: 11127
diff changeset
312 if (ret_len != NULL)
7679
c9804d02dcab [gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7675
diff changeset
313 *ret_len = n - new;
7722
ddcc8366697e [gaim-migrate @ 8367]
Nathan Walp <nwalp@pidgin.im>
parents: 7679
diff changeset
314
7679
c9804d02dcab [gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7675
diff changeset
315 /* Resize to take less space */
c9804d02dcab [gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7675
diff changeset
316 /* new = realloc(new, n - new); */
c9804d02dcab [gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7675
diff changeset
317
11137
cf40226ddff7 [gaim-migrate @ 13201]
Mark Doliner <markdoliner@pidgin.im>
parents: 11135
diff changeset
318 return (guchar *)new;
7679
c9804d02dcab [gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7675
diff changeset
319 }
c9804d02dcab [gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7675
diff changeset
320
c9804d02dcab [gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7675
diff changeset
321 /**************************************************************************
c9804d02dcab [gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7675
diff changeset
322 * MIME Functions
c9804d02dcab [gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7675
diff changeset
323 **************************************************************************/
c9804d02dcab [gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7675
diff changeset
324 char *
c9804d02dcab [gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7675
diff changeset
325 gaim_mime_decode_field(const char *str)
c9804d02dcab [gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7675
diff changeset
326 {
7858
d382c4189f4d [gaim-migrate @ 8512]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7840
diff changeset
327 /*
8958
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
328 * This is wing's version, partially based on revo/shx's version
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
329 * See RFC2047 [which apparently obsoletes RFC1342]
7858
d382c4189f4d [gaim-migrate @ 8512]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7840
diff changeset
330 */
8958
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
331 typedef enum {
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
332 state_start, state_equal1, state_question1,
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
333 state_charset, state_question2,
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
334 state_encoding, state_question3,
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
335 state_encoded_text, state_question4, state_equal2 = state_start
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
336 } encoded_word_state_t;
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
337 encoded_word_state_t state = state_start;
7858
d382c4189f4d [gaim-migrate @ 8512]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7840
diff changeset
338 const char *cur, *mark;
8958
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
339 const char *charset0 = NULL, *encoding0 = NULL, *encoded_text0 = NULL;
7858
d382c4189f4d [gaim-migrate @ 8512]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7840
diff changeset
340 char *n, *new;
d382c4189f4d [gaim-migrate @ 8512]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7840
diff changeset
341
8976
f4425a1dc72c [gaim-migrate @ 9750]
Ambrose Li <ambrose.li@gmail.com>
parents: 8958
diff changeset
342 /* token can be any CHAR (supposedly ISO8859-1/ISO2022), not just ASCII */
8958
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
343 #define token_char_p(c) \
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
344 (c != ' ' && !iscntrl(c) && !strchr("()<>@,;:\"/[]?.=", c))
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
345
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
346 /* But encoded-text must be ASCII; alas, isascii() may not exist */
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
347 #define encoded_text_char_p(c) \
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
348 ((c & 0x80) == 0 && c != '?' && c != ' ' && isgraph(c))
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
349
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
350 #define RECOVER_MARKED_TEXT strncpy(n, mark, cur - mark + 1); \
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
351 n += cur - mark + 1
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
352
8976
f4425a1dc72c [gaim-migrate @ 9750]
Ambrose Li <ambrose.li@gmail.com>
parents: 8958
diff changeset
353 g_return_val_if_fail(str != NULL, NULL);
f4425a1dc72c [gaim-migrate @ 9750]
Ambrose Li <ambrose.li@gmail.com>
parents: 8958
diff changeset
354
f4425a1dc72c [gaim-migrate @ 9750]
Ambrose Li <ambrose.li@gmail.com>
parents: 8958
diff changeset
355 /* NOTE: Assuming that we need just strlen(str)+1 *may* be wrong.
f4425a1dc72c [gaim-migrate @ 9750]
Ambrose Li <ambrose.li@gmail.com>
parents: 8958
diff changeset
356 * It would be wrong if one byte (in some unknown encoding) could
f4425a1dc72c [gaim-migrate @ 9750]
Ambrose Li <ambrose.li@gmail.com>
parents: 8958
diff changeset
357 * expand to >=4 bytes of UTF-8; I don't know if there are such things.
f4425a1dc72c [gaim-migrate @ 9750]
Ambrose Li <ambrose.li@gmail.com>
parents: 8958
diff changeset
358 */
7858
d382c4189f4d [gaim-migrate @ 8512]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7840
diff changeset
359 n = new = g_malloc(strlen(str) + 1);
d382c4189f4d [gaim-migrate @ 8512]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7840
diff changeset
360
d382c4189f4d [gaim-migrate @ 8512]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7840
diff changeset
361 /* Here we will be looking for encoded words and if they seem to be
d382c4189f4d [gaim-migrate @ 8512]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7840
diff changeset
362 * valid then decode them.
d382c4189f4d [gaim-migrate @ 8512]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7840
diff changeset
363 * They are of this form: =?charset?encoding?text?=
d382c4189f4d [gaim-migrate @ 8512]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7840
diff changeset
364 */
d382c4189f4d [gaim-migrate @ 8512]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7840
diff changeset
365
8958
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
366 for (cur = str, mark = NULL; *cur; cur += 1) {
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
367 switch (state) {
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
368 case state_equal1:
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
369 if (*cur == '?') {
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
370 state = state_question1;
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
371 } else {
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
372 RECOVER_MARKED_TEXT;
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
373 state = state_start;
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
374 }
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
375 break;
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
376 case state_question1:
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
377 if (token_char_p(*cur)) {
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
378 charset0 = cur;
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
379 state = state_charset;
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
380 } else { /* This should never happen */
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
381 RECOVER_MARKED_TEXT;
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
382 state = state_start;
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
383 }
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
384 break;
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
385 case state_charset:
7858
d382c4189f4d [gaim-migrate @ 8512]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7840
diff changeset
386 if (*cur == '?') {
8958
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
387 state = state_question2;
8976
f4425a1dc72c [gaim-migrate @ 9750]
Ambrose Li <ambrose.li@gmail.com>
parents: 8958
diff changeset
388 } else if (!token_char_p(*cur)) { /* This should never happen */
8958
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
389 RECOVER_MARKED_TEXT;
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
390 state = state_start;
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
391 }
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
392 break;
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
393 case state_question2:
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
394 if (token_char_p(*cur)) {
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
395 encoding0 = cur;
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
396 state = state_encoding;
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
397 } else { /* This should never happen */
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
398 RECOVER_MARKED_TEXT;
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
399 state = state_start;
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
400 }
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
401 break;
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
402 case state_encoding:
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
403 if (*cur == '?') {
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
404 state = state_question3;
8976
f4425a1dc72c [gaim-migrate @ 9750]
Ambrose Li <ambrose.li@gmail.com>
parents: 8958
diff changeset
405 } else if (!token_char_p(*cur)) { /* This should never happen */
8958
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
406 RECOVER_MARKED_TEXT;
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
407 state = state_start;
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
408 }
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
409 break;
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
410 case state_question3:
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
411 if (encoded_text_char_p(*cur)) {
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
412 encoded_text0 = cur;
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
413 state = state_encoded_text;
8976
f4425a1dc72c [gaim-migrate @ 9750]
Ambrose Li <ambrose.li@gmail.com>
parents: 8958
diff changeset
414 } else if (*cur == '?') { /* empty string */
f4425a1dc72c [gaim-migrate @ 9750]
Ambrose Li <ambrose.li@gmail.com>
parents: 8958
diff changeset
415 encoded_text0 = cur;
f4425a1dc72c [gaim-migrate @ 9750]
Ambrose Li <ambrose.li@gmail.com>
parents: 8958
diff changeset
416 state = state_question4;
8958
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
417 } else { /* This should never happen */
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
418 RECOVER_MARKED_TEXT;
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
419 state = state_start;
7858
d382c4189f4d [gaim-migrate @ 8512]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7840
diff changeset
420 }
8958
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
421 break;
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
422 case state_encoded_text:
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
423 if (*cur == '?') {
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
424 state = state_question4;
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
425 } else if (!encoded_text_char_p(*cur)) {
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
426 RECOVER_MARKED_TEXT;
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
427 state = state_start;
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
428 }
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
429 break;
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
430 case state_question4:
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
431 if (*cur == '=') { /* Got the whole encoded-word */
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
432 char *charset = g_strndup(charset0, encoding0 - charset0 - 1);
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
433 char *encoding = g_strndup(encoding0, encoded_text0 - encoding0 - 1);
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
434 char *encoded_text = g_strndup(encoded_text0, cur - encoded_text0 - 1);
11137
cf40226ddff7 [gaim-migrate @ 13201]
Mark Doliner <markdoliner@pidgin.im>
parents: 11135
diff changeset
435 guchar *decoded = NULL;
11127
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
436 gsize dec_len;
8958
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
437 if (g_ascii_strcasecmp(encoding, "Q") == 0)
11132
eeb2afd70f70 [gaim-migrate @ 13189]
Mark Doliner <markdoliner@pidgin.im>
parents: 11127
diff changeset
438 decoded = gaim_quotedp_decode(encoded_text, &dec_len);
8958
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
439 else if (g_ascii_strcasecmp(encoding, "B") == 0)
11127
5e539d9d26a4 [gaim-migrate @ 13183]
Mark Doliner <markdoliner@pidgin.im>
parents: 10987
diff changeset
440 decoded = gaim_base64_decode(encoded_text, &dec_len);
8958
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
441 else
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
442 decoded = NULL;
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
443 if (decoded) {
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
444 gsize len;
11132
eeb2afd70f70 [gaim-migrate @ 13189]
Mark Doliner <markdoliner@pidgin.im>
parents: 11127
diff changeset
445 char *converted = g_convert((const gchar *)decoded, dec_len, "utf-8", charset, NULL, &len, NULL);
8958
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
446
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
447 if (converted) {
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
448 n = strncpy(n, converted, len) + len;
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
449 g_free(converted);
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
450 }
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
451 g_free(decoded);
7858
d382c4189f4d [gaim-migrate @ 8512]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7840
diff changeset
452 }
8958
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
453 g_free(charset);
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
454 g_free(encoding);
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
455 g_free(encoded_text);
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
456 state = state_equal2; /* Restart the FSM */
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
457 } else { /* This should never happen */
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
458 RECOVER_MARKED_TEXT;
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
459 state = state_start;
7858
d382c4189f4d [gaim-migrate @ 8512]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7840
diff changeset
460 }
8958
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
461 break;
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
462 default:
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
463 if (*cur == '=') {
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
464 mark = cur;
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
465 state = state_equal1;
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
466 } else {
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
467 /* Some unencoded text. */
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
468 *n = *cur;
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
469 n += 1;
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
470 }
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
471 break;
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
472 } /* switch */
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
473 } /* for */
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
474
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
475 if (state != state_start) {
736060c00f48 [gaim-migrate @ 9732]
Ambrose Li <ambrose.li@gmail.com>
parents: 8929
diff changeset
476 RECOVER_MARKED_TEXT;
7858
d382c4189f4d [gaim-migrate @ 8512]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7840
diff changeset
477 }
d382c4189f4d [gaim-migrate @ 8512]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7840
diff changeset
478 *n = '\0';
d382c4189f4d [gaim-migrate @ 8512]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7840
diff changeset
479
d382c4189f4d [gaim-migrate @ 8512]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7840
diff changeset
480 return new;
7840
6a145f8cea82 [gaim-migrate @ 8493]
Mark Doliner <markdoliner@pidgin.im>
parents: 7824
diff changeset
481 }
7824
8ac3a78f2ec0 [gaim-migrate @ 8476]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7820
diff changeset
482
7679
c9804d02dcab [gaim-migrate @ 8323]
Felipe Contreras <felipe.contreras@gmail.com>
parents: 7675
diff changeset
483
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
484 /**************************************************************************
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
485 * Date/Time Functions
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
486 **************************************************************************/
13105
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
487 const char *
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
488 gaim_utf8_strftime(const char *format, const struct tm *tm)
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
489 {
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
490 static char buf[128];
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
491 char *utf8;
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
492
13120
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
493 g_return_val_if_fail(format != NULL, NULL);
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
494
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
495 if (tm == NULL)
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
496 {
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
497 time_t now = time(NULL);
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
498 tm = localtime(&now);
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
499 }
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
500
13116
677ff68a65af [gaim-migrate @ 15477]
Richard Laager <rlaager@pidgin.im>
parents: 13105
diff changeset
501 /* A return value of 0 is either an error (in
677ff68a65af [gaim-migrate @ 15477]
Richard Laager <rlaager@pidgin.im>
parents: 13105
diff changeset
502 * which case, the contents of the buffer are
677ff68a65af [gaim-migrate @ 15477]
Richard Laager <rlaager@pidgin.im>
parents: 13105
diff changeset
503 * undefined) or the empty string (in which
677ff68a65af [gaim-migrate @ 15477]
Richard Laager <rlaager@pidgin.im>
parents: 13105
diff changeset
504 * case, no harm is done here). */
677ff68a65af [gaim-migrate @ 15477]
Richard Laager <rlaager@pidgin.im>
parents: 13105
diff changeset
505 if (strftime(buf, sizeof(buf), format, tm) == 0)
677ff68a65af [gaim-migrate @ 15477]
Richard Laager <rlaager@pidgin.im>
parents: 13105
diff changeset
506 {
13117
e2ca7d501e45 [gaim-migrate @ 15478]
Richard Laager <rlaager@pidgin.im>
parents: 13116
diff changeset
507 buf[0] = '\0';
13116
677ff68a65af [gaim-migrate @ 15477]
Richard Laager <rlaager@pidgin.im>
parents: 13105
diff changeset
508 return buf;
677ff68a65af [gaim-migrate @ 15477]
Richard Laager <rlaager@pidgin.im>
parents: 13105
diff changeset
509 }
13105
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
510
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
511 if ((utf8 = gaim_utf8_try_convert(buf)))
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
512 {
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
513 gaim_strlcpy(buf, utf8);
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
514 g_free(utf8);
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
515 }
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
516
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
517 return buf;
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
518 }
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
519
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
520 const char *
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
521 gaim_date_format_short(const struct tm *tm)
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
522 {
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
523 return gaim_utf8_strftime("%x", tm);
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
524 }
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
525
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
526 const char *
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
527 gaim_date_format_long(const struct tm *tm)
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
528 {
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
529 return gaim_utf8_strftime(_("%x %X"), tm);
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
530 }
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
531
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
532 const char *
13120
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
533 gaim_date_format_full(const struct tm *tm)
13105
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
534 {
13120
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
535 return gaim_utf8_strftime("%c", tm);
13105
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
536 }
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
537
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
538 const char *
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
539 gaim_time_format(const struct tm *tm)
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
540 {
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
541 return gaim_utf8_strftime("%X", tm);
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
542 }
3630
caa952062dc2 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3572
diff changeset
543
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
544 time_t
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
545 gaim_time_build(int year, int month, int day, int hour, int min, int sec)
1805
c2aeee08d50e [gaim-migrate @ 1815]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1753
diff changeset
546 {
c2aeee08d50e [gaim-migrate @ 1815]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1753
diff changeset
547 struct tm tm;
c2aeee08d50e [gaim-migrate @ 1815]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1753
diff changeset
548
c2aeee08d50e [gaim-migrate @ 1815]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1753
diff changeset
549 tm.tm_year = year - 1900;
c2aeee08d50e [gaim-migrate @ 1815]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1753
diff changeset
550 tm.tm_mon = month - 1;
c2aeee08d50e [gaim-migrate @ 1815]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1753
diff changeset
551 tm.tm_mday = day;
c2aeee08d50e [gaim-migrate @ 1815]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1753
diff changeset
552 tm.tm_hour = hour;
c2aeee08d50e [gaim-migrate @ 1815]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1753
diff changeset
553 tm.tm_min = min;
c2aeee08d50e [gaim-migrate @ 1815]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1753
diff changeset
554 tm.tm_sec = sec >= 0 ? sec : time(NULL) % 60;
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
555
1805
c2aeee08d50e [gaim-migrate @ 1815]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1753
diff changeset
556 return mktime(&tm);
c2aeee08d50e [gaim-migrate @ 1815]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents: 1753
diff changeset
557 }
3230
6d0e07333504 [gaim-migrate @ 3247]
Jim Seymour <jseymour@users.sourceforge.net>
parents: 3153
diff changeset
558
8577
64f25a17f8e4 [gaim-migrate @ 9326]
Nathan Walp <nwalp@pidgin.im>
parents: 8561
diff changeset
559 time_t
13120
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
560 gaim_str_to_time(const char *timestamp, gboolean utc,
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
561 struct tm *tm, long *tz_off, const char **rest)
8577
64f25a17f8e4 [gaim-migrate @ 9326]
Nathan Walp <nwalp@pidgin.im>
parents: 8561
diff changeset
562 {
9722
c1072806bcae [gaim-migrate @ 10583]
Mark Doliner <markdoliner@pidgin.im>
parents: 9716
diff changeset
563 time_t retval = 0;
9716
4011c0d5f384 [gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents: 9696
diff changeset
564 struct tm *t;
13120
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
565 const char *c = timestamp;
13105
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
566 int year = 0;
13120
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
567 long tzoff = GAIM_NO_TZ_OFF;
9716
4011c0d5f384 [gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents: 9696
diff changeset
568
4011c0d5f384 [gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents: 9696
diff changeset
569 time(&retval);
4011c0d5f384 [gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents: 9696
diff changeset
570 t = localtime(&retval);
4011c0d5f384 [gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents: 9696
diff changeset
571
4011c0d5f384 [gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents: 9696
diff changeset
572 /* 4 digit year */
13105
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
573 if (sscanf(c, "%04d", &year) && year > 1900)
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
574 {
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
575 c += 4;
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
576 if (*c == '-')
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
577 c++;
13118
e83cc0037d7d [gaim-migrate @ 15479]
Richard Laager <rlaager@pidgin.im>
parents: 13117
diff changeset
578 t->tm_year = year - 1900;
13105
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
579 }
8577
64f25a17f8e4 [gaim-migrate @ 9326]
Nathan Walp <nwalp@pidgin.im>
parents: 8561
diff changeset
580
64f25a17f8e4 [gaim-migrate @ 9326]
Nathan Walp <nwalp@pidgin.im>
parents: 8561
diff changeset
581 /* 2 digit month */
13105
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
582 if (!sscanf(c, "%02d", &t->tm_mon))
13120
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
583 {
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
584 if (rest != NULL && *c != '\0')
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
585 *rest = c;
13105
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
586 return 0;
13120
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
587 }
9716
4011c0d5f384 [gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents: 9696
diff changeset
588 c += 2;
13105
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
589 if (*c == '-' || *c == '/')
8577
64f25a17f8e4 [gaim-migrate @ 9326]
Nathan Walp <nwalp@pidgin.im>
parents: 8561
diff changeset
590 c++;
9716
4011c0d5f384 [gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents: 9696
diff changeset
591 t->tm_mon -= 1;
4011c0d5f384 [gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents: 9696
diff changeset
592
4011c0d5f384 [gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents: 9696
diff changeset
593 /* 2 digit day */
13105
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
594 if (!sscanf(c, "%02d", &t->tm_mday))
13120
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
595 {
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
596 if (rest != NULL && *c != '\0')
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
597 *rest = c;
13105
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
598 return 0;
13120
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
599 }
9716
4011c0d5f384 [gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents: 9696
diff changeset
600 c += 2;
13105
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
601 if (*c == '/')
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
602 {
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
603 c++;
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
604
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
605 if (!sscanf(c, "%04d", &t->tm_year))
13120
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
606 {
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
607 if (rest != NULL && *c != '\0')
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
608 *rest = c;
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
609 return 0;
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
610 }
13105
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
611 t->tm_year -= 1900;
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
612 }
13120
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
613 else if (*c == 'T' || *c == '.')
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
614 {
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
615 c++;
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
616 /* we have more than a date, keep going */
9725
4383542a4291 [gaim-migrate @ 10586]
Mark Doliner <markdoliner@pidgin.im>
parents: 9722
diff changeset
617
4383542a4291 [gaim-migrate @ 10586]
Mark Doliner <markdoliner@pidgin.im>
parents: 9722
diff changeset
618 /* 2 digit hour */
13120
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
619 if ((sscanf(c, "%02d:%02d:%02d", &t->tm_hour, &t->tm_min, &t->tm_sec) == 3 && (c = c + 8)) ||
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
620 (sscanf(c, "%02d%02d%02d", &t->tm_hour, &t->tm_min, &t->tm_sec) == 3 && (c = c + 6)))
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
621 {
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
622 gboolean offset_positive = FALSE;
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
623 int tzhrs;
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
624 int tzmins;
9716
4011c0d5f384 [gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents: 9696
diff changeset
625
10876
276eb05e6276 [gaim-migrate @ 12567]
Nathan Walp <nwalp@pidgin.im>
parents: 10871
diff changeset
626 t->tm_isdst = -1;
276eb05e6276 [gaim-migrate @ 12567]
Nathan Walp <nwalp@pidgin.im>
parents: 10871
diff changeset
627
13120
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
628 if (*c == '.' && *(c+1) >= '0' && *(c+1) <= '9') /* dealing with precision we don't care about */
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
629 c += 4;
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
630 if (*c == '+')
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
631 offset_positive = TRUE;
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
632 if (((*c == '+' || *c == '-') && (c = c + 1)) &&
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
633 ((sscanf(c, "%02d:%02d", &tzhrs, &tzmins) == 2 && (c = c + 5)) ||
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
634 (sscanf(c, "%02d%02d", &tzhrs, &tzmins) == 2 && (c = c + 4))))
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
635 {
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
636 tzoff = tzhrs*60*60 + tzmins*60;
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
637 if (offset_positive)
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
638 tzoff *= -1;
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
639 /* We don't want the C library doing DST calculations
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
640 * if we know the UTC offset already. */
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
641 t->tm_isdst = 0;
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
642 }
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
643
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
644 if (rest != NULL && *c != '\0')
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
645 {
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
646 if (*c == ' ')
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
647 c++;
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
648 if (*c != '\0')
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
649 *rest = c;
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
650 }
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
651
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
652 if (tzoff != GAIM_NO_TZ_OFF || utc)
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
653 {
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
654 #if defined(_WIN32) || defined(HAVE_TM_GMTOFF) || defined (HAVE_TIMEZONE)
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
655 if (tzoff == GAIM_NO_TZ_OFF)
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
656 tzoff = 0;
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
657 #endif
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
658
10987
50b656536923 [gaim-migrate @ 12824]
Daniel Atallah <datallah@pidgin.im>
parents: 10948
diff changeset
659 #ifdef _WIN32
50b656536923 [gaim-migrate @ 12824]
Daniel Atallah <datallah@pidgin.im>
parents: 10948
diff changeset
660 TIME_ZONE_INFORMATION tzi;
50b656536923 [gaim-migrate @ 12824]
Daniel Atallah <datallah@pidgin.im>
parents: 10948
diff changeset
661 DWORD ret;
13120
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
662 if ((ret = GetTimeZoneInformation(&tzi)) != TIME_ZONE_ID_INVALID)
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
663 {
10987
50b656536923 [gaim-migrate @ 12824]
Daniel Atallah <datallah@pidgin.im>
parents: 10948
diff changeset
664 tzoff -= tzi.Bias * 60;
13120
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
665 if (ret == TIME_ZONE_ID_DAYLIGHT)
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
666 {
10987
50b656536923 [gaim-migrate @ 12824]
Daniel Atallah <datallah@pidgin.im>
parents: 10948
diff changeset
667 tzoff -= tzi.DaylightBias * 60;
50b656536923 [gaim-migrate @ 12824]
Daniel Atallah <datallah@pidgin.im>
parents: 10948
diff changeset
668 }
50b656536923 [gaim-migrate @ 12824]
Daniel Atallah <datallah@pidgin.im>
parents: 10948
diff changeset
669 }
13120
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
670 else
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
671 tzoff = GAIM_NO_TZ_OFF;
10987
50b656536923 [gaim-migrate @ 12824]
Daniel Atallah <datallah@pidgin.im>
parents: 10948
diff changeset
672 #else
8577
64f25a17f8e4 [gaim-migrate @ 9326]
Nathan Walp <nwalp@pidgin.im>
parents: 8561
diff changeset
673 #ifdef HAVE_TM_GMTOFF
9716
4011c0d5f384 [gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents: 9696
diff changeset
674 tzoff += t->tm_gmtoff;
8577
64f25a17f8e4 [gaim-migrate @ 9326]
Nathan Walp <nwalp@pidgin.im>
parents: 8561
diff changeset
675 #else
9716
4011c0d5f384 [gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents: 9696
diff changeset
676 # ifdef HAVE_TIMEZONE
4011c0d5f384 [gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents: 9696
diff changeset
677 tzset(); /* making sure */
4011c0d5f384 [gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents: 9696
diff changeset
678 tzoff -= timezone;
4011c0d5f384 [gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents: 9696
diff changeset
679 # endif
8577
64f25a17f8e4 [gaim-migrate @ 9326]
Nathan Walp <nwalp@pidgin.im>
parents: 8561
diff changeset
680 #endif
10987
50b656536923 [gaim-migrate @ 12824]
Daniel Atallah <datallah@pidgin.im>
parents: 10948
diff changeset
681 #endif /* _WIN32 */
8577
64f25a17f8e4 [gaim-migrate @ 9326]
Nathan Walp <nwalp@pidgin.im>
parents: 8561
diff changeset
682 }
9716
4011c0d5f384 [gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents: 9696
diff changeset
683 }
13120
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
684 else
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
685 {
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
686 if (*rest != NULL && *c != '\0')
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
687 *rest = c;
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
688 }
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
689 }
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
690
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
691 if (tm != NULL)
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
692 {
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
693 *tm = *t;
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
694 tm->tm_isdst = -1;
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
695 mktime(tm);
9716
4011c0d5f384 [gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents: 9696
diff changeset
696 }
4011c0d5f384 [gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents: 9696
diff changeset
697
4011c0d5f384 [gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents: 9696
diff changeset
698 retval = mktime(t);
13120
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
699 if (tzoff != GAIM_NO_TZ_OFF)
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
700 retval += tzoff;
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
701
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
702 if (tz_off != NULL)
c25222322810 [gaim-migrate @ 15481]
Richard Laager <rlaager@pidgin.im>
parents: 13118
diff changeset
703 *tz_off = tzoff;
9716
4011c0d5f384 [gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents: 9696
diff changeset
704
4011c0d5f384 [gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents: 9696
diff changeset
705 return retval;
8577
64f25a17f8e4 [gaim-migrate @ 9326]
Nathan Walp <nwalp@pidgin.im>
parents: 8561
diff changeset
706 }
64f25a17f8e4 [gaim-migrate @ 9326]
Nathan Walp <nwalp@pidgin.im>
parents: 8561
diff changeset
707
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
708 /**************************************************************************
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
709 * Markup Functions
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
710 **************************************************************************/
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
711 gboolean
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
712 gaim_markup_find_tag(const char *needle, const char *haystack,
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
713 const char **start, const char **end, GData **attributes)
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
714 {
6982
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
715 GData *attribs;
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
716 const char *cur = haystack;
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
717 char *name = NULL;
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
718 gboolean found = FALSE;
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
719 gboolean in_tag = FALSE;
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
720 gboolean in_attr = FALSE;
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
721 const char *in_quotes = NULL;
7804
125cc377a21c [gaim-migrate @ 8451]
Robert McQueen <robot101@debian.org>
parents: 7722
diff changeset
722 size_t needlelen;
6982
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
723
7804
125cc377a21c [gaim-migrate @ 8451]
Robert McQueen <robot101@debian.org>
parents: 7722
diff changeset
724 g_return_val_if_fail( needle != NULL, FALSE);
125cc377a21c [gaim-migrate @ 8451]
Robert McQueen <robot101@debian.org>
parents: 7722
diff changeset
725 g_return_val_if_fail( *needle != '\0', FALSE);
125cc377a21c [gaim-migrate @ 8451]
Robert McQueen <robot101@debian.org>
parents: 7722
diff changeset
726 g_return_val_if_fail( haystack != NULL, FALSE);
125cc377a21c [gaim-migrate @ 8451]
Robert McQueen <robot101@debian.org>
parents: 7722
diff changeset
727 g_return_val_if_fail( *haystack != '\0', FALSE);
125cc377a21c [gaim-migrate @ 8451]
Robert McQueen <robot101@debian.org>
parents: 7722
diff changeset
728 g_return_val_if_fail( start != NULL, FALSE);
125cc377a21c [gaim-migrate @ 8451]
Robert McQueen <robot101@debian.org>
parents: 7722
diff changeset
729 g_return_val_if_fail( end != NULL, FALSE);
125cc377a21c [gaim-migrate @ 8451]
Robert McQueen <robot101@debian.org>
parents: 7722
diff changeset
730 g_return_val_if_fail(attributes != NULL, FALSE);
125cc377a21c [gaim-migrate @ 8451]
Robert McQueen <robot101@debian.org>
parents: 7722
diff changeset
731
125cc377a21c [gaim-migrate @ 8451]
Robert McQueen <robot101@debian.org>
parents: 7722
diff changeset
732 needlelen = strlen(needle);
6982
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
733 g_datalist_init(&attribs);
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
734
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
735 while (*cur && !found) {
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
736 if (in_tag) {
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
737 if (in_quotes) {
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
738 const char *close = cur;
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
739
7078
0d63d673f170 [gaim-migrate @ 7643]
Nathan Walp <nwalp@pidgin.im>
parents: 7000
diff changeset
740 while (*close && *close != *in_quotes)
6982
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
741 close++;
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
742
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
743 /* if we got the close quote, store the value and carry on from *
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
744 * after it. if we ran to the end of the string, point to the NULL *
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
745 * and we're outta here */
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
746 if (*close) {
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
747 /* only store a value if we have an attribute name */
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
748 if (name) {
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
749 size_t len = close - cur;
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
750 char *val = g_strndup(cur, len);
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
751
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
752 g_datalist_set_data_full(&attribs, name, val, g_free);
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
753 g_free(name);
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
754 name = NULL;
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
755 }
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
756
7078
0d63d673f170 [gaim-migrate @ 7643]
Nathan Walp <nwalp@pidgin.im>
parents: 7000
diff changeset
757 in_quotes = NULL;
6982
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
758 cur = close + 1;
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
759 } else {
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
760 cur = close;
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
761 }
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
762 } else if (in_attr) {
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
763 const char *close = cur;
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
764
7078
0d63d673f170 [gaim-migrate @ 7643]
Nathan Walp <nwalp@pidgin.im>
parents: 7000
diff changeset
765 while (*close && *close != '>' && *close != '"' &&
0d63d673f170 [gaim-migrate @ 7643]
Nathan Walp <nwalp@pidgin.im>
parents: 7000
diff changeset
766 *close != '\'' && *close != ' ' && *close != '=')
6982
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
767 close++;
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
768
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
769 /* if we got the equals, store the name of the attribute. if we got
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
770 * the quote, save the attribute and go straight to quote mode.
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
771 * otherwise the tag closed or we reached the end of the string,
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
772 * so we can get outta here */
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
773 switch (*close) {
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
774 case '"':
7078
0d63d673f170 [gaim-migrate @ 7643]
Nathan Walp <nwalp@pidgin.im>
parents: 7000
diff changeset
775 case '\'':
0d63d673f170 [gaim-migrate @ 7643]
Nathan Walp <nwalp@pidgin.im>
parents: 7000
diff changeset
776 in_quotes = close;
6982
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
777 case '=':
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
778 {
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
779 size_t len = close - cur;
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
780
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
781 /* don't store a blank attribute name */
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
782 if (len) {
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
783 if (name)
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
784 g_free(name);
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
785 name = g_ascii_strdown(cur, len);
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
786 }
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
787
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
788 in_attr = FALSE;
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
789 cur = close + 1;
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
790 break;
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
791 }
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
792 case ' ':
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
793 case '>':
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
794 in_attr = FALSE;
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
795 default:
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
796 cur = close;
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
797 break;
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
798 }
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
799 } else {
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
800 switch (*cur) {
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
801 case ' ':
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
802 /* swallow extra spaces inside tag */
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
803 while (*cur && *cur == ' ') cur++;
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
804 in_attr = TRUE;
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
805 break;
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
806 case '>':
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
807 found = TRUE;
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
808 *end = cur;
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
809 break;
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
810 case '"':
7078
0d63d673f170 [gaim-migrate @ 7643]
Nathan Walp <nwalp@pidgin.im>
parents: 7000
diff changeset
811 case '\'':
0d63d673f170 [gaim-migrate @ 7643]
Nathan Walp <nwalp@pidgin.im>
parents: 7000
diff changeset
812 in_quotes = cur;
6982
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
813 default:
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
814 cur++;
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
815 break;
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
816 }
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
817 }
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
818 } else {
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
819 /* if we hit a < followed by the name of our tag... */
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
820 if (*cur == '<' && !g_ascii_strncasecmp(cur + 1, needle, needlelen)) {
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
821 *start = cur;
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
822 cur = cur + needlelen + 1;
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
823
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
824 /* if we're pointing at a space or a >, we found the right tag. if *
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
825 * we're not, we've found a longer tag, so we need to skip to the *
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
826 * >, but not being distracted by >s inside quotes. */
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
827 if (*cur == ' ' || *cur == '>') {
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
828 in_tag = TRUE;
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
829 } else {
7804
125cc377a21c [gaim-migrate @ 8451]
Robert McQueen <robot101@debian.org>
parents: 7722
diff changeset
830 while (*cur && *cur != '"' && *cur != '\'' && *cur != '>') {
6982
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
831 if (*cur == '"') {
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
832 cur++;
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
833 while (*cur && *cur != '"')
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
834 cur++;
7804
125cc377a21c [gaim-migrate @ 8451]
Robert McQueen <robot101@debian.org>
parents: 7722
diff changeset
835 } else if (*cur == '\'') {
125cc377a21c [gaim-migrate @ 8451]
Robert McQueen <robot101@debian.org>
parents: 7722
diff changeset
836 cur++;
125cc377a21c [gaim-migrate @ 8451]
Robert McQueen <robot101@debian.org>
parents: 7722
diff changeset
837 while (*cur && *cur != '\'')
125cc377a21c [gaim-migrate @ 8451]
Robert McQueen <robot101@debian.org>
parents: 7722
diff changeset
838 cur++;
6982
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
839 } else {
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
840 cur++;
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
841 }
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
842 }
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
843 }
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
844 } else {
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
845 cur++;
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
846 }
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
847 }
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
848 }
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
849
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
850 /* clean up any attribute name from a premature termination */
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
851 if (name)
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
852 g_free(name);
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
853
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
854 if (found) {
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
855 *attributes = attribs;
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
856 } else {
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
857 *start = NULL;
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
858 *end = NULL;
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
859 *attributes = NULL;
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
860 }
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
861
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
862 return found;
12f08de92674 [gaim-migrate @ 7538]
Mark Doliner <markdoliner@pidgin.im>
parents: 6872
diff changeset
863 }
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
864
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
865 gboolean
7675
8058cedec7a2 [gaim-migrate @ 8319]
Tim Ringenbach <marv@pidgin.im>
parents: 7673
diff changeset
866 gaim_markup_extract_info_field(const char *str, int len, GString *dest,
7095
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
867 const char *start_token, int skip,
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
868 const char *end_token, char check_value,
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
869 const char *no_value_token,
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
870 const char *display_name, gboolean is_link,
13105
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
871 const char *link_prefix,
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
872 GaimInfoFieldFormatCallback format_cb)
7095
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
873 {
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
874 const char *p, *q;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
875
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
876 g_return_val_if_fail(str != NULL, FALSE);
7675
8058cedec7a2 [gaim-migrate @ 8319]
Tim Ringenbach <marv@pidgin.im>
parents: 7673
diff changeset
877 g_return_val_if_fail(dest != NULL, FALSE);
7095
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
878 g_return_val_if_fail(start_token != NULL, FALSE);
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
879 g_return_val_if_fail(end_token != NULL, FALSE);
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
880 g_return_val_if_fail(display_name != NULL, FALSE);
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
881
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
882 p = strstr(str, start_token);
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
883
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
884 if (p == NULL)
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
885 return FALSE;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
886
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
887 p += strlen(start_token) + skip;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
888
7675
8058cedec7a2 [gaim-migrate @ 8319]
Tim Ringenbach <marv@pidgin.im>
parents: 7673
diff changeset
889 if (p >= str + len)
8058cedec7a2 [gaim-migrate @ 8319]
Tim Ringenbach <marv@pidgin.im>
parents: 7673
diff changeset
890 return FALSE;
8058cedec7a2 [gaim-migrate @ 8319]
Tim Ringenbach <marv@pidgin.im>
parents: 7673
diff changeset
891
7095
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
892 if (check_value != '\0' && *p == check_value)
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
893 return FALSE;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
894
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
895 q = strstr(p, end_token);
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
896
9161
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
897 /* Trim leading blanks */
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
898 while (*p != '\n' && g_ascii_isspace(*p)) {
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
899 p += 1;
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
900 }
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
901
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
902 /* Trim trailing blanks */
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
903 while (q > p && g_ascii_isspace(*(q - 1))) {
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
904 q -= 1;
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
905 }
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
906
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
907 /* Don't bother with null strings */
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
908 if (p == q)
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
909 return FALSE;
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
910
7095
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
911 if (q != NULL && (!no_value_token ||
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
912 (no_value_token && strncmp(p, no_value_token,
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
913 strlen(no_value_token)))))
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
914 {
9220
d8b1478a406e [gaim-migrate @ 10016]
Tim Ringenbach <marv@pidgin.im>
parents: 9175
diff changeset
915 g_string_append_printf(dest, _("<b>%s:</b> "), display_name);
7095
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
916
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
917 if (is_link)
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
918 {
7675
8058cedec7a2 [gaim-migrate @ 8319]
Tim Ringenbach <marv@pidgin.im>
parents: 7673
diff changeset
919 g_string_append(dest, "<br><a href=\"");
7095
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
920
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
921 if (link_prefix)
7675
8058cedec7a2 [gaim-migrate @ 8319]
Tim Ringenbach <marv@pidgin.im>
parents: 7673
diff changeset
922 g_string_append(dest, link_prefix);
7095
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
923
13105
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
924 if (format_cb != NULL)
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
925 {
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
926 char *reformatted = format_cb(p, q - p);
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
927 g_string_append(dest, reformatted);
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
928 g_free(reformatted);
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
929 }
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
930 else
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
931 g_string_append_len(dest, p, q - p);
7675
8058cedec7a2 [gaim-migrate @ 8319]
Tim Ringenbach <marv@pidgin.im>
parents: 7673
diff changeset
932 g_string_append(dest, "\">");
7095
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
933
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
934 if (link_prefix)
7675
8058cedec7a2 [gaim-migrate @ 8319]
Tim Ringenbach <marv@pidgin.im>
parents: 7673
diff changeset
935 g_string_append(dest, link_prefix);
7095
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
936
7675
8058cedec7a2 [gaim-migrate @ 8319]
Tim Ringenbach <marv@pidgin.im>
parents: 7673
diff changeset
937 g_string_append_len(dest, p, q - p);
8058cedec7a2 [gaim-migrate @ 8319]
Tim Ringenbach <marv@pidgin.im>
parents: 7673
diff changeset
938 g_string_append(dest, "</a>");
7095
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
939 }
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
940 else
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
941 {
13105
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
942 if (format_cb != NULL)
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
943 {
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
944 char *reformatted = format_cb(p, q - p);
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
945 g_string_append(dest, reformatted);
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
946 g_free(reformatted);
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
947 }
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
948 else
8f9c66e4af87 [gaim-migrate @ 15466]
Richard Laager <rlaager@pidgin.im>
parents: 13103
diff changeset
949 g_string_append_len(dest, p, q - p);
7095
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
950 }
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
951
7675
8058cedec7a2 [gaim-migrate @ 8319]
Tim Ringenbach <marv@pidgin.im>
parents: 7673
diff changeset
952 g_string_append(dest, "<br>\n");
7095
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
953
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
954 return TRUE;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
955 }
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
956
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
957 return FALSE;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
958 }
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
959
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
960 struct gaim_parse_tag {
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
961 char *src_tag;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
962 char *dest_tag;
8064
f5115590887b [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
963 gboolean ignore;
7095
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
964 };
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
965
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
966 #define ALLOW_TAG_ALT(x, y) if(!g_ascii_strncasecmp(c, "<" x " ", strlen("<" x " "))) { \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
967 const char *o = c + strlen("<" x); \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
968 const char *p = NULL, *q = NULL, *r = NULL; \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
969 GString *innards = g_string_new(""); \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
970 while(o && *o) { \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
971 if(!q && (*o == '\"' || *o == '\'') ) { \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
972 q = o; \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
973 } else if(q) { \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
974 if(*o == *q) { \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
975 char *unescaped = g_strndup(q+1, o-q-1); \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
976 char *escaped = g_markup_escape_text(unescaped, -1); \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
977 g_string_append_printf(innards, "%c%s%c", *q, escaped, *q); \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
978 g_free(unescaped); \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
979 g_free(escaped); \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
980 q = NULL; \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
981 } else if(*c == '\\') { \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
982 o++; \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
983 } \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
984 } else if(*o == '<') { \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
985 r = o; \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
986 } else if(*o == '>') { \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
987 p = o; \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
988 break; \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
989 } else { \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
990 innards = g_string_append_c(innards, *o); \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
991 } \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
992 o++; \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
993 } \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
994 if(p && !r) { \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
995 if(*(p-1) != '/') { \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
996 struct gaim_parse_tag *pt = g_new0(struct gaim_parse_tag, 1); \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
997 pt->src_tag = x; \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
998 pt->dest_tag = y; \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
999 tags = g_list_prepend(tags, pt); \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1000 } \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1001 xhtml = g_string_append(xhtml, "<" y); \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1002 c += strlen("<" x ); \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1003 xhtml = g_string_append(xhtml, innards->str); \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1004 xhtml = g_string_append_c(xhtml, '>'); \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1005 c = p + 1; \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1006 } else { \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1007 xhtml = g_string_append(xhtml, "&lt;"); \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1008 plain = g_string_append_c(plain, '<'); \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1009 c++; \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1010 } \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1011 g_string_free(innards, TRUE); \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1012 continue; \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1013 } \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1014 if(!g_ascii_strncasecmp(c, "<" x, strlen("<" x)) && \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1015 (*(c+strlen("<" x)) == '>' || \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1016 !g_ascii_strncasecmp(c+strlen("<" x), "/>", 2))) { \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1017 xhtml = g_string_append(xhtml, "<" y); \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1018 c += strlen("<" x); \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1019 if(*c != '/') { \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1020 struct gaim_parse_tag *pt = g_new0(struct gaim_parse_tag, 1); \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1021 pt->src_tag = x; \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1022 pt->dest_tag = y; \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1023 tags = g_list_prepend(tags, pt); \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1024 xhtml = g_string_append_c(xhtml, '>'); \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1025 } else { \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1026 xhtml = g_string_append(xhtml, "/>");\
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1027 } \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1028 c = strchr(c, '>') + 1; \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1029 continue; \
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1030 }
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1031 #define ALLOW_TAG(x) ALLOW_TAG_ALT(x, x)
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1032 void
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1033 gaim_markup_html_to_xhtml(const char *html, char **xhtml_out,
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1034 char **plain_out)
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1035 {
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1036 GString *xhtml = g_string_new("");
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1037 GString *plain = g_string_new("");
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1038 GList *tags = NULL, *tag;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1039 const char *c = html;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1040
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1041 while(c && *c) {
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1042 if(*c == '<') {
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1043 if(*(c+1) == '/') { /* closing tag */
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1044 tag = tags;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1045 while(tag) {
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1046 struct gaim_parse_tag *pt = tag->data;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1047 if(!g_ascii_strncasecmp((c+2), pt->src_tag, strlen(pt->src_tag)) && *(c+strlen(pt->src_tag)+2) == '>') {
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1048 c += strlen(pt->src_tag) + 3;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1049 break;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1050 }
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1051 tag = tag->next;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1052 }
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1053 if(tag) {
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1054 while(tags) {
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1055 struct gaim_parse_tag *pt = tags->data;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1056 g_string_append_printf(xhtml, "</%s>", pt->dest_tag);
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1057 if(tags == tag)
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1058 break;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1059 tags = g_list_remove(tags, pt);
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1060 g_free(pt);
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1061 }
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1062 g_free(tag->data);
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1063 tags = g_list_remove(tags, tag->data);
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1064 } else {
8534
cd92b7af7e12 [gaim-migrate @ 9273]
Nathan Walp <nwalp@pidgin.im>
parents: 8517
diff changeset
1065 /* a closing tag we weren't expecting...
cd92b7af7e12 [gaim-migrate @ 9273]
Nathan Walp <nwalp@pidgin.im>
parents: 8517
diff changeset
1066 * we'll let it slide, if it's really a tag...if it's
cd92b7af7e12 [gaim-migrate @ 9273]
Nathan Walp <nwalp@pidgin.im>
parents: 8517
diff changeset
1067 * just a </ we'll escape it properly */
cd92b7af7e12 [gaim-migrate @ 9273]
Nathan Walp <nwalp@pidgin.im>
parents: 8517
diff changeset
1068 const char *end = c+2;
cd92b7af7e12 [gaim-migrate @ 9273]
Nathan Walp <nwalp@pidgin.im>
parents: 8517
diff changeset
1069 while(*end && g_ascii_isalpha(*end))
cd92b7af7e12 [gaim-migrate @ 9273]
Nathan Walp <nwalp@pidgin.im>
parents: 8517
diff changeset
1070 end++;
cd92b7af7e12 [gaim-migrate @ 9273]
Nathan Walp <nwalp@pidgin.im>
parents: 8517
diff changeset
1071 if(*end == '>') {
cd92b7af7e12 [gaim-migrate @ 9273]
Nathan Walp <nwalp@pidgin.im>
parents: 8517
diff changeset
1072 c = end+1;
cd92b7af7e12 [gaim-migrate @ 9273]
Nathan Walp <nwalp@pidgin.im>
parents: 8517
diff changeset
1073 } else {
cd92b7af7e12 [gaim-migrate @ 9273]
Nathan Walp <nwalp@pidgin.im>
parents: 8517
diff changeset
1074 xhtml = g_string_append(xhtml, "&lt;");
cd92b7af7e12 [gaim-migrate @ 9273]
Nathan Walp <nwalp@pidgin.im>
parents: 8517
diff changeset
1075 plain = g_string_append_c(plain, '<');
cd92b7af7e12 [gaim-migrate @ 9273]
Nathan Walp <nwalp@pidgin.im>
parents: 8517
diff changeset
1076 c++;
cd92b7af7e12 [gaim-migrate @ 9273]
Nathan Walp <nwalp@pidgin.im>
parents: 8517
diff changeset
1077 }
7095
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1078 }
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1079 } else { /* opening tag */
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1080 ALLOW_TAG("a");
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1081 ALLOW_TAG_ALT("b", "strong");
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1082 ALLOW_TAG("blockquote");
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1083 ALLOW_TAG_ALT("bold", "strong");
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1084 ALLOW_TAG("cite");
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1085 ALLOW_TAG("div");
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1086 ALLOW_TAG("em");
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1087 ALLOW_TAG("h1");
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1088 ALLOW_TAG("h2");
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1089 ALLOW_TAG("h3");
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1090 ALLOW_TAG("h4");
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1091 ALLOW_TAG("h5");
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1092 ALLOW_TAG("h6");
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1093 /* we only allow html to start the message */
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1094 if(c == html)
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1095 ALLOW_TAG("html");
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1096 ALLOW_TAG_ALT("i", "em");
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1097 ALLOW_TAG_ALT("italic", "em");
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1098 ALLOW_TAG("li");
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1099 ALLOW_TAG("ol");
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1100 ALLOW_TAG("p");
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1101 ALLOW_TAG("pre");
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1102 ALLOW_TAG("q");
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1103 ALLOW_TAG("span");
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1104 ALLOW_TAG("strong");
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1105 ALLOW_TAG("ul");
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1106
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1107 /* we skip <HR> because it's not legal in XHTML-IM. However,
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1108 * we still want to send something sensible, so we put a
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1109 * linebreak in its place. <BR> also needs special handling
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1110 * because putting a </BR> to close it would just be dumb. */
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1111 if((!g_ascii_strncasecmp(c, "<br", 3)
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1112 || !g_ascii_strncasecmp(c, "<hr", 3))
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1113 && (*(c+3) == '>' ||
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1114 !g_ascii_strncasecmp(c+3, "/>", 2) ||
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1115 !g_ascii_strncasecmp(c+3, " />", 3))) {
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1116 c = strchr(c, '>') + 1;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1117 xhtml = g_string_append(xhtml, "<br/>");
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1118 if(*c != '\n')
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1119 plain = g_string_append_c(plain, '\n');
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1120 continue;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1121 }
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1122 if(!g_ascii_strncasecmp(c, "<u>", 3) || !g_ascii_strncasecmp(c, "<underline>", strlen("<underline>"))) {
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1123 struct gaim_parse_tag *pt = g_new0(struct gaim_parse_tag, 1);
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1124 pt->src_tag = *(c+2) == '>' ? "u" : "underline";
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1125 pt->dest_tag = "span";
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1126 tags = g_list_prepend(tags, pt);
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1127 c = strchr(c, '>') + 1;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1128 xhtml = g_string_append(xhtml, "<span style='text-decoration: underline;'>");
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1129 continue;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1130 }
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1131 if(!g_ascii_strncasecmp(c, "<s>", 3) || !g_ascii_strncasecmp(c, "<strike>", strlen("<strike>"))) {
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1132 struct gaim_parse_tag *pt = g_new0(struct gaim_parse_tag, 1);
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1133 pt->src_tag = *(c+2) == '>' ? "s" : "strike";
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1134 pt->dest_tag = "span";
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1135 tags = g_list_prepend(tags, pt);
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1136 c = strchr(c, '>') + 1;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1137 xhtml = g_string_append(xhtml, "<span style='text-decoration: line-through;'>");
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1138 continue;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1139 }
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1140 if(!g_ascii_strncasecmp(c, "<sub>", 5)) {
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1141 struct gaim_parse_tag *pt = g_new0(struct gaim_parse_tag, 1);
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1142 pt->src_tag = "sub";
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1143 pt->dest_tag = "span";
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1144 tags = g_list_prepend(tags, pt);
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1145 c = strchr(c, '>') + 1;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1146 xhtml = g_string_append(xhtml, "<span style='vertical-align:sub;'>");
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1147 continue;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1148 }
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1149 if(!g_ascii_strncasecmp(c, "<sup>", 5)) {
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1150 struct gaim_parse_tag *pt = g_new0(struct gaim_parse_tag, 1);
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1151 pt->src_tag = "sup";
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1152 pt->dest_tag = "span";
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1153 tags = g_list_prepend(tags, pt);
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1154 c = strchr(c, '>') + 1;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1155 xhtml = g_string_append(xhtml, "<span style='vertical-align:super;'>");
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1156 continue;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1157 }
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1158 if(!g_ascii_strncasecmp(c, "<font", 5) && (*(c+5) == '>' || *(c+5) == ' ')) {
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1159 const char *p = c;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1160 GString *style = g_string_new("");
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1161 struct gaim_parse_tag *pt;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1162 while(*p && *p != '>') {
8064
f5115590887b [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1163 if(!g_ascii_strncasecmp(p, "back=", strlen("back="))) {
f5115590887b [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1164 const char *q = p + strlen("back=");
f5115590887b [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1165 GString *color = g_string_new("");
f5115590887b [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1166 if(*q == '\'' || *q == '\"')
f5115590887b [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1167 q++;
f5115590887b [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1168 while(*q && *q != '\"' && *q != '\'' && *q != ' ') {
f5115590887b [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1169 color = g_string_append_c(color, *q);
f5115590887b [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1170 q++;
f5115590887b [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1171 }
f5115590887b [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1172 g_string_append_printf(style, "background: %s; ", color->str);
f5115590887b [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1173 g_string_free(color, TRUE);
f5115590887b [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1174 p = q;
f5115590887b [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1175 } else if(!g_ascii_strncasecmp(p, "color=", strlen("color="))) {
7095
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1176 const char *q = p + strlen("color=");
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1177 GString *color = g_string_new("");
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1178 if(*q == '\'' || *q == '\"')
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1179 q++;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1180 while(*q && *q != '\"' && *q != '\'' && *q != ' ') {
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1181 color = g_string_append_c(color, *q);
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1182 q++;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1183 }
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1184 g_string_append_printf(style, "color: %s; ", color->str);
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1185 g_string_free(color, TRUE);
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1186 p = q;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1187 } else if(!g_ascii_strncasecmp(p, "face=", strlen("face="))) {
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1188 const char *q = p + strlen("face=");
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1189 gboolean space_allowed = FALSE;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1190 GString *face = g_string_new("");
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1191 if(*q == '\'' || *q == '\"') {
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1192 space_allowed = TRUE;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1193 q++;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1194 }
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1195 while(*q && *q != '\"' && *q != '\'' && (space_allowed || *q != ' ')) {
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1196 face = g_string_append_c(face, *q);
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1197 q++;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1198 }
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1199 g_string_append_printf(style, "font-family: %s; ", face->str);
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1200 g_string_free(face, TRUE);
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1201 p = q;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1202 } else if(!g_ascii_strncasecmp(p, "size=", strlen("size="))) {
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1203 const char *q = p + strlen("size=");
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1204 int sz;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1205 const char *size = "medium";
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1206 if(*q == '\'' || *q == '\"')
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1207 q++;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1208 sz = atoi(q);
8686
87eb1cde44c9 [gaim-migrate @ 9439]
Kevin Stange <kstange@pidgin.im>
parents: 8625
diff changeset
1209 switch (sz)
87eb1cde44c9 [gaim-migrate @ 9439]
Kevin Stange <kstange@pidgin.im>
parents: 8625
diff changeset
1210 {
87eb1cde44c9 [gaim-migrate @ 9439]
Kevin Stange <kstange@pidgin.im>
parents: 8625
diff changeset
1211 case 1:
87eb1cde44c9 [gaim-migrate @ 9439]
Kevin Stange <kstange@pidgin.im>
parents: 8625
diff changeset
1212 size = "xx-small";
87eb1cde44c9 [gaim-migrate @ 9439]
Kevin Stange <kstange@pidgin.im>
parents: 8625
diff changeset
1213 break;
87eb1cde44c9 [gaim-migrate @ 9439]
Kevin Stange <kstange@pidgin.im>
parents: 8625
diff changeset
1214 case 2:
87eb1cde44c9 [gaim-migrate @ 9439]
Kevin Stange <kstange@pidgin.im>
parents: 8625
diff changeset
1215 size = "x-small";
87eb1cde44c9 [gaim-migrate @ 9439]
Kevin Stange <kstange@pidgin.im>
parents: 8625
diff changeset
1216 break;
87eb1cde44c9 [gaim-migrate @ 9439]
Kevin Stange <kstange@pidgin.im>
parents: 8625
diff changeset
1217 case 3:
87eb1cde44c9 [gaim-migrate @ 9439]
Kevin Stange <kstange@pidgin.im>
parents: 8625
diff changeset
1218 size = "small";
87eb1cde44c9 [gaim-migrate @ 9439]
Kevin Stange <kstange@pidgin.im>
parents: 8625
diff changeset
1219 break;
87eb1cde44c9 [gaim-migrate @ 9439]
Kevin Stange <kstange@pidgin.im>
parents: 8625
diff changeset
1220 case 4:
87eb1cde44c9 [gaim-migrate @ 9439]
Kevin Stange <kstange@pidgin.im>
parents: 8625
diff changeset
1221 size = "medium";
87eb1cde44c9 [gaim-migrate @ 9439]
Kevin Stange <kstange@pidgin.im>
parents: 8625
diff changeset
1222 break;
87eb1cde44c9 [gaim-migrate @ 9439]
Kevin Stange <kstange@pidgin.im>
parents: 8625
diff changeset
1223 case 5:
87eb1cde44c9 [gaim-migrate @ 9439]
Kevin Stange <kstange@pidgin.im>
parents: 8625
diff changeset
1224 size = "large";
87eb1cde44c9 [gaim-migrate @ 9439]
Kevin Stange <kstange@pidgin.im>
parents: 8625
diff changeset
1225 break;
87eb1cde44c9 [gaim-migrate @ 9439]
Kevin Stange <kstange@pidgin.im>
parents: 8625
diff changeset
1226 case 6:
87eb1cde44c9 [gaim-migrate @ 9439]
Kevin Stange <kstange@pidgin.im>
parents: 8625
diff changeset
1227 size = "x-large";
87eb1cde44c9 [gaim-migrate @ 9439]
Kevin Stange <kstange@pidgin.im>
parents: 8625
diff changeset
1228 break;
87eb1cde44c9 [gaim-migrate @ 9439]
Kevin Stange <kstange@pidgin.im>
parents: 8625
diff changeset
1229 case 7:
87eb1cde44c9 [gaim-migrate @ 9439]
Kevin Stange <kstange@pidgin.im>
parents: 8625
diff changeset
1230 size = "xx-large";
87eb1cde44c9 [gaim-migrate @ 9439]
Kevin Stange <kstange@pidgin.im>
parents: 8625
diff changeset
1231 break;
87eb1cde44c9 [gaim-migrate @ 9439]
Kevin Stange <kstange@pidgin.im>
parents: 8625
diff changeset
1232 default:
87eb1cde44c9 [gaim-migrate @ 9439]
Kevin Stange <kstange@pidgin.im>
parents: 8625
diff changeset
1233 break;
87eb1cde44c9 [gaim-migrate @ 9439]
Kevin Stange <kstange@pidgin.im>
parents: 8625
diff changeset
1234 }
7095
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1235 g_string_append_printf(style, "font-size: %s; ", size);
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1236 p = q;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1237 }
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1238 p++;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1239 }
10593
cba16404d664 [gaim-migrate @ 12005]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10589
diff changeset
1240 if ((c = strchr(c, '>')) != NULL)
cba16404d664 [gaim-migrate @ 12005]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10589
diff changeset
1241 c++;
cba16404d664 [gaim-migrate @ 12005]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10589
diff changeset
1242 else
cba16404d664 [gaim-migrate @ 12005]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10589
diff changeset
1243 c = p;
8064
f5115590887b [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1244 pt = g_new0(struct gaim_parse_tag, 1);
f5115590887b [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1245 pt->src_tag = "font";
f5115590887b [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1246 pt->dest_tag = "span";
f5115590887b [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1247 tags = g_list_prepend(tags, pt);
f5115590887b [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1248 if(style->len)
8026
91fe30ffb897 [gaim-migrate @ 8706]
Nathan Walp <nwalp@pidgin.im>
parents: 8005
diff changeset
1249 g_string_append_printf(xhtml, "<span style='%s'>", style->str);
8064
f5115590887b [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1250 else
f5115590887b [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1251 pt->ignore = TRUE;
7095
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1252 g_string_free(style, TRUE);
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1253 continue;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1254 }
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1255 if(!g_ascii_strncasecmp(c, "<body ", 6)) {
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1256 const char *p = c;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1257 gboolean did_something = FALSE;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1258 while(*p && *p != '>') {
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1259 if(!g_ascii_strncasecmp(p, "bgcolor=", strlen("bgcolor="))) {
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1260 const char *q = p + strlen("bgcolor=");
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1261 struct gaim_parse_tag *pt = g_new0(struct gaim_parse_tag, 1);
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1262 GString *color = g_string_new("");
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1263 if(*q == '\'' || *q == '\"')
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1264 q++;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1265 while(*q && *q != '\"' && *q != '\'' && *q != ' ') {
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1266 color = g_string_append_c(color, *q);
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1267 q++;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1268 }
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1269 g_string_append_printf(xhtml, "<span style='background: %s;'>", color->str);
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1270 g_string_free(color, TRUE);
10623
33b965c36d84 [gaim-migrate @ 12094]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10614
diff changeset
1271 if ((c = strchr(c, '>')) != NULL)
33b965c36d84 [gaim-migrate @ 12094]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10614
diff changeset
1272 c++;
33b965c36d84 [gaim-migrate @ 12094]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10614
diff changeset
1273 else
33b965c36d84 [gaim-migrate @ 12094]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10614
diff changeset
1274 c = p;
7095
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1275 pt->src_tag = "body";
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1276 pt->dest_tag = "span";
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1277 tags = g_list_prepend(tags, pt);
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1278 did_something = TRUE;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1279 break;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1280 }
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1281 p++;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1282 }
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1283 if(did_something) continue;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1284 }
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1285 /* this has to come after the special case for bgcolor */
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1286 ALLOW_TAG("body");
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1287 if(!g_ascii_strncasecmp(c, "<!--", strlen("<!--"))) {
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1288 char *p = strstr(c + strlen("<!--"), "-->");
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1289 if(p) {
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1290 xhtml = g_string_append(xhtml, "<!--");
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1291 c += strlen("<!--");
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1292 continue;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1293 }
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1294 }
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1295
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1296 xhtml = g_string_append(xhtml, "&lt;");
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1297 plain = g_string_append_c(plain, '<');
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1298 c++;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1299 }
7287
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1300 } else if(*c == '&') {
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1301 char buf[7];
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1302 char *pln;
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1303 int len = 1;
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1304 guint pound;
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1305 if(!g_ascii_strncasecmp(c, "&amp;", 5)) {
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1306 pln = "&";
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1307 len = 5;
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1308 } else if(!g_ascii_strncasecmp(c, "&lt;", 4)) {
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1309 pln = "<";
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1310 len = 4;
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1311 } else if(!g_ascii_strncasecmp(c, "&gt;", 4)) {
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1312 pln = ">";
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1313 len = 4;
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1314 } else if(!g_ascii_strncasecmp(c, "&nbsp;", 6)) {
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1315 pln = " ";
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1316 len = 6;
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1317 } else if(!g_ascii_strncasecmp(c, "&copy;", 6)) {
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1318 pln = "©";
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1319 len = 6;
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1320 } else if(!g_ascii_strncasecmp(c, "&quot;", 6)) {
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1321 pln = "\"";
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1322 len = 6;
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1323 } else if(!g_ascii_strncasecmp(c, "&reg;", 5)) {
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1324 pln = "®";
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1325 len = 5;
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1326 } else if(!g_ascii_strncasecmp(c, "&apos;", 6)) {
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1327 pln = "\'";
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1328 len = 6;
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1329 } else if(*(c+1) == '#' && (sscanf(c, "&#%u;", &pound) == 1) &&
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1330 pound != 0 && *(c+3+(gint)log10(pound)) == ';') {
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1331 int buflen = g_unichar_to_utf8((gunichar)pound, buf);
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1332 buf[buflen] = '\0';
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1333 pln = buf;
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1334
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1335
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1336 len = 2;
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1337 while(isdigit((gint) c [len])) len++;
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1338 if(c [len] == ';') len++;
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1339 } else {
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1340 len = 1;
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1341 g_snprintf(buf, sizeof(buf), "%c", *c);
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1342 pln = buf;
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1343 }
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1344 xhtml = g_string_append_len(xhtml, c, len);
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1345 plain = g_string_append(plain, pln);
abe4e3c069d4 [gaim-migrate @ 7868]
Nathan Walp <nwalp@pidgin.im>
parents: 7265
diff changeset
1346 c += len;
7095
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1347 } else {
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1348 xhtml = g_string_append_c(xhtml, *c);
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1349 plain = g_string_append_c(plain, *c);
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1350 c++;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1351 }
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1352 }
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1353 tag = tags;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1354 while(tag) {
8064
f5115590887b [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1355 struct gaim_parse_tag *pt = tag->data;
f5115590887b [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1356 if(!pt->ignore)
f5115590887b [gaim-migrate @ 8757]
Nathan Walp <nwalp@pidgin.im>
parents: 8063
diff changeset
1357 g_string_append_printf(xhtml, "</%s>", pt->dest_tag);
7095
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1358 tag = tag->next;
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1359 }
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1360 g_list_free(tags);
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1361 if(xhtml_out)
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1362 *xhtml_out = g_strdup(xhtml->str);
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1363 if(plain_out)
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1364 *plain_out = g_strdup(plain->str);
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1365 g_string_free(xhtml, TRUE);
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1366 g_string_free(plain, TRUE);
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1367 }
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1368
9161
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1369 /* The following are probably reasonable changes:
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1370 * - \n should be converted to a normal space
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1371 * - in addition to <br>, <p> and <div> etc. should also be converted into \n
9241
c10e113f7112 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1372 * - We want to turn </td>#whitespace<td> sequences into a single tab
c10e113f7112 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1373 * - We want to turn <td> into a single tab (for msn profile "parsing")
9161
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1374 * - We want to turn </tr>#whitespace<tr> sequences into a single \n
9241
c10e113f7112 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1375 * - <script>...</script> and <style>...</style> should be completely removed
9161
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1376 */
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1377
7095
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1378 char *
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1379 gaim_markup_strip_html(const char *str)
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1380 {
7103
6e03ab150b28 [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1381 int i, j, k;
6e03ab150b28 [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1382 gboolean visible = TRUE;
9161
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1383 gboolean closing_td_p = FALSE;
7103
6e03ab150b28 [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1384 gchar *str2;
9241
c10e113f7112 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1385 const gchar *cdata_close_tag = NULL;
12620
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1386 gchar *href = NULL;
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1387 int href_st = 0;
7103
6e03ab150b28 [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1388
7110
2e5dda9bc6a9 [gaim-migrate @ 7676]
Nathan Walp <nwalp@pidgin.im>
parents: 7108
diff changeset
1389 if(!str)
2e5dda9bc6a9 [gaim-migrate @ 7676]
Nathan Walp <nwalp@pidgin.im>
parents: 7108
diff changeset
1390 return NULL;
7103
6e03ab150b28 [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1391
6e03ab150b28 [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1392 str2 = g_strdup(str);
6e03ab150b28 [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1393
6e03ab150b28 [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1394 for (i = 0, j = 0; str2[i]; i++)
6e03ab150b28 [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1395 {
6e03ab150b28 [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1396 if (str2[i] == '<')
6e03ab150b28 [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1397 {
9241
c10e113f7112 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1398 if (cdata_close_tag)
9161
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1399 {
9241
c10e113f7112 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1400 /* Note: Don't even assume any other tag is a tag in CDATA */
c10e113f7112 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1401 if (strncasecmp(str2 + i, cdata_close_tag,
c10e113f7112 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1402 strlen(cdata_close_tag)) == 0)
c10e113f7112 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1403 {
c10e113f7112 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1404 i += strlen(cdata_close_tag) - 1;
c10e113f7112 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1405 cdata_close_tag = NULL;
c10e113f7112 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1406 }
c10e113f7112 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1407 continue;
c10e113f7112 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1408 }
c10e113f7112 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1409 else if (strncasecmp(str2 + i, "<td", 3) == 0 && closing_td_p)
c10e113f7112 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1410 {
c10e113f7112 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1411 str2[j++] = '\t';
9161
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1412 visible = TRUE;
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1413 }
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1414 else if (strncasecmp(str2 + i, "</td>", 5) == 0)
8517
a6647dc5baee [gaim-migrate @ 9256]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8511
diff changeset
1415 {
9161
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1416 closing_td_p = TRUE;
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1417 visible = FALSE;
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1418 }
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1419 else
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1420 {
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1421 closing_td_p = FALSE;
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1422 visible = TRUE;
8517
a6647dc5baee [gaim-migrate @ 9256]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8511
diff changeset
1423 }
a6647dc5baee [gaim-migrate @ 9256]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8511
diff changeset
1424
7103
6e03ab150b28 [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1425 k = i + 1;
6e03ab150b28 [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1426
6e03ab150b28 [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1427 if(g_ascii_isspace(str2[k]))
6e03ab150b28 [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1428 visible = TRUE;
9170
18732ae70740 [gaim-migrate @ 9955]
Tim Ringenbach <marv@pidgin.im>
parents: 9161
diff changeset
1429 else if (str2[k])
7103
6e03ab150b28 [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1430 {
9161
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1431 /* Scan until we end the tag either implicitly (closed start
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1432 * tag) or explicitly, using a sloppy method (i.e., < or >
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1433 * inside quoted attributes will screw us up)
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1434 */
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1435 while (str2[k] && str2[k] != '<' && str2[k] != '>')
7103
6e03ab150b28 [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1436 {
6e03ab150b28 [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1437 k++;
6e03ab150b28 [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1438 }
9241
c10e113f7112 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1439
12620
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1440 /* If we've got an <a> tag with an href, save the address
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1441 * to print later. */
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1442 if (strncasecmp(str2 + i, "<a", 2) == 0 &&
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1443 g_ascii_isspace(str2[i+2]))
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1444 {
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1445 int st; /* start of href, inclusive [ */
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1446 int end; /* end of href, exclusive ) */
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1447 char delim = ' ';
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1448 /* Find start of href */
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1449 for (st = i + 3; st < k; st++)
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1450 {
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1451 if (strncasecmp(str2+st, "href=", 5) == 0)
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1452 {
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1453 st += 5;
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1454 if (str2[st] == '"')
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1455 {
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1456 delim = '"';
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1457 st++;
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1458 }
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1459 break;
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1460 }
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1461 }
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1462 /* find end of address */
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1463 for (end = st; end < k && str2[end] != delim; end++)
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1464 {
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1465 /* All the work is done in the loop construct above. */
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1466 }
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1467
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1468 /* If there's an address, save it. If there was
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1469 * already one saved, kill it. */
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1470 if (st < k)
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1471 {
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1472 char *tmp;
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1473 g_free(href);
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1474 tmp = g_strndup(str2 + st, end - st);
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1475 href = gaim_unescape_html(tmp);
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1476 g_free(tmp);
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1477 href_st = j;
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1478 }
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1479 }
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1480
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1481 /* Replace </a> with an ascii representation of the
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1482 * address the link was pointing to. */
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1483 else if (href != NULL && strncasecmp(str2 + i, "</a>", 4) == 0)
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1484 {
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1485
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1486 size_t hrlen = strlen(href);
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1487
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1488 /* Only insert the href if it's different from the CDATA. */
12640
1fb40d5d76e7 [gaim-migrate @ 14976]
Richard Laager <rlaager@pidgin.im>
parents: 12628
diff changeset
1489 if ((hrlen != j - href_st ||
1fb40d5d76e7 [gaim-migrate @ 14976]
Richard Laager <rlaager@pidgin.im>
parents: 12628
diff changeset
1490 strncmp(str2 + href_st, href, hrlen)) &&
1fb40d5d76e7 [gaim-migrate @ 14976]
Richard Laager <rlaager@pidgin.im>
parents: 12628
diff changeset
1491 (hrlen != j - href_st + 7 || /* 7 == strlen("http://") */
1fb40d5d76e7 [gaim-migrate @ 14976]
Richard Laager <rlaager@pidgin.im>
parents: 12628
diff changeset
1492 strncmp(str2 + href_st, href + 7, hrlen - 7)))
12620
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1493 {
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1494 str2[j++] = ' ';
12628
35043a7fb16c [gaim-migrate @ 14964]
Richard Laager <rlaager@pidgin.im>
parents: 12622
diff changeset
1495 str2[j++] = '(';
12620
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1496 g_memmove(str2 + j, href, hrlen);
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1497 j += hrlen;
12628
35043a7fb16c [gaim-migrate @ 14964]
Richard Laager <rlaager@pidgin.im>
parents: 12622
diff changeset
1498 str2[j++] = ')';
12620
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1499 g_free(href);
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1500 href = NULL;
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1501 }
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1502 }
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1503
9161
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1504 /* Check for tags which should be mapped to newline */
12620
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1505 else if (strncasecmp(str2 + i, "<p>", 3) == 0
9161
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1506 || strncasecmp(str2 + i, "<tr", 3) == 0
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1507 || strncasecmp(str2 + i, "<br", 3) == 0
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1508 || strncasecmp(str2 + i, "<li", 3) == 0
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1509 || strncasecmp(str2 + i, "<div", 4) == 0
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1510 || strncasecmp(str2 + i, "</table>", 8) == 0)
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1511 {
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1512 str2[j++] = '\n';
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1513 }
9241
c10e113f7112 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1514 /* Check for tags which begin CDATA and need to be closed */
c10e113f7112 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1515 #if 0 /* FIXME.. option is end tag optional, we can't handle this right now */
c10e113f7112 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1516 else if (strncasecmp(str2 + i, "<option", 7) == 0)
c10e113f7112 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1517 {
c10e113f7112 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1518 /* FIXME: We should not do this if the OPTION is SELECT'd */
c10e113f7112 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1519 cdata_close_tag = "</option>";
c10e113f7112 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1520 }
c10e113f7112 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1521 #endif
c10e113f7112 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1522 else if (strncasecmp(str2 + i, "<script", 7) == 0)
c10e113f7112 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1523 {
c10e113f7112 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1524 cdata_close_tag = "</script>";
c10e113f7112 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1525 }
c10e113f7112 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1526 else if (strncasecmp(str2 + i, "<style", 6) == 0)
c10e113f7112 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1527 {
c10e113f7112 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1528 cdata_close_tag = "</style>";
c10e113f7112 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1529 }
9161
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1530 /* Update the index and continue checking after the tag */
10731
8d817cb4268b [gaim-migrate @ 12333]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10700
diff changeset
1531 i = (str2[k] == '<' || str2[k] == '\0')? k - 1: k;
9161
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1532 continue;
7103
6e03ab150b28 [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1533 }
6e03ab150b28 [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1534 }
9241
c10e113f7112 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1535 else if (cdata_close_tag)
c10e113f7112 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1536 {
c10e113f7112 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1537 continue;
c10e113f7112 [gaim-migrate @ 10040]
Tim Ringenbach <marv@pidgin.im>
parents: 9240
diff changeset
1538 }
9161
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1539 else if (!g_ascii_isspace(str2[i]))
7103
6e03ab150b28 [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1540 {
6e03ab150b28 [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1541 visible = TRUE;
6e03ab150b28 [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1542 }
6e03ab150b28 [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1543
9273
cfbcd961bf6b [gaim-migrate @ 10076]
Nathan Walp <nwalp@pidgin.im>
parents: 9257
diff changeset
1544 /* XXX: This sucks. We need to be un-escaping all entities, which
cfbcd961bf6b [gaim-migrate @ 10076]
Nathan Walp <nwalp@pidgin.im>
parents: 9257
diff changeset
1545 * includes these, as well as the &#num; ones */
cfbcd961bf6b [gaim-migrate @ 10076]
Nathan Walp <nwalp@pidgin.im>
parents: 9257
diff changeset
1546
7103
6e03ab150b28 [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1547 if (str2[i] == '&' && strncasecmp(str2 + i, "&quot;", 6) == 0)
6e03ab150b28 [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1548 {
6e03ab150b28 [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1549 str2[j++] = '\"';
6e03ab150b28 [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1550 i = i + 5;
6e03ab150b28 [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1551 continue;
6e03ab150b28 [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1552 }
6e03ab150b28 [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1553
8517
a6647dc5baee [gaim-migrate @ 9256]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8511
diff changeset
1554 if (str2[i] == '&' && strncasecmp(str2 + i, "&amp;", 5) == 0)
a6647dc5baee [gaim-migrate @ 9256]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8511
diff changeset
1555 {
a6647dc5baee [gaim-migrate @ 9256]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8511
diff changeset
1556 str2[j++] = '&';
a6647dc5baee [gaim-migrate @ 9256]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8511
diff changeset
1557 i = i + 4;
a6647dc5baee [gaim-migrate @ 9256]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8511
diff changeset
1558 continue;
a6647dc5baee [gaim-migrate @ 9256]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8511
diff changeset
1559 }
a6647dc5baee [gaim-migrate @ 9256]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8511
diff changeset
1560
a6647dc5baee [gaim-migrate @ 9256]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8511
diff changeset
1561 if (str2[i] == '&' && strncasecmp(str2 + i, "&lt;", 4) == 0)
a6647dc5baee [gaim-migrate @ 9256]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8511
diff changeset
1562 {
a6647dc5baee [gaim-migrate @ 9256]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8511
diff changeset
1563 str2[j++] = '<';
a6647dc5baee [gaim-migrate @ 9256]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8511
diff changeset
1564 i = i + 3;
a6647dc5baee [gaim-migrate @ 9256]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8511
diff changeset
1565 continue;
a6647dc5baee [gaim-migrate @ 9256]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8511
diff changeset
1566 }
a6647dc5baee [gaim-migrate @ 9256]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8511
diff changeset
1567
a6647dc5baee [gaim-migrate @ 9256]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8511
diff changeset
1568 if (str2[i] == '&' && strncasecmp(str2 + i, "&gt;", 4) == 0)
a6647dc5baee [gaim-migrate @ 9256]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8511
diff changeset
1569 {
a6647dc5baee [gaim-migrate @ 9256]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8511
diff changeset
1570 str2[j++] = '>';
a6647dc5baee [gaim-migrate @ 9256]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8511
diff changeset
1571 i = i + 3;
a6647dc5baee [gaim-migrate @ 9256]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8511
diff changeset
1572 continue;
a6647dc5baee [gaim-migrate @ 9256]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8511
diff changeset
1573 }
a6647dc5baee [gaim-migrate @ 9256]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8511
diff changeset
1574
9273
cfbcd961bf6b [gaim-migrate @ 10076]
Nathan Walp <nwalp@pidgin.im>
parents: 9257
diff changeset
1575 if (str2[i] == '&' && strncasecmp(str2 + i, "&apos;", 6) == 0)
cfbcd961bf6b [gaim-migrate @ 10076]
Nathan Walp <nwalp@pidgin.im>
parents: 9257
diff changeset
1576 {
cfbcd961bf6b [gaim-migrate @ 10076]
Nathan Walp <nwalp@pidgin.im>
parents: 9257
diff changeset
1577 str2[j++] = '\'';
cfbcd961bf6b [gaim-migrate @ 10076]
Nathan Walp <nwalp@pidgin.im>
parents: 9257
diff changeset
1578 i = i + 5;
cfbcd961bf6b [gaim-migrate @ 10076]
Nathan Walp <nwalp@pidgin.im>
parents: 9257
diff changeset
1579 continue;
cfbcd961bf6b [gaim-migrate @ 10076]
Nathan Walp <nwalp@pidgin.im>
parents: 9257
diff changeset
1580 }
cfbcd961bf6b [gaim-migrate @ 10076]
Nathan Walp <nwalp@pidgin.im>
parents: 9257
diff changeset
1581
7103
6e03ab150b28 [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1582 if (visible)
9161
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
1583 str2[j++] = g_ascii_isspace(str2[i])? ' ': str2[i];
7103
6e03ab150b28 [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1584 }
6e03ab150b28 [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1585
12620
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1586 g_free(href);
991d2aed617f [gaim-migrate @ 14956]
Dennis Lambe Jr. <malsyned@users.sourceforge.net>
parents: 12483
diff changeset
1587
7103
6e03ab150b28 [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1588 str2[j] = '\0';
6e03ab150b28 [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1589
6e03ab150b28 [gaim-migrate @ 7668]
Nathan Walp <nwalp@pidgin.im>
parents: 7099
diff changeset
1590 return str2;
7095
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1591 }
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
1592
10461
8125858d1d5f [gaim-migrate @ 11733]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10459
diff changeset
1593 static gboolean
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1594 badchar(char c)
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1595 {
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1596 switch (c) {
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1597 case ' ':
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1598 case ',':
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1599 case '\0':
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1600 case '\n':
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1601 case '<':
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1602 case '>':
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1603 case '"':
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1604 case '\'':
10461
8125858d1d5f [gaim-migrate @ 11733]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10459
diff changeset
1605 return TRUE;
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1606 default:
10461
8125858d1d5f [gaim-migrate @ 11733]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10459
diff changeset
1607 return FALSE;
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1608 }
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1609 }
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
1610
10461
8125858d1d5f [gaim-migrate @ 11733]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10459
diff changeset
1611 static gboolean
8125858d1d5f [gaim-migrate @ 11733]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10459
diff changeset
1612 badentity(const char *c)
8125858d1d5f [gaim-migrate @ 11733]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10459
diff changeset
1613 {
8125858d1d5f [gaim-migrate @ 11733]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10459
diff changeset
1614 if (!g_ascii_strncasecmp(c, "&lt;", 4) ||
8125858d1d5f [gaim-migrate @ 11733]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10459
diff changeset
1615 !g_ascii_strncasecmp(c, "&gt;", 4) ||
8125858d1d5f [gaim-migrate @ 11733]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10459
diff changeset
1616 !g_ascii_strncasecmp(c, "&quot;", 6)) {
8125858d1d5f [gaim-migrate @ 11733]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10459
diff changeset
1617 return TRUE;
8125858d1d5f [gaim-migrate @ 11733]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10459
diff changeset
1618 }
8125858d1d5f [gaim-migrate @ 11733]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10459
diff changeset
1619 return FALSE;
8125858d1d5f [gaim-migrate @ 11733]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10459
diff changeset
1620 }
8125858d1d5f [gaim-migrate @ 11733]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10459
diff changeset
1621
7107
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1622 char *
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1623 gaim_markup_linkify(const char *text)
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1624 {
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1625 const char *c, *t, *q = NULL;
10902
7b3ac6bd1bba [gaim-migrate @ 12624]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10876
diff changeset
1626 char *tmp, *tmpurlbuf, *url_buf;
9222
e15847e6086a [gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9220
diff changeset
1627 gunichar g;
8538
b84f47107efb [gaim-migrate @ 9279]
Nathan Walp <nwalp@pidgin.im>
parents: 8534
diff changeset
1628 gboolean inside_html = FALSE;
9222
e15847e6086a [gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9220
diff changeset
1629 int inside_paren = 0;
7107
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1630 GString *ret = g_string_new("");
10372
3b28959779fa [gaim-migrate @ 11595]
Kevin Stange <kstange@pidgin.im>
parents: 10332
diff changeset
1631 /* Assumes you have a buffer able to carry at least BUF_LEN * 2 bytes */
7107
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1632
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1633 c = text;
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1634 while (*c) {
9222
e15847e6086a [gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9220
diff changeset
1635
e15847e6086a [gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9220
diff changeset
1636 if(*c == '(' && !inside_html) {
e15847e6086a [gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9220
diff changeset
1637 inside_paren++;
e15847e6086a [gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9220
diff changeset
1638 ret = g_string_append_c(ret, *c);
e15847e6086a [gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9220
diff changeset
1639 c++;
e15847e6086a [gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9220
diff changeset
1640 }
e15847e6086a [gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9220
diff changeset
1641
8538
b84f47107efb [gaim-migrate @ 9279]
Nathan Walp <nwalp@pidgin.im>
parents: 8534
diff changeset
1642 if(inside_html) {
b84f47107efb [gaim-migrate @ 9279]
Nathan Walp <nwalp@pidgin.im>
parents: 8534
diff changeset
1643 if(*c == '>') {
b84f47107efb [gaim-migrate @ 9279]
Nathan Walp <nwalp@pidgin.im>
parents: 8534
diff changeset
1644 inside_html = FALSE;
b84f47107efb [gaim-migrate @ 9279]
Nathan Walp <nwalp@pidgin.im>
parents: 8534
diff changeset
1645 } else if(!q && (*c == '\"' || *c == '\'')) {
b84f47107efb [gaim-migrate @ 9279]
Nathan Walp <nwalp@pidgin.im>
parents: 8534
diff changeset
1646 q = c;
b84f47107efb [gaim-migrate @ 9279]
Nathan Walp <nwalp@pidgin.im>
parents: 8534
diff changeset
1647 } else if(q) {
b84f47107efb [gaim-migrate @ 9279]
Nathan Walp <nwalp@pidgin.im>
parents: 8534
diff changeset
1648 if(*c == *q)
b84f47107efb [gaim-migrate @ 9279]
Nathan Walp <nwalp@pidgin.im>
parents: 8534
diff changeset
1649 q = NULL;
b84f47107efb [gaim-migrate @ 9279]
Nathan Walp <nwalp@pidgin.im>
parents: 8534
diff changeset
1650 }
b84f47107efb [gaim-migrate @ 9279]
Nathan Walp <nwalp@pidgin.im>
parents: 8534
diff changeset
1651 } else if(*c == '<') {
b84f47107efb [gaim-migrate @ 9279]
Nathan Walp <nwalp@pidgin.im>
parents: 8534
diff changeset
1652 inside_html = TRUE;
9077
cf0a9a478394 [gaim-migrate @ 9853]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9054
diff changeset
1653 if (!g_ascii_strncasecmp(c, "<A", 2)) {
cf0a9a478394 [gaim-migrate @ 9853]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9054
diff changeset
1654 while (1) {
cf0a9a478394 [gaim-migrate @ 9853]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9054
diff changeset
1655 if (!g_ascii_strncasecmp(c, "/A>", 3)) {
cf0a9a478394 [gaim-migrate @ 9853]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9054
diff changeset
1656 inside_html = FALSE;
cf0a9a478394 [gaim-migrate @ 9853]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9054
diff changeset
1657 break;
cf0a9a478394 [gaim-migrate @ 9853]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9054
diff changeset
1658 }
cf0a9a478394 [gaim-migrate @ 9853]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9054
diff changeset
1659 ret = g_string_append_c(ret, *c);
cf0a9a478394 [gaim-migrate @ 9853]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9054
diff changeset
1660 c++;
cf0a9a478394 [gaim-migrate @ 9853]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9054
diff changeset
1661 if (!(*c))
cf0a9a478394 [gaim-migrate @ 9853]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9054
diff changeset
1662 break;
7107
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1663 }
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1664 }
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1665 } else if ((*c=='h') && (!g_ascii_strncasecmp(c, "http://", 7) ||
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1666 (!g_ascii_strncasecmp(c, "https://", 8)))) {
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1667 t = c;
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1668 while (1) {
10461
8125858d1d5f [gaim-migrate @ 11733]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10459
diff changeset
1669 if (badchar(*t) || badentity(t)) {
7107
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1670
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1671 if (*(t) == ',' && (*(t + 1) != ' ')) {
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1672 t++;
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1673 continue;
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1674 }
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1675
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1676 if (*(t - 1) == '.')
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1677 t--;
9222
e15847e6086a [gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9220
diff changeset
1678 if ((*(t - 1) == ')' && (inside_paren > 0))) {
e15847e6086a [gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9220
diff changeset
1679 t--;
e15847e6086a [gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9220
diff changeset
1680 }
10461
8125858d1d5f [gaim-migrate @ 11733]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10459
diff changeset
1681
10902
7b3ac6bd1bba [gaim-migrate @ 12624]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10876
diff changeset
1682 url_buf = g_strndup(c, t - c);
8918
fe48c4ae8274 [gaim-migrate @ 9688]
Tim Ringenbach <marv@pidgin.im>
parents: 8907
diff changeset
1683 tmpurlbuf = gaim_unescape_html(url_buf);
7107
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1684 g_string_append_printf(ret, "<A HREF=\"%s\">%s</A>",
8918
fe48c4ae8274 [gaim-migrate @ 9688]
Tim Ringenbach <marv@pidgin.im>
parents: 8907
diff changeset
1685 tmpurlbuf, url_buf);
10902
7b3ac6bd1bba [gaim-migrate @ 12624]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10876
diff changeset
1686 g_free(url_buf);
8918
fe48c4ae8274 [gaim-migrate @ 9688]
Tim Ringenbach <marv@pidgin.im>
parents: 8907
diff changeset
1687 g_free(tmpurlbuf);
7107
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1688 c = t;
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1689 break;
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1690 }
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1691 if (!t)
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1692 break;
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1693 t++;
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1694
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1695 }
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1696 } else if (!g_ascii_strncasecmp(c, "www.", 4)) {
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1697 if (c[4] != '.') {
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1698 t = c;
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1699 while (1) {
10461
8125858d1d5f [gaim-migrate @ 11733]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10459
diff changeset
1700 if (badchar(*t) || badentity(t)) {
7107
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1701 if (t - c == 4) {
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1702 break;
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1703 }
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1704
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1705 if (*(t) == ',' && (*(t + 1) != ' ')) {
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1706 t++;
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1707 continue;
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1708 }
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1709
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1710 if (*(t - 1) == '.')
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1711 t--;
9222
e15847e6086a [gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9220
diff changeset
1712 if ((*(t - 1) == ')' && (inside_paren > 0))) {
e15847e6086a [gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9220
diff changeset
1713 t--;
e15847e6086a [gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9220
diff changeset
1714 }
10902
7b3ac6bd1bba [gaim-migrate @ 12624]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10876
diff changeset
1715 url_buf = g_strndup(c, t - c);
8918
fe48c4ae8274 [gaim-migrate @ 9688]
Tim Ringenbach <marv@pidgin.im>
parents: 8907
diff changeset
1716 tmpurlbuf = gaim_unescape_html(url_buf);
7107
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1717 g_string_append_printf(ret,
8918
fe48c4ae8274 [gaim-migrate @ 9688]
Tim Ringenbach <marv@pidgin.im>
parents: 8907
diff changeset
1718 "<A HREF=\"http://%s\">%s</A>", tmpurlbuf,
7107
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1719 url_buf);
10902
7b3ac6bd1bba [gaim-migrate @ 12624]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10876
diff changeset
1720 g_free(url_buf);
8918
fe48c4ae8274 [gaim-migrate @ 9688]
Tim Ringenbach <marv@pidgin.im>
parents: 8907
diff changeset
1721 g_free(tmpurlbuf);
7107
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1722 c = t;
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1723 break;
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1724 }
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1725 if (!t)
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1726 break;
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1727 t++;
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1728 }
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1729 }
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1730 } else if (!g_ascii_strncasecmp(c, "ftp://", 6)) {
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1731 t = c;
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1732 while (1) {
10461
8125858d1d5f [gaim-migrate @ 11733]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10459
diff changeset
1733 if (badchar(*t) || badentity(t)) {
7107
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1734 if (*(t - 1) == '.')
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1735 t--;
9222
e15847e6086a [gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9220
diff changeset
1736 if ((*(t - 1) == ')' && (inside_paren > 0))) {
e15847e6086a [gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9220
diff changeset
1737 t--;
e15847e6086a [gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9220
diff changeset
1738 }
10905
56943fe311c2 [gaim-migrate @ 12634]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10902
diff changeset
1739 url_buf = g_strndup(c, t - c);
8918
fe48c4ae8274 [gaim-migrate @ 9688]
Tim Ringenbach <marv@pidgin.im>
parents: 8907
diff changeset
1740 tmpurlbuf = gaim_unescape_html(url_buf);
7107
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1741 g_string_append_printf(ret, "<A HREF=\"%s\">%s</A>",
8918
fe48c4ae8274 [gaim-migrate @ 9688]
Tim Ringenbach <marv@pidgin.im>
parents: 8907
diff changeset
1742 tmpurlbuf, url_buf);
10902
7b3ac6bd1bba [gaim-migrate @ 12624]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10876
diff changeset
1743 g_free(url_buf);
8918
fe48c4ae8274 [gaim-migrate @ 9688]
Tim Ringenbach <marv@pidgin.im>
parents: 8907
diff changeset
1744 g_free(tmpurlbuf);
7107
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1745 c = t;
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1746 break;
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1747 }
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1748 if (!t)
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1749 break;
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1750 t++;
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1751
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1752 }
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1753 } else if (!g_ascii_strncasecmp(c, "ftp.", 4)) {
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1754 if (c[4] != '.') {
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1755 t = c;
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1756 while (1) {
10461
8125858d1d5f [gaim-migrate @ 11733]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10459
diff changeset
1757 if (badchar(*t) || badentity(t)) {
7107
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1758 if (t - c == 4) {
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1759 break;
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1760 }
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1761 if (*(t - 1) == '.')
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1762 t--;
9222
e15847e6086a [gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9220
diff changeset
1763 if ((*(t - 1) == ')' && (inside_paren > 0))) {
e15847e6086a [gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9220
diff changeset
1764 t--;
e15847e6086a [gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9220
diff changeset
1765 }
10902
7b3ac6bd1bba [gaim-migrate @ 12624]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10876
diff changeset
1766 url_buf = g_strndup(c, t - c);
8918
fe48c4ae8274 [gaim-migrate @ 9688]
Tim Ringenbach <marv@pidgin.im>
parents: 8907
diff changeset
1767 tmpurlbuf = gaim_unescape_html(url_buf);
7107
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1768 g_string_append_printf(ret,
8918
fe48c4ae8274 [gaim-migrate @ 9688]
Tim Ringenbach <marv@pidgin.im>
parents: 8907
diff changeset
1769 "<A HREF=\"ftp://%s\">%s</A>", tmpurlbuf,
7107
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1770 url_buf);
10902
7b3ac6bd1bba [gaim-migrate @ 12624]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10876
diff changeset
1771 g_free(url_buf);
8918
fe48c4ae8274 [gaim-migrate @ 9688]
Tim Ringenbach <marv@pidgin.im>
parents: 8907
diff changeset
1772 g_free(tmpurlbuf);
7107
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1773 c = t;
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1774 break;
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1775 }
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1776 if (!t)
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1777 break;
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1778 t++;
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1779 }
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1780 }
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1781 } else if (!g_ascii_strncasecmp(c, "mailto:", 7)) {
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1782 t = c;
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1783 while (1) {
10461
8125858d1d5f [gaim-migrate @ 11733]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10459
diff changeset
1784 if (badchar(*t) || badentity(t)) {
7107
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1785 if (*(t - 1) == '.')
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1786 t--;
10902
7b3ac6bd1bba [gaim-migrate @ 12624]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10876
diff changeset
1787 url_buf = g_strndup(c, t - c);
8918
fe48c4ae8274 [gaim-migrate @ 9688]
Tim Ringenbach <marv@pidgin.im>
parents: 8907
diff changeset
1788 tmpurlbuf = gaim_unescape_html(url_buf);
7107
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1789 g_string_append_printf(ret, "<A HREF=\"%s\">%s</A>",
8918
fe48c4ae8274 [gaim-migrate @ 9688]
Tim Ringenbach <marv@pidgin.im>
parents: 8907
diff changeset
1790 tmpurlbuf, url_buf);
10902
7b3ac6bd1bba [gaim-migrate @ 12624]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10876
diff changeset
1791 g_free(url_buf);
8918
fe48c4ae8274 [gaim-migrate @ 9688]
Tim Ringenbach <marv@pidgin.im>
parents: 8907
diff changeset
1792 g_free(tmpurlbuf);
7107
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1793 c = t;
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1794 break;
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1795 }
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1796 if (!t)
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1797 break;
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1798 t++;
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1799
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1800 }
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1801 } else if (c != text && (*c == '@')) {
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1802 int flag;
10905
56943fe311c2 [gaim-migrate @ 12634]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10902
diff changeset
1803 GString *gurl_buf = NULL;
7107
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1804 const char illegal_chars[] = "!@#$%^&*()[]{}/|\\<>\":;\r\n \0";
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1805
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1806 if (strchr(illegal_chars,*(c - 1)) || strchr(illegal_chars, *(c + 1)))
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1807 flag = 0;
10902
7b3ac6bd1bba [gaim-migrate @ 12624]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10876
diff changeset
1808 else {
7107
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1809 flag = 1;
10902
7b3ac6bd1bba [gaim-migrate @ 12624]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10876
diff changeset
1810 gurl_buf = g_string_new("");
7b3ac6bd1bba [gaim-migrate @ 12624]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10876
diff changeset
1811 }
7107
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1812
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1813 t = c;
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1814 while (flag) {
9222
e15847e6086a [gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9220
diff changeset
1815 /* iterate backwards grabbing the local part of an email address */
e15847e6086a [gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9220
diff changeset
1816 g = g_utf8_get_char(t);
e15847e6086a [gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9220
diff changeset
1817 if (badchar(*t) || (g >= 127) || (*t == '(') ||
11176
a7b860aa756e [gaim-migrate @ 13283]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 11153
diff changeset
1818 ((*t == ';') && ((t > (text+2) && (!g_ascii_strncasecmp(t - 3, "&lt;", 4) ||
a7b860aa756e [gaim-migrate @ 13283]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 11153
diff changeset
1819 !g_ascii_strncasecmp(t - 3, "&gt;", 4))) ||
a7b860aa756e [gaim-migrate @ 13283]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 11153
diff changeset
1820 (t > (text+4) && (!g_ascii_strncasecmp(t - 5, "&quot;", 6)))))) {
9222
e15847e6086a [gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9220
diff changeset
1821 /* local part will already be part of ret, strip it out */
e15847e6086a [gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9220
diff changeset
1822 ret = g_string_truncate(ret, ret->len - (c - t));
e15847e6086a [gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9220
diff changeset
1823 ret = g_string_append_unichar(ret, g);
7107
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1824 break;
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1825 } else {
9222
e15847e6086a [gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9220
diff changeset
1826 g_string_prepend_unichar(gurl_buf, g);
e15847e6086a [gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9220
diff changeset
1827 t = g_utf8_find_prev_char(text, t);
7107
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1828 if (t < text) {
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1829 ret = g_string_assign(ret, "");
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1830 break;
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1831 }
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1832 }
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1833 }
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1834
9222
e15847e6086a [gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9220
diff changeset
1835 t = g_utf8_find_next_char(c, NULL);
7107
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1836
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1837 while (flag) {
9222
e15847e6086a [gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9220
diff changeset
1838 /* iterate forwards grabbing the domain part of an email address */
e15847e6086a [gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9220
diff changeset
1839 g = g_utf8_get_char(t);
10461
8125858d1d5f [gaim-migrate @ 11733]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10459
diff changeset
1840 if (badchar(*t) || (g >= 127) || (*t == ')') || badentity(t)) {
7107
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1841 char *d;
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1842
10902
7b3ac6bd1bba [gaim-migrate @ 12624]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10876
diff changeset
1843 url_buf = g_string_free(gurl_buf, FALSE);
9222
e15847e6086a [gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9220
diff changeset
1844
e15847e6086a [gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9220
diff changeset
1845 /* strip off trailing periods */
10902
7b3ac6bd1bba [gaim-migrate @ 12624]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10876
diff changeset
1846 if (strlen(url_buf) > 0) {
7b3ac6bd1bba [gaim-migrate @ 12624]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10876
diff changeset
1847 for (d = url_buf + strlen(url_buf) - 1; *d == '.'; d--, t--)
7b3ac6bd1bba [gaim-migrate @ 12624]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10876
diff changeset
1848 *d = '\0';
7b3ac6bd1bba [gaim-migrate @ 12624]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10876
diff changeset
1849 }
7107
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1850
8918
fe48c4ae8274 [gaim-migrate @ 9688]
Tim Ringenbach <marv@pidgin.im>
parents: 8907
diff changeset
1851 tmpurlbuf = gaim_unescape_html(url_buf);
9045
c665ceb89b85 [gaim-migrate @ 9821]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8976
diff changeset
1852 if (gaim_email_is_valid(tmpurlbuf)) {
c665ceb89b85 [gaim-migrate @ 9821]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8976
diff changeset
1853 g_string_append_printf(ret, "<A HREF=\"mailto:%s\">%s</A>",
c665ceb89b85 [gaim-migrate @ 9821]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8976
diff changeset
1854 tmpurlbuf, url_buf);
c665ceb89b85 [gaim-migrate @ 9821]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8976
diff changeset
1855 } else {
c665ceb89b85 [gaim-migrate @ 9821]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8976
diff changeset
1856 g_string_append(ret, url_buf);
c665ceb89b85 [gaim-migrate @ 9821]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8976
diff changeset
1857 }
10902
7b3ac6bd1bba [gaim-migrate @ 12624]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10876
diff changeset
1858 g_free(url_buf);
8918
fe48c4ae8274 [gaim-migrate @ 9688]
Tim Ringenbach <marv@pidgin.im>
parents: 8907
diff changeset
1859 g_free(tmpurlbuf);
7107
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1860 c = t;
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1861
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1862 break;
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1863 } else {
9222
e15847e6086a [gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9220
diff changeset
1864 g_string_append_unichar(gurl_buf, g);
e15847e6086a [gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9220
diff changeset
1865 t = g_utf8_find_next_char(t, NULL);
7107
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1866 }
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1867 }
9222
e15847e6086a [gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9220
diff changeset
1868 }
e15847e6086a [gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9220
diff changeset
1869
e15847e6086a [gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9220
diff changeset
1870 if(*c == ')' && !inside_html) {
e15847e6086a [gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9220
diff changeset
1871 inside_paren--;
e15847e6086a [gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9220
diff changeset
1872 ret = g_string_append_c(ret, *c);
e15847e6086a [gaim-migrate @ 10018]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9220
diff changeset
1873 c++;
7107
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1874 }
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1875
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1876 if (*c == 0)
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1877 break;
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1878
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1879 ret = g_string_append_c(ret, *c);
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1880 c++;
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1881
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1882 }
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1883 tmp = ret->str;
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1884 g_string_free(ret, FALSE);
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1885 return tmp;
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1886 }
903864ff76c3 [gaim-migrate @ 7672]
Christian Hammond <chipx86@chipx86.com>
parents: 7106
diff changeset
1887
8163
8f33bb0f433d [gaim-migrate @ 8875]
Ethan Blanton <elb@pidgin.im>
parents: 8125
diff changeset
1888 char *
8442
e5d2b1c684bb [gaim-migrate @ 9172]
Tim Ringenbach <marv@pidgin.im>
parents: 8433
diff changeset
1889 gaim_unescape_html(const char *html) {
e5d2b1c684bb [gaim-migrate @ 9172]
Tim Ringenbach <marv@pidgin.im>
parents: 8433
diff changeset
1890 char *unescaped = NULL;
e5d2b1c684bb [gaim-migrate @ 9172]
Tim Ringenbach <marv@pidgin.im>
parents: 8433
diff changeset
1891
e5d2b1c684bb [gaim-migrate @ 9172]
Tim Ringenbach <marv@pidgin.im>
parents: 8433
diff changeset
1892 if (html != NULL) {
e5d2b1c684bb [gaim-migrate @ 9172]
Tim Ringenbach <marv@pidgin.im>
parents: 8433
diff changeset
1893 const char *c = html;
e5d2b1c684bb [gaim-migrate @ 9172]
Tim Ringenbach <marv@pidgin.im>
parents: 8433
diff changeset
1894 GString *ret = g_string_new("");
e5d2b1c684bb [gaim-migrate @ 9172]
Tim Ringenbach <marv@pidgin.im>
parents: 8433
diff changeset
1895 while (*c) {
e5d2b1c684bb [gaim-migrate @ 9172]
Tim Ringenbach <marv@pidgin.im>
parents: 8433
diff changeset
1896 if (!strncmp(c, "&amp;", 5)) {
e5d2b1c684bb [gaim-migrate @ 9172]
Tim Ringenbach <marv@pidgin.im>
parents: 8433
diff changeset
1897 ret = g_string_append_c(ret, '&');
e5d2b1c684bb [gaim-migrate @ 9172]
Tim Ringenbach <marv@pidgin.im>
parents: 8433
diff changeset
1898 c += 5;
e5d2b1c684bb [gaim-migrate @ 9172]
Tim Ringenbach <marv@pidgin.im>
parents: 8433
diff changeset
1899 } else if (!strncmp(c, "&lt;", 4)) {
e5d2b1c684bb [gaim-migrate @ 9172]
Tim Ringenbach <marv@pidgin.im>
parents: 8433
diff changeset
1900 ret = g_string_append_c(ret, '<');
e5d2b1c684bb [gaim-migrate @ 9172]
Tim Ringenbach <marv@pidgin.im>
parents: 8433
diff changeset
1901 c += 4;
e5d2b1c684bb [gaim-migrate @ 9172]
Tim Ringenbach <marv@pidgin.im>
parents: 8433
diff changeset
1902 } else if (!strncmp(c, "&gt;", 4)) {
e5d2b1c684bb [gaim-migrate @ 9172]
Tim Ringenbach <marv@pidgin.im>
parents: 8433
diff changeset
1903 ret = g_string_append_c(ret, '>');
e5d2b1c684bb [gaim-migrate @ 9172]
Tim Ringenbach <marv@pidgin.im>
parents: 8433
diff changeset
1904 c += 4;
e5d2b1c684bb [gaim-migrate @ 9172]
Tim Ringenbach <marv@pidgin.im>
parents: 8433
diff changeset
1905 } else if (!strncmp(c, "&quot;", 6)) {
e5d2b1c684bb [gaim-migrate @ 9172]
Tim Ringenbach <marv@pidgin.im>
parents: 8433
diff changeset
1906 ret = g_string_append_c(ret, '"');
e5d2b1c684bb [gaim-migrate @ 9172]
Tim Ringenbach <marv@pidgin.im>
parents: 8433
diff changeset
1907 c += 6;
8625
fc8b225d804d [gaim-migrate @ 9376]
Nathan Walp <nwalp@pidgin.im>
parents: 8596
diff changeset
1908 } else if (!strncmp(c, "&apos;", 6)) {
fc8b225d804d [gaim-migrate @ 9376]
Nathan Walp <nwalp@pidgin.im>
parents: 8596
diff changeset
1909 ret = g_string_append_c(ret, '\'');
fc8b225d804d [gaim-migrate @ 9376]
Nathan Walp <nwalp@pidgin.im>
parents: 8596
diff changeset
1910 c += 6;
8500
f6a189a74602 [gaim-migrate @ 9236]
Tim Ringenbach <marv@pidgin.im>
parents: 8442
diff changeset
1911 } else if (!strncmp(c, "<br>", 4)) {
f6a189a74602 [gaim-migrate @ 9236]
Tim Ringenbach <marv@pidgin.im>
parents: 8442
diff changeset
1912 ret = g_string_append_c(ret, '\n');
f6a189a74602 [gaim-migrate @ 9236]
Tim Ringenbach <marv@pidgin.im>
parents: 8442
diff changeset
1913 c += 4;
8442
e5d2b1c684bb [gaim-migrate @ 9172]
Tim Ringenbach <marv@pidgin.im>
parents: 8433
diff changeset
1914 } else {
e5d2b1c684bb [gaim-migrate @ 9172]
Tim Ringenbach <marv@pidgin.im>
parents: 8433
diff changeset
1915 ret = g_string_append_c(ret, *c);
e5d2b1c684bb [gaim-migrate @ 9172]
Tim Ringenbach <marv@pidgin.im>
parents: 8433
diff changeset
1916 c++;
e5d2b1c684bb [gaim-migrate @ 9172]
Tim Ringenbach <marv@pidgin.im>
parents: 8433
diff changeset
1917 }
e5d2b1c684bb [gaim-migrate @ 9172]
Tim Ringenbach <marv@pidgin.im>
parents: 8433
diff changeset
1918 }
e5d2b1c684bb [gaim-migrate @ 9172]
Tim Ringenbach <marv@pidgin.im>
parents: 8433
diff changeset
1919
e5d2b1c684bb [gaim-migrate @ 9172]
Tim Ringenbach <marv@pidgin.im>
parents: 8433
diff changeset
1920 unescaped = ret->str;
e5d2b1c684bb [gaim-migrate @ 9172]
Tim Ringenbach <marv@pidgin.im>
parents: 8433
diff changeset
1921 g_string_free(ret, FALSE);
e5d2b1c684bb [gaim-migrate @ 9172]
Tim Ringenbach <marv@pidgin.im>
parents: 8433
diff changeset
1922 }
e5d2b1c684bb [gaim-migrate @ 9172]
Tim Ringenbach <marv@pidgin.im>
parents: 8433
diff changeset
1923 return unescaped;
e5d2b1c684bb [gaim-migrate @ 9172]
Tim Ringenbach <marv@pidgin.im>
parents: 8433
diff changeset
1924
e5d2b1c684bb [gaim-migrate @ 9172]
Tim Ringenbach <marv@pidgin.im>
parents: 8433
diff changeset
1925 }
e5d2b1c684bb [gaim-migrate @ 9172]
Tim Ringenbach <marv@pidgin.im>
parents: 8433
diff changeset
1926
9175
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1927 char *
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1928 gaim_markup_slice(const char *str, guint x, guint y)
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1929 {
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1930 GString *ret;
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1931 GQueue *q;
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1932 guint z = 0;
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1933 gboolean appended = FALSE;
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1934 gunichar c;
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1935 char *tag;
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1936
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1937 g_return_val_if_fail(x <= y, NULL);
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1938
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1939 if (x == y)
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1940 return g_strdup("");
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1941
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1942 ret = g_string_new("");
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1943 q = g_queue_new();
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1944
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1945 while (*str && (z < y)) {
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1946 c = g_utf8_get_char(str);
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1947
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1948 if (c == '<') {
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1949 char *end = strchr(str, '>');
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1950
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1951 if (!end) {
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1952 g_string_free(ret, TRUE);
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1953 while ((tag = g_queue_pop_head(q)))
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1954 g_free(tag);
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1955 g_queue_free(q);
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1956 return NULL;
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1957 }
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1958
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1959 if (!g_ascii_strncasecmp(str, "<img ", 5)) {
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1960 z += strlen("[Image]");
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1961 } else if (!g_ascii_strncasecmp(str, "<br", 3)) {
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1962 z += 1;
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1963 } else if (!g_ascii_strncasecmp(str, "<hr>", 4)) {
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1964 z += strlen("\n---\n");
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1965 } else if (!g_ascii_strncasecmp(str, "</", 2)) {
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1966 /* pop stack */
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1967 char *tmp;
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1968
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1969 tmp = g_queue_pop_head(q);
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1970 if (tmp)
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1971 g_free(tmp);
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1972 /* z += 0; */
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1973 } else {
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1974 /* push it unto the stack */
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1975 char *tmp;
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1976
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1977 tmp = g_strndup(str, end - str + 1);
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1978 g_queue_push_head(q, tmp);
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1979 /* z += 0; */
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1980 }
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1981
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1982 if (z == x && !appended) {
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1983 GList *l = q->tail;
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1984
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1985 while (l) {
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1986 tag = l->data;
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1987 g_string_append(ret, tag);
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1988 l = l->prev;
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1989 }
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1990 appended = TRUE;
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1991 } else if (z >= x) {
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1992 g_string_append_len(ret, str, end - str + 1);
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1993 }
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1994
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1995 str = end;
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1996 } else if (c == '&') {
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1997 char *end = strchr(str, ';');
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1998 if (!end) {
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
1999 g_string_free(ret, TRUE);
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2000 while ((tag = g_queue_pop_head(q)))
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2001 g_free(tag);
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2002 g_queue_free(q);
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2003
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2004 return NULL;
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2005 }
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2006
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2007 if (z >= x)
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2008 g_string_append_len(ret, str, end - str + 1);
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2009
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2010 z++;
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2011 str = end;
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2012 } else {
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2013 if (z >= x)
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2014 g_string_append_unichar(ret, c);
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2015 z++;
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2016 }
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2017
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2018 str = g_utf8_next_char(str);
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2019 }
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2020
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2021 while ((tag = g_queue_pop_head(q))) {
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2022 char *name;
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2023
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2024 name = gaim_markup_get_tag_name(tag);
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2025 g_string_append_printf(ret, "</%s>", name);
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2026 g_free(name);
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2027 g_free(tag);
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2028 }
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2029
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2030 g_queue_free(q);
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2031 return g_string_free(ret, FALSE);
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2032 }
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2033
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2034 char *
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2035 gaim_markup_get_tag_name(const char *tag)
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2036 {
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2037 int i;
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2038 g_return_val_if_fail(tag != NULL, NULL);
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2039 g_return_val_if_fail(*tag == '<', NULL);
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2040
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2041 for (i = 1; tag[i]; i++)
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2042 if (tag[i] == '>' || tag[i] == ' ' || tag[i] == '/')
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2043 break;
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2044
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2045 return g_strndup(tag, i);
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2046 }
50bd82a24830 [gaim-migrate @ 9970]
Tim Ringenbach <marv@pidgin.im>
parents: 9170
diff changeset
2047
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2048 /**************************************************************************
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2049 * Path/Filename Functions
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2050 **************************************************************************/
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2051 const char *
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2052 gaim_home_dir(void)
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2053 {
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2054 #ifndef _WIN32
11665
6b80cef9b563 [gaim-migrate @ 13950]
Michael Carlson <corfe83@users.sourceforge.net>
parents: 11656
diff changeset
2055 return g_get_home_dir();
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2056 #else
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2057 return wgaim_data_dir();
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2058 #endif
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2059 }
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2060
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2061 /* returns a string of the form ~/.gaim, where ~ is replaced by the user's home
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2062 * dir. Note that there is no trailing slash after .gaim. */
10332
62ed0121db22 [gaim-migrate @ 11539]
Mark Doliner <markdoliner@pidgin.im>
parents: 10258
diff changeset
2063 const char *
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2064 gaim_user_dir(void)
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2065 {
8596
6d70d45b8ea6 [gaim-migrate @ 9347]
Daniel Atallah <datallah@pidgin.im>
parents: 8577
diff changeset
2066 if (custom_home_dir != NULL && strlen(custom_home_dir) > 0) {
6d70d45b8ea6 [gaim-migrate @ 9347]
Daniel Atallah <datallah@pidgin.im>
parents: 8577
diff changeset
2067 strcpy ((char*) &home_dir, (char*) &custom_home_dir);
6d70d45b8ea6 [gaim-migrate @ 9347]
Daniel Atallah <datallah@pidgin.im>
parents: 8577
diff changeset
2068 } else {
6d70d45b8ea6 [gaim-migrate @ 9347]
Daniel Atallah <datallah@pidgin.im>
parents: 8577
diff changeset
2069 const gchar *hd = gaim_home_dir();
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2070
8596
6d70d45b8ea6 [gaim-migrate @ 9347]
Daniel Atallah <datallah@pidgin.im>
parents: 8577
diff changeset
2071 if (hd) {
9916
9ccd988b02c4 [gaim-migrate @ 10808]
Daniel Atallah <datallah@pidgin.im>
parents: 9818
diff changeset
2072 g_strlcpy((char*) &home_dir, hd, sizeof(home_dir));
9ccd988b02c4 [gaim-migrate @ 10808]
Daniel Atallah <datallah@pidgin.im>
parents: 9818
diff changeset
2073 g_strlcat((char*) &home_dir, G_DIR_SEPARATOR_S ".gaim",
9ccd988b02c4 [gaim-migrate @ 10808]
Daniel Atallah <datallah@pidgin.im>
parents: 9818
diff changeset
2074 sizeof(home_dir));
8596
6d70d45b8ea6 [gaim-migrate @ 9347]
Daniel Atallah <datallah@pidgin.im>
parents: 8577
diff changeset
2075 }
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2076 }
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2077
8596
6d70d45b8ea6 [gaim-migrate @ 9347]
Daniel Atallah <datallah@pidgin.im>
parents: 8577
diff changeset
2078 return home_dir;
6d70d45b8ea6 [gaim-migrate @ 9347]
Daniel Atallah <datallah@pidgin.im>
parents: 8577
diff changeset
2079 }
6d70d45b8ea6 [gaim-migrate @ 9347]
Daniel Atallah <datallah@pidgin.im>
parents: 8577
diff changeset
2080
10871
c0282a4f2250 [gaim-migrate @ 12558]
Mark Doliner <markdoliner@pidgin.im>
parents: 10800
diff changeset
2081 void gaim_util_set_user_dir(const char *dir)
8596
6d70d45b8ea6 [gaim-migrate @ 9347]
Daniel Atallah <datallah@pidgin.im>
parents: 8577
diff changeset
2082 {
6d70d45b8ea6 [gaim-migrate @ 9347]
Daniel Atallah <datallah@pidgin.im>
parents: 8577
diff changeset
2083 if (dir != NULL && strlen(dir) > 0) {
9916
9ccd988b02c4 [gaim-migrate @ 10808]
Daniel Atallah <datallah@pidgin.im>
parents: 9818
diff changeset
2084 g_strlcpy((char*) &custom_home_dir, dir,
9ccd988b02c4 [gaim-migrate @ 10808]
Daniel Atallah <datallah@pidgin.im>
parents: 9818
diff changeset
2085 sizeof(custom_home_dir));
8596
6d70d45b8ea6 [gaim-migrate @ 9347]
Daniel Atallah <datallah@pidgin.im>
parents: 8577
diff changeset
2086 }
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2087 }
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2088
7622
8a983ae9204f [gaim-migrate @ 8246]
Nathan Walp <nwalp@pidgin.im>
parents: 7617
diff changeset
2089 int gaim_build_dir (const char *path, int mode)
7612
4f5211591dbd [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
2090 {
11361
b8c9532c9ffe [gaim-migrate @ 13585]
Nathan Walp <nwalp@pidgin.im>
parents: 11237
diff changeset
2091 #if GLIB_CHECK_VERSION(2,8,0)
b8c9532c9ffe [gaim-migrate @ 13585]
Nathan Walp <nwalp@pidgin.im>
parents: 11237
diff changeset
2092 return g_mkdir_with_parents(path, mode);
b8c9532c9ffe [gaim-migrate @ 13585]
Nathan Walp <nwalp@pidgin.im>
parents: 11237
diff changeset
2093 #else
7612
4f5211591dbd [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
2094 char *dir, **components, delim[] = { G_DIR_SEPARATOR, '\0' };
4f5211591dbd [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
2095 int cur, len;
4f5211591dbd [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
2096
7632
c81dccce23ed [gaim-migrate @ 8257]
Nathan Walp <nwalp@pidgin.im>
parents: 7631
diff changeset
2097 g_return_val_if_fail(path != NULL, -1);
7612
4f5211591dbd [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
2098
4f5211591dbd [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
2099 dir = g_new0(char, strlen(path) + 1);
7622
8a983ae9204f [gaim-migrate @ 8246]
Nathan Walp <nwalp@pidgin.im>
parents: 7617
diff changeset
2100 components = g_strsplit(path, delim, -1);
7612
4f5211591dbd [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
2101 len = 0;
4f5211591dbd [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
2102 for (cur = 0; components[cur] != NULL; cur++) {
7633
653fd7bd7e20 [gaim-migrate @ 8258]
Nathan Walp <nwalp@pidgin.im>
parents: 7632
diff changeset
2103 /* If you don't know what you're doing on both
653fd7bd7e20 [gaim-migrate @ 8258]
Nathan Walp <nwalp@pidgin.im>
parents: 7632
diff changeset
2104 * win32 and *NIX, stay the hell away from this code */
653fd7bd7e20 [gaim-migrate @ 8258]
Nathan Walp <nwalp@pidgin.im>
parents: 7632
diff changeset
2105 if(cur > 1)
653fd7bd7e20 [gaim-migrate @ 8258]
Nathan Walp <nwalp@pidgin.im>
parents: 7632
diff changeset
2106 dir[len++] = G_DIR_SEPARATOR;
7612
4f5211591dbd [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
2107 strcpy(dir + len, components[cur]);
4f5211591dbd [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
2108 len += strlen(components[cur]);
7633
653fd7bd7e20 [gaim-migrate @ 8258]
Nathan Walp <nwalp@pidgin.im>
parents: 7632
diff changeset
2109 if(cur == 0)
653fd7bd7e20 [gaim-migrate @ 8258]
Nathan Walp <nwalp@pidgin.im>
parents: 7632
diff changeset
2110 dir[len++] = G_DIR_SEPARATOR;
7632
c81dccce23ed [gaim-migrate @ 8257]
Nathan Walp <nwalp@pidgin.im>
parents: 7631
diff changeset
2111
c81dccce23ed [gaim-migrate @ 8257]
Nathan Walp <nwalp@pidgin.im>
parents: 7631
diff changeset
2112 if(g_file_test(dir, G_FILE_TEST_IS_DIR)) {
c81dccce23ed [gaim-migrate @ 8257]
Nathan Walp <nwalp@pidgin.im>
parents: 7631
diff changeset
2113 continue;
10948
3a55085a2f33 [gaim-migrate @ 12747]
Daniel Atallah <datallah@pidgin.im>
parents: 10905
diff changeset
2114 #ifdef _WIN32
3a55085a2f33 [gaim-migrate @ 12747]
Daniel Atallah <datallah@pidgin.im>
parents: 10905
diff changeset
2115 /* allow us to create subdirs on UNC paths
3a55085a2f33 [gaim-migrate @ 12747]
Daniel Atallah <datallah@pidgin.im>
parents: 10905
diff changeset
2116 * (\\machinename\path\to\blah)
3a55085a2f33 [gaim-migrate @ 12747]
Daniel Atallah <datallah@pidgin.im>
parents: 10905
diff changeset
2117 * g_file_test() doesn't work on "\\machinename" */
3a55085a2f33 [gaim-migrate @ 12747]
Daniel Atallah <datallah@pidgin.im>
parents: 10905
diff changeset
2118 } else if (cur == 2 && dir[0] == '\\' && dir[1] == '\\'
3a55085a2f33 [gaim-migrate @ 12747]
Daniel Atallah <datallah@pidgin.im>
parents: 10905
diff changeset
2119 && components[cur + 1] != NULL) {
3a55085a2f33 [gaim-migrate @ 12747]
Daniel Atallah <datallah@pidgin.im>
parents: 10905
diff changeset
2120 continue;
3a55085a2f33 [gaim-migrate @ 12747]
Daniel Atallah <datallah@pidgin.im>
parents: 10905
diff changeset
2121 #endif
7632
c81dccce23ed [gaim-migrate @ 8257]
Nathan Walp <nwalp@pidgin.im>
parents: 7631
diff changeset
2122 } else if(g_file_test(dir, G_FILE_TEST_EXISTS)) {
9716
4011c0d5f384 [gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents: 9696
diff changeset
2123 gaim_debug_warning("build_dir", "bad path: %s\n", path);
7612
4f5211591dbd [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
2124 g_strfreev(components);
4f5211591dbd [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
2125 g_free(dir);
4f5211591dbd [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
2126 return -1;
4f5211591dbd [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
2127 }
4f5211591dbd [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
2128
10589
4e10236e06d4 [gaim-migrate @ 11994]
Daniel Atallah <datallah@pidgin.im>
parents: 10569
diff changeset
2129 if (g_mkdir(dir, mode) < 0) {
9716
4011c0d5f384 [gaim-migrate @ 10577]
Mark Doliner <markdoliner@pidgin.im>
parents: 9696
diff changeset
2130 gaim_debug_warning("build_dir", "mkdir: %s\n", strerror(errno));
7612
4f5211591dbd [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
2131 g_strfreev(components);
4f5211591dbd [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
2132 g_free(dir);
4f5211591dbd [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
2133 return -1;
4f5211591dbd [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
2134 }
4f5211591dbd [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
2135 }
4f5211591dbd [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
2136
4f5211591dbd [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
2137 g_strfreev(components);
4f5211591dbd [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
2138 g_free(dir);
4f5211591dbd [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
2139 return 0;
11361
b8c9532c9ffe [gaim-migrate @ 13585]
Nathan Walp <nwalp@pidgin.im>
parents: 11237
diff changeset
2140 #endif
7612
4f5211591dbd [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
2141 }
4f5211591dbd [gaim-migrate @ 8236]
Ethan Blanton <elb@pidgin.im>
parents: 7564
diff changeset
2142
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2143 /*
10414
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2144 * This function is long and beautiful, like my--um, yeah. Anyway,
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2145 * it includes lots of error checking so as we don't overwrite
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2146 * people's settings if there is a problem writing the new values.
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2147 */
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2148 gboolean
10415
faceb835eb87 [gaim-migrate @ 11665]
Mark Doliner <markdoliner@pidgin.im>
parents: 10414
diff changeset
2149 gaim_util_write_data_to_file(const char *filename, const char *data, size_t size)
10414
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2150 {
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2151 const char *user_dir = gaim_user_dir();
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2152 gchar *filename_temp, *filename_full;
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2153 FILE *file;
10415
faceb835eb87 [gaim-migrate @ 11665]
Mark Doliner <markdoliner@pidgin.im>
parents: 10414
diff changeset
2154 size_t real_size, byteswritten;
10414
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2155 struct stat st;
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2156
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2157 g_return_val_if_fail(user_dir != NULL, FALSE);
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2158
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2159 gaim_debug_info("util", "Writing file %s to directory %s\n",
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2160 filename, user_dir);
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2161
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2162 /* Ensure the user directory exists */
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2163 if (!g_file_test(user_dir, G_FILE_TEST_IS_DIR))
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2164 {
10589
4e10236e06d4 [gaim-migrate @ 11994]
Daniel Atallah <datallah@pidgin.im>
parents: 10569
diff changeset
2165 if (g_mkdir(user_dir, S_IRUSR | S_IWUSR | S_IXUSR) == -1)
10414
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2166 {
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2167 gaim_debug_error("util", "Error creating directory %s: %s\n",
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2168 user_dir, strerror(errno));
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2169 return FALSE;
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2170 }
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2171 }
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2172
10415
faceb835eb87 [gaim-migrate @ 11665]
Mark Doliner <markdoliner@pidgin.im>
parents: 10414
diff changeset
2173 filename_full = g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s", user_dir, filename);
10414
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2174 filename_temp = g_strdup_printf("%s.save", filename_full);
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2175
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2176 /* Remove an old temporary file, if one exists */
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2177 if (g_file_test(filename_temp, G_FILE_TEST_EXISTS))
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2178 {
10589
4e10236e06d4 [gaim-migrate @ 11994]
Daniel Atallah <datallah@pidgin.im>
parents: 10569
diff changeset
2179 if (g_unlink(filename_temp) == -1)
10414
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2180 {
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2181 gaim_debug_error("util", "Error removing old file %s: %s\n",
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2182 filename_temp, strerror(errno));
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2183 }
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2184 }
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2185
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2186 /* Open file */
10589
4e10236e06d4 [gaim-migrate @ 11994]
Daniel Atallah <datallah@pidgin.im>
parents: 10569
diff changeset
2187 file = g_fopen(filename_temp, "wb");
10414
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2188 if (file == NULL)
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2189 {
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2190 gaim_debug_error("util", "Error opening file %s for writing: %s\n",
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2191 filename_temp, strerror(errno));
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2192 g_free(filename_full);
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2193 g_free(filename_temp);
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2194 return FALSE;
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2195 }
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2196
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2197 /* Write to file */
10415
faceb835eb87 [gaim-migrate @ 11665]
Mark Doliner <markdoliner@pidgin.im>
parents: 10414
diff changeset
2198 real_size = (size == -1) ? strlen(data) : size;
faceb835eb87 [gaim-migrate @ 11665]
Mark Doliner <markdoliner@pidgin.im>
parents: 10414
diff changeset
2199 byteswritten = fwrite(data, 1, real_size, file);
10414
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2200
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2201 /* Close file */
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2202 if (fclose(file) != 0)
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2203 {
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2204 gaim_debug_error("util", "Error closing file %s: %s\n",
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2205 filename_temp, strerror(errno));
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2206 g_free(filename_full);
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2207 g_free(filename_temp);
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2208 return FALSE;
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2209 }
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2210
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2211 /* Ensure the file is the correct size */
10415
faceb835eb87 [gaim-migrate @ 11665]
Mark Doliner <markdoliner@pidgin.im>
parents: 10414
diff changeset
2212 if (byteswritten != real_size)
10414
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2213 {
11656
56f5e598dc6c [gaim-migrate @ 13940]
Richard Laager <rlaager@pidgin.im>
parents: 11552
diff changeset
2214 gaim_debug_error("util", "Error writing to file %s: Wrote %" G_GSIZE_FORMAT " bytes "
56f5e598dc6c [gaim-migrate @ 13940]
Richard Laager <rlaager@pidgin.im>
parents: 11552
diff changeset
2215 "but should have written %" G_GSIZE_FORMAT "; is your disk full?\n",
10415
faceb835eb87 [gaim-migrate @ 11665]
Mark Doliner <markdoliner@pidgin.im>
parents: 10414
diff changeset
2216 filename_temp, byteswritten, real_size);
10414
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2217 g_free(filename_full);
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2218 g_free(filename_temp);
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2219 return FALSE;
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2220 }
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2221 /* Use stat to be absolutely sure. */
10589
4e10236e06d4 [gaim-migrate @ 11994]
Daniel Atallah <datallah@pidgin.im>
parents: 10569
diff changeset
2222 if ((g_stat(filename_temp, &st) == -1) || (st.st_size != real_size))
10414
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2223 {
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2224 gaim_debug_error("util", "Error writing data to file %s: "
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2225 "Incomplete file written; is your disk full?\n",
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2226 filename_temp);
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2227 g_free(filename_full);
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2228 g_free(filename_temp);
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2229 return FALSE;
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2230 }
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2231
12622
55c9c22a3885 [gaim-migrate @ 14958]
Daniel Atallah <datallah@pidgin.im>
parents: 12620
diff changeset
2232 #ifndef _WIN32
10414
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2233 /* Set file permissions */
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2234 if (chmod(filename_temp, S_IRUSR | S_IWUSR) == -1)
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2235 {
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2236 gaim_debug_error("util", "Error setting permissions of file %s: %s\n",
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2237 filename_temp, strerror(errno));
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2238 }
12622
55c9c22a3885 [gaim-migrate @ 14958]
Daniel Atallah <datallah@pidgin.im>
parents: 12620
diff changeset
2239 #endif
10414
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2240
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2241 /* Remove the old file, if it exists */
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2242 if (g_file_test(filename_full, G_FILE_TEST_EXISTS))
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2243 {
10589
4e10236e06d4 [gaim-migrate @ 11994]
Daniel Atallah <datallah@pidgin.im>
parents: 10569
diff changeset
2244 if (g_unlink(filename_full) == -1)
10414
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2245 {
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2246 gaim_debug_error("util", "Error removing old file %s: %s\n",
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2247 filename_full, strerror(errno));
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2248 }
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2249 }
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2250
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2251 /* Rename to the REAL name */
10589
4e10236e06d4 [gaim-migrate @ 11994]
Daniel Atallah <datallah@pidgin.im>
parents: 10569
diff changeset
2252 if (g_rename(filename_temp, filename_full) == -1)
10414
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2253 {
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2254 gaim_debug_error("util", "Error renaming %s to %s: %s\n",
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2255 filename_temp, filename_full, strerror(errno));
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2256 }
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2257
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2258 g_free(filename_full);
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2259 g_free(filename_temp);
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2260
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2261 return TRUE;
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2262 }
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2263
10425
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2264 xmlnode *
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2265 gaim_util_read_xml_from_file(const char *filename, const char *description)
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2266 {
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2267 const char *user_dir = gaim_user_dir();
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2268 gchar *filename_full;
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2269 GError *error;
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2270 gchar *contents = NULL;
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2271 gsize length;
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2272 xmlnode *node = NULL;
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2273
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2274 g_return_val_if_fail(user_dir != NULL, NULL);
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2275
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2276 gaim_debug_info("util", "Reading file %s from directory %s\n",
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2277 filename, user_dir);
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2278
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2279 filename_full = g_build_filename(user_dir, filename, NULL);
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2280
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2281 if (!g_file_test(filename_full, G_FILE_TEST_EXISTS))
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2282 {
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2283 gaim_debug_info("util", "File %s does not exist (this is not "
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2284 "necessarily an error)\n", filename_full);
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2285 g_free(filename_full);
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2286 return NULL;
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2287 }
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2288
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2289 if (!g_file_get_contents(filename_full, &contents, &length, &error))
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2290 {
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2291 gaim_debug_error("util", "Error reading file %s: %s\n",
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2292 filename_full, error->message);
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2293 g_error_free(error);
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2294 }
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2295
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2296 if ((contents != NULL) && (length > 0))
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2297 {
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2298 node = xmlnode_from_str(contents, length);
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2299
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2300 /* If we were unable to parse the file then save its contents to a backup file */
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2301 if (node == NULL)
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2302 {
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2303 gchar *filename_temp;
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2304
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2305 filename_temp = g_strdup_printf("%s~", filename);
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2306 gaim_debug_error("util", "Error parsing file %s. Rrenaming old "
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2307 "file to %s\n", filename_full, filename_temp);
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2308 gaim_util_write_data_to_file(filename_temp, contents, length);
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2309 g_free(filename_temp);
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2310 }
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2311
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2312 g_free(contents);
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2313 }
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2314
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2315 /* If we could not parse the file then show the user an error message */
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2316 if (node == NULL)
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2317 {
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2318 gchar *title, *msg;
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2319 title = g_strdup_printf(_("Error Reading %s"), filename);
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2320 msg = g_strdup_printf(_("An error was encountered reading your "
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2321 "%s. They have not been loaded, and the old file "
11493
7f7bb96ece74 [gaim-migrate @ 13736]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 11407
diff changeset
2322 "has been renamed to %s~."), description, filename_full);
10425
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2323 gaim_notify_error(NULL, NULL, title, msg);
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2324 g_free(title);
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2325 g_free(msg);
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2326 }
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2327
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2328 g_free(filename_full);
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2329
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2330 return node;
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2331 }
d82cef15da95 [gaim-migrate @ 11677]
Mark Doliner <markdoliner@pidgin.im>
parents: 10415
diff changeset
2332
10414
6b10b76933e1 [gaim-migrate @ 11664]
Mark Doliner <markdoliner@pidgin.im>
parents: 10372
diff changeset
2333 /*
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2334 * Like mkstemp() but returns a file pointer, uses a pre-set template,
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2335 * uses the semantics of tempnam() for the directory to use and allocates
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2336 * the space for the filepath.
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2337 *
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2338 * Caller is responsible for closing the file and removing it when done,
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2339 * as well as freeing the space pointed-to by "path" with g_free().
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2340 *
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2341 * Returns NULL on failure and cleans up after itself if so.
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2342 */
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2343 static const char *gaim_mkstemp_templ = {"gaimXXXXXX"};
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2344
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2345 FILE *
10203
21d6c11a53c6 [gaim-migrate @ 11324]
Herman Bloggs <herman@bluedigits.com>
parents: 10112
diff changeset
2346 gaim_mkstemp(char **fpath, gboolean binary)
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2347 {
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2348 const gchar *tmpdir;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2349 #ifndef _WIN32
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2350 int fd;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2351 #endif
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2352 FILE *fp = NULL;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2353
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2354 g_return_val_if_fail(fpath != NULL, NULL);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2355
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2356 if((tmpdir = (gchar*)g_get_tmp_dir()) != NULL) {
9427
4155f2f8f5fb [gaim-migrate @ 10245]
Arun Tharuvai <aatharuv@mit.edu>
parents: 9426
diff changeset
2357 if((*fpath = g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s", tmpdir, gaim_mkstemp_templ)) != NULL) {
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2358 #ifdef _WIN32
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2359 char* result = _mktemp( *fpath );
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2360 if( result == NULL )
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2361 gaim_debug(GAIM_DEBUG_ERROR, "gaim_mkstemp",
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2362 "Problem creating the template\n");
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2363 else
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2364 {
10589
4e10236e06d4 [gaim-migrate @ 11994]
Daniel Atallah <datallah@pidgin.im>
parents: 10569
diff changeset
2365 if( (fp = g_fopen( result, binary?"wb+":"w+")) == NULL ) {
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2366 gaim_debug(GAIM_DEBUG_ERROR, "gaim_mkstemp",
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2367 "Couldn't fopen() %s\n", result);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2368 }
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2369 }
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2370 #else
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2371 if((fd = mkstemp(*fpath)) == -1) {
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2372 gaim_debug(GAIM_DEBUG_ERROR, "gaim_mkstemp",
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2373 "Couldn't make \"%s\", error: %d\n",
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2374 *fpath, errno);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2375 } else {
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2376 if((fp = fdopen(fd, "r+")) == NULL) {
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2377 close(fd);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2378 gaim_debug(GAIM_DEBUG_ERROR, "gaim_mkstemp",
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2379 "Couldn't fdopen(), error: %d\n", errno);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2380 }
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2381 }
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2382 #endif
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2383 if(!fp) {
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2384 g_free(*fpath);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2385 *fpath = NULL;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2386 }
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2387 }
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2388 } else {
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2389 gaim_debug(GAIM_DEBUG_ERROR, "gaim_mkstemp",
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2390 "g_get_tmp_dir() failed!");
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2391 }
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2392
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2393 return fp;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2394 }
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2395
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2396 gboolean
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2397 gaim_program_is_valid(const char *program)
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2398 {
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2399 GError *error = NULL;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2400 char **argv;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2401 gchar *progname;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2402 gboolean is_valid = FALSE;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2403
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2404 g_return_val_if_fail(program != NULL, FALSE);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2405 g_return_val_if_fail(*program != '\0', FALSE);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2406
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2407 if (!g_shell_parse_argv(program, NULL, &argv, &error)) {
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2408 gaim_debug(GAIM_DEBUG_ERROR, "program_is_valid",
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2409 "Could not parse program '%s': %s\n",
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2410 program, error->message);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2411 g_error_free(error);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2412 return FALSE;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2413 }
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2414
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2415 if (argv == NULL) {
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2416 return FALSE;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2417 }
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2418
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2419 progname = g_find_program_in_path(argv[0]);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2420 is_valid = (progname != NULL);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2421
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2422 g_strfreev(argv);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2423 g_free(progname);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2424
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2425 return is_valid;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2426 }
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2427
11878
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11780
diff changeset
2428
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11780
diff changeset
2429 gboolean
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11780
diff changeset
2430 gaim_running_gnome(void)
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11780
diff changeset
2431 {
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11780
diff changeset
2432 gchar *tmp = g_find_program_in_path("gnome-open");
12483
38fc67810cdb [gaim-migrate @ 14795]
Richard Laager <rlaager@pidgin.im>
parents: 12110
diff changeset
2433
38fc67810cdb [gaim-migrate @ 14795]
Richard Laager <rlaager@pidgin.im>
parents: 12110
diff changeset
2434 if (tmp == NULL)
38fc67810cdb [gaim-migrate @ 14795]
Richard Laager <rlaager@pidgin.im>
parents: 12110
diff changeset
2435 return FALSE;
38fc67810cdb [gaim-migrate @ 14795]
Richard Laager <rlaager@pidgin.im>
parents: 12110
diff changeset
2436 g_free(tmp);
38fc67810cdb [gaim-migrate @ 14795]
Richard Laager <rlaager@pidgin.im>
parents: 12110
diff changeset
2437
38fc67810cdb [gaim-migrate @ 14795]
Richard Laager <rlaager@pidgin.im>
parents: 12110
diff changeset
2438 return (g_getenv("GNOME_DESKTOP_SESSION_ID") != NULL);
38fc67810cdb [gaim-migrate @ 14795]
Richard Laager <rlaager@pidgin.im>
parents: 12110
diff changeset
2439 }
38fc67810cdb [gaim-migrate @ 14795]
Richard Laager <rlaager@pidgin.im>
parents: 12110
diff changeset
2440
38fc67810cdb [gaim-migrate @ 14795]
Richard Laager <rlaager@pidgin.im>
parents: 12110
diff changeset
2441 gboolean
38fc67810cdb [gaim-migrate @ 14795]
Richard Laager <rlaager@pidgin.im>
parents: 12110
diff changeset
2442 gaim_running_kde(void)
38fc67810cdb [gaim-migrate @ 14795]
Richard Laager <rlaager@pidgin.im>
parents: 12110
diff changeset
2443 {
38fc67810cdb [gaim-migrate @ 14795]
Richard Laager <rlaager@pidgin.im>
parents: 12110
diff changeset
2444 gchar *tmp = g_find_program_in_path("kfmclient");
38fc67810cdb [gaim-migrate @ 14795]
Richard Laager <rlaager@pidgin.im>
parents: 12110
diff changeset
2445 const char *session;
38fc67810cdb [gaim-migrate @ 14795]
Richard Laager <rlaager@pidgin.im>
parents: 12110
diff changeset
2446
38fc67810cdb [gaim-migrate @ 14795]
Richard Laager <rlaager@pidgin.im>
parents: 12110
diff changeset
2447 if (tmp == NULL)
38fc67810cdb [gaim-migrate @ 14795]
Richard Laager <rlaager@pidgin.im>
parents: 12110
diff changeset
2448 return FALSE;
38fc67810cdb [gaim-migrate @ 14795]
Richard Laager <rlaager@pidgin.im>
parents: 12110
diff changeset
2449 g_free(tmp);
38fc67810cdb [gaim-migrate @ 14795]
Richard Laager <rlaager@pidgin.im>
parents: 12110
diff changeset
2450
38fc67810cdb [gaim-migrate @ 14795]
Richard Laager <rlaager@pidgin.im>
parents: 12110
diff changeset
2451 session = g_getenv("KDE_FULL_SESSION");
38fc67810cdb [gaim-migrate @ 14795]
Richard Laager <rlaager@pidgin.im>
parents: 12110
diff changeset
2452 if (session != NULL && !strcmp(session, "true"))
11878
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11780
diff changeset
2453 return TRUE;
12483
38fc67810cdb [gaim-migrate @ 14795]
Richard Laager <rlaager@pidgin.im>
parents: 12110
diff changeset
2454
38fc67810cdb [gaim-migrate @ 14795]
Richard Laager <rlaager@pidgin.im>
parents: 12110
diff changeset
2455 /* If you run Gaim from Konsole under !KDE, this will provide a
38fc67810cdb [gaim-migrate @ 14795]
Richard Laager <rlaager@pidgin.im>
parents: 12110
diff changeset
2456 * a false positive. Since we do the GNOME checks first, this is
38fc67810cdb [gaim-migrate @ 14795]
Richard Laager <rlaager@pidgin.im>
parents: 12110
diff changeset
2457 * only a problem if you're running something !(KDE || GNOME) and
38fc67810cdb [gaim-migrate @ 14795]
Richard Laager <rlaager@pidgin.im>
parents: 12110
diff changeset
2458 * you run Gaim from Konsole. This really shouldn't be a problem. */
38fc67810cdb [gaim-migrate @ 14795]
Richard Laager <rlaager@pidgin.im>
parents: 12110
diff changeset
2459 return ((g_getenv("KDEDIR") != NULL) || g_getenv("KDEDIRS") != NULL);
11878
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11780
diff changeset
2460 }
4c2661df91bb [gaim-migrate @ 14169]
Sean Egan <seanegan@pidgin.im>
parents: 11780
diff changeset
2461
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2462 char *
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2463 gaim_fd_get_ip(int fd)
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2464 {
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2465 struct sockaddr addr;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2466 socklen_t namelen = sizeof(addr);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2467
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2468 g_return_val_if_fail(fd != 0, NULL);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2469
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2470 if (getsockname(fd, &addr, &namelen))
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2471 return NULL;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2472
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2473 return g_strdup(inet_ntoa(((struct sockaddr_in *)&addr)->sin_addr));
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2474 }
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2475
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2476
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2477 /**************************************************************************
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2478 * String Functions
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2479 **************************************************************************/
7162
dfd30c70acde [gaim-migrate @ 7729]
Nathan Walp <nwalp@pidgin.im>
parents: 7134
diff changeset
2480 const char *
11153
b5c721366f2d [gaim-migrate @ 13235]
Evan Schoenberg <evands@pidgin.im>
parents: 11142
diff changeset
2481 gaim_normalize(const GaimAccount *account, const char *str)
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2482 {
7261
4be05820d441 [gaim-migrate @ 7838]
Nathan Walp <nwalp@pidgin.im>
parents: 7162
diff changeset
2483 GaimPlugin *prpl = NULL;
4be05820d441 [gaim-migrate @ 7838]
Nathan Walp <nwalp@pidgin.im>
parents: 7162
diff changeset
2484 GaimPluginProtocolInfo *prpl_info = NULL;
7430
bf3e9ac3302e [gaim-migrate @ 8034]
Nathan Walp <nwalp@pidgin.im>
parents: 7386
diff changeset
2485 const char *ret = NULL;
7261
4be05820d441 [gaim-migrate @ 7838]
Nathan Walp <nwalp@pidgin.im>
parents: 7162
diff changeset
2486
4be05820d441 [gaim-migrate @ 7838]
Nathan Walp <nwalp@pidgin.im>
parents: 7162
diff changeset
2487 if(account)
7956
21d891f33b89 [gaim-migrate @ 8631]
Nathan Walp <nwalp@pidgin.im>
parents: 7889
diff changeset
2488 prpl = gaim_find_prpl(gaim_account_get_protocol_id(account));
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2489
7261
4be05820d441 [gaim-migrate @ 7838]
Nathan Walp <nwalp@pidgin.im>
parents: 7162
diff changeset
2490 if(prpl)
4be05820d441 [gaim-migrate @ 7838]
Nathan Walp <nwalp@pidgin.im>
parents: 7162
diff changeset
2491 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl);
4be05820d441 [gaim-migrate @ 7838]
Nathan Walp <nwalp@pidgin.im>
parents: 7162
diff changeset
2492
7430
bf3e9ac3302e [gaim-migrate @ 8034]
Nathan Walp <nwalp@pidgin.im>
parents: 7386
diff changeset
2493 if(prpl_info && prpl_info->normalize)
11153
b5c721366f2d [gaim-migrate @ 13235]
Evan Schoenberg <evands@pidgin.im>
parents: 11142
diff changeset
2494 ret = prpl_info->normalize(account, str);
b5c721366f2d [gaim-migrate @ 13235]
Evan Schoenberg <evands@pidgin.im>
parents: 11142
diff changeset
2495
b5c721366f2d [gaim-migrate @ 13235]
Evan Schoenberg <evands@pidgin.im>
parents: 11142
diff changeset
2496 if(!ret)
b5c721366f2d [gaim-migrate @ 13235]
Evan Schoenberg <evands@pidgin.im>
parents: 11142
diff changeset
2497 {
7261
4be05820d441 [gaim-migrate @ 7838]
Nathan Walp <nwalp@pidgin.im>
parents: 7162
diff changeset
2498 static char buf[BUF_LEN];
4be05820d441 [gaim-migrate @ 7838]
Nathan Walp <nwalp@pidgin.im>
parents: 7162
diff changeset
2499 char *tmp;
11153
b5c721366f2d [gaim-migrate @ 13235]
Evan Schoenberg <evands@pidgin.im>
parents: 11142
diff changeset
2500
b5c721366f2d [gaim-migrate @ 13235]
Evan Schoenberg <evands@pidgin.im>
parents: 11142
diff changeset
2501 tmp = g_utf8_normalize(str, -1, G_NORMALIZE_DEFAULT);
7261
4be05820d441 [gaim-migrate @ 7838]
Nathan Walp <nwalp@pidgin.im>
parents: 7162
diff changeset
2502 g_snprintf(buf, sizeof(buf), "%s", tmp);
4be05820d441 [gaim-migrate @ 7838]
Nathan Walp <nwalp@pidgin.im>
parents: 7162
diff changeset
2503 g_free(tmp);
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2504
7430
bf3e9ac3302e [gaim-migrate @ 8034]
Nathan Walp <nwalp@pidgin.im>
parents: 7386
diff changeset
2505 ret = buf;
7261
4be05820d441 [gaim-migrate @ 7838]
Nathan Walp <nwalp@pidgin.im>
parents: 7162
diff changeset
2506 }
11153
b5c721366f2d [gaim-migrate @ 13235]
Evan Schoenberg <evands@pidgin.im>
parents: 11142
diff changeset
2507
7430
bf3e9ac3302e [gaim-migrate @ 8034]
Nathan Walp <nwalp@pidgin.im>
parents: 7386
diff changeset
2508 return ret;
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2509 }
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2510
11153
b5c721366f2d [gaim-migrate @ 13235]
Evan Schoenberg <evands@pidgin.im>
parents: 11142
diff changeset
2511 /*
b5c721366f2d [gaim-migrate @ 13235]
Evan Schoenberg <evands@pidgin.im>
parents: 11142
diff changeset
2512 * You probably don't want to call this directly, it is
b5c721366f2d [gaim-migrate @ 13235]
Evan Schoenberg <evands@pidgin.im>
parents: 11142
diff changeset
2513 * mainly for use as a PRPL callback function. See the
b5c721366f2d [gaim-migrate @ 13235]
Evan Schoenberg <evands@pidgin.im>
parents: 11142
diff changeset
2514 * comments in util.h.
b5c721366f2d [gaim-migrate @ 13235]
Evan Schoenberg <evands@pidgin.im>
parents: 11142
diff changeset
2515 */
b5c721366f2d [gaim-migrate @ 13235]
Evan Schoenberg <evands@pidgin.im>
parents: 11142
diff changeset
2516 const char *
b5c721366f2d [gaim-migrate @ 13235]
Evan Schoenberg <evands@pidgin.im>
parents: 11142
diff changeset
2517 gaim_normalize_nocase(const GaimAccount *account, const char *str)
b5c721366f2d [gaim-migrate @ 13235]
Evan Schoenberg <evands@pidgin.im>
parents: 11142
diff changeset
2518 {
b5c721366f2d [gaim-migrate @ 13235]
Evan Schoenberg <evands@pidgin.im>
parents: 11142
diff changeset
2519 static char buf[BUF_LEN];
b5c721366f2d [gaim-migrate @ 13235]
Evan Schoenberg <evands@pidgin.im>
parents: 11142
diff changeset
2520 char *tmp1, *tmp2;
b5c721366f2d [gaim-migrate @ 13235]
Evan Schoenberg <evands@pidgin.im>
parents: 11142
diff changeset
2521
b5c721366f2d [gaim-migrate @ 13235]
Evan Schoenberg <evands@pidgin.im>
parents: 11142
diff changeset
2522 g_return_val_if_fail(str != NULL, NULL);
b5c721366f2d [gaim-migrate @ 13235]
Evan Schoenberg <evands@pidgin.im>
parents: 11142
diff changeset
2523
b5c721366f2d [gaim-migrate @ 13235]
Evan Schoenberg <evands@pidgin.im>
parents: 11142
diff changeset
2524 tmp1 = g_utf8_strdown(str, -1);
b5c721366f2d [gaim-migrate @ 13235]
Evan Schoenberg <evands@pidgin.im>
parents: 11142
diff changeset
2525 tmp2 = g_utf8_normalize(tmp1, -1, G_NORMALIZE_DEFAULT);
b5c721366f2d [gaim-migrate @ 13235]
Evan Schoenberg <evands@pidgin.im>
parents: 11142
diff changeset
2526 g_snprintf(buf, sizeof(buf), "%s", tmp2);
b5c721366f2d [gaim-migrate @ 13235]
Evan Schoenberg <evands@pidgin.im>
parents: 11142
diff changeset
2527 g_free(tmp2);
b5c721366f2d [gaim-migrate @ 13235]
Evan Schoenberg <evands@pidgin.im>
parents: 11142
diff changeset
2528 g_free(tmp1);
b5c721366f2d [gaim-migrate @ 13235]
Evan Schoenberg <evands@pidgin.im>
parents: 11142
diff changeset
2529
b5c721366f2d [gaim-migrate @ 13235]
Evan Schoenberg <evands@pidgin.im>
parents: 11142
diff changeset
2530 return buf;
b5c721366f2d [gaim-migrate @ 13235]
Evan Schoenberg <evands@pidgin.im>
parents: 11142
diff changeset
2531 }
b5c721366f2d [gaim-migrate @ 13235]
Evan Schoenberg <evands@pidgin.im>
parents: 11142
diff changeset
2532
8700
0c9288c5e40e [gaim-migrate @ 9453]
Mark Doliner <markdoliner@pidgin.im>
parents: 8686
diff changeset
2533 gchar *
0c9288c5e40e [gaim-migrate @ 9453]
Mark Doliner <markdoliner@pidgin.im>
parents: 8686
diff changeset
2534 gaim_str_sub_away_formatters(const char *str, const char *name)
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2535 {
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2536 char *c;
11237
20884737f404 [gaim-migrate @ 13388]
Mark Doliner <markdoliner@pidgin.im>
parents: 11176
diff changeset
2537 GString *cpy;
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2538 time_t t;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2539 struct tm *tme;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2540
8700
0c9288c5e40e [gaim-migrate @ 9453]
Mark Doliner <markdoliner@pidgin.im>
parents: 8686
diff changeset
2541 g_return_val_if_fail(str != NULL, NULL);
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2542 g_return_val_if_fail(name != NULL, NULL);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2543
11237
20884737f404 [gaim-migrate @ 13388]
Mark Doliner <markdoliner@pidgin.im>
parents: 11176
diff changeset
2544 /* Create an empty GString that is hopefully big enough for most messages */
20884737f404 [gaim-migrate @ 13388]
Mark Doliner <markdoliner@pidgin.im>
parents: 11176
diff changeset
2545 cpy = g_string_sized_new(1024);
8700
0c9288c5e40e [gaim-migrate @ 9453]
Mark Doliner <markdoliner@pidgin.im>
parents: 8686
diff changeset
2546
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2547 t = time(NULL);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2548 tme = localtime(&t);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2549
8700
0c9288c5e40e [gaim-migrate @ 9453]
Mark Doliner <markdoliner@pidgin.im>
parents: 8686
diff changeset
2550 c = (char *)str;
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2551 while (*c) {
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2552 switch (*c) {
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2553 case '%':
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2554 if (*(c + 1)) {
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2555 switch (*(c + 1)) {
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2556 case 'n':
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2557 /* append name */
11237
20884737f404 [gaim-migrate @ 13388]
Mark Doliner <markdoliner@pidgin.im>
parents: 11176
diff changeset
2558 g_string_append(cpy, name);
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2559 c++;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2560 break;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2561 case 'd':
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2562 /* append date */
13117
e2ca7d501e45 [gaim-migrate @ 15478]
Richard Laager <rlaager@pidgin.im>
parents: 13116
diff changeset
2563 g_string_append(cpy, gaim_utf8_strftime("%m/%d/%Y", tme));
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2564 c++;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2565 break;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2566 case 't':
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2567 /* append time */
13117
e2ca7d501e45 [gaim-migrate @ 15478]
Richard Laager <rlaager@pidgin.im>
parents: 13116
diff changeset
2568 g_string_append(cpy, gaim_utf8_strftime("%I:%M:%S %p", tme));
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2569 c++;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2570 break;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2571 default:
11237
20884737f404 [gaim-migrate @ 13388]
Mark Doliner <markdoliner@pidgin.im>
parents: 11176
diff changeset
2572 g_string_append_c(cpy, *c);
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2573 }
10614
cda55093c0e6 [gaim-migrate @ 12074]
Ka-Hing Cheung <khc@pidgin.im>
parents: 10593
diff changeset
2574 } else {
11237
20884737f404 [gaim-migrate @ 13388]
Mark Doliner <markdoliner@pidgin.im>
parents: 11176
diff changeset
2575 g_string_append_c(cpy, *c);
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2576 }
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2577 break;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2578 default:
11237
20884737f404 [gaim-migrate @ 13388]
Mark Doliner <markdoliner@pidgin.im>
parents: 11176
diff changeset
2579 g_string_append_c(cpy, *c);
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2580 }
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2581 c++;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2582 }
11237
20884737f404 [gaim-migrate @ 13388]
Mark Doliner <markdoliner@pidgin.im>
parents: 11176
diff changeset
2583
20884737f404 [gaim-migrate @ 13388]
Mark Doliner <markdoliner@pidgin.im>
parents: 11176
diff changeset
2584 return g_string_free(cpy, FALSE);
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2585 }
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2586
8341
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2587 gchar *
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2588 gaim_strdup_withhtml(const gchar *src)
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2589 {
8341
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2590 gulong destsize, i, j;
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2591 gchar *dest;
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2592
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2593 g_return_val_if_fail(src != NULL, NULL);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2594
8341
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2595 /* New length is (length of src) + (number of \n's * 3) + 1 */
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2596 for (i = 0, j = 0; src[i] != '\0'; i++)
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2597 if (src[i] == '\n')
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2598 j++;
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2599
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2600 destsize = i + (j * 3) + 1;
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2601 dest = g_malloc(destsize);
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2602
8341
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2603 /* Copy stuff, ignoring \r's, because they are dumb */
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2604 for (i = 0, j = 0; src[i] != '\0'; i++) {
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2605 if (src[i] == '\n') {
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2606 strcpy(&dest[j], "<BR>");
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2607 j += 4;
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2608 } else if (src[i] != '\r')
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2609 dest[j++] = src[i];
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2610 }
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2611
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2612 dest[destsize-1] = '\0';
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2613
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2614 return dest;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2615 }
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2616
7628
f76ce1d73e1c [gaim-migrate @ 8252]
Ethan Blanton <elb@pidgin.im>
parents: 7622
diff changeset
2617 gboolean
f76ce1d73e1c [gaim-migrate @ 8252]
Ethan Blanton <elb@pidgin.im>
parents: 7622
diff changeset
2618 gaim_str_has_prefix(const char *s, const char *p)
f76ce1d73e1c [gaim-migrate @ 8252]
Ethan Blanton <elb@pidgin.im>
parents: 7622
diff changeset
2619 {
11780
9aee3bde84b9 [gaim-migrate @ 14071]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 11665
diff changeset
2620 #if GLIB_CHECK_VERSION(2,2,0)
9aee3bde84b9 [gaim-migrate @ 14071]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 11665
diff changeset
2621 return g_str_has_prefix(s, p);
9aee3bde84b9 [gaim-migrate @ 14071]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 11665
diff changeset
2622 #else
13096
03d1402b31ea [gaim-migrate @ 15457]
Richard Laager <rlaager@pidgin.im>
parents: 13090
diff changeset
2623 g_return_val_if_fail(s != NULL, FALSE);
03d1402b31ea [gaim-migrate @ 15457]
Richard Laager <rlaager@pidgin.im>
parents: 13090
diff changeset
2624 g_return_val_if_fail(p != NULL, FALSE);
03d1402b31ea [gaim-migrate @ 15457]
Richard Laager <rlaager@pidgin.im>
parents: 13090
diff changeset
2625
03d1402b31ea [gaim-migrate @ 15457]
Richard Laager <rlaager@pidgin.im>
parents: 13090
diff changeset
2626 return (!strncmp(s, p, strlen(p)));
11780
9aee3bde84b9 [gaim-migrate @ 14071]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 11665
diff changeset
2627 #endif
7628
f76ce1d73e1c [gaim-migrate @ 8252]
Ethan Blanton <elb@pidgin.im>
parents: 7622
diff changeset
2628 }
f76ce1d73e1c [gaim-migrate @ 8252]
Ethan Blanton <elb@pidgin.im>
parents: 7622
diff changeset
2629
f76ce1d73e1c [gaim-migrate @ 8252]
Ethan Blanton <elb@pidgin.im>
parents: 7622
diff changeset
2630 gboolean
f76ce1d73e1c [gaim-migrate @ 8252]
Ethan Blanton <elb@pidgin.im>
parents: 7622
diff changeset
2631 gaim_str_has_suffix(const char *s, const char *x)
f76ce1d73e1c [gaim-migrate @ 8252]
Ethan Blanton <elb@pidgin.im>
parents: 7622
diff changeset
2632 {
11780
9aee3bde84b9 [gaim-migrate @ 14071]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 11665
diff changeset
2633 #if GLIB_CHECK_VERSION(2,2,0)
9aee3bde84b9 [gaim-migrate @ 14071]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 11665
diff changeset
2634 return g_str_has_suffix(s, x);
9aee3bde84b9 [gaim-migrate @ 14071]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 11665
diff changeset
2635 #else
13096
03d1402b31ea [gaim-migrate @ 15457]
Richard Laager <rlaager@pidgin.im>
parents: 13090
diff changeset
2636 int off;
03d1402b31ea [gaim-migrate @ 15457]
Richard Laager <rlaager@pidgin.im>
parents: 13090
diff changeset
2637
03d1402b31ea [gaim-migrate @ 15457]
Richard Laager <rlaager@pidgin.im>
parents: 13090
diff changeset
2638 g_return_val_if_fail(s != NULL, FALSE);
03d1402b31ea [gaim-migrate @ 15457]
Richard Laager <rlaager@pidgin.im>
parents: 13090
diff changeset
2639 g_return_val_if_fail(x != NULL, FALSE);
03d1402b31ea [gaim-migrate @ 15457]
Richard Laager <rlaager@pidgin.im>
parents: 13090
diff changeset
2640
03d1402b31ea [gaim-migrate @ 15457]
Richard Laager <rlaager@pidgin.im>
parents: 13090
diff changeset
2641 off = strlen(s) - strlen(x);
03d1402b31ea [gaim-migrate @ 15457]
Richard Laager <rlaager@pidgin.im>
parents: 13090
diff changeset
2642 return (off >= 0 && !strcmp(s + off, x));
11780
9aee3bde84b9 [gaim-migrate @ 14071]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 11665
diff changeset
2643 #endif
7628
f76ce1d73e1c [gaim-migrate @ 8252]
Ethan Blanton <elb@pidgin.im>
parents: 7622
diff changeset
2644 }
f76ce1d73e1c [gaim-migrate @ 8252]
Ethan Blanton <elb@pidgin.im>
parents: 7622
diff changeset
2645
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2646 char *
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2647 gaim_str_add_cr(const char *text)
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2648 {
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2649 char *ret = NULL;
7631
0e9e516bb6c3 [gaim-migrate @ 8255]
Nathan Walp <nwalp@pidgin.im>
parents: 7628
diff changeset
2650 int count = 0, j;
0e9e516bb6c3 [gaim-migrate @ 8255]
Nathan Walp <nwalp@pidgin.im>
parents: 7628
diff changeset
2651 guint i;
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2652
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2653 g_return_val_if_fail(text != NULL, NULL);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2654
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2655 if (text[0] == '\n')
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2656 count++;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2657 for (i = 1; i < strlen(text); i++)
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2658 if (text[i] == '\n' && text[i - 1] != '\r')
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2659 count++;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2660
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2661 if (count == 0)
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2662 return g_strdup(text);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2663
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2664 ret = g_malloc0(strlen(text) + count + 1);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2665
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2666 i = 0; j = 0;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2667 if (text[i] == '\n')
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2668 ret[j++] = '\r';
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2669 ret[j++] = text[i++];
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2670 for (; i < strlen(text); i++) {
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2671 if (text[i] == '\n' && text[i - 1] != '\r')
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2672 ret[j++] = '\r';
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2673 ret[j++] = text[i];
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2674 }
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2675
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2676 gaim_debug_misc("gaim_str_add_cr", "got: %s, leaving with %s\n",
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2677 text, ret);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2678
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2679 return ret;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2680 }
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2681
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2682 void
11920
be80617ec59b [gaim-migrate @ 14211]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 11878
diff changeset
2683 gaim_str_strip_char(char *text, char thechar)
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2684 {
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2685 int i, j;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2686
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2687 g_return_if_fail(text != NULL);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2688
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2689 for (i = 0, j = 0; text[i]; i++)
11920
be80617ec59b [gaim-migrate @ 14211]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 11878
diff changeset
2690 if (text[i] != thechar)
11142
3ed4fc774b87 [gaim-migrate @ 13206]
Mark Doliner <markdoliner@pidgin.im>
parents: 11137
diff changeset
2691 text[j++] = text[i];
3ed4fc774b87 [gaim-migrate @ 13206]
Mark Doliner <markdoliner@pidgin.im>
parents: 11137
diff changeset
2692
3ed4fc774b87 [gaim-migrate @ 13206]
Mark Doliner <markdoliner@pidgin.im>
parents: 11137
diff changeset
2693 text[j++] = '\0';
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2694 }
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2695
11920
be80617ec59b [gaim-migrate @ 14211]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 11878
diff changeset
2696 void
be80617ec59b [gaim-migrate @ 14211]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 11878
diff changeset
2697 gaim_util_chrreplace(char *string, char delimiter,
be80617ec59b [gaim-migrate @ 14211]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 11878
diff changeset
2698 char replacement)
be80617ec59b [gaim-migrate @ 14211]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 11878
diff changeset
2699 {
be80617ec59b [gaim-migrate @ 14211]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 11878
diff changeset
2700 int i = 0;
be80617ec59b [gaim-migrate @ 14211]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 11878
diff changeset
2701
be80617ec59b [gaim-migrate @ 14211]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 11878
diff changeset
2702 g_return_if_fail(string != NULL);
be80617ec59b [gaim-migrate @ 14211]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 11878
diff changeset
2703
be80617ec59b [gaim-migrate @ 14211]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 11878
diff changeset
2704 while (string[i] != '\0')
be80617ec59b [gaim-migrate @ 14211]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 11878
diff changeset
2705 {
be80617ec59b [gaim-migrate @ 14211]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 11878
diff changeset
2706 if (string[i] == delimiter)
be80617ec59b [gaim-migrate @ 14211]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 11878
diff changeset
2707 string[i] = replacement;
be80617ec59b [gaim-migrate @ 14211]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 11878
diff changeset
2708 i++;
be80617ec59b [gaim-migrate @ 14211]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 11878
diff changeset
2709 }
be80617ec59b [gaim-migrate @ 14211]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 11878
diff changeset
2710 }
be80617ec59b [gaim-migrate @ 14211]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 11878
diff changeset
2711
8341
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2712 gchar *
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2713 gaim_strreplace(const char *string, const char *delimiter,
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2714 const char *replacement)
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2715 {
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2716 gchar **split;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2717 gchar *ret;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2718
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2719 g_return_val_if_fail(string != NULL, NULL);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2720 g_return_val_if_fail(delimiter != NULL, NULL);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2721 g_return_val_if_fail(replacement != NULL, NULL);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2722
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2723 split = g_strsplit(string, delimiter, 0);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2724 ret = g_strjoinv(replacement, split);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2725 g_strfreev(split);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2726
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2727 return ret;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2728 }
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2729
8341
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2730 gchar *
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2731 gaim_strcasereplace(const char *string, const char *delimiter,
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2732 const char *replacement)
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2733 {
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2734 gchar *ret;
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2735 int length_del, length_rep, i, j;
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2736
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2737 g_return_val_if_fail(string != NULL, NULL);
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2738 g_return_val_if_fail(delimiter != NULL, NULL);
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2739 g_return_val_if_fail(replacement != NULL, NULL);
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2740
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2741 length_del = strlen(delimiter);
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2742 length_rep = strlen(replacement);
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2743
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2744 /* Count how many times the delimiter appears */
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2745 i = 0; /* position in the source string */
8735
01248ea222d3 [gaim-migrate @ 9490]
Jonathan Champ <royanee@users.sourceforge.net>
parents: 8700
diff changeset
2746 j = 0; /* number of occurrences of "delimiter" */
8341
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2747 while (string[i] != '\0') {
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2748 if (!strncasecmp(&string[i], delimiter, length_del)) {
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2749 i += length_del;
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2750 j += length_rep;
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2751 } else {
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2752 i++;
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2753 j++;
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2754 }
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2755 }
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2756
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2757 ret = g_malloc(j+1);
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2758
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2759 i = 0; /* position in the source string */
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2760 j = 0; /* position in the destination string */
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2761 while (string[i] != '\0') {
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2762 if (!strncasecmp(&string[i], delimiter, length_del)) {
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2763 strncpy(&ret[j], replacement, length_rep);
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2764 i += length_del;
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2765 j += length_rep;
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2766 } else {
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2767 ret[j] = string[i];
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2768 i++;
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2769 j++;
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2770 }
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2771 }
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2772
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2773 ret[j] = '\0';
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2774
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2775 return ret;
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2776 }
dc43b1acfc1a [gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents: 8163
diff changeset
2777
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2778 const char *
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2779 gaim_strcasestr(const char *haystack, const char *needle)
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2780 {
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2781 size_t hlen, nlen;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2782 const char *tmp, *ret;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2783
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2784 g_return_val_if_fail(haystack != NULL, NULL);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2785 g_return_val_if_fail(needle != NULL, NULL);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2786
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2787 hlen = strlen(haystack);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2788 nlen = strlen(needle);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2789 tmp = haystack,
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2790 ret = NULL;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2791
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2792 g_return_val_if_fail(hlen > 0, NULL);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2793 g_return_val_if_fail(nlen > 0, NULL);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2794
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2795 while (*tmp && !ret) {
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2796 if (!g_ascii_strncasecmp(needle, tmp, nlen))
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2797 ret = tmp;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2798 else
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2799 tmp++;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2800 }
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2801
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2802 return ret;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2803 }
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2804
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2805 char *
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2806 gaim_str_size_to_units(size_t size)
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2807 {
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2808 static const char *size_str[4] = { "bytes", "KB", "MB", "GB" };
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2809 float size_mag;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2810 int size_index = 0;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2811
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2812 if (size == -1) {
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2813 return g_strdup(_("Calculating..."));
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2814 }
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2815 else if (size == 0) {
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2816 return g_strdup(_("Unknown."));
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2817 }
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2818 else {
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2819 size_mag = (float)size;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2820
10569
3324f62c07aa [gaim-migrate @ 11957]
Daniel Atallah <datallah@pidgin.im>
parents: 10506
diff changeset
2821 while ((size_index < 3) && (size_mag > 1024)) {
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2822 size_mag /= 1024;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2823 size_index++;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2824 }
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2825
10103
5744088750bc [gaim-migrate @ 11130]
Caleb Gilmour <caleb_gilmour@users.sourceforge.net>
parents: 9940
diff changeset
2826 if (size_index == 0) {
11656
56f5e598dc6c [gaim-migrate @ 13940]
Richard Laager <rlaager@pidgin.im>
parents: 11552
diff changeset
2827 return g_strdup_printf("%" G_GSIZE_FORMAT " %s", size, size_str[size_index]);
10103
5744088750bc [gaim-migrate @ 11130]
Caleb Gilmour <caleb_gilmour@users.sourceforge.net>
parents: 9940
diff changeset
2828 } else {
5744088750bc [gaim-migrate @ 11130]
Caleb Gilmour <caleb_gilmour@users.sourceforge.net>
parents: 9940
diff changeset
2829 return g_strdup_printf("%.2f %s", size_mag, size_str[size_index]);
5744088750bc [gaim-migrate @ 11130]
Caleb Gilmour <caleb_gilmour@users.sourceforge.net>
parents: 9940
diff changeset
2830 }
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2831 }
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2832 }
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2833
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2834 char *
9233
41fb39a8d21e [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2835 gaim_str_seconds_to_string(guint secs)
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2836 {
13098
48f8b34a76bf [gaim-migrate @ 15459]
Richard Laager <rlaager@pidgin.im>
parents: 13096
diff changeset
2837 char *ret = NULL;
9233
41fb39a8d21e [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2838 guint days, hrs, mins;
41fb39a8d21e [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2839
9424
7b580e2e2e9e [gaim-migrate @ 10242]
Alan Ford
parents: 9341
diff changeset
2840 if (secs < 60)
7b580e2e2e9e [gaim-migrate @ 10242]
Alan Ford
parents: 9341
diff changeset
2841 {
13098
48f8b34a76bf [gaim-migrate @ 15459]
Richard Laager <rlaager@pidgin.im>
parents: 13096
diff changeset
2842 return g_strdup_printf(ngettext("%d second", "%d seconds", secs), secs);
9424
7b580e2e2e9e [gaim-migrate @ 10242]
Alan Ford
parents: 9341
diff changeset
2843 }
7b580e2e2e9e [gaim-migrate @ 10242]
Alan Ford
parents: 9341
diff changeset
2844
9233
41fb39a8d21e [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2845 days = secs / (60 * 60 * 24);
41fb39a8d21e [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2846 secs = secs % (60 * 60 * 24);
41fb39a8d21e [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2847 hrs = secs / (60 * 60);
41fb39a8d21e [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2848 secs = secs % (60 * 60);
41fb39a8d21e [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2849 mins = secs / 60;
41fb39a8d21e [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2850 secs = secs % 60;
41fb39a8d21e [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2851
41fb39a8d21e [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2852 if (days > 0)
41fb39a8d21e [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2853 {
13098
48f8b34a76bf [gaim-migrate @ 15459]
Richard Laager <rlaager@pidgin.im>
parents: 13096
diff changeset
2854 ret = g_strdup_printf(ngettext("%d day", "%d days", days), days);
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2855 }
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2856
9233
41fb39a8d21e [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2857 if (hrs > 0)
41fb39a8d21e [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2858 {
13098
48f8b34a76bf [gaim-migrate @ 15459]
Richard Laager <rlaager@pidgin.im>
parents: 13096
diff changeset
2859 if (ret != NULL)
48f8b34a76bf [gaim-migrate @ 15459]
Richard Laager <rlaager@pidgin.im>
parents: 13096
diff changeset
2860 {
48f8b34a76bf [gaim-migrate @ 15459]
Richard Laager <rlaager@pidgin.im>
parents: 13096
diff changeset
2861 char *tmp = g_strdup_printf(
48f8b34a76bf [gaim-migrate @ 15459]
Richard Laager <rlaager@pidgin.im>
parents: 13096
diff changeset
2862 ngettext("%s, %d hour", "%s, %d hours", hrs),
48f8b34a76bf [gaim-migrate @ 15459]
Richard Laager <rlaager@pidgin.im>
parents: 13096
diff changeset
2863 ret, hrs);
48f8b34a76bf [gaim-migrate @ 15459]
Richard Laager <rlaager@pidgin.im>
parents: 13096
diff changeset
2864 g_free(ret);
48f8b34a76bf [gaim-migrate @ 15459]
Richard Laager <rlaager@pidgin.im>
parents: 13096
diff changeset
2865 ret = tmp;
48f8b34a76bf [gaim-migrate @ 15459]
Richard Laager <rlaager@pidgin.im>
parents: 13096
diff changeset
2866 }
48f8b34a76bf [gaim-migrate @ 15459]
Richard Laager <rlaager@pidgin.im>
parents: 13096
diff changeset
2867 else
48f8b34a76bf [gaim-migrate @ 15459]
Richard Laager <rlaager@pidgin.im>
parents: 13096
diff changeset
2868 ret = g_strdup_printf(ngettext("%d hour", "%d hours", hrs), hrs);
9233
41fb39a8d21e [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2869 }
41fb39a8d21e [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2870
41fb39a8d21e [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2871 if (mins > 0)
41fb39a8d21e [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2872 {
13098
48f8b34a76bf [gaim-migrate @ 15459]
Richard Laager <rlaager@pidgin.im>
parents: 13096
diff changeset
2873 if (ret != NULL)
48f8b34a76bf [gaim-migrate @ 15459]
Richard Laager <rlaager@pidgin.im>
parents: 13096
diff changeset
2874 {
48f8b34a76bf [gaim-migrate @ 15459]
Richard Laager <rlaager@pidgin.im>
parents: 13096
diff changeset
2875 char *tmp = g_strdup_printf(
48f8b34a76bf [gaim-migrate @ 15459]
Richard Laager <rlaager@pidgin.im>
parents: 13096
diff changeset
2876 ngettext("%s, %d minute", "%s, %d minutes", mins),
48f8b34a76bf [gaim-migrate @ 15459]
Richard Laager <rlaager@pidgin.im>
parents: 13096
diff changeset
2877 ret, mins);
48f8b34a76bf [gaim-migrate @ 15459]
Richard Laager <rlaager@pidgin.im>
parents: 13096
diff changeset
2878 g_free(ret);
48f8b34a76bf [gaim-migrate @ 15459]
Richard Laager <rlaager@pidgin.im>
parents: 13096
diff changeset
2879 ret = tmp;
48f8b34a76bf [gaim-migrate @ 15459]
Richard Laager <rlaager@pidgin.im>
parents: 13096
diff changeset
2880 }
48f8b34a76bf [gaim-migrate @ 15459]
Richard Laager <rlaager@pidgin.im>
parents: 13096
diff changeset
2881 else
48f8b34a76bf [gaim-migrate @ 15459]
Richard Laager <rlaager@pidgin.im>
parents: 13096
diff changeset
2882 ret = g_strdup_printf(ngettext("%d minute", "%d minutes", mins), mins);
9233
41fb39a8d21e [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2883 }
41fb39a8d21e [gaim-migrate @ 10029]
Christian Hammond <chipx86@chipx86.com>
parents: 9230
diff changeset
2884
13098
48f8b34a76bf [gaim-migrate @ 15459]
Richard Laager <rlaager@pidgin.im>
parents: 13096
diff changeset
2885 return ret;
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2886 }
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2887
9277
08d5a10f91c6 [gaim-migrate @ 10080]
Tim Ringenbach <marv@pidgin.im>
parents: 9273
diff changeset
2888
08d5a10f91c6 [gaim-migrate @ 10080]
Tim Ringenbach <marv@pidgin.im>
parents: 9273
diff changeset
2889 char *
08d5a10f91c6 [gaim-migrate @ 10080]
Tim Ringenbach <marv@pidgin.im>
parents: 9273
diff changeset
2890 gaim_str_binary_to_ascii(const unsigned char *binary, guint len)
08d5a10f91c6 [gaim-migrate @ 10080]
Tim Ringenbach <marv@pidgin.im>
parents: 9273
diff changeset
2891 {
08d5a10f91c6 [gaim-migrate @ 10080]
Tim Ringenbach <marv@pidgin.im>
parents: 9273
diff changeset
2892 GString *ret;
08d5a10f91c6 [gaim-migrate @ 10080]
Tim Ringenbach <marv@pidgin.im>
parents: 9273
diff changeset
2893 guint i;
08d5a10f91c6 [gaim-migrate @ 10080]
Tim Ringenbach <marv@pidgin.im>
parents: 9273
diff changeset
2894
08d5a10f91c6 [gaim-migrate @ 10080]
Tim Ringenbach <marv@pidgin.im>
parents: 9273
diff changeset
2895 g_return_val_if_fail(len > 0, NULL);
08d5a10f91c6 [gaim-migrate @ 10080]
Tim Ringenbach <marv@pidgin.im>
parents: 9273
diff changeset
2896
08d5a10f91c6 [gaim-migrate @ 10080]
Tim Ringenbach <marv@pidgin.im>
parents: 9273
diff changeset
2897 ret = g_string_sized_new(len);
08d5a10f91c6 [gaim-migrate @ 10080]
Tim Ringenbach <marv@pidgin.im>
parents: 9273
diff changeset
2898
08d5a10f91c6 [gaim-migrate @ 10080]
Tim Ringenbach <marv@pidgin.im>
parents: 9273
diff changeset
2899 for (i = 0; i < len; i++)
08d5a10f91c6 [gaim-migrate @ 10080]
Tim Ringenbach <marv@pidgin.im>
parents: 9273
diff changeset
2900 if (binary[i] < 32 || binary[i] > 126)
08d5a10f91c6 [gaim-migrate @ 10080]
Tim Ringenbach <marv@pidgin.im>
parents: 9273
diff changeset
2901 g_string_append_printf(ret, "\\x%02hhx", binary[i]);
08d5a10f91c6 [gaim-migrate @ 10080]
Tim Ringenbach <marv@pidgin.im>
parents: 9273
diff changeset
2902 else if (binary[i] == '\\')
08d5a10f91c6 [gaim-migrate @ 10080]
Tim Ringenbach <marv@pidgin.im>
parents: 9273
diff changeset
2903 g_string_append(ret, "\\\\");
08d5a10f91c6 [gaim-migrate @ 10080]
Tim Ringenbach <marv@pidgin.im>
parents: 9273
diff changeset
2904 else
08d5a10f91c6 [gaim-migrate @ 10080]
Tim Ringenbach <marv@pidgin.im>
parents: 9273
diff changeset
2905 g_string_append_c(ret, binary[i]);
08d5a10f91c6 [gaim-migrate @ 10080]
Tim Ringenbach <marv@pidgin.im>
parents: 9273
diff changeset
2906
08d5a10f91c6 [gaim-migrate @ 10080]
Tim Ringenbach <marv@pidgin.im>
parents: 9273
diff changeset
2907 return g_string_free(ret, FALSE);
08d5a10f91c6 [gaim-migrate @ 10080]
Tim Ringenbach <marv@pidgin.im>
parents: 9273
diff changeset
2908 }
08d5a10f91c6 [gaim-migrate @ 10080]
Tim Ringenbach <marv@pidgin.im>
parents: 9273
diff changeset
2909
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2910 /**************************************************************************
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2911 * URI/URL Functions
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
2912 **************************************************************************/
7095
17d2b54254f8 [gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents: 7094
diff changeset
2913 gboolean
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2914 gaim_url_parse(const char *url, char **ret_host, int *ret_port,
9227
95c28297b72c [gaim-migrate @ 10023]
Don Seiler <rizzo@gentoo.org>
parents: 9222
diff changeset
2915 char **ret_path, char **ret_user, char **ret_passwd)
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2916 {
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2917 char scan_info[255];
8118
7f5315bb4506 [gaim-migrate @ 8822]
Douglas Thrift <douglas@douglasthrift.net>
parents: 8088
diff changeset
2918 char port_str[6];
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2919 int f;
9341
f626c11987e2 [gaim-migrate @ 10149]
Don Seiler <rizzo@gentoo.org>
parents: 9311
diff changeset
2920 const char *at, *slash;
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2921 const char *turl;
9227
95c28297b72c [gaim-migrate @ 10023]
Don Seiler <rizzo@gentoo.org>
parents: 9222
diff changeset
2922 char host[256], path[256], user[256], passwd[256];
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2923 int port = 0;
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2924 /* hyphen at end includes it in control set */
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2925 static char addr_ctrl[] = "A-Za-z0-9.-";
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2926 static char port_ctrl[] = "0-9";
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2927 static char page_ctrl[] = "A-Za-z0-9.~_/:*!@&%%?=+^-";
9227
95c28297b72c [gaim-migrate @ 10023]
Don Seiler <rizzo@gentoo.org>
parents: 9222
diff changeset
2928 static char user_ctrl[] = "A-Za-z0-9.~_/*!&%%?=+^-";
95c28297b72c [gaim-migrate @ 10023]
Don Seiler <rizzo@gentoo.org>
parents: 9222
diff changeset
2929 static char passwd_ctrl[] = "A-Za-z0-9.~_/*!&%%?=+^-";
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2930
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2931 g_return_val_if_fail(url != NULL, FALSE);
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2932
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2933 if ((turl = strstr(url, "http://")) != NULL ||
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2934 (turl = strstr(url, "HTTP://")) != NULL)
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2935 {
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2936 turl += 7;
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2937 url = turl;
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2938 }
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2939
9227
95c28297b72c [gaim-migrate @ 10023]
Don Seiler <rizzo@gentoo.org>
parents: 9222
diff changeset
2940 /* parse out authentication information if supplied */
9341
f626c11987e2 [gaim-migrate @ 10149]
Don Seiler <rizzo@gentoo.org>
parents: 9311
diff changeset
2941 /* Only care about @ char BEFORE the first / */
f626c11987e2 [gaim-migrate @ 10149]
Don Seiler <rizzo@gentoo.org>
parents: 9311
diff changeset
2942 at = strchr(url, '@');
f626c11987e2 [gaim-migrate @ 10149]
Don Seiler <rizzo@gentoo.org>
parents: 9311
diff changeset
2943 slash = strchr(url, '/');
f626c11987e2 [gaim-migrate @ 10149]
Don Seiler <rizzo@gentoo.org>
parents: 9311
diff changeset
2944 if ((at != NULL) &&
f626c11987e2 [gaim-migrate @ 10149]
Don Seiler <rizzo@gentoo.org>
parents: 9311
diff changeset
2945 (((slash != NULL) && (strlen(at) > strlen(slash))) ||
f626c11987e2 [gaim-migrate @ 10149]
Don Seiler <rizzo@gentoo.org>
parents: 9311
diff changeset
2946 (slash == NULL))) {
9227
95c28297b72c [gaim-migrate @ 10023]
Don Seiler <rizzo@gentoo.org>
parents: 9222
diff changeset
2947 g_snprintf(scan_info, sizeof(scan_info),
95c28297b72c [gaim-migrate @ 10023]
Don Seiler <rizzo@gentoo.org>
parents: 9222
diff changeset
2948 "%%255[%s]:%%255[%s]^@", user_ctrl, passwd_ctrl);
95c28297b72c [gaim-migrate @ 10023]
Don Seiler <rizzo@gentoo.org>
parents: 9222
diff changeset
2949 f = sscanf(url, scan_info, user, passwd);
95c28297b72c [gaim-migrate @ 10023]
Don Seiler <rizzo@gentoo.org>
parents: 9222
diff changeset
2950
95c28297b72c [gaim-migrate @ 10023]
Don Seiler <rizzo@gentoo.org>
parents: 9222
diff changeset
2951 if (f ==1 ) {
95c28297b72c [gaim-migrate @ 10023]
Don Seiler <rizzo@gentoo.org>
parents: 9222
diff changeset
2952 /* No passwd, possibly just username supplied */
95c28297b72c [gaim-migrate @ 10023]
Don Seiler <rizzo@gentoo.org>
parents: 9222
diff changeset
2953 g_snprintf(scan_info, sizeof(scan_info),
95c28297b72c [gaim-migrate @ 10023]
Don Seiler <rizzo@gentoo.org>
parents: 9222
diff changeset
2954 "%%255[%s]^@", user_ctrl);
95c28297b72c [gaim-migrate @ 10023]
Don Seiler <rizzo@gentoo.org>
parents: 9222
diff changeset
2955 f = sscanf(url, scan_info, user);
95c28297b72c [gaim-migrate @ 10023]
Don Seiler <rizzo@gentoo.org>
parents: 9222
diff changeset
2956 *passwd = '\0';
95c28297b72c [gaim-migrate @ 10023]
Don Seiler <rizzo@gentoo.org>
parents: 9222
diff changeset
2957 }
95c28297b72c [gaim-migrate @ 10023]
Don Seiler <rizzo@gentoo.org>
parents: 9222
diff changeset
2958
9230
5f34aa66ce4c [gaim-migrate @ 10026]
Nathan Walp <nwalp@pidgin.im>
parents: 9227
diff changeset
2959 url = at+1; /* move pointer after the @ char */
9227
95c28297b72c [gaim-migrate @ 10023]
Don Seiler <rizzo@gentoo.org>
parents: 9222
diff changeset
2960 } else {
95c28297b72c [gaim-migrate @ 10023]
Don Seiler <rizzo@gentoo.org>
parents: 9222
diff changeset
2961 *user = '\0';
95c28297b72c [gaim-migrate @ 10023]
Don Seiler <rizzo@gentoo.org>
parents: 9222
diff changeset
2962 *passwd = '\0';
95c28297b72c [gaim-migrate @ 10023]
Don Seiler <rizzo@gentoo.org>
parents: 9222
diff changeset
2963 }
95c28297b72c [gaim-migrate @ 10023]
Don Seiler <rizzo@gentoo.org>
parents: 9222
diff changeset
2964
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2965 g_snprintf(scan_info, sizeof(scan_info),
8118
7f5315bb4506 [gaim-migrate @ 8822]
Douglas Thrift <douglas@douglasthrift.net>
parents: 8088
diff changeset
2966 "%%255[%s]:%%5[%s]/%%255[%s]", addr_ctrl, port_ctrl, page_ctrl);
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2967
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2968 f = sscanf(url, scan_info, host, port_str, path);
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2969
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2970 if (f == 1)
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2971 {
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2972 g_snprintf(scan_info, sizeof(scan_info),
8118
7f5315bb4506 [gaim-migrate @ 8822]
Douglas Thrift <douglas@douglasthrift.net>
parents: 8088
diff changeset
2973 "%%255[%s]/%%255[%s]",
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2974 addr_ctrl, page_ctrl);
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2975 f = sscanf(url, scan_info, host, path);
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2976 g_snprintf(port_str, sizeof(port_str), "80");
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2977 }
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2978
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2979 if (f == 1)
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2980 *path = '\0';
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2981
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2982 sscanf(port_str, "%d", &port);
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2983
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2984 if (ret_host != NULL) *ret_host = g_strdup(host);
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2985 if (ret_port != NULL) *ret_port = port;
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2986 if (ret_path != NULL) *ret_path = g_strdup(path);
9227
95c28297b72c [gaim-migrate @ 10023]
Don Seiler <rizzo@gentoo.org>
parents: 9222
diff changeset
2987 if (ret_user != NULL) *ret_user = g_strdup(user);
95c28297b72c [gaim-migrate @ 10023]
Don Seiler <rizzo@gentoo.org>
parents: 9222
diff changeset
2988 if (ret_passwd != NULL) *ret_passwd = g_strdup(passwd);
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2989
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2990 return TRUE;
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2991 }
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2992
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2993 static void
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2994 destroy_fetch_url_data(GaimFetchUrlData *gfud)
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
2995 {
12887
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
2996 g_free(gfud->webdata);
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
2997 g_free(gfud->url);
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
2998 g_free(gfud->user_agent);
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
2999 g_free(gfud->website.address);
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3000 g_free(gfud->website.page);
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3001 g_free(gfud->website.user);
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3002 g_free(gfud->website.passwd);
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3003 g_free(gfud->request);
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3004
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3005 g_free(gfud);
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3006 }
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3007
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3008 static gboolean
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3009 parse_redirect(const char *data, size_t data_len, gint sock,
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3010 GaimFetchUrlData *gfud)
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3011 {
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3012 gchar *s;
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3013
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3014 if ((s = g_strstr_len(data, data_len, "Location: ")) != NULL)
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3015 {
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3016 gchar *new_url, *temp_url, *end;
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3017 gboolean full;
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3018 int len;
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3019
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3020 s += strlen("Location: ");
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3021 end = strchr(s, '\r');
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3022
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3023 /* Just in case :) */
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3024 if (end == NULL)
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3025 end = strchr(s, '\n');
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3026
10623
33b965c36d84 [gaim-migrate @ 12094]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10614
diff changeset
3027 if (end == NULL)
33b965c36d84 [gaim-migrate @ 12094]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10614
diff changeset
3028 return FALSE;
33b965c36d84 [gaim-migrate @ 12094]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10614
diff changeset
3029
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3030 len = end - s;
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3031
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3032 new_url = g_malloc(len + 1);
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3033 strncpy(new_url, s, len);
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3034 new_url[len] = '\0';
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3035
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3036 full = gfud->full;
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3037
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3038 if (*new_url == '/' || g_strstr_len(new_url, len, "://") == NULL)
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3039 {
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3040 temp_url = new_url;
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3041
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3042 new_url = g_strdup_printf("%s:%d%s", gfud->website.address,
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3043 gfud->website.port, temp_url);
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3044
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3045 g_free(temp_url);
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3046
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3047 full = FALSE;
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3048 }
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3049
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3050 /* Close the existing stuff. */
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3051 gaim_input_remove(gfud->inpa);
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3052 close(sock);
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3053
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3054 gaim_debug_info("gaim_url_fetch", "Redirecting to %s\n", new_url);
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3055
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3056 /* Try again, with this new location. */
12887
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3057 gaim_url_fetch_request(new_url, full, gfud->user_agent,
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3058 gfud->http11, gfud->request, gfud->include_headers,
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3059 gfud->callback, gfud->user_data);
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3060
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3061 /* Free up. */
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3062 g_free(new_url);
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3063 destroy_fetch_url_data(gfud);
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3064
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3065 return TRUE;
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3066 }
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3067
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3068 return FALSE;
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3069 }
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3070
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3071 static size_t
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3072 parse_content_len(const char *data, size_t data_len)
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3073 {
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3074 size_t content_len = 0;
9240
52f712c0c976 [gaim-migrate @ 10039]
Ambrose Li <ambrose.li@gmail.com>
parents: 9233
diff changeset
3075 const char *p = NULL;
52f712c0c976 [gaim-migrate @ 10039]
Ambrose Li <ambrose.li@gmail.com>
parents: 9233
diff changeset
3076
52f712c0c976 [gaim-migrate @ 10039]
Ambrose Li <ambrose.li@gmail.com>
parents: 9233
diff changeset
3077 /* This is still technically wrong, since headers are case-insensitive
52f712c0c976 [gaim-migrate @ 10039]
Ambrose Li <ambrose.li@gmail.com>
parents: 9233
diff changeset
3078 * [RFC 2616, section 4.2], though this ought to catch the normal case.
52f712c0c976 [gaim-migrate @ 10039]
Ambrose Li <ambrose.li@gmail.com>
parents: 9233
diff changeset
3079 * Note: data is _not_ nul-terminated.
52f712c0c976 [gaim-migrate @ 10039]
Ambrose Li <ambrose.li@gmail.com>
parents: 9233
diff changeset
3080 */
52f712c0c976 [gaim-migrate @ 10039]
Ambrose Li <ambrose.li@gmail.com>
parents: 9233
diff changeset
3081 if (data_len > 16) {
12887
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3082 p = strncmp(data, "Content-Length: ", 16) == 0 ? data : NULL;
9240
52f712c0c976 [gaim-migrate @ 10039]
Ambrose Li <ambrose.li@gmail.com>
parents: 9233
diff changeset
3083 if (!p) {
52f712c0c976 [gaim-migrate @ 10039]
Ambrose Li <ambrose.li@gmail.com>
parents: 9233
diff changeset
3084 p = g_strstr_len(data, data_len, "\nContent-Length: ");
52f712c0c976 [gaim-migrate @ 10039]
Ambrose Li <ambrose.li@gmail.com>
parents: 9233
diff changeset
3085 if (p)
52f712c0c976 [gaim-migrate @ 10039]
Ambrose Li <ambrose.li@gmail.com>
parents: 9233
diff changeset
3086 p += 1;
52f712c0c976 [gaim-migrate @ 10039]
Ambrose Li <ambrose.li@gmail.com>
parents: 9233
diff changeset
3087 }
12887
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3088 if (!p)
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3089 p = (strncmp(data, "CONTENT-LENGTH: ", 16) == 0)
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3090 ? data : NULL;
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3091 if (!p) {
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3092 p = g_strstr_len(data, data_len, "\nContent-Length: ");
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3093 if (p)
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3094 p++;
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3095 }
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3096 if (!p) {
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3097 p = g_strstr_len(data, data_len, "\nCONTENT-LENGTH: ");
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3098 if (p)
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3099 p++;
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3100 }
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3101
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3102 if (p)
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3103 p += 16;
9240
52f712c0c976 [gaim-migrate @ 10039]
Ambrose Li <ambrose.li@gmail.com>
parents: 9233
diff changeset
3104 }
52f712c0c976 [gaim-migrate @ 10039]
Ambrose Li <ambrose.li@gmail.com>
parents: 9233
diff changeset
3105
52f712c0c976 [gaim-migrate @ 10039]
Ambrose Li <ambrose.li@gmail.com>
parents: 9233
diff changeset
3106 /* If we can find a Content-Length header at all, try to sscanf it.
52f712c0c976 [gaim-migrate @ 10039]
Ambrose Li <ambrose.li@gmail.com>
parents: 9233
diff changeset
3107 * Response headers should end with at least \r\n, so sscanf is safe,
52f712c0c976 [gaim-migrate @ 10039]
Ambrose Li <ambrose.li@gmail.com>
parents: 9233
diff changeset
3108 * if we make sure that there is indeed a \n in our header.
52f712c0c976 [gaim-migrate @ 10039]
Ambrose Li <ambrose.li@gmail.com>
parents: 9233
diff changeset
3109 */
52f712c0c976 [gaim-migrate @ 10039]
Ambrose Li <ambrose.li@gmail.com>
parents: 9233
diff changeset
3110 if (p && g_strstr_len(p, data_len - (p - data), "\n")) {
12887
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3111 sscanf(p, "%" G_GSIZE_FORMAT, &content_len);
9818
a6b6dbae39fe [gaim-migrate @ 10689]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 9804
diff changeset
3112 gaim_debug_misc("parse_content_len", "parsed %u\n", content_len);
9240
52f712c0c976 [gaim-migrate @ 10039]
Ambrose Li <ambrose.li@gmail.com>
parents: 9233
diff changeset
3113 }
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3114
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3115 return content_len;
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3116 }
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3117
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3118 static void
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3119 url_fetched_cb(gpointer url_data, gint sock, GaimInputCondition cond)
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3120 {
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3121 GaimFetchUrlData *gfud = url_data;
12109
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3122 int len;
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3123 char buf[4096];
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3124 char *data_cursor;
9240
52f712c0c976 [gaim-migrate @ 10039]
Ambrose Li <ambrose.li@gmail.com>
parents: 9233
diff changeset
3125 gboolean got_eof = FALSE;
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3126
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3127 if (sock == -1)
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3128 {
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3129 gfud->callback(gfud->user_data, NULL, 0);
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3130
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3131 destroy_fetch_url_data(gfud);
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3132
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3133 return;
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3134 }
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3135
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3136 if (!gfud->sentreq)
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3137 {
12887
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3138 char *send;
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3139 char buf[1024];
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3140
12887
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3141 if (gfud->request) {
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3142 send = gfud->request;
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3143 } else {
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3144 if (gfud->user_agent) {
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3145 /* Host header is not forbidden in HTTP/1.0 requests, and HTTP/1.1
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3146 * clients must know how to handle the "chunked" transfer encoding.
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3147 * Gaim doesn't know how to handle "chunked", so should always send
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3148 * the Host header regardless, to get around some observed problems
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3149 */
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3150 g_snprintf(buf, sizeof(buf),
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3151 "GET %s%s HTTP/%s\r\n"
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3152 "Connection: close\r\n"
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3153 "User-Agent: %s\r\n"
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3154 "Host: %s\r\n\r\n",
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3155 (gfud->full ? "" : "/"),
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3156 (gfud->full ? gfud->url : gfud->website.page),
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3157 (gfud->http11 ? "1.1" : "1.0"),
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3158 gfud->user_agent, gfud->website.address);
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3159 } else {
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3160 g_snprintf(buf, sizeof(buf),
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3161 "GET %s%s HTTP/%s\r\n"
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3162 "Connection: close\r\n"
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3163 "Host: %s\r\n\r\n",
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3164 (gfud->full ? "" : "/"),
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3165 (gfud->full ? gfud->url : gfud->website.page),
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3166 (gfud->http11 ? "1.1" : "1.0"),
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3167 gfud->website.address);
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3168 }
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3169 send = buf;
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3170 }
12887
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3171
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3172 gaim_debug_misc("gaim_url_fetch", "Request: %s\n", send);
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3173
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3174 write(sock, send, strlen(send));
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3175 fcntl(sock, F_SETFL, O_NONBLOCK);
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3176 gfud->sentreq = TRUE;
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3177 gfud->inpa = gaim_input_add(sock, GAIM_INPUT_READ,
12887
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3178 url_fetched_cb, url_data);
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3179 gfud->data_len = 4096;
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3180 gfud->webdata = g_malloc(gfud->data_len);
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3181
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3182 return;
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3183 }
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3184
12109
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3185 while ((len = read(sock, buf, sizeof(buf))) > 0)
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3186 {
12109
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3187 /* If we've filled up our butfer, make it bigger */
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3188 if ((gfud->len + len) >= gfud->data_len)
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3189 {
12109
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3190 gfud->data_len += MAX(((gfud->data_len) / 2), sizeof(buf));
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3191
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3192 gfud->webdata = g_realloc(gfud->webdata, gfud->data_len);
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3193 }
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3194
12109
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3195 data_cursor = gfud->webdata + gfud->len;
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3196
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3197 gfud->len += len;
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3198
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3199 memcpy(data_cursor, buf, len);
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3200
11407
3f89b9b59ba9 [gaim-migrate @ 13642]
Federico G. Schwindt <fgsch@lodoss.net>
parents: 11361
diff changeset
3201 gfud->webdata[gfud->len] = '\0';
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3202
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3203 if (!gfud->startsaving)
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3204 {
12109
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3205 char *tmp;
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3206
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3207 /** See if we've reached the end of the headers yet */
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3208 if ((tmp = strstr(gfud->webdata, "\r\n\r\n"))) {
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3209 char * new_data;
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3210 guint header_len = (tmp + 4 - gfud->webdata);
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3211 size_t content_len, body_len = 0;
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3212
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3213 gaim_debug_misc("gaim_url_fetch", "Response headers: '%.*s'\n",
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3214 header_len, gfud->webdata);
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3215
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3216 /* See if we can find a redirect. */
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3217 if (parse_redirect(gfud->webdata, header_len, sock, gfud))
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3218 return;
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3219
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3220 gfud->startsaving = TRUE;
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3221
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3222 /* No redirect. See if we can find a content length. */
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3223 content_len = parse_content_len(gfud->webdata, header_len);
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3224
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3225 if (content_len == 0)
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3226 {
12109
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3227 /* We'll stick with an initial 8192 */
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3228 content_len = 8192;
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3229 }
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3230 else
12109
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3231 {
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3232 gfud->has_explicit_data_len = TRUE;
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3233 }
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3234
12887
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3235 content_len = MAX(content_len, body_len);
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3236
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3237 /* If we're returning the headers too, we don't need to clean them out */
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3238 if (gfud->include_headers) {
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3239 gfud->data_len = content_len + header_len;
12907
5d2ed97ed7e3 [gaim-migrate @ 15260]
Daniel Atallah <datallah@pidgin.im>
parents: 12887
diff changeset
3240 } else {
5d2ed97ed7e3 [gaim-migrate @ 15260]
Daniel Atallah <datallah@pidgin.im>
parents: 12887
diff changeset
3241
5d2ed97ed7e3 [gaim-migrate @ 15260]
Daniel Atallah <datallah@pidgin.im>
parents: 12887
diff changeset
3242 if (gfud->len > (header_len + 1))
5d2ed97ed7e3 [gaim-migrate @ 15260]
Daniel Atallah <datallah@pidgin.im>
parents: 12887
diff changeset
3243 body_len = (gfud->len - header_len);
5d2ed97ed7e3 [gaim-migrate @ 15260]
Daniel Atallah <datallah@pidgin.im>
parents: 12887
diff changeset
3244
5d2ed97ed7e3 [gaim-migrate @ 15260]
Daniel Atallah <datallah@pidgin.im>
parents: 12887
diff changeset
3245
5d2ed97ed7e3 [gaim-migrate @ 15260]
Daniel Atallah <datallah@pidgin.im>
parents: 12887
diff changeset
3246 new_data = g_try_malloc(content_len);
5d2ed97ed7e3 [gaim-migrate @ 15260]
Daniel Atallah <datallah@pidgin.im>
parents: 12887
diff changeset
3247 if (new_data == NULL) {
5d2ed97ed7e3 [gaim-migrate @ 15260]
Daniel Atallah <datallah@pidgin.im>
parents: 12887
diff changeset
3248 gaim_debug_error("gaim_url_fetch", "Failed to allocate %u bytes: %s\n",
5d2ed97ed7e3 [gaim-migrate @ 15260]
Daniel Atallah <datallah@pidgin.im>
parents: 12887
diff changeset
3249 content_len, strerror(errno));
5d2ed97ed7e3 [gaim-migrate @ 15260]
Daniel Atallah <datallah@pidgin.im>
parents: 12887
diff changeset
3250 gaim_input_remove(gfud->inpa);
5d2ed97ed7e3 [gaim-migrate @ 15260]
Daniel Atallah <datallah@pidgin.im>
parents: 12887
diff changeset
3251 close(sock);
5d2ed97ed7e3 [gaim-migrate @ 15260]
Daniel Atallah <datallah@pidgin.im>
parents: 12887
diff changeset
3252 gfud->callback(gfud->user_data, NULL, 0);
5d2ed97ed7e3 [gaim-migrate @ 15260]
Daniel Atallah <datallah@pidgin.im>
parents: 12887
diff changeset
3253 destroy_fetch_url_data(gfud);
5d2ed97ed7e3 [gaim-migrate @ 15260]
Daniel Atallah <datallah@pidgin.im>
parents: 12887
diff changeset
3254
5d2ed97ed7e3 [gaim-migrate @ 15260]
Daniel Atallah <datallah@pidgin.im>
parents: 12887
diff changeset
3255 return;
5d2ed97ed7e3 [gaim-migrate @ 15260]
Daniel Atallah <datallah@pidgin.im>
parents: 12887
diff changeset
3256 }
5d2ed97ed7e3 [gaim-migrate @ 15260]
Daniel Atallah <datallah@pidgin.im>
parents: 12887
diff changeset
3257
5d2ed97ed7e3 [gaim-migrate @ 15260]
Daniel Atallah <datallah@pidgin.im>
parents: 12887
diff changeset
3258 /* We may have read part of the body when reading the headers, don't lose it */
5d2ed97ed7e3 [gaim-migrate @ 15260]
Daniel Atallah <datallah@pidgin.im>
parents: 12887
diff changeset
3259 if (body_len > 0) {
5d2ed97ed7e3 [gaim-migrate @ 15260]
Daniel Atallah <datallah@pidgin.im>
parents: 12887
diff changeset
3260 tmp += 4;
5d2ed97ed7e3 [gaim-migrate @ 15260]
Daniel Atallah <datallah@pidgin.im>
parents: 12887
diff changeset
3261 memcpy(new_data, tmp, body_len);
5d2ed97ed7e3 [gaim-migrate @ 15260]
Daniel Atallah <datallah@pidgin.im>
parents: 12887
diff changeset
3262 }
5d2ed97ed7e3 [gaim-migrate @ 15260]
Daniel Atallah <datallah@pidgin.im>
parents: 12887
diff changeset
3263
5d2ed97ed7e3 [gaim-migrate @ 15260]
Daniel Atallah <datallah@pidgin.im>
parents: 12887
diff changeset
3264 /* Out with the old... */
5d2ed97ed7e3 [gaim-migrate @ 15260]
Daniel Atallah <datallah@pidgin.im>
parents: 12887
diff changeset
3265 g_free(gfud->webdata);
5d2ed97ed7e3 [gaim-migrate @ 15260]
Daniel Atallah <datallah@pidgin.im>
parents: 12887
diff changeset
3266 gfud->webdata = NULL;
5d2ed97ed7e3 [gaim-migrate @ 15260]
Daniel Atallah <datallah@pidgin.im>
parents: 12887
diff changeset
3267
5d2ed97ed7e3 [gaim-migrate @ 15260]
Daniel Atallah <datallah@pidgin.im>
parents: 12887
diff changeset
3268 /* In with the new. */
5d2ed97ed7e3 [gaim-migrate @ 15260]
Daniel Atallah <datallah@pidgin.im>
parents: 12887
diff changeset
3269 gfud->len = body_len;
5d2ed97ed7e3 [gaim-migrate @ 15260]
Daniel Atallah <datallah@pidgin.im>
parents: 12887
diff changeset
3270 gfud->data_len = content_len;
5d2ed97ed7e3 [gaim-migrate @ 15260]
Daniel Atallah <datallah@pidgin.im>
parents: 12887
diff changeset
3271 gfud->webdata = new_data;
12887
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3272 }
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3273 }
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3274 }
12109
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3275
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3276 if (gfud->has_explicit_data_len && gfud->len >= gfud->data_len)
9240
52f712c0c976 [gaim-migrate @ 10039]
Ambrose Li <ambrose.li@gmail.com>
parents: 9233
diff changeset
3277 {
52f712c0c976 [gaim-migrate @ 10039]
Ambrose Li <ambrose.li@gmail.com>
parents: 9233
diff changeset
3278 got_eof = TRUE;
12109
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3279 break;
9240
52f712c0c976 [gaim-migrate @ 10039]
Ambrose Li <ambrose.li@gmail.com>
parents: 9233
diff changeset
3280 }
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3281 }
12109
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3282
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3283 if (len <= 0) {
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3284 if (errno == EWOULDBLOCK) {
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3285 errno = 0;
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3286 return;
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3287 } else if (errno != ETIMEDOUT) {
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3288 got_eof = TRUE;
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3289 } else {
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3290 gaim_input_remove(gfud->inpa);
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3291 close(sock);
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3292
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3293 gfud->callback(gfud->user_data, NULL, 0);
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3294
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3295 destroy_fetch_url_data(gfud);
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3296 return;
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3297 }
9240
52f712c0c976 [gaim-migrate @ 10039]
Ambrose Li <ambrose.li@gmail.com>
parents: 9233
diff changeset
3298 }
52f712c0c976 [gaim-migrate @ 10039]
Ambrose Li <ambrose.li@gmail.com>
parents: 9233
diff changeset
3299
52f712c0c976 [gaim-migrate @ 10039]
Ambrose Li <ambrose.li@gmail.com>
parents: 9233
diff changeset
3300 if (got_eof) {
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3301 gfud->webdata = g_realloc(gfud->webdata, gfud->len + 1);
12109
10f7b7f64648 [gaim-migrate @ 14409]
Daniel Atallah <datallah@pidgin.im>
parents: 11920
diff changeset
3302 gfud->webdata[gfud->len] = '\0';
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3303
9311
f1737fc453f2 [gaim-migrate @ 10119]
Tim Ringenbach <marv@pidgin.im>
parents: 9277
diff changeset
3304 /* gaim_debug_misc("gaim_url_fetch", "Received: '%s'\n", gfud->webdata); */
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3305
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3306 gaim_input_remove(gfud->inpa);
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3307 close(sock);
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3308 gfud->callback(gfud->user_data, gfud->webdata, gfud->len);
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3309
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3310 destroy_fetch_url_data(gfud);
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3311 }
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3312 }
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3313
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3314 void
12887
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3315 gaim_url_fetch_request(const char *url, gboolean full,
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3316 const char *user_agent, gboolean http11,
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3317 const char *request, gboolean include_headers,
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3318 GaimURLFetchCallback cb, void *user_data)
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3319 {
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3320 GaimFetchUrlData *gfud;
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3321
9257
878debfe3137 [gaim-migrate @ 10056]
Tim Ringenbach <marv@pidgin.im>
parents: 9241
diff changeset
3322 g_return_if_fail(url != NULL);
878debfe3137 [gaim-migrate @ 10056]
Tim Ringenbach <marv@pidgin.im>
parents: 9241
diff changeset
3323 g_return_if_fail(cb != NULL);
9311
f1737fc453f2 [gaim-migrate @ 10119]
Tim Ringenbach <marv@pidgin.im>
parents: 9277
diff changeset
3324
9240
52f712c0c976 [gaim-migrate @ 10039]
Ambrose Li <ambrose.li@gmail.com>
parents: 9233
diff changeset
3325 gaim_debug_info("gaim_url_fetch",
52f712c0c976 [gaim-migrate @ 10039]
Ambrose Li <ambrose.li@gmail.com>
parents: 9233
diff changeset
3326 "requested to fetch (%s), full=%d, user_agent=(%s), http11=%d\n",
9257
878debfe3137 [gaim-migrate @ 10056]
Tim Ringenbach <marv@pidgin.im>
parents: 9241
diff changeset
3327 url, full, user_agent?user_agent:"(null)", http11);
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3328
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3329 gfud = g_new0(GaimFetchUrlData, 1);
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3330
12887
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3331 gfud->callback = cb;
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3332 gfud->user_data = user_data;
12887
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3333 gfud->url = g_strdup(url);
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3334 gfud->user_agent = user_agent ? g_strdup(user_agent) : NULL;
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3335 gfud->http11 = http11;
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3336 gfud->full = full;
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3337 gfud->request = request ? g_strdup(request) : NULL;
4235bbee17b1 [gaim-migrate @ 15240]
Daniel Atallah <datallah@pidgin.im>
parents: 12880
diff changeset
3338 gfud->include_headers = include_headers;
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3339
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3340 gaim_url_parse(url, &gfud->website.address, &gfud->website.port,
9227
95c28297b72c [gaim-migrate @ 10023]
Don Seiler <rizzo@gentoo.org>
parents: 9222
diff changeset
3341 &gfud->website.page, &gfud->website.user, &gfud->website.passwd);
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3342
12802
e3bb72245d85 [gaim-migrate @ 15149]
Daniel Atallah <datallah@pidgin.im>
parents: 12640
diff changeset
3343 if (gaim_proxy_connect(NULL, gfud->website.address,
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3344 gfud->website.port, url_fetched_cb,
12802
e3bb72245d85 [gaim-migrate @ 15149]
Daniel Atallah <datallah@pidgin.im>
parents: 12640
diff changeset
3345 gfud) != 0)
7094
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3346 {
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3347 destroy_fetch_url_data(gfud);
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3348
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3349 cb(user_data, g_strdup(_("g003: Error opening connection.\n")), 0);
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3350 }
8f9588491993 [gaim-migrate @ 7659]
Christian Hammond <chipx86@chipx86.com>
parents: 7078
diff changeset
3351 }
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3352
7162
dfd30c70acde [gaim-migrate @ 7729]
Nathan Walp <nwalp@pidgin.im>
parents: 7134
diff changeset
3353 const char *
7134
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3354 gaim_url_decode(const char *str)
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3355 {
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3356 static char buf[BUF_LEN];
7631
0e9e516bb6c3 [gaim-migrate @ 8255]
Nathan Walp <nwalp@pidgin.im>
parents: 7628
diff changeset
3357 guint i, j = 0;
7134
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3358 char *bum;
9804
1fbe747c77aa [gaim-migrate @ 10672]
Mark Doliner <markdoliner@pidgin.im>
parents: 9786
diff changeset
3359 char hex[3];
7134
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3360
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3361 g_return_val_if_fail(str != NULL, NULL);
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3362
9804
1fbe747c77aa [gaim-migrate @ 10672]
Mark Doliner <markdoliner@pidgin.im>
parents: 9786
diff changeset
3363 /*
1fbe747c77aa [gaim-migrate @ 10672]
Mark Doliner <markdoliner@pidgin.im>
parents: 9786
diff changeset
3364 * XXX - This check could be removed and buf could be made
1fbe747c77aa [gaim-migrate @ 10672]
Mark Doliner <markdoliner@pidgin.im>
parents: 9786
diff changeset
3365 * dynamically allocated, but this is easier.
1fbe747c77aa [gaim-migrate @ 10672]
Mark Doliner <markdoliner@pidgin.im>
parents: 9786
diff changeset
3366 */
1fbe747c77aa [gaim-migrate @ 10672]
Mark Doliner <markdoliner@pidgin.im>
parents: 9786
diff changeset
3367 if (strlen(str) >= BUF_LEN)
1fbe747c77aa [gaim-migrate @ 10672]
Mark Doliner <markdoliner@pidgin.im>
parents: 9786
diff changeset
3368 return NULL;
1fbe747c77aa [gaim-migrate @ 10672]
Mark Doliner <markdoliner@pidgin.im>
parents: 9786
diff changeset
3369
7134
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3370 for (i = 0; i < strlen(str); i++) {
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3371
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3372 if (str[i] != '%')
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3373 buf[j++] = str[i];
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3374 else {
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3375 strncpy(hex, str + ++i, 2);
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3376 hex[2] = '\0';
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3377
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3378 /* i is pointing to the start of the number */
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3379 i++;
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3380
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3381 /*
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3382 * Now it's at the end and at the start of the for loop
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3383 * will be at the next character.
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3384 */
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3385 buf[j++] = strtol(hex, NULL, 16);
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3386 }
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3387 }
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3388
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3389 buf[j] = '\0';
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3390
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3391 if (!g_utf8_validate(buf, -1, (const char **)&bum))
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3392 *bum = '\0';
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3393
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3394 return buf;
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3395 }
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3396
7162
dfd30c70acde [gaim-migrate @ 7729]
Nathan Walp <nwalp@pidgin.im>
parents: 7134
diff changeset
3397 const char *
7134
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3398 gaim_url_encode(const char *str)
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3399 {
10700
93f5099b2775 [gaim-migrate @ 12273]
Daniel Atallah <datallah@pidgin.im>
parents: 10636
diff changeset
3400 const char *iter;
7134
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3401 static char buf[BUF_LEN];
10700
93f5099b2775 [gaim-migrate @ 12273]
Daniel Atallah <datallah@pidgin.im>
parents: 10636
diff changeset
3402 char utf_char[6];
7631
0e9e516bb6c3 [gaim-migrate @ 8255]
Nathan Walp <nwalp@pidgin.im>
parents: 7628
diff changeset
3403 guint i, j = 0;
7134
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3404
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3405 g_return_val_if_fail(str != NULL, NULL);
10700
93f5099b2775 [gaim-migrate @ 12273]
Daniel Atallah <datallah@pidgin.im>
parents: 10636
diff changeset
3406 g_return_val_if_fail(g_utf8_validate(str, -1, NULL), NULL);
93f5099b2775 [gaim-migrate @ 12273]
Daniel Atallah <datallah@pidgin.im>
parents: 10636
diff changeset
3407
93f5099b2775 [gaim-migrate @ 12273]
Daniel Atallah <datallah@pidgin.im>
parents: 10636
diff changeset
3408 iter = str;
93f5099b2775 [gaim-migrate @ 12273]
Daniel Atallah <datallah@pidgin.im>
parents: 10636
diff changeset
3409 for (; *iter && j < (BUF_LEN - 1) ; iter = g_utf8_next_char(iter)) {
93f5099b2775 [gaim-migrate @ 12273]
Daniel Atallah <datallah@pidgin.im>
parents: 10636
diff changeset
3410 gunichar c = g_utf8_get_char(iter);
10800
00a2c404c1dc [gaim-migrate @ 12446]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10732
diff changeset
3411 /* If the character is an ASCII character and is alphanumeric
00a2c404c1dc [gaim-migrate @ 12446]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10732
diff changeset
3412 * no need to escape */
00a2c404c1dc [gaim-migrate @ 12446]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10732
diff changeset
3413 if (c < 128 && isalnum(c)) {
10700
93f5099b2775 [gaim-migrate @ 12273]
Daniel Atallah <datallah@pidgin.im>
parents: 10636
diff changeset
3414 buf[j++] = c;
93f5099b2775 [gaim-migrate @ 12273]
Daniel Atallah <datallah@pidgin.im>
parents: 10636
diff changeset
3415 } else {
93f5099b2775 [gaim-migrate @ 12273]
Daniel Atallah <datallah@pidgin.im>
parents: 10636
diff changeset
3416 int bytes = g_unichar_to_utf8(c, utf_char);
93f5099b2775 [gaim-migrate @ 12273]
Daniel Atallah <datallah@pidgin.im>
parents: 10636
diff changeset
3417 for (i = 0; i < bytes; i++) {
93f5099b2775 [gaim-migrate @ 12273]
Daniel Atallah <datallah@pidgin.im>
parents: 10636
diff changeset
3418 if (j > (BUF_LEN - 4))
93f5099b2775 [gaim-migrate @ 12273]
Daniel Atallah <datallah@pidgin.im>
parents: 10636
diff changeset
3419 break;
93f5099b2775 [gaim-migrate @ 12273]
Daniel Atallah <datallah@pidgin.im>
parents: 10636
diff changeset
3420 sprintf(buf + j, "%%%02x", utf_char[i] & 0xff);
93f5099b2775 [gaim-migrate @ 12273]
Daniel Atallah <datallah@pidgin.im>
parents: 10636
diff changeset
3421 j += 3;
93f5099b2775 [gaim-migrate @ 12273]
Daniel Atallah <datallah@pidgin.im>
parents: 10636
diff changeset
3422 }
7134
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3423 }
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3424 }
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3425
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3426 buf[j] = '\0';
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3427
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3428 return buf;
e999c4697e38 [gaim-migrate @ 7701]
Sean Egan <seanegan@pidgin.im>
parents: 7110
diff changeset
3429 }
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3430
9054
481fddb7dc5a [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3431 /* Originally lifted from
481fddb7dc5a [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3432 * http://www.oreillynet.com/pub/a/network/excerpt/spcookbook_chap03/index3.html
481fddb7dc5a [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3433 * ... and slightly modified to be a bit more rfc822 compliant
481fddb7dc5a [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3434 * ... and modified a bit more to make domain checking rfc1035 compliant
481fddb7dc5a [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3435 * with the exception permitted in rfc1101 for domains to start with digit
481fddb7dc5a [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3436 * but not completely checking to avoid conflicts with IP addresses
481fddb7dc5a [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3437 */
9045
c665ceb89b85 [gaim-migrate @ 9821]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8976
diff changeset
3438 gboolean
c665ceb89b85 [gaim-migrate @ 9821]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8976
diff changeset
3439 gaim_email_is_valid(const char *address)
c665ceb89b85 [gaim-migrate @ 9821]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8976
diff changeset
3440 {
c665ceb89b85 [gaim-migrate @ 9821]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8976
diff changeset
3441 const char *c, *domain;
c665ceb89b85 [gaim-migrate @ 9821]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8976
diff changeset
3442 static char *rfc822_specials = "()<>@,;:\\\"[]";
c665ceb89b85 [gaim-migrate @ 9821]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8976
diff changeset
3443
9054
481fddb7dc5a [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3444 /* first we validate the name portion (name@domain) (rfc822)*/
9045
c665ceb89b85 [gaim-migrate @ 9821]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8976
diff changeset
3445 for (c = address; *c; c++) {
c665ceb89b85 [gaim-migrate @ 9821]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8976
diff changeset
3446 if (*c == '\"' && (c == address || *(c - 1) == '.' || *(c - 1) == '\"')) {
c665ceb89b85 [gaim-migrate @ 9821]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8976
diff changeset
3447 while (*++c) {
9054
481fddb7dc5a [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3448 if (*c == '\\') {
481fddb7dc5a [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3449 if (*c++ && *c < 127 && *c != '\n' && *c != '\r') continue;
481fddb7dc5a [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3450 else return FALSE;
481fddb7dc5a [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3451 }
9045
c665ceb89b85 [gaim-migrate @ 9821]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8976
diff changeset
3452 if (*c == '\"') break;
9054
481fddb7dc5a [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3453 if (*c < ' ' || *c >= 127) return FALSE;
9045
c665ceb89b85 [gaim-migrate @ 9821]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8976
diff changeset
3454 }
c665ceb89b85 [gaim-migrate @ 9821]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8976
diff changeset
3455 if (!*c++) return FALSE;
c665ceb89b85 [gaim-migrate @ 9821]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8976
diff changeset
3456 if (*c == '@') break;
c665ceb89b85 [gaim-migrate @ 9821]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8976
diff changeset
3457 if (*c != '.') return FALSE;
c665ceb89b85 [gaim-migrate @ 9821]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8976
diff changeset
3458 continue;
c665ceb89b85 [gaim-migrate @ 9821]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8976
diff changeset
3459 }
c665ceb89b85 [gaim-migrate @ 9821]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8976
diff changeset
3460 if (*c == '@') break;
c665ceb89b85 [gaim-migrate @ 9821]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8976
diff changeset
3461 if (*c <= ' ' || *c >= 127) return FALSE;
c665ceb89b85 [gaim-migrate @ 9821]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8976
diff changeset
3462 if (strchr(rfc822_specials, *c)) return FALSE;
c665ceb89b85 [gaim-migrate @ 9821]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8976
diff changeset
3463 }
9054
481fddb7dc5a [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3464 /* strictly we should return false if (*(c - 1) == '.') too, but I think
481fddb7dc5a [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3465 * we should permit user.@domain type addresses - they do work :) */
481fddb7dc5a [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3466 if (c == address) return FALSE;
481fddb7dc5a [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3467
481fddb7dc5a [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3468 /* next we validate the domain portion (name@domain) (rfc1035 & rfc1011) */
9045
c665ceb89b85 [gaim-migrate @ 9821]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8976
diff changeset
3469 if (!*(domain = ++c)) return FALSE;
c665ceb89b85 [gaim-migrate @ 9821]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8976
diff changeset
3470 do {
9054
481fddb7dc5a [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3471 if (*c == '.' && (c == domain || *(c - 1) == '.' || *(c - 1) == '-'))
481fddb7dc5a [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3472 return FALSE;
481fddb7dc5a [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3473 if (*c == '-' && *(c - 1) == '.') return FALSE;
481fddb7dc5a [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3474 if ((*c < '0' && *c != '-' && *c != '.') || (*c > '9' && *c < 'A') ||
481fddb7dc5a [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3475 (*c > 'Z' && *c < 'a') || (*c > 'z')) return FALSE;
9045
c665ceb89b85 [gaim-migrate @ 9821]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8976
diff changeset
3476 } while (*++c);
c665ceb89b85 [gaim-migrate @ 9821]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8976
diff changeset
3477
9054
481fddb7dc5a [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3478 if (*(c - 1) == '-') return FALSE;
481fddb7dc5a [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3479
481fddb7dc5a [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3480 return ((c - domain) > 3 ? TRUE : FALSE);
9045
c665ceb89b85 [gaim-migrate @ 9821]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8976
diff changeset
3481 }
c665ceb89b85 [gaim-migrate @ 9821]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 8976
diff changeset
3482
11135
063678d038f9 [gaim-migrate @ 13196]
Mark Doliner <markdoliner@pidgin.im>
parents: 11132
diff changeset
3483 /* Stolen from gnome_uri_list_extract_uris */
063678d038f9 [gaim-migrate @ 13196]
Mark Doliner <markdoliner@pidgin.im>
parents: 11132
diff changeset
3484 GList *
063678d038f9 [gaim-migrate @ 13196]
Mark Doliner <markdoliner@pidgin.im>
parents: 11132
diff changeset
3485 gaim_uri_list_extract_uris(const gchar *uri_list)
063678d038f9 [gaim-migrate @ 13196]
Mark Doliner <markdoliner@pidgin.im>
parents: 11132
diff changeset
3486 {
9670
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3487 const gchar *p, *q;
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3488 gchar *retval;
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3489 GList *result = NULL;
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3490
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3491 g_return_val_if_fail (uri_list != NULL, NULL);
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3492
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3493 p = uri_list;
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3494
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3495 /* We don't actually try to validate the URI according to RFC
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3496 * 2396, or even check for allowed characters - we just ignore
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3497 * comments and trim whitespace off the ends. We also
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3498 * allow LF delimination as well as the specified CRLF.
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3499 */
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3500 while (p) {
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3501 if (*p != '#') {
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3502 while (isspace(*p))
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3503 p++;
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3504
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3505 q = p;
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3506 while (*q && (*q != '\n') && (*q != '\r'))
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3507 q++;
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3508
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3509 if (q > p) {
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3510 q--;
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3511 while (q > p && isspace(*q))
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3512 q--;
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3513
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3514 retval = (gchar*)g_malloc (q - p + 2);
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3515 strncpy (retval, p, q - p + 1);
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3516 retval[q - p + 1] = '\0';
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3517
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3518 result = g_list_prepend (result, retval);
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3519 }
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3520 }
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3521 p = strchr (p, '\n');
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3522 if (p)
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3523 p++;
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3524 }
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3525
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3526 return g_list_reverse (result);
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3527 }
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3528
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3529
11135
063678d038f9 [gaim-migrate @ 13196]
Mark Doliner <markdoliner@pidgin.im>
parents: 11132
diff changeset
3530 /* Stolen from gnome_uri_list_extract_filenames */
063678d038f9 [gaim-migrate @ 13196]
Mark Doliner <markdoliner@pidgin.im>
parents: 11132
diff changeset
3531 GList *
063678d038f9 [gaim-migrate @ 13196]
Mark Doliner <markdoliner@pidgin.im>
parents: 11132
diff changeset
3532 gaim_uri_list_extract_filenames(const gchar *uri_list)
063678d038f9 [gaim-migrate @ 13196]
Mark Doliner <markdoliner@pidgin.im>
parents: 11132
diff changeset
3533 {
9670
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3534 GList *tmp_list, *node, *result;
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3535
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3536 g_return_val_if_fail (uri_list != NULL, NULL);
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3537
11135
063678d038f9 [gaim-migrate @ 13196]
Mark Doliner <markdoliner@pidgin.im>
parents: 11132
diff changeset
3538 result = gaim_uri_list_extract_uris(uri_list);
9670
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3539
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3540 tmp_list = result;
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3541 while (tmp_list) {
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3542 gchar *s = (gchar*)tmp_list->data;
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3543
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3544 node = tmp_list;
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3545 tmp_list = tmp_list->next;
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3546
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3547 if (!strncmp (s, "file:", 5)) {
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3548 node->data = g_filename_from_uri (s, NULL, NULL);
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3549 /* not sure if this fallback is useful at all */
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3550 if (!node->data) node->data = g_strdup (s+5);
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3551 } else {
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3552 result = g_list_remove_link(result, node);
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3553 g_list_free_1 (node);
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3554 }
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3555 g_free (s);
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3556 }
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3557 return result;
4e8cb7ef72ab [gaim-migrate @ 10522]
Daniel Atallah <datallah@pidgin.im>
parents: 9642
diff changeset
3558 }
9054
481fddb7dc5a [gaim-migrate @ 9830]
Tim Ringenbach <marv@pidgin.im>
parents: 9045
diff changeset
3559
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3560 /**************************************************************************
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3561 * UTF8 String Functions
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3562 **************************************************************************/
9642
ec0b88cf9161 [gaim-migrate @ 10490]
Mark Doliner <markdoliner@pidgin.im>
parents: 9427
diff changeset
3563 gchar *
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3564 gaim_utf8_try_convert(const char *str)
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3565 {
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3566 gsize converted;
9642
ec0b88cf9161 [gaim-migrate @ 10490]
Mark Doliner <markdoliner@pidgin.im>
parents: 9427
diff changeset
3567 gchar *utf8;
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3568
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3569 g_return_val_if_fail(str != NULL, NULL);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3570
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3571 if (g_utf8_validate(str, -1, NULL)) {
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3572 return g_strdup(str);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3573 }
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3574
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3575 utf8 = g_locale_to_utf8(str, -1, &converted, NULL, NULL);
9642
ec0b88cf9161 [gaim-migrate @ 10490]
Mark Doliner <markdoliner@pidgin.im>
parents: 9427
diff changeset
3576 if (utf8 != NULL)
ec0b88cf9161 [gaim-migrate @ 10490]
Mark Doliner <markdoliner@pidgin.im>
parents: 9427
diff changeset
3577 return utf8;
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3578
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3579 utf8 = g_convert(str, -1, "UTF-8", "ISO-8859-15", &converted, NULL, NULL);
9642
ec0b88cf9161 [gaim-migrate @ 10490]
Mark Doliner <markdoliner@pidgin.im>
parents: 9427
diff changeset
3580 if ((utf8 != NULL) && (converted == strlen(str)))
ec0b88cf9161 [gaim-migrate @ 10490]
Mark Doliner <markdoliner@pidgin.im>
parents: 9427
diff changeset
3581 return utf8;
ec0b88cf9161 [gaim-migrate @ 10490]
Mark Doliner <markdoliner@pidgin.im>
parents: 9427
diff changeset
3582
ec0b88cf9161 [gaim-migrate @ 10490]
Mark Doliner <markdoliner@pidgin.im>
parents: 9427
diff changeset
3583 if (utf8 != NULL)
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3584 g_free(utf8);
9642
ec0b88cf9161 [gaim-migrate @ 10490]
Mark Doliner <markdoliner@pidgin.im>
parents: 9427
diff changeset
3585
ec0b88cf9161 [gaim-migrate @ 10490]
Mark Doliner <markdoliner@pidgin.im>
parents: 9427
diff changeset
3586 return NULL;
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3587 }
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3588
10258
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3589 #define utf8_first(x) ((x & 0x80) == 0 || (x & 0xe0) == 0xc0 \
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3590 || (x & 0xf0) == 0xe0 || (x & 0xf8) == 0xf)
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3591 gchar *
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3592 gaim_utf8_salvage(const char *str)
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3593 {
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3594 GString *workstr;
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3595 const char *end;
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3596
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3597 g_return_val_if_fail(str != NULL, NULL);
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3598
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3599 workstr = g_string_sized_new(strlen(str));
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3600
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3601 do {
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3602 g_utf8_validate(str, -1, &end);
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3603 workstr = g_string_append_len(workstr, str, end - str);
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3604 str = end;
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3605 if (*str == '\0')
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3606 break;
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3607 do {
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3608 workstr = g_string_append_c(workstr, '?');
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3609 str++;
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3610 } while (!utf8_first(*str));
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3611 } while (*str != '\0');
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3612
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3613 return g_string_free(workstr, FALSE);
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3614 }
21cfe876ca17 [gaim-migrate @ 11400]
Ethan Blanton <elb@pidgin.im>
parents: 10203
diff changeset
3615
12813
6f67cfa0e6a0 [gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents: 12802
diff changeset
3616
6f67cfa0e6a0 [gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents: 12802
diff changeset
3617 char *
12880
eb39a798ff9a [gaim-migrate @ 15232]
Christopher O'Brien <siege@pidgin.im>
parents: 12813
diff changeset
3618 gaim_utf8_ncr_encode(const char *str)
12813
6f67cfa0e6a0 [gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents: 12802
diff changeset
3619 {
6f67cfa0e6a0 [gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents: 12802
diff changeset
3620 GString *out;
6f67cfa0e6a0 [gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents: 12802
diff changeset
3621
12880
eb39a798ff9a [gaim-migrate @ 15232]
Christopher O'Brien <siege@pidgin.im>
parents: 12813
diff changeset
3622 g_return_val_if_fail(str != NULL, NULL);
eb39a798ff9a [gaim-migrate @ 15232]
Christopher O'Brien <siege@pidgin.im>
parents: 12813
diff changeset
3623 g_return_val_if_fail(g_utf8_validate(str, -1, NULL), NULL);
12813
6f67cfa0e6a0 [gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents: 12802
diff changeset
3624
6f67cfa0e6a0 [gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents: 12802
diff changeset
3625 out = g_string_new("");
6f67cfa0e6a0 [gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents: 12802
diff changeset
3626
12880
eb39a798ff9a [gaim-migrate @ 15232]
Christopher O'Brien <siege@pidgin.im>
parents: 12813
diff changeset
3627 for(; *str; str = g_utf8_next_char(str)) {
eb39a798ff9a [gaim-migrate @ 15232]
Christopher O'Brien <siege@pidgin.im>
parents: 12813
diff changeset
3628 gunichar wc = g_utf8_get_char(str);
eb39a798ff9a [gaim-migrate @ 15232]
Christopher O'Brien <siege@pidgin.im>
parents: 12813
diff changeset
3629
eb39a798ff9a [gaim-migrate @ 15232]
Christopher O'Brien <siege@pidgin.im>
parents: 12813
diff changeset
3630 /* super simple check. hopefully not too wrong. */
eb39a798ff9a [gaim-migrate @ 15232]
Christopher O'Brien <siege@pidgin.im>
parents: 12813
diff changeset
3631 if(wc >= 0x80) {
12813
6f67cfa0e6a0 [gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents: 12802
diff changeset
3632 g_string_append_printf(out, "&#%u;", (guint32) wc);
6f67cfa0e6a0 [gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents: 12802
diff changeset
3633 } else {
6f67cfa0e6a0 [gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents: 12802
diff changeset
3634 g_string_append_unichar(out, wc);
6f67cfa0e6a0 [gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents: 12802
diff changeset
3635 }
6f67cfa0e6a0 [gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents: 12802
diff changeset
3636 }
6f67cfa0e6a0 [gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents: 12802
diff changeset
3637
6f67cfa0e6a0 [gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents: 12802
diff changeset
3638 return g_string_free(out, FALSE);
6f67cfa0e6a0 [gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents: 12802
diff changeset
3639 }
6f67cfa0e6a0 [gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents: 12802
diff changeset
3640
6f67cfa0e6a0 [gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents: 12802
diff changeset
3641
9161
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
3642 char *
12880
eb39a798ff9a [gaim-migrate @ 15232]
Christopher O'Brien <siege@pidgin.im>
parents: 12813
diff changeset
3643 gaim_utf8_ncr_decode(const char *str)
9161
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
3644 {
12813
6f67cfa0e6a0 [gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents: 12802
diff changeset
3645 GString *out;
12880
eb39a798ff9a [gaim-migrate @ 15232]
Christopher O'Brien <siege@pidgin.im>
parents: 12813
diff changeset
3646 char *buf, *b;
eb39a798ff9a [gaim-migrate @ 15232]
Christopher O'Brien <siege@pidgin.im>
parents: 12813
diff changeset
3647
eb39a798ff9a [gaim-migrate @ 15232]
Christopher O'Brien <siege@pidgin.im>
parents: 12813
diff changeset
3648 g_return_val_if_fail(str != NULL, NULL);
eb39a798ff9a [gaim-migrate @ 15232]
Christopher O'Brien <siege@pidgin.im>
parents: 12813
diff changeset
3649 g_return_val_if_fail(g_utf8_validate(str, -1, NULL), NULL);
eb39a798ff9a [gaim-migrate @ 15232]
Christopher O'Brien <siege@pidgin.im>
parents: 12813
diff changeset
3650
eb39a798ff9a [gaim-migrate @ 15232]
Christopher O'Brien <siege@pidgin.im>
parents: 12813
diff changeset
3651 buf = (char *) str;
12813
6f67cfa0e6a0 [gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents: 12802
diff changeset
3652 out = g_string_new("");
6f67cfa0e6a0 [gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents: 12802
diff changeset
3653
12880
eb39a798ff9a [gaim-migrate @ 15232]
Christopher O'Brien <siege@pidgin.im>
parents: 12813
diff changeset
3654 while( (b = strstr(buf, "&#")) ) {
eb39a798ff9a [gaim-migrate @ 15232]
Christopher O'Brien <siege@pidgin.im>
parents: 12813
diff changeset
3655 gunichar wc;
eb39a798ff9a [gaim-migrate @ 15232]
Christopher O'Brien <siege@pidgin.im>
parents: 12813
diff changeset
3656 int base = 0;
eb39a798ff9a [gaim-migrate @ 15232]
Christopher O'Brien <siege@pidgin.im>
parents: 12813
diff changeset
3657
eb39a798ff9a [gaim-migrate @ 15232]
Christopher O'Brien <siege@pidgin.im>
parents: 12813
diff changeset
3658 /* append everything leading up to the &# */
eb39a798ff9a [gaim-migrate @ 15232]
Christopher O'Brien <siege@pidgin.im>
parents: 12813
diff changeset
3659 g_string_append_len(out, buf, b-buf);
eb39a798ff9a [gaim-migrate @ 15232]
Christopher O'Brien <siege@pidgin.im>
parents: 12813
diff changeset
3660
eb39a798ff9a [gaim-migrate @ 15232]
Christopher O'Brien <siege@pidgin.im>
parents: 12813
diff changeset
3661 b += 2; /* skip past the &# */
eb39a798ff9a [gaim-migrate @ 15232]
Christopher O'Brien <siege@pidgin.im>
parents: 12813
diff changeset
3662
eb39a798ff9a [gaim-migrate @ 15232]
Christopher O'Brien <siege@pidgin.im>
parents: 12813
diff changeset
3663 /* strtoul will handle 0x prefix as hex, but not x */
eb39a798ff9a [gaim-migrate @ 15232]
Christopher O'Brien <siege@pidgin.im>
parents: 12813
diff changeset
3664 if(*b == 'x' || *b == 'X')
eb39a798ff9a [gaim-migrate @ 15232]
Christopher O'Brien <siege@pidgin.im>
parents: 12813
diff changeset
3665 base = 16;
eb39a798ff9a [gaim-migrate @ 15232]
Christopher O'Brien <siege@pidgin.im>
parents: 12813
diff changeset
3666
eb39a798ff9a [gaim-migrate @ 15232]
Christopher O'Brien <siege@pidgin.im>
parents: 12813
diff changeset
3667 /* advances buf to the end of the ncr segment */
eb39a798ff9a [gaim-migrate @ 15232]
Christopher O'Brien <siege@pidgin.im>
parents: 12813
diff changeset
3668 wc = (gunichar) strtoul(b, &buf, base);
eb39a798ff9a [gaim-migrate @ 15232]
Christopher O'Brien <siege@pidgin.im>
parents: 12813
diff changeset
3669
eb39a798ff9a [gaim-migrate @ 15232]
Christopher O'Brien <siege@pidgin.im>
parents: 12813
diff changeset
3670 /* this mimics the previous impl of ncr_decode */
eb39a798ff9a [gaim-migrate @ 15232]
Christopher O'Brien <siege@pidgin.im>
parents: 12813
diff changeset
3671 if(*buf == ';') {
eb39a798ff9a [gaim-migrate @ 15232]
Christopher O'Brien <siege@pidgin.im>
parents: 12813
diff changeset
3672 g_string_append_unichar(out, wc);
eb39a798ff9a [gaim-migrate @ 15232]
Christopher O'Brien <siege@pidgin.im>
parents: 12813
diff changeset
3673 buf++;
9161
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
3674 }
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
3675 }
12880
eb39a798ff9a [gaim-migrate @ 15232]
Christopher O'Brien <siege@pidgin.im>
parents: 12813
diff changeset
3676
eb39a798ff9a [gaim-migrate @ 15232]
Christopher O'Brien <siege@pidgin.im>
parents: 12813
diff changeset
3677 /* append whatever's left */
eb39a798ff9a [gaim-migrate @ 15232]
Christopher O'Brien <siege@pidgin.im>
parents: 12813
diff changeset
3678 g_string_append(out, buf);
eb39a798ff9a [gaim-migrate @ 15232]
Christopher O'Brien <siege@pidgin.im>
parents: 12813
diff changeset
3679
9161
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
3680 return g_string_free(out, FALSE);
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
3681 }
0561de0af1c6 [gaim-migrate @ 9946]
Tim Ringenbach <marv@pidgin.im>
parents: 9160
diff changeset
3682
12880
eb39a798ff9a [gaim-migrate @ 15232]
Christopher O'Brien <siege@pidgin.im>
parents: 12813
diff changeset
3683
7108
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3684 int
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3685 gaim_utf8_strcasecmp(const char *a, const char *b)
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3686 {
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3687 char *a_norm = NULL;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3688 char *b_norm = NULL;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3689 int ret = -1;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3690
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3691 if(!a && b)
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3692 return -1;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3693 else if(!b && a)
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3694 return 1;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3695 else if(!a && !b)
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3696 return 0;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3697
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3698 if(!g_utf8_validate(a, -1, NULL) || !g_utf8_validate(b, -1, NULL))
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3699 {
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3700 gaim_debug_error("gaim_utf8_strcasecmp",
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3701 "One or both parameters are invalid UTF8\n");
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3702 return ret;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3703 }
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3704
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3705 a_norm = g_utf8_casefold(a, -1);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3706 b_norm = g_utf8_casefold(b, -1);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3707 ret = g_utf8_collate(a_norm, b_norm);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3708 g_free(a_norm);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3709 g_free(b_norm);
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3710
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3711 return ret;
82655fa54acb [gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents: 7107
diff changeset
3712 }
7162
dfd30c70acde [gaim-migrate @ 7729]
Nathan Walp <nwalp@pidgin.im>
parents: 7134
diff changeset
3713
11552
674a2a79943a [gaim-migrate @ 13812]
Casey Harkins <charkins@pidgin.im>
parents: 11493
diff changeset
3714 /* previously conversation::find_nick() */
674a2a79943a [gaim-migrate @ 13812]
Casey Harkins <charkins@pidgin.im>
parents: 11493
diff changeset
3715 gboolean
674a2a79943a [gaim-migrate @ 13812]
Casey Harkins <charkins@pidgin.im>
parents: 11493
diff changeset
3716 gaim_utf8_has_word(const char *haystack, const char *needle)
674a2a79943a [gaim-migrate @ 13812]
Casey Harkins <charkins@pidgin.im>
parents: 11493
diff changeset
3717 {
674a2a79943a [gaim-migrate @ 13812]
Casey Harkins <charkins@pidgin.im>
parents: 11493
diff changeset
3718 char *hay, *pin, *p;
674a2a79943a [gaim-migrate @ 13812]
Casey Harkins <charkins@pidgin.im>
parents: 11493
diff changeset
3719 int n;
674a2a79943a [gaim-migrate @ 13812]
Casey Harkins <charkins@pidgin.im>
parents: 11493
diff changeset
3720 gboolean ret = FALSE;
674a2a79943a [gaim-migrate @ 13812]
Casey Harkins <charkins@pidgin.im>
parents: 11493
diff changeset
3721
674a2a79943a [gaim-migrate @ 13812]
Casey Harkins <charkins@pidgin.im>
parents: 11493
diff changeset
3722 hay = g_utf8_strdown(haystack, -1);
674a2a79943a [gaim-migrate @ 13812]
Casey Harkins <charkins@pidgin.im>
parents: 11493
diff changeset
3723
674a2a79943a [gaim-migrate @ 13812]
Casey Harkins <charkins@pidgin.im>
parents: 11493
diff changeset
3724 pin = g_utf8_strdown(needle, -1);
674a2a79943a [gaim-migrate @ 13812]
Casey Harkins <charkins@pidgin.im>
parents: 11493
diff changeset
3725 n = strlen(pin);
674a2a79943a [gaim-migrate @ 13812]
Casey Harkins <charkins@pidgin.im>
parents: 11493
diff changeset
3726
674a2a79943a [gaim-migrate @ 13812]
Casey Harkins <charkins@pidgin.im>
parents: 11493
diff changeset
3727 if ((p = strstr(hay, pin)) != NULL) {
674a2a79943a [gaim-migrate @ 13812]
Casey Harkins <charkins@pidgin.im>
parents: 11493
diff changeset
3728 if ((p == hay || !isalnum(*(p - 1))) && !isalnum(*(p + n))) {
674a2a79943a [gaim-migrate @ 13812]
Casey Harkins <charkins@pidgin.im>
parents: 11493
diff changeset
3729 ret = TRUE;
674a2a79943a [gaim-migrate @ 13812]
Casey Harkins <charkins@pidgin.im>
parents: 11493
diff changeset
3730 }
674a2a79943a [gaim-migrate @ 13812]
Casey Harkins <charkins@pidgin.im>
parents: 11493
diff changeset
3731 }
674a2a79943a [gaim-migrate @ 13812]
Casey Harkins <charkins@pidgin.im>
parents: 11493
diff changeset
3732
674a2a79943a [gaim-migrate @ 13812]
Casey Harkins <charkins@pidgin.im>
parents: 11493
diff changeset
3733 g_free(pin);
674a2a79943a [gaim-migrate @ 13812]
Casey Harkins <charkins@pidgin.im>
parents: 11493
diff changeset
3734 g_free(hay);
674a2a79943a [gaim-migrate @ 13812]
Casey Harkins <charkins@pidgin.im>
parents: 11493
diff changeset
3735
674a2a79943a [gaim-migrate @ 13812]
Casey Harkins <charkins@pidgin.im>
parents: 11493
diff changeset
3736 return ret;
674a2a79943a [gaim-migrate @ 13812]
Casey Harkins <charkins@pidgin.im>
parents: 11493
diff changeset
3737 }
674a2a79943a [gaim-migrate @ 13812]
Casey Harkins <charkins@pidgin.im>
parents: 11493
diff changeset
3738
13090
aee4ed853ff3 [gaim-migrate @ 15451]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents: 13033
diff changeset
3739 void
aee4ed853ff3 [gaim-migrate @ 15451]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents: 13033
diff changeset
3740 gaim_print_utf8_to_console(FILE *filestream, char *message)
aee4ed853ff3 [gaim-migrate @ 15451]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents: 13033
diff changeset
3741 {
aee4ed853ff3 [gaim-migrate @ 15451]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents: 13033
diff changeset
3742 gchar *message_conv;
aee4ed853ff3 [gaim-migrate @ 15451]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents: 13033
diff changeset
3743 GError *error = NULL;
aee4ed853ff3 [gaim-migrate @ 15451]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents: 13033
diff changeset
3744
aee4ed853ff3 [gaim-migrate @ 15451]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents: 13033
diff changeset
3745 /* Try to convert 'message' to user's locale */
aee4ed853ff3 [gaim-migrate @ 15451]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents: 13033
diff changeset
3746 message_conv = g_locale_from_utf8(message, -1, NULL, NULL, &error);
aee4ed853ff3 [gaim-migrate @ 15451]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents: 13033
diff changeset
3747 if (message_conv != NULL) {
aee4ed853ff3 [gaim-migrate @ 15451]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents: 13033
diff changeset
3748 fputs(message_conv, filestream);
aee4ed853ff3 [gaim-migrate @ 15451]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents: 13033
diff changeset
3749 g_free(message_conv);
aee4ed853ff3 [gaim-migrate @ 15451]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents: 13033
diff changeset
3750 }
aee4ed853ff3 [gaim-migrate @ 15451]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents: 13033
diff changeset
3751 else
aee4ed853ff3 [gaim-migrate @ 15451]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents: 13033
diff changeset
3752 {
aee4ed853ff3 [gaim-migrate @ 15451]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents: 13033
diff changeset
3753 /* use 'message' as a fallback */
aee4ed853ff3 [gaim-migrate @ 15451]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents: 13033
diff changeset
3754 g_warning("%s\n", error->message);
aee4ed853ff3 [gaim-migrate @ 15451]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents: 13033
diff changeset
3755 g_error_free(error);
aee4ed853ff3 [gaim-migrate @ 15451]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents: 13033
diff changeset
3756 fputs(message, filestream);
aee4ed853ff3 [gaim-migrate @ 15451]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents: 13033
diff changeset
3757 }
aee4ed853ff3 [gaim-migrate @ 15451]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents: 13033
diff changeset
3758 }
aee4ed853ff3 [gaim-migrate @ 15451]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents: 13033
diff changeset
3759
7564
baab99d239d8 [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3760 gboolean gaim_message_meify(char *message, size_t len)
baab99d239d8 [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3761 {
baab99d239d8 [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3762 char *c;
baab99d239d8 [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3763 gboolean inside_html = FALSE;
baab99d239d8 [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3764
baab99d239d8 [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3765 g_return_val_if_fail(message != NULL, FALSE);
baab99d239d8 [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3766
baab99d239d8 [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3767 if(len == -1)
baab99d239d8 [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3768 len = strlen(message);
baab99d239d8 [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3769
baab99d239d8 [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3770 for (c = message; *c; c++, len--) {
baab99d239d8 [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3771 if(inside_html) {
baab99d239d8 [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3772 if(*c == '>')
baab99d239d8 [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3773 inside_html = FALSE;
baab99d239d8 [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3774 } else {
baab99d239d8 [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3775 if(*c == '<')
baab99d239d8 [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3776 inside_html = TRUE;
baab99d239d8 [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3777 else
baab99d239d8 [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3778 break;
baab99d239d8 [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3779 }
baab99d239d8 [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3780 }
baab99d239d8 [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3781
baab99d239d8 [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3782 if(*c && !g_ascii_strncasecmp(c, "/me ", 4)) {
baab99d239d8 [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3783 memmove(c, c+4, len-3);
baab99d239d8 [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3784 return TRUE;
baab99d239d8 [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3785 }
baab99d239d8 [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3786
baab99d239d8 [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3787 return FALSE;
baab99d239d8 [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3788 }
baab99d239d8 [gaim-migrate @ 8180]
Nathan Walp <nwalp@pidgin.im>
parents: 7478
diff changeset
3789
7889
34cc5467bf55 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3790 char *gaim_text_strip_mnemonic(const char *in)
34cc5467bf55 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3791 {
34cc5467bf55 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3792 char *out;
34cc5467bf55 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3793 char *a;
8561
fb105b6434ef [gaim-migrate @ 9305]
Ambrose Li <ambrose.li@gmail.com>
parents: 8538
diff changeset
3794 char *a0;
7889
34cc5467bf55 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3795 const char *b;
34cc5467bf55 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3796
34cc5467bf55 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3797 g_return_val_if_fail(in != NULL, NULL);
34cc5467bf55 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3798
34cc5467bf55 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3799 out = g_malloc(strlen(in)+1);
34cc5467bf55 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3800 a = out;
34cc5467bf55 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3801 b = in;
34cc5467bf55 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3802
8561
fb105b6434ef [gaim-migrate @ 9305]
Ambrose Li <ambrose.li@gmail.com>
parents: 8538
diff changeset
3803 a0 = a; /* The last non-space char seen so far, or the first char */
fb105b6434ef [gaim-migrate @ 9305]
Ambrose Li <ambrose.li@gmail.com>
parents: 8538
diff changeset
3804
7889
34cc5467bf55 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3805 while(*b) {
34cc5467bf55 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3806 if(*b == '_') {
8561
fb105b6434ef [gaim-migrate @ 9305]
Ambrose Li <ambrose.li@gmail.com>
parents: 8538
diff changeset
3807 if(a > out && b > in && *(b-1) == '(' && *(b+1) && !(*(b+1) & 0x80) && *(b+2) == ')') {
fb105b6434ef [gaim-migrate @ 9305]
Ambrose Li <ambrose.li@gmail.com>
parents: 8538
diff changeset
3808 /* Detected CJK style shortcut (Bug 875311) */
fb105b6434ef [gaim-migrate @ 9305]
Ambrose Li <ambrose.li@gmail.com>
parents: 8538
diff changeset
3809 a = a0; /* undo the left parenthesis */
fb105b6434ef [gaim-migrate @ 9305]
Ambrose Li <ambrose.li@gmail.com>
parents: 8538
diff changeset
3810 b += 3; /* and skip the whole mess */
fb105b6434ef [gaim-migrate @ 9305]
Ambrose Li <ambrose.li@gmail.com>
parents: 8538
diff changeset
3811 } else if(*(b+1) == '_') {
7889
34cc5467bf55 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3812 *(a++) = '_';
34cc5467bf55 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3813 b += 2;
8561
fb105b6434ef [gaim-migrate @ 9305]
Ambrose Li <ambrose.li@gmail.com>
parents: 8538
diff changeset
3814 a0 = a;
7889
34cc5467bf55 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3815 } else {
34cc5467bf55 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3816 b++;
34cc5467bf55 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3817 }
8561
fb105b6434ef [gaim-migrate @ 9305]
Ambrose Li <ambrose.li@gmail.com>
parents: 8538
diff changeset
3818 /* We don't want to corrupt the middle of UTF-8 characters */
fb105b6434ef [gaim-migrate @ 9305]
Ambrose Li <ambrose.li@gmail.com>
parents: 8538
diff changeset
3819 } else if (!(*b & 0x80)) { /* other 1-byte char */
fb105b6434ef [gaim-migrate @ 9305]
Ambrose Li <ambrose.li@gmail.com>
parents: 8538
diff changeset
3820 if (*b != ' ')
fb105b6434ef [gaim-migrate @ 9305]
Ambrose Li <ambrose.li@gmail.com>
parents: 8538
diff changeset
3821 a0 = a;
fb105b6434ef [gaim-migrate @ 9305]
Ambrose Li <ambrose.li@gmail.com>
parents: 8538
diff changeset
3822 *(a++) = *(b++);
7889
34cc5467bf55 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3823 } else {
8561
fb105b6434ef [gaim-migrate @ 9305]
Ambrose Li <ambrose.li@gmail.com>
parents: 8538
diff changeset
3824 /* Multibyte utf8 char, don't look for _ inside these */
fb105b6434ef [gaim-migrate @ 9305]
Ambrose Li <ambrose.li@gmail.com>
parents: 8538
diff changeset
3825 int n = 0;
fb105b6434ef [gaim-migrate @ 9305]
Ambrose Li <ambrose.li@gmail.com>
parents: 8538
diff changeset
3826 int i;
fb105b6434ef [gaim-migrate @ 9305]
Ambrose Li <ambrose.li@gmail.com>
parents: 8538
diff changeset
3827 if ((*b & 0xe0) == 0xc0) {
fb105b6434ef [gaim-migrate @ 9305]
Ambrose Li <ambrose.li@gmail.com>
parents: 8538
diff changeset
3828 n = 2;
fb105b6434ef [gaim-migrate @ 9305]
Ambrose Li <ambrose.li@gmail.com>
parents: 8538
diff changeset
3829 } else if ((*b & 0xf0) == 0xe0) {
fb105b6434ef [gaim-migrate @ 9305]
Ambrose Li <ambrose.li@gmail.com>
parents: 8538
diff changeset
3830 n = 3;
fb105b6434ef [gaim-migrate @ 9305]
Ambrose Li <ambrose.li@gmail.com>
parents: 8538
diff changeset
3831 } else if ((*b & 0xf8) == 0xf0) {
fb105b6434ef [gaim-migrate @ 9305]
Ambrose Li <ambrose.li@gmail.com>
parents: 8538
diff changeset
3832 n = 4;
fb105b6434ef [gaim-migrate @ 9305]
Ambrose Li <ambrose.li@gmail.com>
parents: 8538
diff changeset
3833 } else if ((*b & 0xfc) == 0xf8) {
fb105b6434ef [gaim-migrate @ 9305]
Ambrose Li <ambrose.li@gmail.com>
parents: 8538
diff changeset
3834 n = 5;
fb105b6434ef [gaim-migrate @ 9305]
Ambrose Li <ambrose.li@gmail.com>
parents: 8538
diff changeset
3835 } else if ((*b & 0xfe) == 0xfc) {
fb105b6434ef [gaim-migrate @ 9305]
Ambrose Li <ambrose.li@gmail.com>
parents: 8538
diff changeset
3836 n = 6;
fb105b6434ef [gaim-migrate @ 9305]
Ambrose Li <ambrose.li@gmail.com>
parents: 8538
diff changeset
3837 } else { /* Illegal utf8 */
fb105b6434ef [gaim-migrate @ 9305]
Ambrose Li <ambrose.li@gmail.com>
parents: 8538
diff changeset
3838 n = 1;
fb105b6434ef [gaim-migrate @ 9305]
Ambrose Li <ambrose.li@gmail.com>
parents: 8538
diff changeset
3839 }
fb105b6434ef [gaim-migrate @ 9305]
Ambrose Li <ambrose.li@gmail.com>
parents: 8538
diff changeset
3840 a0 = a; /* unless we want to delete CJK spaces too */
fb105b6434ef [gaim-migrate @ 9305]
Ambrose Li <ambrose.li@gmail.com>
parents: 8538
diff changeset
3841 for (i = 0; i < n && *b; i += 1) {
fb105b6434ef [gaim-migrate @ 9305]
Ambrose Li <ambrose.li@gmail.com>
parents: 8538
diff changeset
3842 *(a++) = *(b++);
fb105b6434ef [gaim-migrate @ 9305]
Ambrose Li <ambrose.li@gmail.com>
parents: 8538
diff changeset
3843 }
7889
34cc5467bf55 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3844 }
34cc5467bf55 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3845 }
34cc5467bf55 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3846 *a = '\0';
34cc5467bf55 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3847
34cc5467bf55 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3848 return out;
34cc5467bf55 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3849 }
34cc5467bf55 [gaim-migrate @ 8547]
Nathan Walp <nwalp@pidgin.im>
parents: 7858
diff changeset
3850
9926
9957e01fd88a [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3851 const char* gaim_unescape_filename(const char *escaped) {
9957e01fd88a [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3852 return gaim_url_decode(escaped);
9957e01fd88a [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3853 }
9957e01fd88a [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3854
9957e01fd88a [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3855
9957e01fd88a [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3856 /* this is almost identical to gaim_url_encode (hence gaim_url_decode
9957e01fd88a [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3857 * being used above), but we want to keep certain characters unescaped
9957e01fd88a [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3858 * for compat reasons */
9957e01fd88a [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3859 const char *
9957e01fd88a [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3860 gaim_escape_filename(const char *str)
9957e01fd88a [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3861 {
10700
93f5099b2775 [gaim-migrate @ 12273]
Daniel Atallah <datallah@pidgin.im>
parents: 10636
diff changeset
3862 const char *iter;
9926
9957e01fd88a [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3863 static char buf[BUF_LEN];
10700
93f5099b2775 [gaim-migrate @ 12273]
Daniel Atallah <datallah@pidgin.im>
parents: 10636
diff changeset
3864 char utf_char[6];
9926
9957e01fd88a [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3865 guint i, j = 0;
9957e01fd88a [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3866
9957e01fd88a [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3867 g_return_val_if_fail(str != NULL, NULL);
10700
93f5099b2775 [gaim-migrate @ 12273]
Daniel Atallah <datallah@pidgin.im>
parents: 10636
diff changeset
3868 g_return_val_if_fail(g_utf8_validate(str, -1, NULL), NULL);
93f5099b2775 [gaim-migrate @ 12273]
Daniel Atallah <datallah@pidgin.im>
parents: 10636
diff changeset
3869
93f5099b2775 [gaim-migrate @ 12273]
Daniel Atallah <datallah@pidgin.im>
parents: 10636
diff changeset
3870 iter = str;
93f5099b2775 [gaim-migrate @ 12273]
Daniel Atallah <datallah@pidgin.im>
parents: 10636
diff changeset
3871 for (; *iter && j < (BUF_LEN - 1) ; iter = g_utf8_next_char(iter)) {
93f5099b2775 [gaim-migrate @ 12273]
Daniel Atallah <datallah@pidgin.im>
parents: 10636
diff changeset
3872 gunichar c = g_utf8_get_char(iter);
93f5099b2775 [gaim-migrate @ 12273]
Daniel Atallah <datallah@pidgin.im>
parents: 10636
diff changeset
3873 /* If the character is an ASCII character and is alphanumeric,
93f5099b2775 [gaim-migrate @ 12273]
Daniel Atallah <datallah@pidgin.im>
parents: 10636
diff changeset
3874 * or one of the specified values, no need to escape */
10800
00a2c404c1dc [gaim-migrate @ 12446]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10732
diff changeset
3875 if (c < 128 && (isalnum(c) || c == '@' || c == '-' ||
10700
93f5099b2775 [gaim-migrate @ 12273]
Daniel Atallah <datallah@pidgin.im>
parents: 10636
diff changeset
3876 c == '_' || c == '.' || c == '#')) {
93f5099b2775 [gaim-migrate @ 12273]
Daniel Atallah <datallah@pidgin.im>
parents: 10636
diff changeset
3877 buf[j++] = c;
93f5099b2775 [gaim-migrate @ 12273]
Daniel Atallah <datallah@pidgin.im>
parents: 10636
diff changeset
3878 } else {
93f5099b2775 [gaim-migrate @ 12273]
Daniel Atallah <datallah@pidgin.im>
parents: 10636
diff changeset
3879 int bytes = g_unichar_to_utf8(c, utf_char);
93f5099b2775 [gaim-migrate @ 12273]
Daniel Atallah <datallah@pidgin.im>
parents: 10636
diff changeset
3880 for (i = 0; i < bytes; i++) {
93f5099b2775 [gaim-migrate @ 12273]
Daniel Atallah <datallah@pidgin.im>
parents: 10636
diff changeset
3881 if (j > (BUF_LEN - 4))
93f5099b2775 [gaim-migrate @ 12273]
Daniel Atallah <datallah@pidgin.im>
parents: 10636
diff changeset
3882 break;
93f5099b2775 [gaim-migrate @ 12273]
Daniel Atallah <datallah@pidgin.im>
parents: 10636
diff changeset
3883 sprintf(buf + j, "%%%02x", utf_char[i] & 0xff);
93f5099b2775 [gaim-migrate @ 12273]
Daniel Atallah <datallah@pidgin.im>
parents: 10636
diff changeset
3884 j += 3;
93f5099b2775 [gaim-migrate @ 12273]
Daniel Atallah <datallah@pidgin.im>
parents: 10636
diff changeset
3885 }
9926
9957e01fd88a [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3886 }
9957e01fd88a [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3887 }
9957e01fd88a [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3888
9957e01fd88a [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3889 buf[j] = '\0';
9957e01fd88a [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3890
9957e01fd88a [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3891 return buf;
9957e01fd88a [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3892 }
9957e01fd88a [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3893
9957e01fd88a [gaim-migrate @ 10818]
Nathan Walp <nwalp@pidgin.im>
parents: 9916
diff changeset
3894

mercurial