const char * xdg_mime_get_mime_type_for_data (const void *data, size_t len, int *result_prio) { const char *mime_type; if (len == 0) { *result_prio = 100; return XDG_MIME_TYPE_EMPTY; } xdg_mime_init (); if (_caches) mime_type = _xdg_mime_cache_get_mime_type_for_data (data, len, result_prio); else mime_type = _xdg_mime_magic_lookup_data (global_magic, data, len, result_prio, NULL, 0); if (mime_type) return mime_type; return _xdg_binary_or_text_fallback(data, len); }
const char * xdg_mime_unalias_mime_type (const char *mime_type) { xdg_mime_init (); return _xdg_mime_unalias_mime_type (mime_type); }
int xdg_mime_mime_type_subclass (const char *mime, const char *base) { xdg_mime_init (); return _xdg_mime_mime_type_subclass (mime, base); }
int xdg_mime_mime_type_equal (const char *mime_a, const char *mime_b) { xdg_mime_init (); return _xdg_mime_mime_type_equal (mime_a, mime_b); }
const char * xdg_mime_get_generic_icon (const char *mime) { xdg_mime_init (); if (_caches) return _xdg_mime_cache_get_generic_icon (mime); return _xdg_mime_icon_list_lookup (generic_icon_list, mime); }
int xdg_mime_get_max_buffer_extents (void) { xdg_mime_init (); if (_caches) return _xdg_mime_cache_get_max_buffer_extents (); return _xdg_mime_magic_get_buffer_extents (global_magic); }
int xdg_mime_get_simple_globs (const char *mime, char *globs[], int n_globs) { xdg_mime_init (); if (_caches) return _xdg_mime_cache_get_simple_globs (mime, globs, n_globs); return _xdg_glob_hash_get_simple_globs (global_hash, mime, globs, n_globs); }
int xdg_mime_get_mime_types_from_file_name (const char *file_name, const char *mime_types[], int n_mime_types) { xdg_mime_init (); if (_caches) return _xdg_mime_cache_get_mime_types_from_file_name (file_name, mime_types, n_mime_types); return _xdg_glob_hash_lookup_file_name (global_hash, file_name, mime_types, n_mime_types); }
const char * xdg_mime_get_mime_type_from_file_name (const char *file_name) { const char *mime_type; xdg_mime_init (); if (_caches) return _xdg_mime_cache_get_mime_type_from_file_name (file_name); if (_xdg_glob_hash_lookup_file_name (global_hash, file_name, &mime_type, 1)) return mime_type; else return XDG_MIME_TYPE_UNKNOWN; }
void xdg_mime_dump (void) { xdg_mime_init(); printf ("*** ALIASES ***\n\n"); _xdg_mime_alias_list_dump (alias_list); printf ("\n*** PARENTS ***\n\n"); _xdg_mime_parent_list_dump (parent_list); printf ("\n*** CACHE ***\n\n"); _xdg_glob_hash_dump (global_hash); printf ("\n*** GLOBS ***\n\n"); _xdg_glob_hash_dump (global_hash); printf ("\n*** GLOBS REVERSE TREE ***\n\n"); _xdg_mime_cache_glob_dump (); }
const char * xdg_mime_get_mime_type_for_data (const void *data, size_t len, int *result_prio) { const char *mime_type; xdg_mime_init (); if (_caches) return _xdg_mime_cache_get_mime_type_for_data (data, len, result_prio); mime_type = _xdg_mime_magic_lookup_data (global_magic, data, len, result_prio, NULL, 0); if (mime_type) return mime_type; return XDG_MIME_TYPE_UNKNOWN; }
const char * xdg_mime_get_mime_type_for_file (const char *file_name, struct stat *statbuf) { const char *mime_type; /* currently, only a few globs occur twice, and none * more often, so 5 seems plenty. */ const char *mime_types[5]; FILE *file; unsigned char *data; int max_extent; int bytes_read; struct stat buf; const char *base_name; int n; if (file_name == NULL) return NULL; if (! _xdg_utf8_validate (file_name)) return NULL; xdg_mime_init (); if (_caches) return _xdg_mime_cache_get_mime_type_for_file (file_name, statbuf); base_name = _xdg_get_base_name (file_name); n = _xdg_glob_hash_lookup_file_name (global_hash, base_name, mime_types, 5); if (n == 1) return mime_types[0]; if (!statbuf) { if (stat (file_name, &buf) != 0) return XDG_MIME_TYPE_UNKNOWN; statbuf = &buf; } if (!S_ISREG (statbuf->st_mode)) return XDG_MIME_TYPE_UNKNOWN; /* FIXME: Need to make sure that max_extent isn't totally broken. This could * be large and need getting from a stream instead of just reading it all * in. */ max_extent = _xdg_mime_magic_get_buffer_extents (global_magic); data = malloc (max_extent); if (data == NULL) return XDG_MIME_TYPE_UNKNOWN; file = fopen (file_name, "r"); if (file == NULL) { free (data); return XDG_MIME_TYPE_UNKNOWN; } bytes_read = fread (data, 1, max_extent, file); if (ferror (file)) { free (data); fclose (file); return XDG_MIME_TYPE_UNKNOWN; } mime_type = _xdg_mime_magic_lookup_data (global_magic, data, bytes_read, NULL, mime_types, n); if (!mime_type) mime_type = _xdg_binary_or_text_fallback (data, bytes_read); free (data); fclose (file); return mime_type; }