* efreet: Fix previously broken efreet cache.
authorcedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Wed, 25 Feb 2009 16:46:51 +0000 (16:46 +0000)
committercedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Wed, 25 Feb 2009 16:46:51 +0000 (16:46 +0000)
git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/efreet@39211 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/bin/ef_desktop.c
src/bin/main.c
src/lib/efreet_desktop.c
src/lib/efreet_icon.c
src/lib/efreet_utils.c

index 7713cce..4712f33 100644 (file)
@@ -142,8 +142,8 @@ ef_cb_desktop_save(void)
     desktop->generic_name = strdup("Test Application");
     desktop->exec = strdup("efreet_test");
     desktop->categories = NULL;
-    desktop->categories = eina_list_append(desktop->categories, strdup("Test"));
-    desktop->categories = eina_list_append(desktop->categories, strdup("Enlightenment"));
+    desktop->categories = eina_list_append(desktop->categories, eina_stringshare_add("Test"));
+    desktop->categories = eina_list_append(desktop->categories, eina_stringshare_add("Enlightenment"));
     printf("save test: %d\n", efreet_desktop_save(desktop));
     unlink("/tmp/test.desktop");
     efreet_desktop_free(desktop);
@@ -198,8 +198,7 @@ ef_cb_desktop_command_get(void)
     expected = eina_list_append(expected, "app '/relative_uri'");
 
     efreet_desktop_command_get(desktop, files, _cb_command, info);
-    while (expected)
-           expected = eina_list_remove_list(expected, expected);
+    expected = eina_list_free(expected);
 
     /* test single uri */
     info->type = 'u';
@@ -211,8 +210,7 @@ ef_cb_desktop_command_get(void)
     expected = eina_list_append(expected, "app 'file:///relative_uri'");
 
     efreet_desktop_command_get(desktop, files, _cb_command, info);
-    while (expected)
-           expected = eina_list_remove_list(expected, expected);
+    expected = eina_list_free(expected);
 
     /* test single dir */
     info->type = 'd';
@@ -224,8 +222,7 @@ ef_cb_desktop_command_get(void)
     expected = eina_list_append(expected, "app '/'");
 
     efreet_desktop_command_get(desktop, files, _cb_command, info);
-    while (expected)
-           expected = eina_list_remove_list(expected, expected);
+    expected = eina_list_free(expected);
 
 
     /* test single names */
@@ -238,8 +235,7 @@ ef_cb_desktop_command_get(void)
     expected = eina_list_append(expected, "app 'relative_uri'");
 
     efreet_desktop_command_get(desktop, files, _cb_command, info);
-    while (expected)
-           expected = eina_list_remove_list(expected, expected);
+    expected = eina_list_free(expected);
 
     /* test multiple fullpaths */
     info->type = 'F';
@@ -248,8 +244,7 @@ ef_cb_desktop_command_get(void)
     expected = eina_list_append(expected, "app '/tmp/absolute_path' '/relative_path' '/tmp/absolute_uri' '/relative_uri'");
 
     efreet_desktop_command_get(desktop, files, _cb_command, info);
-    while (expected)
-           expected = eina_list_remove_list(expected, expected);
+    expected = eina_list_free(expected);
 
     /* test multiple URIs */
     info->type = 'U';
@@ -258,8 +253,7 @@ ef_cb_desktop_command_get(void)
     expected = eina_list_append(expected, "app 'file:///tmp/absolute_path' 'file:///relative_path' 'file:///tmp/absolute_uri' 'file:///relative_uri'");
 
     efreet_desktop_command_get(desktop, files, _cb_command, info);
-    while (expected)
-           expected = eina_list_remove_list(expected, expected);
+    expected = eina_list_free(expected);
 
     /* test multiple dirs */
     info->type = 'D';
@@ -268,8 +262,7 @@ ef_cb_desktop_command_get(void)
     expected = eina_list_append(expected, "app '/tmp' '/' '/tmp' '/'");
 
     efreet_desktop_command_get(desktop, files, _cb_command, info);
-    while (expected)
-           expected = eina_list_remove_list(expected, expected);
+    expected = eina_list_free(expected);
 
     /* test multiple names */
     info->type = 'N';
@@ -278,8 +271,7 @@ ef_cb_desktop_command_get(void)
     expected = eina_list_append(expected, "app 'absolute_path' 'relative_path' 'absolute_uri' 'relative_uri'");
 
     efreet_desktop_command_get(desktop, files, _cb_command, info);
-    while (expected)
-           expected = eina_list_remove_list(expected, expected);
+    expected = eina_list_free(expected);
 
     /* test icon appending */
     info->type = 'i';
