3 /* local subsystem functions */
4 static void _e_path_free(E_Path *ep);
5 static void _e_path_cache_free(E_Path *ep);
6 static Eina_Bool _e_path_cache_free_cb(const Eina_Hash *hash, const void *key, void *data, void *fdata);
8 /* externally accessible functions */
14 ep = E_OBJECT_ALLOC(E_Path, E_PATH_TYPE, _e_path_free);
19 e_path_default_path_append(E_Path *ep, const char *path)
22 E_OBJECT_TYPE_CHECK(ep, E_PATH_TYPE);
31 home_dir = e_user_homedir_get();
32 len1 = strlen(home_dir);
34 new_path = malloc(len1 + len2 + 1);
35 if (!new_path) return;
36 epd = malloc(sizeof(E_Path_Dir));
43 strcpy(new_path, home_dir);
44 strcat(new_path, path + 1);
45 epd->dir = eina_stringshare_add(new_path);
47 ep->default_dir_list = eina_list_append(ep->default_dir_list, epd);
52 epd = malloc(sizeof(E_Path_Dir));
55 epd->dir = eina_stringshare_add(path);
56 ep->default_dir_list = eina_list_append(ep->default_dir_list, epd);
58 _e_path_cache_free(ep);
62 e_path_user_path_set(E_Path *ep, Eina_List **user_dir_list)
65 E_OBJECT_TYPE_CHECK(ep, E_PATH_TYPE);
67 ep->user_dir_list = user_dir_list;
68 _e_path_cache_free(ep);
72 e_path_user_path_append(E_Path *ep, const char *path)
75 E_OBJECT_TYPE_CHECK(ep, E_PATH_TYPE);
84 home_dir = e_user_homedir_get();
85 len1 = strlen(home_dir);
87 new_path = malloc(len1 + len2 + 1);
88 if (!new_path) return;
89 epd = malloc(sizeof(E_Path_Dir));
96 strcpy(new_path, home_dir);
97 strcat(new_path, path + 1);
98 epd->dir = eina_stringshare_add(new_path);
100 *(ep->user_dir_list) = eina_list_append(*(ep->user_dir_list), epd);
105 epd = malloc(sizeof(E_Path_Dir));
108 epd->dir = eina_stringshare_add(path);
109 *(ep->user_dir_list) = eina_list_append(*(ep->user_dir_list), epd);
111 _e_path_cache_free(ep);
115 e_path_user_path_prepend(E_Path *ep, const char *path)
118 E_OBJECT_TYPE_CHECK(ep, E_PATH_TYPE);
124 const char *home_dir;
127 home_dir = e_user_homedir_get();
128 len1 = strlen(home_dir);
130 new_path = malloc(len1 + len2 + 1);
131 if (!new_path) return;
132 epd = malloc(sizeof(E_Path_Dir));
139 strcpy(new_path, home_dir);
140 strcat(new_path, path + 1);
141 epd->dir = eina_stringshare_add(new_path);
143 *(ep->user_dir_list) = eina_list_prepend(*(ep->user_dir_list), epd);
148 epd = malloc(sizeof(E_Path_Dir));
151 epd->dir = eina_stringshare_add(path);
152 *(ep->user_dir_list) = eina_list_prepend(*(ep->user_dir_list), epd);
154 _e_path_cache_free(ep);
158 e_path_user_path_remove(E_Path *ep, const char *path)
164 E_OBJECT_TYPE_CHECK(ep, E_PATH_TYPE);
169 const char *home_dir;
172 home_dir = e_user_homedir_get();
173 len1 = strlen(home_dir);
175 new_path = malloc(len1 + len2 + 1);
176 if (!new_path) return;
177 strcpy(new_path, home_dir);
178 strcat(new_path, path + 1);
179 EINA_LIST_FOREACH(*(ep->user_dir_list), l, epd)
183 if (!strcmp(epd->dir, new_path))
185 *(ep->user_dir_list) = eina_list_remove_list(
186 *(ep->user_dir_list), l);
187 eina_stringshare_del(epd->dir);
190 _e_path_cache_free(ep);
199 EINA_LIST_FOREACH(*(ep->user_dir_list), l, epd)
203 if (!strcmp(epd->dir, path))
205 *(ep->user_dir_list) = eina_list_remove_list(
206 *(ep->user_dir_list), l);
207 eina_stringshare_del(epd->dir);
209 _e_path_cache_free(ep);
218 e_path_user_path_clear(E_Path *ep)
221 EINA_LIST_FREE(*(ep->user_dir_list), epd)
223 eina_stringshare_del(epd->dir);
226 _e_path_cache_free(ep);
230 e_path_find(E_Path *ep, const char *file)
235 char buf[PATH_MAX] = "";
237 E_OBJECT_CHECK_RETURN(ep, NULL);
238 E_OBJECT_TYPE_CHECK_RETURN(ep, E_PATH_TYPE, NULL);
240 if (!file) return NULL;
241 str = eina_hash_find(ep->hash, file);
242 if (str) return eina_stringshare_add(str);
243 /* Look in the default dir list */
244 EINA_LIST_FOREACH(ep->default_dir_list, l, epd)
248 snprintf(buf, sizeof(buf), "%s/%s", epd->dir, file);
249 if (ecore_file_exists(buf))
252 ep->hash = eina_hash_string_superfast_new(NULL);
253 if (eina_hash_population(ep->hash) >= 512)
254 _e_path_cache_free(ep);
255 eina_hash_add(ep->hash, file,
256 eina_stringshare_add(buf));
257 return eina_stringshare_add(buf);
261 /* Look in the users dir list */
262 EINA_LIST_FOREACH(*(ep->user_dir_list), l, epd)
266 snprintf(buf, sizeof(buf), "%s/%s", epd->dir, file);
267 if (ecore_file_exists(buf))
270 ep->hash = eina_hash_string_superfast_new(NULL);
271 if (eina_hash_population(ep->hash) >= 512)
272 _e_path_cache_free(ep);
273 eina_hash_add(ep->hash, file,
274 eina_stringshare_add(buf));
275 return eina_stringshare_add(buf);
283 e_path_evas_append(E_Path *ep, Evas *evas)
289 E_OBJECT_TYPE_CHECK(ep, E_PATH_TYPE);
292 dir_list = e_path_dir_list_get(ep);
294 EINA_LIST_FREE(dir_list, epd)
296 if (epd->dir) evas_font_path_append(evas, epd->dir);
297 eina_stringshare_del(epd->dir);
302 /* combine default_list and and user_list in and easy to use list */
304 e_path_dir_list_get(E_Path *ep)
313 if (ep->user_dir_list)
315 EINA_LIST_FOREACH(*(ep->user_dir_list), l, epd)
317 new_epd = malloc(sizeof(E_Path_Dir));
318 new_epd->dir = eina_stringshare_add(epd->dir);
319 dir_list = eina_list_append(dir_list, new_epd);
323 EINA_LIST_FOREACH(ep->default_dir_list, l, epd)
325 new_epd = malloc(sizeof(E_Path_Dir));
326 new_epd->dir = eina_stringshare_add(epd->dir);
327 dir_list = eina_list_append(dir_list, new_epd);
334 e_path_dir_list_free(Eina_List *dir_list)
338 EINA_LIST_FREE(dir_list, epd)
340 eina_stringshare_del(epd->dir);
345 /* local subsystem functions */
347 _e_path_free(E_Path *ep)
351 _e_path_cache_free(ep);
352 EINA_LIST_FREE(ep->default_dir_list, epd)
354 eina_stringshare_del(epd->dir);
361 _e_path_cache_free(E_Path *ep)
363 if (!ep->hash) return;
364 eina_hash_foreach(ep->hash, _e_path_cache_free_cb, NULL);
365 eina_hash_free(ep->hash);
370 _e_path_cache_free_cb(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata __UNUSED__)
372 eina_stringshare_del(data);