Mercurial > pidgin.yaz
annotate src/protocols/oscar/util.c @ 13608:6c34fbb75bbd
[gaim-migrate @ 15994]
Disconnect the account with a decent error message when there are
problems with an oscar FLAP connection. This needed to be added
after I removed it when rewriting things for non-blocking I/O.
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Mon, 10 Apr 2006 03:37:37 +0000 |
parents | c1157497b32c |
children | b198d0c26b83 |
rev | line source |
---|---|
13234 | 1 /* |
2 * Gaim's oscar protocol plugin | |
3 * This file is the legal property of its developers. | |
4 * Please see the AUTHORS file distributed alongside this file. | |
5 * | |
6 * This library is free software; you can redistribute it and/or | |
7 * modify it under the terms of the GNU Lesser General Public | |
8 * License as published by the Free Software Foundation; either | |
9 * version 2 of the License, or (at your option) any later version. | |
10 * | |
11 * This library is distributed in the hope that it will be useful, | |
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
14 * Lesser General Public License for more details. | |
15 * | |
16 * You should have received a copy of the GNU Lesser General Public | |
17 * License along with this library; if not, write to the Free Software | |
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
19 */ | |
20 | |
2086 | 21 /* |
4246 | 22 * A little bit of this |
23 * A little bit of that | |
24 * It started with a kiss | |
25 * Now we're up to bat | |
2086 | 26 */ |
27 | |
13234 | 28 #include "oscar.h" |
2086 | 29 #include <ctype.h> |
30 | |
4246 | 31 #ifdef _WIN32 |
32 #include "win32dep.h" | |
33 #endif | |
34 | |
2086 | 35 /* |
36 * Tokenizing functions. Used to portably replace strtok/sep. | |
37 * -- DMP. | |
38 * | |
39 */ | |
13606 | 40 int |
41 aimutil_tokslen(char *toSearch, int theindex, char dl) | |
2086 | 42 { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
43 int curCount = 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
44 char *next; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
45 char *last; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
46 int toReturn; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
47 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
48 last = toSearch; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
49 next = strchr(toSearch, dl); |
2086 | 50 |
6323 | 51 while(curCount < theindex && next != NULL) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
52 curCount++; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
53 last = next + 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
54 next = strchr(last, dl); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
55 } |
2086 | 56 |
6323 | 57 if ((curCount < theindex) || (next == NULL)) |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
58 toReturn = strlen(toSearch) - (curCount - 1); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
59 else |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
60 toReturn = next - toSearch - (curCount - 1); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
61 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
62 return toReturn; |
2086 | 63 } |
64 | |
13606 | 65 int |
66 aimutil_itemcnt(char *toSearch, char dl) | |
2086 | 67 { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
68 int curCount; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
69 char *next; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
70 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
71 curCount = 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
72 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
73 next = strchr(toSearch, dl); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
74 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
75 while(next != NULL) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
76 curCount++; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
77 next = strchr(next + 1, dl); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
78 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
79 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
80 return curCount; |
2086 | 81 } |
82 | |
13606 | 83 char * |
84 aimutil_itemindex(char *toSearch, int theindex, char dl) | |
2086 | 85 { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
86 int curCount; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
87 char *next; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
88 char *last; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
89 char *toReturn; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
90 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
91 curCount = 0; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
92 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
93 last = toSearch; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
94 next = strchr(toSearch, dl); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
95 |
6323 | 96 while (curCount < theindex && next != NULL) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
97 curCount++; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
98 last = next + 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
99 next = strchr(last, dl); |
2086 | 100 } |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
101 |
6323 | 102 if (curCount < theindex) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
103 toReturn = malloc(sizeof(char)); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
104 *toReturn = '\0'; |
2086 | 105 } |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
106 next = strchr(last, dl); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
107 |
6323 | 108 if (curCount < theindex) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
109 toReturn = malloc(sizeof(char)); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
110 *toReturn = '\0'; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
111 } else { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
112 if (next == NULL) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
113 toReturn = malloc((strlen(last) + 1) * sizeof(char)); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
114 strcpy(toReturn, last); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
115 } else { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
116 toReturn = malloc((next - last + 1) * sizeof(char)); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
117 memcpy(toReturn, last, (next - last)); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
118 toReturn[next - last] = '\0'; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
119 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
120 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
121 return toReturn; |
2086 | 122 } |
123 | |
4617 | 124 /** |
125 * Calculate the checksum of a given icon. | |
126 */ | |
13606 | 127 guint16 |
128 aimutil_iconsum(const guint8 *buf, int buflen) | |
4617 | 129 { |
13234 | 130 guint32 sum; |
4617 | 131 int i; |
132 | |
133 for (i=0, sum=0; i+1<buflen; i+=2) | |
134 sum += (buf[i+1] << 8) + buf[i]; | |
135 if (i < buflen) | |
136 sum += buf[i]; | |
137 sum = ((sum & 0xffff0000) >> 16) + (sum & 0x0000ffff); | |
138 | |
139 return sum; | |
140 } | |
141 | |
8092 | 142 /** |
8972 | 143 * Check if the given screen name is a valid AIM screen name. |
144 * Example: BobDole | |
9681 | 145 * Example: Henry_Ford@mac.com |
8972 | 146 * |
13606 | 147 * @return TRUE if the screen name is valid, FALSE if not. |
8972 | 148 */ |
13606 | 149 static gboolean |
150 aim_snvalid_aim(const char *sn) | |
8972 | 151 { |
152 int i; | |
153 | |
154 for (i = 0; sn[i] != '\0'; i++) { | |
9681 | 155 if (!isalnum(sn[i]) && (sn[i] != ' ') && |
156 (sn[i] != '@') && (sn[i] != '.') && | |
157 (sn[i] != '_') && (sn[i] != '-')) | |
13606 | 158 return FALSE; |
8972 | 159 } |
160 | |
13606 | 161 return TRUE; |
8972 | 162 } |
163 | |
164 /** | |
165 * Check if the given screen name is a valid ICQ screen name. | |
166 * Example: 1234567 | |
167 * | |
13606 | 168 * @return TRUE if the screen name is valid, FALSE if not. |
8972 | 169 */ |
13606 | 170 static gboolean |
171 aim_snvalid_icq(const char *sn) | |
8972 | 172 { |
173 int i; | |
174 | |
175 for (i = 0; sn[i] != '\0'; i++) { | |
176 if (!isdigit(sn[i])) | |
177 return 0; | |
178 } | |
179 | |
180 return 1; | |
181 } | |
182 | |
183 /** | |
184 * Check if the given screen name is a valid SMS screen name. | |
185 * Example: +19195551234 | |
186 * | |
13606 | 187 * @return TRUE if the screen name is valid, FALSE if not. |
8972 | 188 */ |
13606 | 189 static gboolean |
190 aim_snvalid_sms(const char *sn) | |
8972 | 191 { |
192 int i; | |
193 | |
194 if (sn[0] != '+') | |
195 return 0; | |
196 | |
197 for (i = 1; sn[i] != '\0'; i++) { | |
198 if (!isdigit(sn[i])) | |
199 return 0; | |
200 } | |
201 | |
202 return 1; | |
203 } | |
204 | |
205 /** | |
206 * Check if the given screen name is a valid oscar screen name. | |
8092 | 207 * |
13606 | 208 * @return TRUE if the screen name is valid, FALSE if not. |
8092 | 209 */ |
13606 | 210 gboolean |
211 aim_snvalid(const char *sn) | |
8092 | 212 { |
8972 | 213 if ((sn == NULL) || (*sn == '\0')) |
8092 | 214 return 0; |
215 | |
8972 | 216 if (isalpha(sn[0])) |
217 return aim_snvalid_aim(sn); | |
218 else if (isdigit(sn[0])) | |
219 return aim_snvalid_icq(sn); | |
220 else if (sn[0] == '+') | |
221 return aim_snvalid_sms(sn); | |
8092 | 222 |
8972 | 223 return 0; |
8092 | 224 } |
225 | |
9975 | 226 /** |
13606 | 227 * Determine if a given screen name is an ICQ screen name |
9975 | 228 * (i.e. it begins with a number). |
229 * | |
230 * @sn A valid AIM or ICQ screen name. | |
13606 | 231 * @return TRUE if the screen name is an ICQ screen name. Otherwise |
232 * FALSE is returned. | |
9975 | 233 */ |
13606 | 234 gboolean |
235 aim_sn_is_icq(const char *sn) | |
9975 | 236 { |
237 if (isalpha(sn[0])) | |
13606 | 238 return FALSE; |
239 return TRUE; | |
9975 | 240 } |
241 | |
13168
bdb8d7beb5a7
[gaim-migrate @ 15531]
Evan Schoenberg <evan.s@dreskin.net>
parents:
11253
diff
changeset
|
242 /** |
bdb8d7beb5a7
[gaim-migrate @ 15531]
Evan Schoenberg <evan.s@dreskin.net>
parents:
11253
diff
changeset
|
243 * Determine if a given screen name is an SMS number |
bdb8d7beb5a7
[gaim-migrate @ 15531]
Evan Schoenberg <evan.s@dreskin.net>
parents:
11253
diff
changeset
|
244 * (i.e. it begins with a +). |
bdb8d7beb5a7
[gaim-migrate @ 15531]
Evan Schoenberg <evan.s@dreskin.net>
parents:
11253
diff
changeset
|
245 * |
bdb8d7beb5a7
[gaim-migrate @ 15531]
Evan Schoenberg <evan.s@dreskin.net>
parents:
11253
diff
changeset
|
246 * @sn A valid AIM or ICQ screen name. |
13606 | 247 * @return TRUE if the screen name is an SMS number. Otherwise |
248 * FALSE is returned. | |
13168
bdb8d7beb5a7
[gaim-migrate @ 15531]
Evan Schoenberg <evan.s@dreskin.net>
parents:
11253
diff
changeset
|
249 */ |
13606 | 250 gboolean |
251 aim_sn_is_sms(const char *sn) | |
13168
bdb8d7beb5a7
[gaim-migrate @ 15531]
Evan Schoenberg <evan.s@dreskin.net>
parents:
11253
diff
changeset
|
252 { |
bdb8d7beb5a7
[gaim-migrate @ 15531]
Evan Schoenberg <evan.s@dreskin.net>
parents:
11253
diff
changeset
|
253 if (sn[0] != '+') |
13606 | 254 return FALSE; |
255 return TRUE; | |
13168
bdb8d7beb5a7
[gaim-migrate @ 15531]
Evan Schoenberg <evan.s@dreskin.net>
parents:
11253
diff
changeset
|
256 } |
bdb8d7beb5a7
[gaim-migrate @ 15531]
Evan Schoenberg <evan.s@dreskin.net>
parents:
11253
diff
changeset
|
257 |
13606 | 258 /** |
259 * This takes a screen name and returns its length without | |
260 * spaces. If there are no spaces in the SN, then the | |
261 * return is equal to that of strlen(). | |
262 */ | |
263 int | |
264 aim_snlen(const char *sn) | |
2086 | 265 { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
266 int i = 0; |
2086 | 267 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
268 if (!sn) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
269 return 0; |
2086 | 270 |
5556 | 271 while (*sn != '\0') { |
272 if (*sn != ' ') | |
273 i++; | |
274 sn++; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
275 } |
2086 | 276 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
277 return i; |
2086 | 278 } |
279 | |
13606 | 280 /** |
281 * This takes two screen names and compares them using the rules | |
282 * on screen names for AIM/AOL. Mainly, this means case and space | |
283 * insensitivity (all case differences and spacing differences are | |
284 * ignored, with the exception that screen names can not start with | |
285 * a space). | |
286 * | |
287 * Return: 0 if equal | |
288 * non-0 if different | |
289 */ | |
290 int | |
291 aim_sncmp(const char *sn1, const char *sn2) | |
2086 | 292 { |
293 | |
10116 | 294 if ((sn1 == NULL) || (sn2 == NULL)) |
295 return -1; | |
296 | |
5928 | 297 do { |
5556 | 298 while (*sn2 == ' ') |
5724 | 299 sn2++; |
5556 | 300 while (*sn1 == ' ') |
5724 | 301 sn1++; |
5928 | 302 if (toupper(*sn1) != toupper(*sn2)) |
303 return 1; | |
304 } while ((*sn1 != '\0') && sn1++ && sn2++); | |
2086 | 305 |
5928 | 306 return 0; |
2086 | 307 } |