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)) {