Mercurial > pidgin
annotate src/protocols/oscar/util.c @ 13901:e40263ba9680
[gaim-migrate @ 16388]
When moving a buddy on AIM, remove the buddy from the server list
before adding it to the new group (it used to be the other way
around).
The downside of this is that, if you're moving an ICQ buddy who
requires authorization, you'll have to rerequest authorization.
The upside of this is that it actually works, and moving an ICQ
buddy won't inadvertently delete them from your list.
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Sat, 01 Jul 2006 18:39:13 +0000 |
parents | b198d0c26b83 |
children |
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 next = strchr(last, dl); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
102 |
6323 | 103 if (curCount < theindex) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
104 toReturn = malloc(sizeof(char)); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
105 *toReturn = '\0'; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
106 } else { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
107 if (next == NULL) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
108 toReturn = malloc((strlen(last) + 1) * sizeof(char)); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
109 strcpy(toReturn, last); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
110 } else { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
111 toReturn = malloc((next - last + 1) * sizeof(char)); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
112 memcpy(toReturn, last, (next - last)); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
113 toReturn[next - last] = '\0'; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
114 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
115 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
116 return toReturn; |
2086 | 117 } |
118 | |
4617 | 119 /** |
120 * Calculate the checksum of a given icon. | |
121 */ | |
13606 | 122 guint16 |
123 aimutil_iconsum(const guint8 *buf, int buflen) | |
4617 | 124 { |
13234 | 125 guint32 sum; |
4617 | 126 int i; |
127 | |
128 for (i=0, sum=0; i+1<buflen; i+=2) | |
129 sum += (buf[i+1] << 8) + buf[i]; | |
130 if (i < buflen) | |
131 sum += buf[i]; | |
132 sum = ((sum & 0xffff0000) >> 16) + (sum & 0x0000ffff); | |
133 | |
134 return sum; | |
135 } | |
136 | |
8092 | 137 /** |
8972 | 138 * Check if the given screen name is a valid AIM screen name. |
139 * Example: BobDole | |
9681 | 140 * Example: Henry_Ford@mac.com |
8972 | 141 * |
13606 | 142 * @return TRUE if the screen name is valid, FALSE if not. |
8972 | 143 */ |
13606 | 144 static gboolean |
145 aim_snvalid_aim(const char *sn) | |
8972 | 146 { |
147 int i; | |
148 | |
149 for (i = 0; sn[i] != '\0'; i++) { | |
9681 | 150 if (!isalnum(sn[i]) && (sn[i] != ' ') && |
151 (sn[i] != '@') && (sn[i] != '.') && | |
152 (sn[i] != '_') && (sn[i] != '-')) | |
13606 | 153 return FALSE; |
8972 | 154 } |
155 | |
13606 | 156 return TRUE; |
8972 | 157 } |
158 | |
159 /** | |
160 * Check if the given screen name is a valid ICQ screen name. | |
161 * Example: 1234567 | |
162 * | |
13606 | 163 * @return TRUE if the screen name is valid, FALSE if not. |
8972 | 164 */ |
13606 | 165 static gboolean |
166 aim_snvalid_icq(const char *sn) | |
8972 | 167 { |
168 int i; | |
169 | |
170 for (i = 0; sn[i] != '\0'; i++) { | |
171 if (!isdigit(sn[i])) | |
172 return 0; | |
173 } | |
174 | |
175 return 1; | |
176 } | |
177 | |
178 /** | |
179 * Check if the given screen name is a valid SMS screen name. | |
180 * Example: +19195551234 | |
181 * | |
13606 | 182 * @return TRUE if the screen name is valid, FALSE if not. |
8972 | 183 */ |
13606 | 184 static gboolean |
185 aim_snvalid_sms(const char *sn) | |
8972 | 186 { |
187 int i; | |
188 | |
189 if (sn[0] != '+') | |
190 return 0; | |
191 | |
192 for (i = 1; sn[i] != '\0'; i++) { | |
193 if (!isdigit(sn[i])) | |
194 return 0; | |
195 } | |
196 | |
197 return 1; | |
198 } | |
199 | |
200 /** | |
201 * Check if the given screen name is a valid oscar screen name. | |
8092 | 202 * |
13606 | 203 * @return TRUE if the screen name is valid, FALSE if not. |
8092 | 204 */ |
13606 | 205 gboolean |
206 aim_snvalid(const char *sn) | |
8092 | 207 { |
8972 | 208 if ((sn == NULL) || (*sn == '\0')) |
8092 | 209 return 0; |
210 | |
8972 | 211 if (isalpha(sn[0])) |
212 return aim_snvalid_aim(sn); | |
213 else if (isdigit(sn[0])) | |
214 return aim_snvalid_icq(sn); | |
215 else if (sn[0] == '+') | |
216 return aim_snvalid_sms(sn); | |
8092 | 217 |
8972 | 218 return 0; |
8092 | 219 } |
220 | |
9975 | 221 /** |
13606 | 222 * Determine if a given screen name is an ICQ screen name |
9975 | 223 * (i.e. it begins with a number). |
224 * | |
225 * @sn A valid AIM or ICQ screen name. | |
13606 | 226 * @return TRUE if the screen name is an ICQ screen name. Otherwise |
227 * FALSE is returned. | |
9975 | 228 */ |
13606 | 229 gboolean |
230 aim_sn_is_icq(const char *sn) | |
9975 | 231 { |
232 if (isalpha(sn[0])) | |
13606 | 233 return FALSE; |
234 return TRUE; | |
9975 | 235 } |
236 | |
13168
bdb8d7beb5a7
[gaim-migrate @ 15531]
Evan Schoenberg <evan.s@dreskin.net>
parents:
11253
diff
changeset
|
237 /** |
bdb8d7beb5a7
[gaim-migrate @ 15531]
Evan Schoenberg <evan.s@dreskin.net>
parents:
11253
diff
changeset
|
238 * Determine if a given screen name is an SMS number |
bdb8d7beb5a7
[gaim-migrate @ 15531]
Evan Schoenberg <evan.s@dreskin.net>
parents:
11253
diff
changeset
|
239 * (i.e. it begins with a +). |
bdb8d7beb5a7
[gaim-migrate @ 15531]
Evan Schoenberg <evan.s@dreskin.net>
parents:
11253
diff
changeset
|
240 * |
bdb8d7beb5a7
[gaim-migrate @ 15531]
Evan Schoenberg <evan.s@dreskin.net>
parents:
11253
diff
changeset
|
241 * @sn A valid AIM or ICQ screen name. |
13606 | 242 * @return TRUE if the screen name is an SMS number. Otherwise |
243 * FALSE is returned. | |
13168
bdb8d7beb5a7
[gaim-migrate @ 15531]
Evan Schoenberg <evan.s@dreskin.net>
parents:
11253
diff
changeset
|
244 */ |
13606 | 245 gboolean |
246 aim_sn_is_sms(const char *sn) | |
13168
bdb8d7beb5a7
[gaim-migrate @ 15531]
Evan Schoenberg <evan.s@dreskin.net>
parents:
11253
diff
changeset
|
247 { |
bdb8d7beb5a7
[gaim-migrate @ 15531]
Evan Schoenberg <evan.s@dreskin.net>
parents:
11253
diff
changeset
|
248 if (sn[0] != '+') |
13606 | 249 return FALSE; |
250 return TRUE; | |
13168
bdb8d7beb5a7
[gaim-migrate @ 15531]
Evan Schoenberg <evan.s@dreskin.net>
parents:
11253
diff
changeset
|
251 } |
bdb8d7beb5a7
[gaim-migrate @ 15531]
Evan Schoenberg <evan.s@dreskin.net>
parents:
11253
diff
changeset
|
252 |
13606 | 253 /** |
254 * This takes a screen name and returns its length without | |
255 * spaces. If there are no spaces in the SN, then the | |
256 * return is equal to that of strlen(). | |
257 */ | |
258 int | |
259 aim_snlen(const char *sn) | |
2086 | 260 { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
261 int i = 0; |
2086 | 262 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
263 if (!sn) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
264 return 0; |
2086 | 265 |
5556 | 266 while (*sn != '\0') { |
267 if (*sn != ' ') | |
268 i++; | |
269 sn++; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
270 } |
2086 | 271 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
272 return i; |
2086 | 273 } |
274 | |
13606 | 275 /** |
276 * This takes two screen names and compares them using the rules | |
277 * on screen names for AIM/AOL. Mainly, this means case and space | |
278 * insensitivity (all case differences and spacing differences are | |
279 * ignored, with the exception that screen names can not start with | |
280 * a space). | |
281 * | |
282 * Return: 0 if equal | |
283 * non-0 if different | |
284 */ | |
285 int | |
286 aim_sncmp(const char *sn1, const char *sn2) | |
2086 | 287 { |
288 | |
10116 | 289 if ((sn1 == NULL) || (sn2 == NULL)) |
290 return -1; | |
291 | |
5928 | 292 do { |
5556 | 293 while (*sn2 == ' ') |
5724 | 294 sn2++; |
5556 | 295 while (*sn1 == ' ') |
5724 | 296 sn1++; |
5928 | 297 if (toupper(*sn1) != toupper(*sn2)) |
298 return 1; | |
299 } while ((*sn1 != '\0') && sn1++ && sn2++); | |
2086 | 300 |
5928 | 301 return 0; |
2086 | 302 } |