Mercurial > pidgin
annotate src/protocols/oscar/util.c @ 13794:ecfd8fb02c19
[gaim-migrate @ 16206]
We don't really need to pop up an error if the sound file doesn't exist
committer: Tailor Script <tailor@pidgin.im>
| author | Sean Egan <seanegan@gmail.com> |
|---|---|
| date | Tue, 30 May 2006 17:02:27 +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 } |
