int _xdg_mime_cache_get_mime_types_from_file_name (const char *file_name, const char *mime_types[], int n_mime_types) { return cache_glob_lookup_file_name (file_name, mime_types, n_mime_types); }
const char * _xdg_mime_cache_get_mime_type_from_file_name (const char *file_name) { const char *mime_type; if (cache_glob_lookup_file_name (file_name, &mime_type, 1)) return mime_type; else return XDG_MIME_TYPE_UNKNOWN; }
const char * _xdg_mime_cache_get_mime_type_from_file_name (const char *file_name) { const char *mime_types[2]; if (cache_glob_lookup_file_name (file_name, mime_types, 2) == 1) return mime_types[0]; else return XDG_MIME_TYPE_UNKNOWN; }
const char * _xdg_mime_cache_get_mime_type_for_file (const char *file_name, struct stat *statbuf) { const char *mime_type; const char *mime_types[10]; 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; base_name = _xdg_get_base_name (file_name); n = cache_glob_lookup_file_name (base_name, mime_types, 10); 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_cache_get_max_buffer_extents (); 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 = cache_get_mime_type_for_data (data, bytes_read, NULL, mime_types, n); free (data); fclose (file); return mime_type; }
const char * _xdg_mime_cache_get_mime_type_for_file (const char *file_name, int *is_regular) { #ifdef __WIN32__ return XDG_MIME_TYPE_UNKNOWN; #else const char *mime_type; const char *mime_types[10]; FILE *file; unsigned char *data; int max_extent; int bytes_read; int is_regular_here; const char *base_name; int n; if (file_name == NULL) return NULL; if (! _xdg_utf8_validate (file_name)) return NULL; base_name = _xdg_get_base_name (file_name); n = cache_glob_lookup_file_name (base_name, mime_types, 10); if (n == 1) return mime_types[0]; if (!is_regular) { struct stat statbuf; if (XDG_MIME_STAT (file_name, &statbuf) != 0) return XDG_MIME_TYPE_UNKNOWN; is_regular_here = S_ISREG (statbuf.st_mode); is_regular = &is_regular_here; } if (!*is_regular) 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_cache_get_max_buffer_extents (); data = malloc (max_extent); if (data == NULL) return XDG_MIME_TYPE_UNKNOWN; file = fopen (file_name, "rb"); 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 = cache_get_mime_type_for_data (data, bytes_read, NULL, mime_types, n); free (data); fclose (file); return mime_type; #endif // !__WIN32__ }