@@ -288,8 +280,7 @@ ef_cb_desktop_command_get(void)
     expected = eina_list_append(expected, "app --icon 'icon.png'");
 
     efreet_desktop_command_get(desktop, NULL, _cb_command, info);
-    while (expected)
-           expected = eina_list_remove_list(expected, expected);
+    expected = eina_list_free(expected);
 
     /* test app name */
     info->type = 'c';
@@ -298,8 +289,7 @@ ef_cb_desktop_command_get(void)
     expected = eina_list_append(expected, "app 'App Name'");
 
     efreet_desktop_command_get(desktop, NULL, _cb_command, info);
-    while (expected)
-           expected = eina_list_remove_list(expected, expected);
+    expected = eina_list_free(expected);
 
     /* test desktop path */
     info->type = 'k';
@@ -308,15 +298,12 @@ ef_cb_desktop_command_get(void)
     expected = eina_list_append(expected, "app 'test.desktop'");
 
     efreet_desktop_command_get(desktop, NULL, _cb_command, info);
-    while (expected)
-           expected = eina_list_remove_list(expected, expected);
+    expected = eina_list_free(expected);
 
     /* clean up */
     efreet_desktop_free(desktop);
-    while (files)
-           files = eina_list_remove_list(files, expected);
-    while (expected)
-           expected = eina_list_remove_list(expected, expected);
+    files = eina_list_free(files);
+    expected = eina_list_free(expected);
 
     ret = info->error > 0 ? 0 : 1;
     free(info);
@@ -348,8 +335,6 @@ _cb_command(void *data, Efreet_Desktop *desktop __UNUSED__,
       info->error++;
     }
   }
-
-  free(exec);
   return NULL;
 }
 
index b515f8c..034436d 100644 (file)
@@ -115,6 +115,8 @@ main(int argc, char ** argv)
     Eina_List *run = NULL;
     double total;
 
+    eina_init();
+
     total = ecore_time_get();
     if (argc > 1)
     {
@@ -176,5 +178,7 @@ main(int argc, char ** argv)
         run = eina_list_remove_list(run, run);
 
     printf("Total run: %.3f seconds\n", ecore_time_get() - total);
+
+    eina_shutdown();
     return 0;
 }
