Mercurial > pidgin-twitter
comparison icon.c @ 308:bc7d8baf79dd
more robust image type detection.
author | Yoshiki Yazawa <yaz@honeyplanet.jp> |
---|---|
date | Thu, 02 Jul 2009 05:15:43 +0900 |
parents | 42cdddf0f747 |
children | e922ad73c07e |
comparison
equal
deleted
inserted
replaced
307:554c8c956a8a | 308:bc7d8baf79dd |
---|---|
1 #include "pidgin-twitter.h" | 1 #include "pidgin-twitter.h" |
2 #include "purple_internal.h" | 2 #include "purple_internal.h" |
3 | 3 |
4 extern GHashTable *icon_hash[]; | 4 extern GHashTable *icon_hash[]; |
5 extern GRegex *regp[]; | 5 extern GRegex *regp[]; |
6 | |
7 static gchar *ext_list[] = { | |
8 "png", | |
9 "gif", | |
10 "jpg", | |
11 "bmp", | |
12 NULL | |
13 }; | |
6 | 14 |
7 /* prototypes */ | 15 /* prototypes */ |
8 static void insert_icon_at_mark(GtkTextMark *requested_mark, gpointer user_data); | 16 static void insert_icon_at_mark(GtkTextMark *requested_mark, gpointer user_data); |
9 static void insert_requested_icon(const gchar *user_name, gint service); | 17 static void insert_requested_icon(const gchar *user_name, gint service); |
10 static void got_icon_cb(PurpleUtilFetchUrlData *url_data, gpointer user_data, const gchar *url_text, gsize len, const gchar *error_message); | 18 static void got_icon_cb(PurpleUtilFetchUrlData *url_data, gpointer user_data, const gchar *url_text, gsize len, const gchar *error_message); |
243 | 251 |
244 /* separate url into basename and the rest */ | 252 /* separate url into basename and the rest */ |
245 gchar *slash = strrchr(url, '/'); | 253 gchar *slash = strrchr(url, '/'); |
246 *slash = '\0'; | 254 *slash = '\0'; |
247 | 255 |
248 gchar *lower = g_ascii_strdown(slash+1, -1); | |
249 | |
250 if(strstr(lower, ".png")) | |
251 data->img_type = "png"; | |
252 else if(strstr(lower, ".gif")) | |
253 data->img_type = "gif"; | |
254 else if(strstr(lower, ".jpg") || strstr(lower, ".jpeg")) | |
255 data->img_type = "jpg"; | |
256 | |
257 g_free(lower); | |
258 | |
259 gchar *tmp; | 256 gchar *tmp; |
260 /* url encode basename. twitter needs this. */ | 257 /* url encode basename. twitter needs this. */ |
261 if(service == twitter_service) | 258 if(service == twitter_service) |
262 tmp = g_strdup_printf("%s/%s", url, | 259 tmp = g_strdup_printf("%s/%s", url, |
263 purple_url_encode(slash+1)); | 260 purple_url_encode(slash+1)); |
338 gdk_pixbuf_unref(src); | 335 gdk_pixbuf_unref(src); |
339 | 336 |
340 return dest; | 337 return dest; |
341 } | 338 } |
342 | 339 |
343 static gchar *ext_list[] = { | |
344 "png", | |
345 "gif", | |
346 "jpg", | |
347 NULL | |
348 }; | |
349 | |
350 /* this function will be called when requested icon has been retrieved */ | 340 /* this function will be called when requested icon has been retrieved */ |
351 static void | 341 static void |
352 got_icon_cb(PurpleUtilFetchUrlData *url_data, gpointer user_data, | 342 got_icon_cb(PurpleUtilFetchUrlData *url_data, gpointer user_data, |
353 const gchar *url_text, gsize len, const gchar *error_message) | 343 const gchar *url_text, gsize len, const gchar *error_message) |
354 { | 344 { |
450 if(hash) | 440 if(hash) |
451 g_hash_table_insert(hash, g_strdup(user_name), data); | 441 g_hash_table_insert(hash, g_strdup(user_name), data); |
452 | 442 |
453 /* find out extension */ | 443 /* find out extension */ |
454 gchar *slash = strrchr(url_data->url, '/'); | 444 gchar *slash = strrchr(url_data->url, '/'); |
455 gchar *lower = g_ascii_strdown(slash+1, -1); | 445 gchar *lower = g_ascii_strdown(purple_url_decode(slash+1), -1); |
456 | 446 |
457 if(strstr(lower, ".png")) | 447 gchar **extp; |
458 data->img_type = "png"; | 448 gchar *dot; |
459 else if(strstr(lower, ".gif")) | 449 data->img_type = NULL; |
460 data->img_type = "gif"; | 450 |
461 else if(strstr(lower, ".jpg") || strstr(lower, ".jpeg")) | 451 dot = strrchr(lower, '.'); |
462 data->img_type = "jpg"; | 452 if(dot) { |
463 | 453 for(extp = ext_list; *extp; extp++) { |
454 if(!strcmp(dot+1, *extp)) { | |
455 data->img_type = *extp; | |
456 break; | |
457 } | |
458 } | |
459 if(!data->img_type && !strcmp(dot+1, "jpeg")) | |
460 data->img_type = ext_list[2]; /* jpg */ | |
461 } | |
464 g_free(lower); | 462 g_free(lower); |
463 | |
464 /* return if no suitable image found */ | |
465 if(!data->img_type) { | |
466 g_free(gotdata->user_name); | |
467 g_free(gotdata); | |
468 return; | |
469 } | |
465 | 470 |
466 dirname = purple_prefs_get_string(OPT_ICON_DIR); | 471 dirname = purple_prefs_get_string(OPT_ICON_DIR); |
467 | 472 |
468 /* store retrieved image to a file in icon dir */ | 473 /* store retrieved image to a file in icon dir */ |
469 if(ensure_path_exists(dirname)) { | 474 if(ensure_path_exists(dirname)) { |