51static int need_reread = TRUE;
52static time_t last_stat_time = 0;
64static int n_caches = 0;
102xdg_dir_time_list_add (
char *file_name,
107 for (list = dir_time_list; list; list = list->
next)
120 list->
next = dir_time_list;
121 dir_time_list = list;
139xdg_mime_init_from_directory (
const char *directory)
144 assert (directory != NULL);
146 file_name = malloc (strlen (directory) + strlen (
"/mime/mime.cache") + 1);
147 strcpy (file_name, directory); strcat (file_name,
"/mime/mime.cache");
148 if (stat (file_name, &st) == 0)
154 xdg_dir_time_list_add (file_name, st.st_mtime);
166 file_name = malloc (strlen (directory) + strlen (
"/mime/globs2") + 1);
167 strcpy (file_name, directory); strcat (file_name,
"/mime/globs2");
168 if (stat (file_name, &st) == 0)
171 xdg_dir_time_list_add (file_name, st.st_mtime);
176 file_name = malloc (strlen (directory) + strlen (
"/mime/globs") + 1);
177 strcpy (file_name, directory); strcat (file_name,
"/mime/globs");
178 if (stat (file_name, &st) == 0)
181 xdg_dir_time_list_add (file_name, st.st_mtime);
189 file_name = malloc (strlen (directory) + strlen (
"/mime/magic") + 1);
190 strcpy (file_name, directory); strcat (file_name,
"/mime/magic");
191 if (stat (file_name, &st) == 0)
194 xdg_dir_time_list_add (file_name, st.st_mtime);
201 file_name = malloc (strlen (directory) + strlen (
"/mime/aliases") + 1);
202 strcpy (file_name, directory); strcat (file_name,
"/mime/aliases");
206 file_name = malloc (strlen (directory) + strlen (
"/mime/subclasses") + 1);
207 strcpy (file_name, directory); strcat (file_name,
"/mime/subclasses");
211 file_name = malloc (strlen (directory) + strlen (
"/mime/icons") + 1);
212 strcpy (file_name, directory); strcat (file_name,
"/mime/icons");
216 file_name = malloc (strlen (directory) + strlen (
"/mime/generic-icons") + 1);
217 strcpy (file_name, directory); strcat (file_name,
"/mime/generic-icons");
229 const char *xdg_data_home;
230 const char *xdg_data_dirs;
233 xdg_data_home = getenv (
"XDG_DATA_HOME");
236 if ((func) (xdg_data_home, user_data))
243 home = getenv (
"HOME");
246 char *guessed_xdg_home;
249 guessed_xdg_home = malloc (strlen (home) + strlen (
"/.local/share/") + 1);
250 strcpy (guessed_xdg_home, home);
251 strcat (guessed_xdg_home,
"/.local/share/");
252 stop_processing = (func) (guessed_xdg_home, user_data);
253 free (guessed_xdg_home);
260 xdg_data_dirs = getenv (
"XDG_DATA_DIRS");
261 if (xdg_data_dirs == NULL)
262 xdg_data_dirs =
"/usr/local/share/:/usr/share/";
266 while (*ptr !=
'\000')
274 while (*end_ptr !=
':' && *end_ptr !=
'\000')
286 len = end_ptr - ptr + 1;
287 dir = malloc (len + 1);
288 strncpy (dir, ptr, len);
290 stop_processing = (func) (dir, user_data);
307xdg_check_file (
const char *file_path,
313 if (stat (file_path, &st) == 0)
320 for (list = dir_time_list; list; list = list->
next)
324 if (st.st_mtime == list->
mtime)
342xdg_check_dir (
const char *directory,
343 int *invalid_dir_list)
348 assert (directory != NULL);
351 file_name = malloc (strlen (directory) + strlen (
"/mime/mime.cache") + 1);
352 strcpy (file_name, directory); strcat (file_name,
"/mime/mime.cache");
353 invalid = xdg_check_file (file_name, &exists);
357 *invalid_dir_list = TRUE;
366 file_name = malloc (strlen (directory) + strlen (
"/mime/globs") + 1);
367 strcpy (file_name, directory); strcat (file_name,
"/mime/globs");
368 invalid = xdg_check_file (file_name, NULL);
372 *invalid_dir_list = TRUE;
377 file_name = malloc (strlen (directory) + strlen (
"/mime/magic") + 1);
378 strcpy (file_name, directory); strcat (file_name,
"/mime/magic");
379 invalid = xdg_check_file (file_name, NULL);
383 *invalid_dir_list = TRUE;
396 int invalid_dir_list = FALSE;
398 for (list = dir_time_list; list; list = list->
next)
404 if (invalid_dir_list)
407 for (list = dir_time_list; list; list = list->
next)
421xdg_check_time_and_dirs (
void)
427 gettimeofday (&tv, NULL);
428 current_time = tv.tv_sec;
430 if (current_time >= last_stat_time + 5)
432 retval = xdg_check_dirs ();
433 last_stat_time = current_time;
444 if (xdg_check_time_and_dirs ())
470 const char *mime_type;
474 if (result_prio != NULL)
476 return XDG_MIME_TYPE_EMPTY;
494 struct stat *statbuf)
496 const char *mime_type;
500 const char *mime_types[5];
506 const char *base_name;
509 if (file_name == NULL)
523 return mime_types[0];
527 if (stat (file_name, &buf) != 0)
528 return XDG_MIME_TYPE_UNKNOWN;
533 if (!S_ISREG (statbuf->st_mode))
534 return XDG_MIME_TYPE_UNKNOWN;
540 data = malloc (max_extent);
542 return XDG_MIME_TYPE_UNKNOWN;
544 file = fopen (file_name,
"r");
548 return XDG_MIME_TYPE_UNKNOWN;
551 bytes_read = fread (data, 1, max_extent, file);
556 return XDG_MIME_TYPE_UNKNOWN;
574 const char *mime_type;
584 return XDG_MIME_TYPE_UNKNOWN;
589 const char *mime_types[],
616 xdg_dir_time_list_free (dir_time_list);
617 dir_time_list = NULL;
649 if (generic_icon_list)
652 generic_icon_list = NULL;
659 for (i = 0; i < n_caches; i++)
666 for (list = callback_list; list; list = list->
next)
709 const char *unalias_a, *unalias_b;
714 if (strcmp (unalias_a, unalias_b) == 0)
735 sep = strchr (mime_a,
'/');
737 if (sep && strncmp (mime_a, mime_b, sep - mime_a + 1) == 0)
745ends_with (
const char *str,
751 length = strlen (str);
752 suffix_length = strlen (suffix);
753 if (length < suffix_length)
756 if (strcmp (str + length - suffix_length, suffix) == 0)
763xdg_mime_is_super_type (
const char *mime)
765 return ends_with (mime,
"/*");
773 const char *umime, *ubase;
774 const char **parents;
782 if (strcmp (umime, ubase) == 0)
787 if (xdg_mime_is_super_type (ubase) &&
793 if (strcmp (ubase,
"text/plain") == 0 &&
794 strncmp (umime,
"text/", 5) == 0)
797 if (strcmp (ubase,
"application/octet-stream") == 0 &&
798 strncmp (umime,
"inode/", 6) != 0)
802 for (; parents && *parents; parents++)
823 const char **parents;
835 for (i = 0; parents[i]; i++) ;
837 n = (i + 1) *
sizeof (
char *);
838 result = (
char **) malloc (n);
839 memcpy (result, parents, n);
861 printf (
"*** ALIASES ***\n\n");
863 printf (
"\n*** PARENTS ***\n\n");
865 printf (
"\n*** CACHE ***\n\n");
867 printf (
"\n*** GLOBS ***\n\n");
869 printf (
"\n*** GLOBS REVERSE TREE ***\n\n");
882 static int callback_id = 1;
888 list_el->
data = data;
890 list_el->
next = callback_list;
894 callback_list = list_el;
897 return callback_id - 1;
905 for (list = callback_list; list; list = list->
next)
915 callback_list = list->
next;
int _xdg_mime_mime_type_equal(const char *mime_a, const char *mime_b)
int xdg_mime_media_type_equal(const char *mime_a, const char *mime_b)
const char * xdg_mime_get_icon(const char *mime)
void xdg_mime_shutdown(void)
const char * xdg_mime_get_mime_type_from_file_name(const char *file_name)
int xdg_mime_mime_type_subclass(const char *mime, const char *base)
int _xdg_mime_mime_type_subclass(const char *mime, const char *base)
int xdg_mime_is_valid_mime_type(const char *mime_type)
const char xdg_mime_type_unknown[]
const char * _xdg_mime_unalias_mime_type(const char *mime_type)
void xdg_mime_remove_callback(int callback_id)
const char xdg_mime_type_textplain[]
char ** xdg_mime_list_mime_parents(const char *mime)
int xdg_mime_get_mime_types_from_file_name(const char *file_name, const char *mime_types[], int n_mime_types)
int xdg_mime_register_reload_callback(XdgMimeCallback callback, void *data, XdgMimeDestroy destroy)
const char xdg_mime_type_empty[]
const char * xdg_mime_get_generic_icon(const char *mime)
int xdg_mime_mime_type_equal(const char *mime_a, const char *mime_b)
const char * xdg_mime_get_mime_type_for_data(const void *data, size_t len, int *result_prio)
int xdg_mime_get_max_buffer_extents(void)
int(* XdgDirectoryFunc)(const char *directory, void *user_data)
const char * xdg_mime_unalias_mime_type(const char *mime_type)
const char ** xdg_mime_get_mime_parents(const char *mime)
const char * xdg_mime_get_mime_type_for_file(const char *file_name, struct stat *statbuf)
void(* XdgMimeCallback)(void *user_data)
void(* XdgMimeDestroy)(void *user_data)
void _xdg_mime_alias_list_free(XdgAliasList *list)
const char * _xdg_mime_alias_list_lookup(XdgAliasList *list, const char *alias)
void _xdg_mime_alias_read_from_file(XdgAliasList *list, const char *file_name)
XdgAliasList * _xdg_mime_alias_list_new(void)
void _xdg_mime_alias_list_dump(XdgAliasList *list)
const char * _xdg_mime_cache_get_icon(const char *mime)
int _xdg_mime_cache_get_mime_types_from_file_name(const char *file_name, const char *mime_types[], int n_mime_types)
XdgMimeCache * _xdg_mime_cache_new_from_file(const char *file_name)
int _xdg_mime_cache_get_max_buffer_extents(void)
const char * _xdg_mime_cache_get_mime_type_from_file_name(const char *file_name)
void _xdg_mime_cache_glob_dump(void)
const char * _xdg_mime_cache_get_mime_type_for_file(const char *file_name, struct stat *statbuf)
const char * _xdg_mime_cache_unalias_mime_type(const char *mime)
const char * _xdg_mime_cache_get_mime_type_for_data(const void *data, size_t len, int *result_prio)
int _xdg_mime_cache_mime_type_subclass(const char *mime, const char *base)
const char * _xdg_mime_cache_get_generic_icon(const char *mime)
void _xdg_mime_cache_unref(XdgMimeCache *cache)
char ** _xdg_mime_cache_list_mime_parents(const char *mime)
int _xdg_glob_hash_lookup_file_name(XdgGlobHash *glob_hash, const char *file_name, const char *mime_types[], int n_mime_types)
void _xdg_glob_hash_dump(XdgGlobHash *glob_hash)
XdgGlobHash * _xdg_glob_hash_new(void)
void _xdg_mime_glob_read_from_file(XdgGlobHash *glob_hash, const char *file_name, int version_two)
void _xdg_glob_hash_free(XdgGlobHash *glob_hash)
void _xdg_mime_icon_read_from_file(XdgIconList *list, const char *file_name)
const char * _xdg_mime_icon_list_lookup(XdgIconList *list, const char *mime_type)
XdgIconList * _xdg_mime_icon_list_new(void)
void _xdg_mime_icon_list_free(XdgIconList *list)
const char * _xdg_binary_or_text_fallback(const void *data, size_t len)
const char * _xdg_get_base_name(const char *file_name)
int _xdg_utf8_validate(const char *source)
void _xdg_mime_magic_read_from_file(XdgMimeMagic *mime_magic, const char *file_name)
XdgMimeMagic * _xdg_mime_magic_new(void)
int _xdg_mime_magic_get_buffer_extents(XdgMimeMagic *mime_magic)
void _xdg_mime_magic_free(XdgMimeMagic *mime_magic)
const char * _xdg_mime_magic_lookup_data(XdgMimeMagic *mime_magic, const void *data, size_t len, int *result_prio, const char *mime_types[], int n_mime_types)
const char ** _xdg_mime_parent_list_lookup(XdgParentList *list, const char *mime)
void _xdg_mime_parent_read_from_file(XdgParentList *list, const char *file_name)
void _xdg_mime_parent_list_free(XdgParentList *list)
XdgParentList * _xdg_mime_parent_list_new(void)
void _xdg_mime_parent_list_dump(XdgParentList *list)