index 5db998a..0c9b4ba 100644 (file)
@@ -488,6 +488,8 @@ efreet_desktop_save_as(Efreet_Desktop *desktop, const char *file)
 EAPI void
 efreet_desktop_free(Efreet_Desktop *desktop)
 {
+    char *str;
+
     if (!desktop) return;
 
     desktop->ref--;
@@ -512,16 +514,10 @@ efreet_desktop_free(Efreet_Desktop *desktop)
     IF_FREE_LIST(desktop->only_show_in);
     IF_FREE_LIST(desktop->not_show_in);
 
-    while (desktop->categories)
-    {
-        eina_stringshare_del(eina_list_data_get(desktop->categories));
-        desktop->categories = eina_list_remove_list(desktop->categories, desktop->categories);
-    }
-    while (desktop->mime_types)
-    {
-        eina_stringshare_del(eina_list_data_get(desktop->mime_types));
-        desktop->mime_types = eina_list_remove_list(desktop->mime_types, desktop->mime_types);
-    }
+    EINA_LIST_FREE(desktop->categories, str)
+        eina_stringshare_del(str);
+    EINA_LIST_FREE(desktop->mime_types, str)
+        eina_stringshare_del(str);
 
     IF_FREE_HASH(desktop->x);
 
@@ -1058,7 +1054,7 @@ efreet_desktop_x_fields_save(const Eina_Hash *hash, const void *key, void *value
 static int
 efreet_desktop_environment_check(Efreet_Ini *ini)
 {
-    Eina_List *list, *l;
+    Eina_List *list;
     int found = 0;
     char *val;
 
@@ -1207,12 +1203,8 @@ efreet_desktop_command_progress_get(Efreet_Desktop *desktop, Eina_List *files,
         Eina_List *execs;
         execs = efreet_desktop_command_build(command);
         ret = efreet_desktop_command_execs_process(command, execs);
-        while (execs)
-        {
-            exec = eina_list_data_get(execs);
-            free(exec);
-            execs = eina_list_remove_list(execs, execs);
-        }
+       EINA_LIST_FREE(execs, exec)
+         free(exec);
         efreet_desktop_command_free(command);
     }
 
index aead8b5..637821a 100644 (file)
@@ -74,11 +74,13 @@ static int efreet_icon_theme_cache_check_dir(Efreet_Icon_Theme *theme,
                                                         const char *dir);
 
 static int efreet_icon_cache_find(Efreet_Icon_Cache *value, const char *key);
-static void efreet_icon_cache_flush(Eina_List *list);
+static void efreet_icon_cache_flush(Efreet_Icon_Theme *theme, Eina_List *list);
 static void efreet_icon_cache_free(Efreet_Icon_Cache *value);
 static char *efreet_icon_cache_check(Efreet_Icon_Theme *theme, const char *icon, unsigned int size);
 static void efreet_icon_cache_add(Efreet_Icon_Theme *theme, const char *icon, unsigned int size, const char *value);
 
+static Efreet_Icon_Theme *fake_null = NULL;
+
 static void
 _efreet_icon_cache_list_destroy(Eina_List *list)
 {
@@ -262,17 +264,16 @@ efreet_icon_theme_list_get(void)
 EAPI Efreet_Icon_Theme *
 efreet_icon_theme_find(const char *theme_name)
 {
-    const char *key;
     Efreet_Icon_Theme *theme;
 
-    key = eina_stringshare_add(theme_name);
-    theme = eina_hash_find(efreet_icon_themes, key);
+    if (!theme_name) return fake_null;
+
+    theme = eina_hash_find(efreet_icon_themes, theme_name);
     if (!theme)
     {
         efreet_icon_theme_dir_scan_all(theme_name);
-        theme = eina_hash_find(efreet_icon_themes, key);
+        theme = eina_hash_find(efreet_icon_themes, theme_name);
     }
-    eina_stringshare_del(key);
 
     return theme;
 }
@@ -327,9 +328,17 @@ efreet_icon_find_theme_check(const char *theme_name)
     {
         theme = efreet_icon_theme_new();
         theme->fake = 1;
-        theme->name.internal = eina_stringshare_add(theme_name);
-        eina_hash_del(efreet_icon_themes, (void *)theme->name.internal, NULL);
-        eina_hash_add(efreet_icon_themes, (void *)theme->name.internal, theme);
+       if (theme_name)
+         {
+            theme->name.internal = eina_stringshare_add(theme_name);
+            eina_hash_del(efreet_icon_themes, (void *)theme->name.internal, NULL);
+            eina_hash_add(efreet_icon_themes, (void *)theme->name.internal, theme);
+         }
+       else
+         {
+            theme->name.internal = NULL;
+            fake_null = theme;
+         }
     }
 
     return theme;
@@ -409,12 +418,8 @@ efreet_icon_list_find(const char *theme_name, Eina_List *icons,
             tmps = eina_list_append(tmps, efreet_icon_remove_extension(icon));
 
         value = efreet_icon_list_find_helper(theme, tmps, size);
-        while (tmps)
-        {
-            data = eina_list_data_get(tmps);
+       EINA_LIST_FREE(tmps, data)
             free(data);
-            tmps = eina_list_remove_list(tmps, tmps);
-        }
     }
 #else
     value = efreet_icon_list_find_helper(theme, icons, size);
@@ -793,7 +798,7 @@ efreet_icon_fallback_icon(const char *icon_name)
     char *icon;
 
     if (!icon_name) return NULL;
-    icon = efreet_icon_cache_check(NULL, icon_name, 0);
+    icon = efreet_icon_cache_check(efreet_icon_find_theme_check(NULL), icon_name, 0);
     if (icon) return icon;
 
     icon = efreet_icon_fallback_dir_scan(efreet_icon_deprecated_user_dir_get(), icon_name);
@@ -810,7 +815,7 @@ efreet_icon_fallback_icon(const char *icon_name)
             icon = efreet_icon_fallback_dir_scan(dir, icon_name);
             if (icon)
             {
-                efreet_icon_cache_add(NULL, icon_name, 0, icon);
+              efreet_icon_cache_add(efreet_icon_find_theme_check(NULL), icon_name, 0, icon);
                 return icon;
             }
         }
@@ -823,7 +828,7 @@ efreet_icon_fallback_icon(const char *icon_name)
             icon = efreet_icon_fallback_dir_scan(path, icon_name);
             if (icon)
             {
-                efreet_icon_cache_add(NULL, icon_name, 0, icon);
+                efreet_icon_cache_add(efreet_icon_find_theme_check(NULL), icon_name, 0, icon);
                 return icon;
             }
         }
@@ -831,7 +836,7 @@ efreet_icon_fallback_icon(const char *icon_name)
         icon = efreet_icon_fallback_dir_scan("/usr/share/pixmaps", icon_name);
     }
 
-    efreet_icon_cache_add(NULL, icon_name, 0, icon);
+    efreet_icon_cache_add(efreet_icon_find_theme_check(NULL), icon_name, 0, icon);
     return icon;
 }
 
@@ -1201,7 +1206,7 @@ efreet_icon_theme_cache_check_dir(Efreet_Icon_Theme *theme, const char *dir)
     /* have we modified this directory since our last cache check? */
     if (stat(dir, &buf) || (buf.st_mtime > theme->last_cache_check))
     {
-        eina_hash_del(efreet_icon_cache, &theme, NULL);
+        eina_hash_del(efreet_icon_cache, theme, NULL);
         return 0;
     }
 
@@ -1412,7 +1417,7 @@ efreet_icon_theme_index_read(Efreet_Icon_Theme *theme, const char *path)
 static void
 efreet_icon_theme_dir_validity_check(void)
 {
-    Eina_List *keys, *l;
+    Eina_List *keys;
     const char *name;
     Eina_Iterator *it;
 
@@ -1421,7 +1426,7 @@ efreet_icon_theme_dir_validity_check(void)
     eina_iterator_foreach(it, EINA_EACH(_hash_keys), &keys);
     eina_iterator_free(it);
 
-    EINA_LIST_FOREACH(keys, l, name)
+    EINA_LIST_FREE(keys, name)
     {
         Efreet_Icon_Theme *theme;
 
@@ -1429,8 +1434,6 @@ efreet_icon_theme_dir_validity_check(void)
         if (theme && !theme->valid && !theme->fake)
             eina_hash_del(efreet_icon_themes, name, theme);
     }
-    while (keys)
-        keys = eina_list_remove_list(keys, keys);
 }
 
 /**
@@ -1525,7 +1528,7 @@ efreet_icon_cache_find(Efreet_Icon_Cache *value, const char *key)
 }
 
 static void
-efreet_icon_cache_flush(Eina_List *list)
+efreet_icon_cache_flush(Efreet_Icon_Theme *theme, Eina_List *list)
 {
     /* TODO:
      * * Dynamic cache size
@@ -1541,6 +1544,8 @@ efreet_icon_cache_flush(Eina_List *list)
         efreet_icon_cache_free(cache);
         list = eina_list_remove_list(list, last);
     }
+
+    eina_hash_modify(efreet_icon_cache, theme, list);
 }
 
 static void
@@ -1561,7 +1566,7 @@ efreet_icon_cache_check(Efreet_Icon_Theme *theme, const char *icon, unsigned int
     char key[4096];
     struct stat st;
 
-    list = eina_hash_find(efreet_icon_cache, &theme);
+    list = eina_hash_find(efreet_icon_cache, theme);
     if (!list) return NULL;
 
     snprintf(key, sizeof(key), "%s %d", icon, size);
@@ -1571,15 +1576,19 @@ efreet_icon_cache_check(Efreet_Icon_Theme *theme, const char *icon, unsigned int
         if (!cache->path)
         {
             list = eina_list_promote_list(list, eina_list_data_find_list(list, cache));
+           eina_hash_modify(efreet_icon_cache, theme, list);
             return NON_EXISTING;
         }
         else if (!stat(cache->path, &st) && st.st_mtime == cache->lasttime)
         {
             list = eina_list_promote_list(list, eina_list_data_find_list(list, cache));
+           eina_hash_modify(efreet_icon_cache, theme, list);
             return strdup(cache->path);
         }
         efreet_icon_cache_free(cache);
        list = eina_list_remove(list, cache);
+       if (list != NULL) eina_hash_modify(efreet_icon_cache, theme, list);
+       else eina_hash_del(efreet_icon_cache, theme, NULL);
     }
     return NULL;
 }
@@ -1592,7 +1601,7 @@ efreet_icon_cache_add(Efreet_Icon_Theme *theme, const char *icon, unsigned int s
     char key[4096];
     struct stat st;
 
-    list = eina_hash_find(efreet_icon_cache, &theme);
+    list = eina_hash_find(efreet_icon_cache, theme);
 
     snprintf(key, sizeof(key), "%s %d", icon, size);
     cache = NEW(Efreet_Icon_Cache, 1);
@@ -1608,8 +1617,8 @@ efreet_icon_cache_add(Efreet_Icon_Theme *theme, const char *icon, unsigned int s
     l = list;
     list = eina_list_prepend(list, cache);
 
-    if (!l) eina_hash_add(efreet_icon_cache, &theme, list);
-    else eina_hash_modify(efreet_icon_cache, &theme, list);
+    if (!l) eina_hash_add(efreet_icon_cache, theme, list);
+    else eina_hash_modify(efreet_icon_cache, theme, list);
 
-    efreet_icon_cache_flush(list);
+    efreet_icon_cache_flush(theme, list);
 }
index 92d33f1..b938455 100644 (file)
@@ -178,7 +178,7 @@ efreet_util_shutdown(void)
 static char *
 efreet_util_path_in_default(const char *section, const char *path)
 {
-    Eina_List *dirs, *l;
+    Eina_List *dirs;
     char *ret = NULL;
     char *dir;