You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1789 lines
57 KiB
1789 lines
57 KiB
diff -up gnome-vfs-2.22.0/libgnomevfs/gnome-vfs-mime.c.xdgmime gnome-vfs-2.22.0/libgnomevfs/gnome-vfs-mime.c
|
|
--- gnome-vfs-2.22.0/libgnomevfs/gnome-vfs-mime.c.xdgmime 2008-03-10 15:12:45.000000000 -0400
|
|
+++ gnome-vfs-2.22.0/libgnomevfs/gnome-vfs-mime.c 2008-07-24 10:35:59.000000000 -0400
|
|
@@ -236,6 +236,7 @@ _gnome_vfs_read_mime_from_buffer (GnomeV
|
|
int max_extents;
|
|
GnomeVFSResult result = GNOME_VFS_OK;
|
|
const char *mime_type;
|
|
+ int prio;
|
|
|
|
G_LOCK (gnome_vfs_mime_mutex);
|
|
max_extents = xdg_mime_get_max_buffer_extents ();
|
|
@@ -250,7 +251,7 @@ _gnome_vfs_read_mime_from_buffer (GnomeV
|
|
}
|
|
G_LOCK (gnome_vfs_mime_mutex);
|
|
|
|
- mime_type = xdg_mime_get_mime_type_for_data (buffer->buffer, buffer->buffer_length);
|
|
+ mime_type = xdg_mime_get_mime_type_for_data (buffer->buffer, buffer->buffer_length, &prio);
|
|
|
|
G_UNLOCK (gnome_vfs_mime_mutex);
|
|
|
|
diff -up gnome-vfs-2.22.0/libgnomevfs/xdgmimealias.c.xdgmime gnome-vfs-2.22.0/libgnomevfs/xdgmimealias.c
|
|
--- gnome-vfs-2.22.0/libgnomevfs/xdgmimealias.c.xdgmime 2008-03-10 15:12:45.000000000 -0400
|
|
+++ gnome-vfs-2.22.0/libgnomevfs/xdgmimealias.c 2008-07-24 10:42:39.000000000 -0400
|
|
@@ -26,7 +26,7 @@
|
|
*/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
-#include <config.h>
|
|
+#include "config.h"
|
|
#endif
|
|
|
|
#include "xdgmimealias.h"
|
|
@@ -105,7 +105,7 @@ _xdg_mime_alias_list_lookup (XdgAliasLis
|
|
if (list->n_aliases > 0)
|
|
{
|
|
key.alias = (char *)alias;
|
|
- key.mime_type = 0;
|
|
+ key.mime_type = NULL;
|
|
|
|
entry = bsearch (&key, list->aliases, list->n_aliases,
|
|
sizeof (XdgAlias), alias_entry_cmp);
|
|
diff -up gnome-vfs-2.22.0/libgnomevfs/xdgmimealias.h.xdgmime gnome-vfs-2.22.0/libgnomevfs/xdgmimealias.h
|
|
--- gnome-vfs-2.22.0/libgnomevfs/xdgmimealias.h.xdgmime 2008-03-10 15:12:45.000000000 -0400
|
|
+++ gnome-vfs-2.22.0/libgnomevfs/xdgmimealias.h 2008-07-24 10:42:39.000000000 -0400
|
|
@@ -33,10 +33,11 @@
|
|
typedef struct XdgAliasList XdgAliasList;
|
|
|
|
#ifdef XDG_PREFIX
|
|
-#define _xdg_mime_alias_read_from_file XDG_ENTRY(alias_read_from_file)
|
|
-#define _xdg_mime_alias_list_new XDG_ENTRY(alias_list_new)
|
|
-#define _xdg_mime_alias_list_free XDG_ENTRY(alias_list_free)
|
|
-#define _xdg_mime_alias_list_lookup XDG_ENTRY(alias_list_lookup)
|
|
+#define _xdg_mime_alias_read_from_file XDG_RESERVED_ENTRY(alias_read_from_file)
|
|
+#define _xdg_mime_alias_list_new XDG_RESERVED_ENTRY(alias_list_new)
|
|
+#define _xdg_mime_alias_list_free XDG_RESERVED_ENTRY(alias_list_free)
|
|
+#define _xdg_mime_alias_list_lookup XDG_RESERVED_ENTRY(alias_list_lookup)
|
|
+#define _xdg_mime_alias_list_dump XDG_RESERVED_ENTRY(alias_list_dump)
|
|
#endif
|
|
|
|
void _xdg_mime_alias_read_from_file (XdgAliasList *list,
|
|
diff -up gnome-vfs-2.22.0/libgnomevfs/xdgmimecache.c.xdgmime gnome-vfs-2.22.0/libgnomevfs/xdgmimecache.c
|
|
--- gnome-vfs-2.22.0/libgnomevfs/xdgmimecache.c.xdgmime 2008-03-10 15:12:45.000000000 -0400
|
|
+++ gnome-vfs-2.22.0/libgnomevfs/xdgmimecache.c 2008-07-24 10:42:40.000000000 -0400
|
|
@@ -25,7 +25,7 @@
|
|
*/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
-#include <config.h>
|
|
+#include "config.h"
|
|
#endif
|
|
|
|
#include <stdio.h>
|
|
@@ -41,6 +41,8 @@
|
|
|
|
#ifdef HAVE_MMAP
|
|
#include <sys/mman.h>
|
|
+#else
|
|
+#warning Building xdgmime without MMAP support. Binary "mime.info" cache files will not be used.
|
|
#endif
|
|
|
|
#include <sys/stat.h>
|
|
@@ -70,7 +72,7 @@
|
|
#endif
|
|
|
|
#define MAJOR_VERSION 1
|
|
-#define MINOR_VERSION 0
|
|
+#define MINOR_VERSION 1
|
|
|
|
struct _XdgMimeCache
|
|
{
|
|
@@ -297,7 +299,7 @@ cache_magic_lookup_data (XdgMimeCache *c
|
|
for (n = 0; n < n_mime_types; n++)
|
|
{
|
|
if (mime_types[n] &&
|
|
- xdg_mime_mime_type_equal (mime_types[n], non_match))
|
|
+ _xdg_mime_mime_type_equal (mime_types[n], non_match))
|
|
mime_types[n] = NULL;
|
|
}
|
|
}
|
|
@@ -344,6 +346,11 @@ cache_alias_lookup (const char *alias)
|
|
return NULL;
|
|
}
|
|
|
|
+typedef struct {
|
|
+ const char *mime;
|
|
+ int weight;
|
|
+} MimeWeight;
|
|
+
|
|
static int
|
|
cache_glob_lookup_literal (const char *file_name,
|
|
const char *mime_types[],
|
|
@@ -365,7 +372,7 @@ cache_glob_lookup_literal (const char *f
|
|
{
|
|
mid = (min + max) / 2;
|
|
|
|
- offset = GET_UINT32 (cache->buffer, list_offset + 4 + 8 * mid);
|
|
+ offset = GET_UINT32 (cache->buffer, list_offset + 4 + 12 * mid);
|
|
ptr = cache->buffer + offset;
|
|
cmp = strcmp (ptr, file_name);
|
|
|
|
@@ -375,7 +382,7 @@ cache_glob_lookup_literal (const char *f
|
|
max = mid - 1;
|
|
else
|
|
{
|
|
- offset = GET_UINT32 (cache->buffer, list_offset + 4 + 8 * mid + 4);
|
|
+ offset = GET_UINT32 (cache->buffer, list_offset + 4 + 12 * mid + 4);
|
|
mime_types[0] = (const char *)(cache->buffer + offset);
|
|
|
|
return 1;
|
|
@@ -388,7 +395,7 @@ cache_glob_lookup_literal (const char *f
|
|
|
|
static int
|
|
cache_glob_lookup_fnmatch (const char *file_name,
|
|
- const char *mime_types[],
|
|
+ MimeWeight mime_types[],
|
|
int n_mime_types)
|
|
{
|
|
const char *mime_type;
|
|
@@ -406,14 +413,19 @@ cache_glob_lookup_fnmatch (const char *f
|
|
|
|
for (j = 0; j < n_entries && n < n_mime_types; j++)
|
|
{
|
|
- xdg_uint32_t offset = GET_UINT32 (cache->buffer, list_offset + 4 + 8 * j);
|
|
- xdg_uint32_t mimetype_offset = GET_UINT32 (cache->buffer, list_offset + 4 + 8 * j + 4);
|
|
+ xdg_uint32_t offset = GET_UINT32 (cache->buffer, list_offset + 4 + 12 * j);
|
|
+ xdg_uint32_t mimetype_offset = GET_UINT32 (cache->buffer, list_offset + 4 + 12 * j + 4);
|
|
+ int weight = GET_UINT32 (cache->buffer, list_offset + 4 + 12 * j + 8);
|
|
ptr = cache->buffer + offset;
|
|
mime_type = cache->buffer + mimetype_offset;
|
|
|
|
/* FIXME: Not UTF-8 safe */
|
|
if (fnmatch (ptr, file_name, 0) == 0)
|
|
- mime_types[n++] = mime_type;
|
|
+ {
|
|
+ mime_types[n].mime = mime_type;
|
|
+ mime_types[n].weight = weight;
|
|
+ n++;
|
|
+ }
|
|
}
|
|
|
|
if (n > 0)
|
|
@@ -424,85 +436,86 @@ cache_glob_lookup_fnmatch (const char *f
|
|
}
|
|
|
|
static int
|
|
-cache_glob_node_lookup_suffix (XdgMimeCache *cache,
|
|
- xdg_uint32_t n_entries,
|
|
- xdg_uint32_t offset,
|
|
- const char *suffix,
|
|
- int ignore_case,
|
|
- const char *mime_types[],
|
|
- int n_mime_types)
|
|
+cache_glob_node_lookup_suffix (XdgMimeCache *cache,
|
|
+ xdg_uint32_t n_entries,
|
|
+ xdg_uint32_t offset,
|
|
+ xdg_unichar_t *file_name,
|
|
+ int len,
|
|
+ int ignore_case,
|
|
+ MimeWeight mime_types[],
|
|
+ int n_mime_types)
|
|
{
|
|
xdg_unichar_t character;
|
|
xdg_unichar_t match_char;
|
|
xdg_uint32_t mimetype_offset;
|
|
xdg_uint32_t n_children;
|
|
xdg_uint32_t child_offset;
|
|
+ int weight;
|
|
|
|
int min, max, mid, n, i;
|
|
|
|
- character = _xdg_utf8_to_ucs4 (suffix);
|
|
+ character = file_name[len - 1];
|
|
if (ignore_case)
|
|
character = _xdg_ucs4_to_lower (character);
|
|
|
|
+ assert (character != 0);
|
|
+
|
|
min = 0;
|
|
max = n_entries - 1;
|
|
while (max >= min)
|
|
{
|
|
mid = (min + max) / 2;
|
|
-
|
|
- match_char = GET_UINT32 (cache->buffer, offset + 16 * mid);
|
|
-
|
|
+ match_char = GET_UINT32 (cache->buffer, offset + 12 * mid);
|
|
if (match_char < character)
|
|
min = mid + 1;
|
|
else if (match_char > character)
|
|
max = mid - 1;
|
|
else
|
|
{
|
|
- suffix = _xdg_utf8_next_char (suffix);
|
|
- if (*suffix == '\0')
|
|
- {
|
|
- mimetype_offset = GET_UINT32 (cache->buffer, offset + 16 * mid + 4);
|
|
- n = 0;
|
|
- mime_types[n++] = cache->buffer + mimetype_offset;
|
|
-
|
|
- n_children = GET_UINT32 (cache->buffer, offset + 16 * mid + 8);
|
|
- child_offset = GET_UINT32 (cache->buffer, offset + 16 * mid + 12);
|
|
+ len--;
|
|
+ n = 0;
|
|
+ n_children = GET_UINT32 (cache->buffer, offset + 12 * mid + 4);
|
|
+ child_offset = GET_UINT32 (cache->buffer, offset + 12 * mid + 8);
|
|
+
|
|
+ if (len > 0)
|
|
+ {
|
|
+ n = cache_glob_node_lookup_suffix (cache,
|
|
+ n_children, child_offset,
|
|
+ file_name, len,
|
|
+ ignore_case,
|
|
+ mime_types,
|
|
+ n_mime_types);
|
|
+ }
|
|
+ if (n == 0)
|
|
+ {
|
|
i = 0;
|
|
while (n < n_mime_types && i < n_children)
|
|
{
|
|
- match_char = GET_UINT32 (cache->buffer, child_offset + 16 * i);
|
|
- mimetype_offset = GET_UINT32 (cache->buffer, offset + 16 * i + 4);
|
|
+ match_char = GET_UINT32 (cache->buffer, child_offset + 12 * i);
|
|
if (match_char != 0)
|
|
break;
|
|
|
|
- mime_types[n++] = cache->buffer + mimetype_offset;
|
|
+ mimetype_offset = GET_UINT32 (cache->buffer, child_offset + 12 * i + 4);
|
|
+ weight = GET_UINT32 (cache->buffer, child_offset + 12 * i + 8);
|
|
+
|
|
+ mime_types[n].mime = cache->buffer + mimetype_offset;
|
|
+ mime_types[n].weight = weight;
|
|
+ n++;
|
|
i++;
|
|
}
|
|
-
|
|
- return n;
|
|
- }
|
|
- else
|
|
- {
|
|
- n_children = GET_UINT32 (cache->buffer, offset + 16 * mid + 8);
|
|
- child_offset = GET_UINT32 (cache->buffer, offset + 16 * mid + 12);
|
|
-
|
|
- return cache_glob_node_lookup_suffix (cache,
|
|
- n_children, child_offset,
|
|
- suffix, ignore_case,
|
|
- mime_types,
|
|
- n_mime_types);
|
|
}
|
|
+ return n;
|
|
}
|
|
}
|
|
-
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
-cache_glob_lookup_suffix (const char *suffix,
|
|
- int ignore_case,
|
|
- const char *mime_types[],
|
|
- int n_mime_types)
|
|
+cache_glob_lookup_suffix (xdg_unichar_t *file_name,
|
|
+ int len,
|
|
+ int ignore_case,
|
|
+ MimeWeight mime_types[],
|
|
+ int n_mime_types)
|
|
{
|
|
int i, n;
|
|
|
|
@@ -516,7 +529,8 @@ cache_glob_lookup_suffix (const char *su
|
|
|
|
n = cache_glob_node_lookup_suffix (cache,
|
|
n_entries, offset,
|
|
- suffix, ignore_case,
|
|
+ file_name, len,
|
|
+ ignore_case,
|
|
mime_types,
|
|
n_mime_types);
|
|
if (n > 0)
|
|
@@ -526,41 +540,12 @@ cache_glob_lookup_suffix (const char *su
|
|
return 0;
|
|
}
|
|
|
|
-static void
|
|
-find_stopchars (char *stopchars)
|
|
+static int compare_mime_weight (const void *a, const void *b)
|
|
{
|
|
- int i, j, k, l;
|
|
-
|
|
- k = 0;
|
|
- for (i = 0; _caches[i]; i++)
|
|
- {
|
|
- XdgMimeCache *cache = _caches[i];
|
|
-
|
|
- xdg_uint32_t list_offset = GET_UINT32 (cache->buffer, 16);
|
|
- xdg_uint32_t n_entries = GET_UINT32 (cache->buffer, list_offset);
|
|
- xdg_uint32_t offset = GET_UINT32 (cache->buffer, list_offset + 4);
|
|
-
|
|
- for (j = 0; j < n_entries; j++)
|
|
- {
|
|
- xdg_uint32_t match_char = GET_UINT32 (cache->buffer, offset);
|
|
-
|
|
- if (match_char < 128)
|
|
- {
|
|
- for (l = 0; l < k; l++)
|
|
- if (stopchars[l] == match_char)
|
|
- break;
|
|
- if (l == k)
|
|
- {
|
|
- stopchars[k] = (char) match_char;
|
|
- k++;
|
|
- }
|
|
- }
|
|
+ const MimeWeight *aa = (const MimeWeight *)a;
|
|
+ const MimeWeight *bb = (const MimeWeight *)b;
|
|
|
|
- offset += 16;
|
|
- }
|
|
- }
|
|
-
|
|
- stopchars[k] = '\0';
|
|
+ return aa->weight - bb->weight;
|
|
}
|
|
|
|
static int
|
|
@@ -568,36 +553,40 @@ cache_glob_lookup_file_name (const char
|
|
const char *mime_types[],
|
|
int n_mime_types)
|
|
{
|
|
- const char *ptr;
|
|
- char stopchars[128];
|
|
int n;
|
|
+ MimeWeight mimes[10];
|
|
+ int n_mimes = 10;
|
|
+ int i;
|
|
+ xdg_unichar_t *ucs4;
|
|
+ int len;
|
|
|
|
- assert (file_name != NULL);
|
|
+ assert (file_name != NULL && n_mime_types > 0);
|
|
|
|
/* First, check the literals */
|
|
n = cache_glob_lookup_literal (file_name, mime_types, n_mime_types);
|
|
if (n > 0)
|
|
return n;
|
|
|
|
- find_stopchars (stopchars);
|
|
+ ucs4 = _xdg_convert_to_ucs4 (file_name, &len);
|
|
+ n = cache_glob_lookup_suffix (ucs4, len, FALSE, mimes, n_mimes);
|
|
|
|
- /* Next, check suffixes */
|
|
- ptr = strpbrk (file_name, stopchars);
|
|
- while (ptr)
|
|
- {
|
|
- n = cache_glob_lookup_suffix (ptr, FALSE, mime_types, n_mime_types);
|
|
- if (n > 0)
|
|
- return n;
|
|
-
|
|
- n = cache_glob_lookup_suffix (ptr, TRUE, mime_types, n_mime_types);
|
|
- if (n > 0)
|
|
- return n;
|
|
-
|
|
- ptr = strpbrk (ptr + 1, stopchars);
|
|
- }
|
|
+ if (n == 0)
|
|
+ n = cache_glob_lookup_suffix (ucs4, len, TRUE, mimes, n_mimes);
|
|
+ free(ucs4);
|
|
|
|
/* Last, try fnmatch */
|
|
- return cache_glob_lookup_fnmatch (file_name, mime_types, n_mime_types);
|
|
+ if (n == 0)
|
|
+ n = cache_glob_lookup_fnmatch (file_name, mimes, n_mimes);
|
|
+
|
|
+ qsort (mimes, n, sizeof (MimeWeight), compare_mime_weight);
|
|
+
|
|
+ if (n_mime_types < n)
|
|
+ n = n_mime_types;
|
|
+
|
|
+ for (i = 0; i < n; i++)
|
|
+ mime_types[i] = mimes[i].mime;
|
|
+
|
|
+ return n;
|
|
}
|
|
|
|
int
|
|
@@ -622,6 +611,7 @@ _xdg_mime_cache_get_max_buffer_extents (
|
|
static const char *
|
|
cache_get_mime_type_for_data (const void *data,
|
|
size_t len,
|
|
+ int *result_prio,
|
|
const char *mime_types[],
|
|
int n_mime_types)
|
|
{
|
|
@@ -646,11 +636,15 @@ cache_get_mime_type_for_data (const void
|
|
}
|
|
}
|
|
|
|
+ if (result_prio)
|
|
+ *result_prio = priority;
|
|
+
|
|
if (priority > 0)
|
|
return mime_type;
|
|
|
|
for (n = 0; n < n_mime_types; n++)
|
|
{
|
|
+
|
|
if (mime_types[n])
|
|
return mime_types[n];
|
|
}
|
|
@@ -660,9 +654,10 @@ cache_get_mime_type_for_data (const void
|
|
|
|
const char *
|
|
_xdg_mime_cache_get_mime_type_for_data (const void *data,
|
|
- size_t len)
|
|
+ size_t len,
|
|
+ int *result_prio)
|
|
{
|
|
- return cache_get_mime_type_for_data (data, len, NULL, 0);
|
|
+ return cache_get_mime_type_for_data (data, len, result_prio, NULL, 0);
|
|
}
|
|
|
|
const char *
|
|
@@ -670,7 +665,7 @@ _xdg_mime_cache_get_mime_type_for_file (
|
|
struct stat *statbuf)
|
|
{
|
|
const char *mime_type;
|
|
- const char *mime_types[2];
|
|
+ const char *mime_types[10];
|
|
FILE *file;
|
|
unsigned char *data;
|
|
int max_extent;
|
|
@@ -686,7 +681,7 @@ _xdg_mime_cache_get_mime_type_for_file (
|
|
return NULL;
|
|
|
|
base_name = _xdg_get_base_name (file_name);
|
|
- n = cache_glob_lookup_file_name (base_name, mime_types, 2);
|
|
+ n = cache_glob_lookup_file_name (base_name, mime_types, 10);
|
|
|
|
if (n == 1)
|
|
return mime_types[0];
|
|
@@ -725,7 +720,7 @@ _xdg_mime_cache_get_mime_type_for_file (
|
|
return XDG_MIME_TYPE_UNKNOWN;
|
|
}
|
|
|
|
- mime_type = cache_get_mime_type_for_data (data, bytes_read,
|
|
+ mime_type = cache_get_mime_type_for_data (data, bytes_read, NULL,
|
|
mime_types, n);
|
|
|
|
free (data);
|
|
@@ -745,6 +740,14 @@ _xdg_mime_cache_get_mime_type_from_file_
|
|
return XDG_MIME_TYPE_UNKNOWN;
|
|
}
|
|
|
|
+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);
|
|
+}
|
|
+
|
|
#if 1
|
|
static int
|
|
is_super_type (const char *mime)
|
|
@@ -850,10 +853,12 @@ _xdg_mime_cache_unalias_mime_type (const
|
|
char **
|
|
_xdg_mime_cache_list_mime_parents (const char *mime)
|
|
{
|
|
- int i, j, p;
|
|
+ int i, j, k, l, p;
|
|
char *all_parents[128]; /* we'll stop at 128 */
|
|
char **result;
|
|
|
|
+ mime = xdg_mime_unalias_mime_type (mime);
|
|
+
|
|
p = 0;
|
|
for (i = 0; _caches[i]; i++)
|
|
{
|
|
@@ -864,21 +869,36 @@ _xdg_mime_cache_list_mime_parents (const
|
|
|
|
for (j = 0; j < n_entries; j++)
|
|
{
|
|
- xdg_uint32_t mimetype_offset = GET_UINT32 (cache->buffer, list_offset + 4 + 8 * i);
|
|
- xdg_uint32_t parents_offset = GET_UINT32 (cache->buffer, list_offset + 4 + 8 * i + 4);
|
|
-
|
|
+ xdg_uint32_t mimetype_offset = GET_UINT32 (cache->buffer, list_offset + 4 + 8 * j);
|
|
+ xdg_uint32_t parents_offset = GET_UINT32 (cache->buffer, list_offset + 4 + 8 * j + 4);
|
|
+
|
|
if (strcmp (cache->buffer + mimetype_offset, mime) == 0)
|
|
{
|
|
+ xdg_uint32_t parent_mime_offset;
|
|
xdg_uint32_t n_parents = GET_UINT32 (cache->buffer, parents_offset);
|
|
-
|
|
- for (j = 0; j < n_parents; j++)
|
|
- all_parents[p++] = cache->buffer + parents_offset + 4 + 4 * j;
|
|
+
|
|
+ for (k = 0; k < n_parents && p < 127; k++)
|
|
+ {
|
|
+ parent_mime_offset = GET_UINT32 (cache->buffer, parents_offset + 4 + 4 * k);
|
|
+
|
|
+ /* Don't add same parent multiple times.
|
|
+ * This can happen for instance if the same type is listed in multiple directories
|
|
+ */
|
|
+ for (l = 0; l < p; l++)
|
|
+ {
|
|
+ if (strcmp (all_parents[l], cache->buffer + parent_mime_offset) == 0)
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ if (l == p)
|
|
+ all_parents[p++] = cache->buffer + parent_mime_offset;
|
|
+ }
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
- all_parents[p++] = 0;
|
|
+ all_parents[p++] = NULL;
|
|
|
|
result = (char **) malloc (p * sizeof (char *));
|
|
memcpy (result, all_parents, p * sizeof (char *));
|
|
@@ -886,3 +906,107 @@ _xdg_mime_cache_list_mime_parents (const
|
|
return result;
|
|
}
|
|
|
|
+static const char *
|
|
+cache_lookup_icon (const char *mime, int header)
|
|
+{
|
|
+ const char *ptr;
|
|
+ int i, min, max, mid, cmp;
|
|
+
|
|
+ for (i = 0; _caches[i]; i++)
|
|
+ {
|
|
+ XdgMimeCache *cache = _caches[i];
|
|
+ xdg_uint32_t list_offset = GET_UINT32 (cache->buffer, header);
|
|
+ xdg_uint32_t n_entries = GET_UINT32 (cache->buffer, list_offset);
|
|
+ xdg_uint32_t offset;
|
|
+
|
|
+ min = 0;
|
|
+ max = n_entries - 1;
|
|
+ while (max >= min)
|
|
+ {
|
|
+ mid = (min + max) / 2;
|
|
+
|
|
+ offset = GET_UINT32 (cache->buffer, list_offset + 4 + 8 * mid);
|
|
+ ptr = cache->buffer + offset;
|
|
+ cmp = strcmp (ptr, mime);
|
|
+
|
|
+ if (cmp < 0)
|
|
+ min = mid + 1;
|
|
+ else if (cmp > 0)
|
|
+ max = mid - 1;
|
|
+ else
|
|
+ {
|
|
+ offset = GET_UINT32 (cache->buffer, list_offset + 4 + 8 * mid + 4);
|
|
+ return cache->buffer + offset;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ return NULL;
|
|
+}
|
|
+
|
|
+const char *
|
|
+_xdg_mime_cache_get_generic_icon (const char *mime)
|
|
+{
|
|
+ return cache_lookup_icon (mime, 36);
|
|
+}
|
|
+
|
|
+const char *
|
|
+_xdg_mime_cache_get_icon (const char *mime)
|
|
+{
|
|
+ const char *icon;
|
|
+
|
|
+ icon = cache_lookup_icon (mime, 32);
|
|
+
|
|
+ if (icon == NULL)
|
|
+ icon = _xdg_mime_cache_get_generic_icon (mime);
|
|
+
|
|
+ return icon;
|
|
+}
|
|
+
|
|
+static void
|
|
+dump_glob_node (XdgMimeCache *cache,
|
|
+ xdg_uint32_t offset,
|
|
+ int depth)
|
|
+{
|
|
+ xdg_unichar_t character;
|
|
+ xdg_uint32_t mime_offset;
|
|
+ xdg_uint32_t n_children;
|
|
+ xdg_uint32_t child_offset;
|
|
+ int i;
|
|
+
|
|
+ character = GET_UINT32 (cache->buffer, offset);
|
|
+ mime_offset = GET_UINT32 (cache->buffer, offset + 4);
|
|
+ n_children = GET_UINT32 (cache->buffer, offset + 8);
|
|
+ child_offset = GET_UINT32 (cache->buffer, offset + 12);
|
|
+ for (i = 0; i < depth; i++)
|
|
+ printf (" ");
|
|
+ printf ("%c", character);
|
|
+ if (mime_offset)
|
|
+ printf (" - %s", cache->buffer + mime_offset);
|
|
+ printf ("\n");
|
|
+ if (child_offset)
|
|
+ {
|
|
+ for (i = 0; i < n_children; i++)
|
|
+ dump_glob_node (cache, child_offset + 20 * i, depth + 1);
|
|
+ }
|
|
+}
|
|
+
|
|
+void
|
|
+_xdg_mime_cache_glob_dump (void)
|
|
+{
|
|
+ int i, j;
|
|
+ for (i = 0; _caches[i]; i++)
|
|
+ {
|
|
+ XdgMimeCache *cache = _caches[i];
|
|
+ xdg_uint32_t list_offset;
|
|
+ xdg_uint32_t n_entries;
|
|
+ xdg_uint32_t offset;
|
|
+ list_offset = GET_UINT32 (cache->buffer, 16);
|
|
+ n_entries = GET_UINT32 (cache->buffer, list_offset);
|
|
+ offset = GET_UINT32 (cache->buffer, list_offset + 4);
|
|
+ for (j = 0; j < n_entries; j++)
|
|
+ dump_glob_node (cache, offset + 20 * j, 0);
|
|
+ }
|
|
+}
|
|
+
|
|
+
|
|
diff -up gnome-vfs-2.22.0/libgnomevfs/xdgmimecache.h.xdgmime gnome-vfs-2.22.0/libgnomevfs/xdgmimecache.h
|
|
--- gnome-vfs-2.22.0/libgnomevfs/xdgmimecache.h.xdgmime 2008-03-10 15:12:45.000000000 -0400
|
|
+++ gnome-vfs-2.22.0/libgnomevfs/xdgmimecache.h 2008-07-24 10:42:40.000000000 -0400
|
|
@@ -32,9 +32,20 @@
|
|
typedef struct _XdgMimeCache XdgMimeCache;
|
|
|
|
#ifdef XDG_PREFIX
|
|
-#define _xdg_mime_cache_new_from_file XDG_ENTRY(cache_new_from_file)
|
|
-#define _xdg_mime_cache_ref XDG_ENTRY(cache_ref)
|
|
-#define _xdg_mime_cache_unref XDG_ENTRY(cache_unref)
|
|
+#define _xdg_mime_cache_new_from_file XDG_RESERVED_ENTRY(cache_new_from_file)
|
|
+#define _xdg_mime_cache_ref XDG_RESERVED_ENTRY(cache_ref)
|
|
+#define _xdg_mime_cache_unref XDG_RESERVED_ENTRY(cache_unref)
|
|
+#define _xdg_mime_cache_get_max_buffer_extents XDG_RESERVED_ENTRY(cache_get_max_buffer_extents)
|
|
+#define _xdg_mime_cache_get_mime_type_for_data XDG_RESERVED_ENTRY(cache_get_mime_type_for_data)
|
|
+#define _xdg_mime_cache_get_mime_type_for_file XDG_RESERVED_ENTRY(cache_get_mime_type_for_file)
|
|
+#define _xdg_mime_cache_get_mime_type_from_file_name XDG_RESERVED_ENTRY(cache_get_mime_type_from_file_name)
|
|
+#define _xdg_mime_cache_get_mime_types_from_file_name XDG_RESERVED_ENTRY(cache_get_mime_types_from_file_name)
|
|
+#define _xdg_mime_cache_list_mime_parents XDG_RESERVED_ENTRY(cache_list_mime_parents)
|
|
+#define _xdg_mime_cache_mime_type_subclass XDG_RESERVED_ENTRY(cache_mime_type_subclass)
|
|
+#define _xdg_mime_cache_unalias_mime_type XDG_RESERVED_ENTRY(cache_unalias_mime_type)
|
|
+#define _xdg_mime_cache_get_icon XDG_RESERVED_ENTRY(cache_get_icon)
|
|
+#define _xdg_mime_cache_get_generic_icon XDG_RESERVED_ENTRY(cache_get_generic_icon)
|
|
+#define _xdg_mime_cache_glob_dump XDG_RESERVED_ENTRY(cache_glob_dump)
|
|
#endif
|
|
|
|
extern XdgMimeCache **_caches;
|
|
@@ -45,9 +56,13 @@ void _xdg_mime_cache_unref
|
|
|
|
|
|
const char *_xdg_mime_cache_get_mime_type_for_data (const void *data,
|
|
- size_t len);
|
|
+ size_t len,
|
|
+ int *result_prio);
|
|
const char *_xdg_mime_cache_get_mime_type_for_file (const char *file_name,
|
|
struct stat *statbuf);
|
|
+int _xdg_mime_cache_get_mime_types_from_file_name (const char *file_name,
|
|
+ const char *mime_types[],
|
|
+ int n_mime_types);
|
|
const char *_xdg_mime_cache_get_mime_type_from_file_name (const char *file_name);
|
|
int _xdg_mime_cache_is_valid_mime_type (const char *mime_type);
|
|
int _xdg_mime_cache_mime_type_equal (const char *mime_a,
|
|
@@ -59,5 +74,8 @@ int _xdg_mime_cache_mime_type_s
|
|
char **_xdg_mime_cache_list_mime_parents (const char *mime);
|
|
const char *_xdg_mime_cache_unalias_mime_type (const char *mime);
|
|
int _xdg_mime_cache_get_max_buffer_extents (void);
|
|
+const char *_xdg_mime_cache_get_icon (const char *mime);
|
|
+const char *_xdg_mime_cache_get_generic_icon (const char *mime);
|
|
+void _xdg_mime_cache_glob_dump (void);
|
|
|
|
#endif /* __XDG_MIME_CACHE_H__ */
|
|
diff -up gnome-vfs-2.22.0/libgnomevfs/xdgmime.c.xdgmime gnome-vfs-2.22.0/libgnomevfs/xdgmime.c
|
|
--- gnome-vfs-2.22.0/libgnomevfs/xdgmime.c.xdgmime 2008-03-10 15:12:45.000000000 -0400
|
|
+++ gnome-vfs-2.22.0/libgnomevfs/xdgmime.c 2008-07-24 10:42:40.000000000 -0400
|
|
@@ -26,7 +26,7 @@
|
|
*/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
-#include <config.h>
|
|
+#include "config.h"
|
|
#endif
|
|
|
|
#include "xdgmime.h"
|
|
@@ -34,6 +34,7 @@
|
|
#include "xdgmimeglob.h"
|
|
#include "xdgmimemagic.h"
|
|
#include "xdgmimealias.h"
|
|
+#include "xdgmimeicon.h"
|
|
#include "xdgmimeparent.h"
|
|
#include "xdgmimecache.h"
|
|
#include <stdio.h>
|
|
@@ -56,6 +57,8 @@ static XdgAliasList *alias_list = NULL;
|
|
static XdgParentList *parent_list = NULL;
|
|
static XdgDirTimeList *dir_time_list = NULL;
|
|
static XdgCallbackList *callback_list = NULL;
|
|
+static XdgIconList *icon_list = NULL;
|
|
+static XdgIconList *generic_icon_list = NULL;
|
|
|
|
XdgMimeCache **_caches = NULL;
|
|
static int n_caches = 0;
|
|
@@ -93,17 +96,26 @@ struct XdgCallbackList
|
|
typedef int (*XdgDirectoryFunc) (const char *directory,
|
|
void *user_data);
|
|
|
|
-static XdgDirTimeList *
|
|
-xdg_dir_time_list_new (void)
|
|
+static void
|
|
+xdg_dir_time_list_add (char *file_name,
|
|
+ time_t mtime)
|
|
{
|
|
- XdgDirTimeList *retval;
|
|
-
|
|
- retval = calloc (1, sizeof (XdgDirTimeList));
|
|
- retval->checked = XDG_CHECKED_UNCHECKED;
|
|
+ XdgDirTimeList *list;
|
|
|
|
- return retval;
|
|
+ for (list = dir_time_list; list; list = list->next)
|
|
+ {
|
|
+ if (strcmp (list->directory_name, file_name) == 0)
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ list = calloc (1, sizeof (XdgDirTimeList));
|
|
+ list->checked = XDG_CHECKED_UNCHECKED;
|
|
+ list->directory_name = file_name;
|
|
+ list->mtime = mtime;
|
|
+ list->next = dir_time_list;
|
|
+ dir_time_list = list;
|
|
}
|
|
-
|
|
+
|
|
static void
|
|
xdg_dir_time_list_free (XdgDirTimeList *list)
|
|
{
|
|
@@ -123,7 +135,6 @@ xdg_mime_init_from_directory (const char
|
|
{
|
|
char *file_name;
|
|
struct stat st;
|
|
- XdgDirTimeList *list;
|
|
|
|
assert (directory != NULL);
|
|
|
|
@@ -135,11 +146,7 @@ xdg_mime_init_from_directory (const char
|
|
|
|
if (cache != NULL)
|
|
{
|
|
- list = xdg_dir_time_list_new ();
|
|
- list->directory_name = file_name;
|
|
- list->mtime = st.st_mtime;
|
|
- list->next = dir_time_list;
|
|
- dir_time_list = list;
|
|
+ xdg_dir_time_list_add (file_name, st.st_mtime);
|
|
|
|
_caches = realloc (_caches, sizeof (XdgMimeCache *) * (n_caches + 2));
|
|
_caches[n_caches] = cache;
|
|
@@ -151,21 +158,27 @@ xdg_mime_init_from_directory (const char
|
|
}
|
|
free (file_name);
|
|
|
|
- file_name = malloc (strlen (directory) + strlen ("/mime/globs") + 1);
|
|
- strcpy (file_name, directory); strcat (file_name, "/mime/globs");
|
|
+ file_name = malloc (strlen (directory) + strlen ("/mime/globs2") + 1);
|
|
+ strcpy (file_name, directory); strcat (file_name, "/mime/globs2");
|
|
if (stat (file_name, &st) == 0)
|
|
{
|
|
_xdg_mime_glob_read_from_file (global_hash, file_name);
|
|
-
|
|
- list = xdg_dir_time_list_new ();
|
|
- list->directory_name = file_name;
|
|
- list->mtime = st.st_mtime;
|
|
- list->next = dir_time_list;
|
|
- dir_time_list = list;
|
|
+ xdg_dir_time_list_add (file_name, st.st_mtime);
|
|
}
|
|
else
|
|
{
|
|
free (file_name);
|
|
+ file_name = malloc (strlen (directory) + strlen ("/mime/globs") + 1);
|
|
+ strcpy (file_name, directory); strcat (file_name, "/mime/globs");
|
|
+ if (stat (file_name, &st) == 0)
|
|
+ {
|
|
+ _xdg_mime_glob_read_from_file (global_hash, file_name);
|
|
+ xdg_dir_time_list_add (file_name, st.st_mtime);
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ free (file_name);
|
|
+ }
|
|
}
|
|
|
|
file_name = malloc (strlen (directory) + strlen ("/mime/magic") + 1);
|
|
@@ -173,12 +186,7 @@ xdg_mime_init_from_directory (const char
|
|
if (stat (file_name, &st) == 0)
|
|
{
|
|
_xdg_mime_magic_read_from_file (global_magic, file_name);
|
|
-
|
|
- list = xdg_dir_time_list_new ();
|
|
- list->directory_name = file_name;
|
|
- list->mtime = st.st_mtime;
|
|
- list->next = dir_time_list;
|
|
- dir_time_list = list;
|
|
+ xdg_dir_time_list_add (file_name, st.st_mtime);
|
|
}
|
|
else
|
|
{
|
|
@@ -195,6 +203,16 @@ xdg_mime_init_from_directory (const char
|
|
_xdg_mime_parent_read_from_file (parent_list, file_name);
|
|
free (file_name);
|
|
|
|
+ file_name = malloc (strlen (directory) + strlen ("/mime/icons") + 1);
|
|
+ strcpy (file_name, directory); strcat (file_name, "/mime/icons");
|
|
+ _xdg_mime_icon_read_from_file (icon_list, file_name);
|
|
+ free (file_name);
|
|
+
|
|
+ file_name = malloc (strlen (directory) + strlen ("/mime/generic-icons") + 1);
|
|
+ strcpy (file_name, directory); strcat (file_name, "/mime/generic-icons");
|
|
+ _xdg_mime_icon_read_from_file (generic_icon_list, file_name);
|
|
+ free (file_name);
|
|
+
|
|
return FALSE; /* Keep processing */
|
|
}
|
|
|
|
@@ -296,12 +314,11 @@ xdg_check_file (const char *file_path,
|
|
|
|
for (list = dir_time_list; list; list = list->next)
|
|
{
|
|
- if (! strcmp (list->directory_name, file_path) &&
|
|
- st.st_mtime == list->mtime)
|
|
+ if (! strcmp (list->directory_name, file_path))
|
|
{
|
|
- if (list->checked == XDG_CHECKED_UNCHECKED)
|
|
+ if (st.st_mtime == list->mtime)
|
|
list->checked = XDG_CHECKED_VALID;
|
|
- else if (list->checked == XDG_CHECKED_VALID)
|
|
+ else
|
|
list->checked = XDG_CHECKED_INVALID;
|
|
|
|
return (list->checked != XDG_CHECKED_VALID);
|
|
@@ -430,6 +447,8 @@ xdg_mime_init (void)
|
|
global_magic = _xdg_mime_magic_new ();
|
|
alias_list = _xdg_mime_alias_list_new ();
|
|
parent_list = _xdg_mime_parent_list_new ();
|
|
+ icon_list = _xdg_mime_icon_list_new ();
|
|
+ generic_icon_list = _xdg_mime_icon_list_new ();
|
|
|
|
xdg_run_command_on_dirs ((XdgDirectoryFunc) xdg_mime_init_from_directory,
|
|
NULL);
|
|
@@ -440,16 +459,17 @@ xdg_mime_init (void)
|
|
|
|
const char *
|
|
xdg_mime_get_mime_type_for_data (const void *data,
|
|
- size_t len)
|
|
+ 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);
|
|
+ return _xdg_mime_cache_get_mime_type_for_data (data, len, result_prio);
|
|
|
|
- mime_type = _xdg_mime_magic_lookup_data (global_magic, data, len, NULL, 0);
|
|
+ mime_type = _xdg_mime_magic_lookup_data (global_magic, data, len, result_prio, NULL, 0);
|
|
|
|
if (mime_type)
|
|
return mime_type;
|
|
@@ -524,7 +544,7 @@ xdg_mime_get_mime_type_for_file (const c
|
|
return XDG_MIME_TYPE_UNKNOWN;
|
|
}
|
|
|
|
- mime_type = _xdg_mime_magic_lookup_data (global_magic, data, bytes_read,
|
|
+ mime_type = _xdg_mime_magic_lookup_data (global_magic, data, bytes_read, NULL,
|
|
mime_types, n);
|
|
|
|
free (data);
|
|
@@ -553,6 +573,19 @@ xdg_mime_get_mime_type_from_file_name (c
|
|
}
|
|
|
|
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);
|
|
+}
|
|
+
|
|
+int
|
|
xdg_mime_is_valid_mime_type (const char *mime_type)
|
|
{
|
|
/* FIXME: We should make this a better test
|
|
@@ -675,8 +708,6 @@ xdg_mime_media_type_equal (const char *m
|
|
{
|
|
char *sep;
|
|
|
|
- xdg_mime_init ();
|
|
-
|
|
sep = strchr (mime_a, '/');
|
|
|
|
if (sep && strncmp (mime_a, mime_b, sep - mime_a + 1) == 0)
|
|
@@ -791,10 +822,18 @@ xdg_mime_get_mime_parents (const char *m
|
|
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 ();
|
|
}
|
|
|
|
|
|
@@ -848,3 +887,32 @@ xdg_mime_remove_callback (int callback_i
|
|
}
|
|
}
|
|
}
|
|
+
|
|
+const char *
|
|
+xdg_mime_get_icon (const char *mime)
|
|
+{
|
|
+ const char *icon;
|
|
+
|
|
+ xdg_mime_init ();
|
|
+
|
|
+ if (_caches)
|
|
+ return _xdg_mime_cache_get_icon (mime);
|
|
+
|
|
+ icon = _xdg_mime_icon_list_lookup (icon_list, mime);
|
|
+
|
|
+ if (!icon)
|
|
+ icon = xdg_mime_get_generic_icon (mime);
|
|
+
|
|
+ return icon;
|
|
+}
|
|
+
|
|
+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);
|
|
+}
|
|
diff -up gnome-vfs-2.22.0/libgnomevfs/xdgmimeglob.c.xdgmime gnome-vfs-2.22.0/libgnomevfs/xdgmimeglob.c
|
|
--- gnome-vfs-2.22.0/libgnomevfs/xdgmimeglob.c.xdgmime 2008-07-24 10:35:59.000000000 -0400
|
|
+++ gnome-vfs-2.22.0/libgnomevfs/xdgmimeglob.c 2008-07-24 10:42:40.000000000 -0400
|
|
@@ -26,7 +26,7 @@
|
|
*/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
-#include <config.h>
|
|
+#include "config.h"
|
|
#endif
|
|
|
|
#include "xdgmimeglob.h"
|
|
@@ -52,6 +52,7 @@ struct XdgGlobHashNode
|
|
{
|
|
xdg_unichar_t character;
|
|
const char *mime_type;
|
|
+ int weight;
|
|
XdgGlobHashNode *next;
|
|
XdgGlobHashNode *child;
|
|
};
|
|
@@ -59,6 +60,7 @@ struct XdgGlobList
|
|
{
|
|
const char *data;
|
|
const char *mime_type;
|
|
+ int weight;
|
|
XdgGlobList *next;
|
|
};
|
|
|
|
@@ -107,7 +109,8 @@ _xdg_glob_list_free (XdgGlobList *glob_l
|
|
static XdgGlobList *
|
|
_xdg_glob_list_append (XdgGlobList *glob_list,
|
|
void *data,
|
|
- const char *mime_type)
|
|
+ const char *mime_type,
|
|
+ int weight)
|
|
{
|
|
XdgGlobList *new_element;
|
|
XdgGlobList *tmp_element;
|
|
@@ -115,6 +118,7 @@ _xdg_glob_list_append (XdgGlobList *glob
|
|
new_element = _xdg_glob_list_new ();
|
|
new_element->data = data;
|
|
new_element->mime_type = mime_type;
|
|
+ new_element->weight = weight;
|
|
if (glob_list == NULL)
|
|
return new_element;
|
|
|
|
@@ -127,23 +131,6 @@ _xdg_glob_list_append (XdgGlobList *glob
|
|
return glob_list;
|
|
}
|
|
|
|
-#if 0
|
|
-static XdgGlobList *
|
|
-_xdg_glob_list_prepend (XdgGlobList *glob_list,
|
|
- void *data,
|
|
- const char *mime_type)
|
|
-{
|
|
- XdgGlobList *new_element;
|
|
-
|
|
- new_element = _xdg_glob_list_new ();
|
|
- new_element->data = data;
|
|
- new_element->next = glob_list;
|
|
- new_element->mime_type = mime_type;
|
|
-
|
|
- return new_element;
|
|
-}
|
|
-#endif
|
|
-
|
|
/* XdgGlobHashNode
|
|
*/
|
|
|
|
@@ -167,7 +154,7 @@ _xdg_glob_hash_node_dump (XdgGlobHashNod
|
|
|
|
printf ("%c", (char)glob_hash_node->character);
|
|
if (glob_hash_node->mime_type)
|
|
- printf (" - %s\n", glob_hash_node->mime_type);
|
|
+ printf (" - %s %d\n", glob_hash_node->mime_type, glob_hash_node->weight);
|
|
else
|
|
printf ("\n");
|
|
if (glob_hash_node->child)
|
|
@@ -177,14 +164,15 @@ _xdg_glob_hash_node_dump (XdgGlobHashNod
|
|
}
|
|
|
|
static XdgGlobHashNode *
|
|
-_xdg_glob_hash_insert_text (XdgGlobHashNode *glob_hash_node,
|
|
- const char *text,
|
|
- const char *mime_type)
|
|
+_xdg_glob_hash_insert_ucs4 (XdgGlobHashNode *glob_hash_node,
|
|
+ xdg_unichar_t *text,
|
|
+ const char *mime_type,
|
|
+ int weight)
|
|
{
|
|
XdgGlobHashNode *node;
|
|
xdg_unichar_t character;
|
|
|
|
- character = _xdg_utf8_to_ucs4 (text);
|
|
+ character = text[0];
|
|
|
|
if ((glob_hash_node == NULL) ||
|
|
(character < glob_hash_node->character))
|
|
@@ -238,8 +226,8 @@ _xdg_glob_hash_insert_text (XdgGlobHashN
|
|
}
|
|
}
|
|
|
|
- text = _xdg_utf8_next_char (text);
|
|
- if (*text == '\000')
|
|
+ text++;
|
|
+ if (*text == 0)
|
|
{
|
|
if (node->mime_type)
|
|
{
|
|
@@ -249,7 +237,7 @@ _xdg_glob_hash_insert_text (XdgGlobHashN
|
|
int found_node = FALSE;
|
|
|
|
child = node->child;
|
|
- while (child && child->character == '\0')
|
|
+ while (child && child->character == 0)
|
|
{
|
|
if (strcmp (child->mime_type, mime_type) == 0)
|
|
{
|
|
@@ -262,8 +250,9 @@ _xdg_glob_hash_insert_text (XdgGlobHashN
|
|
if (!found_node)
|
|
{
|
|
child = _xdg_glob_hash_node_new ();
|
|
- child->character = '\000';
|
|
+ child->character = 0;
|
|
child->mime_type = strdup (mime_type);
|
|
+ child->weight = weight;
|
|
child->child = NULL;
|
|
child->next = node->child;
|
|
node->child = child;
|
|
@@ -273,20 +262,45 @@ _xdg_glob_hash_insert_text (XdgGlobHashN
|
|
else
|
|
{
|
|
node->mime_type = strdup (mime_type);
|
|
+ node->weight = weight;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
- node->child = _xdg_glob_hash_insert_text (node->child, text, mime_type);
|
|
+ node->child = _xdg_glob_hash_insert_ucs4 (node->child, text, mime_type, weight);
|
|
}
|
|
return glob_hash_node;
|
|
}
|
|
|
|
+/* glob must be valid UTF-8 */
|
|
+static XdgGlobHashNode *
|
|
+_xdg_glob_hash_insert_text (XdgGlobHashNode *glob_hash_node,
|
|
+ const char *text,
|
|
+ const char *mime_type,
|
|
+ int weight)
|
|
+{
|
|
+ XdgGlobHashNode *node;
|
|
+ xdg_unichar_t *unitext;
|
|
+ int len;
|
|
+
|
|
+ unitext = _xdg_convert_to_ucs4 (text, &len);
|
|
+ _xdg_reverse_ucs4 (unitext, len);
|
|
+ node = _xdg_glob_hash_insert_ucs4 (glob_hash_node, unitext, mime_type, weight);
|
|
+ free (unitext);
|
|
+ return node;
|
|
+}
|
|
+
|
|
+typedef struct {
|
|
+ const char *mime;
|
|
+ int weight;
|
|
+} MimeWeight;
|
|
+
|
|
static int
|
|
_xdg_glob_hash_node_lookup_file_name (XdgGlobHashNode *glob_hash_node,
|
|
- const char *file_name,
|
|
+ xdg_unichar_t *file_name,
|
|
+ int len,
|
|
int ignore_case,
|
|
- const char *mime_types[],
|
|
+ MimeWeight mime_types[],
|
|
int n_mime_types)
|
|
{
|
|
int n;
|
|
@@ -296,36 +310,45 @@ _xdg_glob_hash_node_lookup_file_name (Xd
|
|
if (glob_hash_node == NULL)
|
|
return 0;
|
|
|
|
- character = _xdg_utf8_to_ucs4 (file_name);
|
|
+ character = file_name[len - 1];
|
|
if (ignore_case)
|
|
character = _xdg_ucs4_to_lower(character);
|
|
|
|
for (node = glob_hash_node; node && character >= node->character; node = node->next)
|
|
{
|
|
if (character == node->character)
|
|
- {
|
|
- file_name = _xdg_utf8_next_char (file_name);
|
|
- if (*file_name == '\000')
|
|
+ {
|
|
+ len--;
|
|
+ n = 0;
|
|
+ if (len > 0)
|
|
+ {
|
|
+ n = _xdg_glob_hash_node_lookup_file_name (node->child,
|
|
+ file_name,
|
|
+ len,
|
|
+ ignore_case,
|
|
+ mime_types,
|
|
+ n_mime_types);
|
|
+ }
|
|
+ if (n == 0)
|
|
{
|
|
- n = 0;
|
|
if (node->mime_type)
|
|
- mime_types[n++] = node->mime_type;
|
|
+ {
|
|
+ mime_types[n].mime = node->mime_type;
|
|
+ mime_types[n].weight = node->weight;
|
|
+ n++;
|
|
+ }
|
|
node = node->child;
|
|
while (n < n_mime_types && node && node->character == 0)
|
|
{
|
|
if (node->mime_type)
|
|
- mime_types[n++] = node->mime_type;
|
|
+ {
|
|
+ mime_types[n].mime = node->mime_type;
|
|
+ mime_types[n].weight = node->weight;
|
|
+ n++;
|
|
+ }
|
|
node = node->next;
|
|
}
|
|
}
|
|
- else
|
|
- {
|
|
- n = _xdg_glob_hash_node_lookup_file_name (node->child,
|
|
- file_name,
|
|
- ignore_case,
|
|
- mime_types,
|
|
- n_mime_types);
|
|
- }
|
|
return n;
|
|
}
|
|
}
|
|
@@ -333,6 +356,14 @@ _xdg_glob_hash_node_lookup_file_name (Xd
|
|
return 0;
|
|
}
|
|
|
|
+static int compare_mime_weight (const void *a, const void *b)
|
|
+{
|
|
+ const MimeWeight *aa = (const MimeWeight *)a;
|
|
+ const MimeWeight *bb = (const MimeWeight *)b;
|
|
+
|
|
+ return aa->weight - bb->weight;
|
|
+}
|
|
+
|
|
int
|
|
_xdg_glob_hash_lookup_file_name (XdgGlobHash *glob_hash,
|
|
const char *file_name,
|
|
@@ -340,15 +371,18 @@ _xdg_glob_hash_lookup_file_name (XdgGlob
|
|
int n_mime_types)
|
|
{
|
|
XdgGlobList *list;
|
|
- const char *ptr;
|
|
- char stopchars[128];
|
|
int i, n;
|
|
- XdgGlobHashNode *node;
|
|
+ MimeWeight mimes[10];
|
|
+ int n_mimes = 10;
|
|
+ xdg_unichar_t *ucs4;
|
|
+ int len;
|
|
|
|
/* First, check the literals */
|
|
|
|
assert (file_name != NULL && n_mime_types > 0);
|
|
|
|
+ n = 0;
|
|
+
|
|
for (list = glob_hash->literal_list; list; list = list->next)
|
|
{
|
|
if (strcmp ((const char *)list->data, file_name) == 0)
|
|
@@ -358,38 +392,36 @@ _xdg_glob_hash_lookup_file_name (XdgGlob
|
|
}
|
|
}
|
|
|
|
- i = 0;
|
|
- for (node = glob_hash->simple_node; node; node = node->next)
|
|
- {
|
|
- if (node->character < 128)
|
|
- stopchars[i++] = (char)node->character;
|
|
- }
|
|
- stopchars[i] = '\0';
|
|
-
|
|
- ptr = strpbrk (file_name, stopchars);
|
|
- while (ptr)
|
|
- {
|
|
- n = _xdg_glob_hash_node_lookup_file_name (glob_hash->simple_node, ptr, FALSE,
|
|
- mime_types, n_mime_types);
|
|
- if (n > 0)
|
|
- return n;
|
|
-
|
|
- n = _xdg_glob_hash_node_lookup_file_name (glob_hash->simple_node, ptr, TRUE,
|
|
- mime_types, n_mime_types);
|
|
- if (n > 0)
|
|
- return n;
|
|
-
|
|
- ptr = strpbrk (ptr + 1, stopchars);
|
|
- }
|
|
+ ucs4 = _xdg_convert_to_ucs4 (file_name, &len);
|
|
+ n = _xdg_glob_hash_node_lookup_file_name (glob_hash->simple_node, ucs4, len, FALSE,
|
|
+ mimes, n_mimes);
|
|
+ if (n == 0)
|
|
+ n = _xdg_glob_hash_node_lookup_file_name (glob_hash->simple_node, ucs4, len, TRUE,
|
|
+ mimes, n_mimes);
|
|
+ free(ucs4);
|
|
|
|
/* FIXME: Not UTF-8 safe */
|
|
- n = 0;
|
|
- for (list = glob_hash->full_list; list && n < n_mime_types; list = list->next)
|
|
+ if (n == 0)
|
|
{
|
|
- if (fnmatch ((const char *)list->data, file_name, 0) == 0)
|
|
- mime_types[n++] = list->mime_type;
|
|
+ for (list = glob_hash->full_list; list && n < n_mime_types; list = list->next)
|
|
+ {
|
|
+ if (fnmatch ((const char *)list->data, file_name, 0) == 0)
|
|
+ {
|
|
+ mimes[n].mime = list->mime_type;
|
|
+ mimes[n].weight = list->weight;
|
|
+ n++;
|
|
+ }
|
|
+ }
|
|
}
|
|
|
|
+ qsort (mimes, n, sizeof (MimeWeight), compare_mime_weight);
|
|
+
|
|
+ if (n_mime_types < n)
|
|
+ n = n_mime_types;
|
|
+
|
|
+ for (i = 0; i < n; i++)
|
|
+ mime_types[i] = mimes[i].mime;
|
|
+
|
|
return n;
|
|
}
|
|
|
|
@@ -442,7 +474,7 @@ _xdg_glob_determine_type (const char *gl
|
|
|
|
ptr = glob;
|
|
|
|
- while (*ptr != '\000')
|
|
+ while (*ptr != '\0')
|
|
{
|
|
if (*ptr == '*' && first_char)
|
|
maybe_in_simple_glob = TRUE;
|
|
@@ -462,7 +494,8 @@ _xdg_glob_determine_type (const char *gl
|
|
void
|
|
_xdg_glob_hash_append_glob (XdgGlobHash *glob_hash,
|
|
const char *glob,
|
|
- const char *mime_type)
|
|
+ const char *mime_type,
|
|
+ int weight)
|
|
{
|
|
XdgGlobType type;
|
|
|
|
@@ -474,13 +507,13 @@ _xdg_glob_hash_append_glob (XdgGlobHash
|
|
switch (type)
|
|
{
|
|
case XDG_GLOB_LITERAL:
|
|
- glob_hash->literal_list = _xdg_glob_list_append (glob_hash->literal_list, strdup (glob), strdup (mime_type));
|
|
+ glob_hash->literal_list = _xdg_glob_list_append (glob_hash->literal_list, strdup (glob), strdup (mime_type), weight);
|
|
break;
|
|
case XDG_GLOB_SIMPLE:
|
|
- glob_hash->simple_node = _xdg_glob_hash_insert_text (glob_hash->simple_node, glob + 1, mime_type);
|
|
+ glob_hash->simple_node = _xdg_glob_hash_insert_text (glob_hash->simple_node, glob + 1, mime_type, weight);
|
|
break;
|
|
case XDG_GLOB_FULL:
|
|
- glob_hash->full_list = _xdg_glob_list_append (glob_hash->full_list, strdup (glob), strdup (mime_type));
|
|
+ glob_hash->full_list = _xdg_glob_list_append (glob_hash->full_list, strdup (glob), strdup (mime_type), weight);
|
|
break;
|
|
}
|
|
}
|
|
@@ -490,27 +523,34 @@ _xdg_glob_hash_dump (XdgGlobHash *glob_h
|
|
{
|
|
XdgGlobList *list;
|
|
printf ("LITERAL STRINGS\n");
|
|
- if (glob_hash->literal_list == NULL)
|
|
+ if (!glob_hash || glob_hash->literal_list == NULL)
|
|
{
|
|
printf (" None\n");
|
|
}
|
|
else
|
|
{
|
|
for (list = glob_hash->literal_list; list; list = list->next)
|
|
- printf (" %s - %s\n", (char *)list->data, list->mime_type);
|
|
+ printf (" %s - %s %d\n", (char *)list->data, list->mime_type, list->weight);
|
|
}
|
|
printf ("\nSIMPLE GLOBS\n");
|
|
- _xdg_glob_hash_node_dump (glob_hash->simple_node, 4);
|
|
+ if (!glob_hash || glob_hash->simple_node == NULL)
|
|
+ {
|
|
+ printf (" None\n");
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ _xdg_glob_hash_node_dump (glob_hash->simple_node, 4);
|
|
+ }
|
|
|
|
printf ("\nFULL GLOBS\n");
|
|
- if (glob_hash->full_list == NULL)
|
|
+ if (!glob_hash || glob_hash->full_list == NULL)
|
|
{
|
|
printf (" None\n");
|
|
}
|
|
else
|
|
{
|
|
for (list = glob_hash->full_list; list; list = list->next)
|
|
- printf (" %s - %s\n", (char *)list->data, list->mime_type);
|
|
+ printf (" %s - %s %d\n", (char *)list->data, list->mime_type, list->weight);
|
|
}
|
|
}
|
|
|
|
@@ -531,16 +571,33 @@ _xdg_mime_glob_read_from_file (XdgGlobHa
|
|
* Blah */
|
|
while (fgets (line, 255, glob_file) != NULL)
|
|
{
|
|
- char *colon;
|
|
+ char *colon, *colon2;
|
|
+ char *mimetype, *glob;
|
|
+ int weight;
|
|
+
|
|
if (line[0] == '#')
|
|
continue;
|
|
|
|
colon = strchr (line, ':');
|
|
if (colon == NULL)
|
|
continue;
|
|
- *(colon++) = '\000';
|
|
- colon[strlen (colon) -1] = '\000';
|
|
- _xdg_glob_hash_append_glob (glob_hash, colon, line);
|
|
+ *(colon++) = '\0';
|
|
+ colon[strlen (colon) -1] = '\0';
|
|
+ colon2 = strchr (colon, ':');
|
|
+ if (colon2)
|
|
+ {
|
|
+ *(colon2++) = '\000';
|
|
+ weight = atoi (line);
|
|
+ mimetype = colon;
|
|
+ glob = colon2;
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ weight = 50;
|
|
+ mimetype = line;
|
|
+ glob = colon;
|
|
+ }
|
|
+ _xdg_glob_hash_append_glob (glob_hash, glob, mimetype, weight);
|
|
}
|
|
|
|
fclose (glob_file);
|
|
diff -up gnome-vfs-2.22.0/libgnomevfs/xdgmimeglob.h.xdgmime gnome-vfs-2.22.0/libgnomevfs/xdgmimeglob.h
|
|
--- gnome-vfs-2.22.0/libgnomevfs/xdgmimeglob.h.xdgmime 2008-03-10 15:12:45.000000000 -0400
|
|
+++ gnome-vfs-2.22.0/libgnomevfs/xdgmimeglob.h 2008-07-24 10:42:40.000000000 -0400
|
|
@@ -41,13 +41,13 @@ typedef enum
|
|
|
|
|
|
#ifdef XDG_PREFIX
|
|
-#define _xdg_mime_glob_read_from_file XDG_ENTRY(glob_read_from_file)
|
|
-#define _xdg_glob_hash_new XDG_ENTRY(hash_new)
|
|
-#define _xdg_glob_hash_free XDG_ENTRY(hash_free)
|
|
-#define _xdg_glob_hash_lookup_file_name XDG_ENTRY(hash_lookup_file_name)
|
|
-#define _xdg_glob_hash_append_glob XDG_ENTRY(hash_append_glob)
|
|
-#define _xdg_glob_determine_type XDG_ENTRY(determine_type)
|
|
-#define _xdg_glob_hash_dump XDG_ENTRY(hash_dump)
|
|
+#define _xdg_mime_glob_read_from_file XDG_RESERVED_ENTRY(glob_read_from_file)
|
|
+#define _xdg_glob_hash_new XDG_RESERVED_ENTRY(hash_new)
|
|
+#define _xdg_glob_hash_free XDG_RESERVED_ENTRY(hash_free)
|
|
+#define _xdg_glob_hash_lookup_file_name XDG_RESERVED_ENTRY(hash_lookup_file_name)
|
|
+#define _xdg_glob_hash_append_glob XDG_RESERVED_ENTRY(hash_append_glob)
|
|
+#define _xdg_glob_determine_type XDG_RESERVED_ENTRY(determine_type)
|
|
+#define _xdg_glob_hash_dump XDG_RESERVED_ENTRY(hash_dump)
|
|
#endif
|
|
|
|
void _xdg_mime_glob_read_from_file (XdgGlobHash *glob_hash,
|
|
@@ -60,7 +60,8 @@ int _xdg_glob_hash_lookup_file_
|
|
int n_mime_types);
|
|
void _xdg_glob_hash_append_glob (XdgGlobHash *glob_hash,
|
|
const char *glob,
|
|
- const char *mime_type);
|
|
+ const char *mime_type,
|
|
+ int weight);
|
|
XdgGlobType _xdg_glob_determine_type (const char *glob);
|
|
void _xdg_glob_hash_dump (XdgGlobHash *glob_hash);
|
|
|
|
diff -up gnome-vfs-2.22.0/libgnomevfs/xdgmime.h.xdgmime gnome-vfs-2.22.0/libgnomevfs/xdgmime.h
|
|
--- gnome-vfs-2.22.0/libgnomevfs/xdgmime.h.xdgmime 2008-03-10 15:12:45.000000000 -0400
|
|
+++ gnome-vfs-2.22.0/libgnomevfs/xdgmime.h 2008-07-24 10:42:40.000000000 -0400
|
|
@@ -40,6 +40,10 @@ extern "C" {
|
|
#define XDG_ENTRY(func) _XDG_ENTRY2(XDG_PREFIX,func)
|
|
#define _XDG_ENTRY2(prefix,func) _XDG_ENTRY3(prefix,func)
|
|
#define _XDG_ENTRY3(prefix,func) prefix##_##func
|
|
+
|
|
+#define XDG_RESERVED_ENTRY(func) _XDG_RESERVED_ENTRY2(XDG_PREFIX,func)
|
|
+#define _XDG_RESERVED_ENTRY2(prefix,func) _XDG_RESERVED_ENTRY3(prefix,func)
|
|
+#define _XDG_RESERVED_ENTRY3(prefix,func) _##prefix##_##func
|
|
#endif
|
|
|
|
typedef void (*XdgMimeCallback) (void *user_data);
|
|
@@ -50,32 +54,40 @@ typedef void (*XdgMimeDestroy) (void *u
|
|
#define xdg_mime_get_mime_type_for_data XDG_ENTRY(get_mime_type_for_data)
|
|
#define xdg_mime_get_mime_type_for_file XDG_ENTRY(get_mime_type_for_file)
|
|
#define xdg_mime_get_mime_type_from_file_name XDG_ENTRY(get_mime_type_from_file_name)
|
|
+#define xdg_mime_get_mime_types_from_file_name XDG_ENTRY(get_mime_types_from_file_name)
|
|
#define xdg_mime_is_valid_mime_type XDG_ENTRY(is_valid_mime_type)
|
|
#define xdg_mime_mime_type_equal XDG_ENTRY(mime_type_equal)
|
|
-#define _xdg_mime_mime_type_equal XDG_ENTRY(mime_type_equal_p)
|
|
#define xdg_mime_media_type_equal XDG_ENTRY(media_type_equal)
|
|
#define xdg_mime_mime_type_subclass XDG_ENTRY(mime_type_subclass)
|
|
-#define _xdg_mime_mime_type_subclass XDG_ENTRY(mime_type_subclass_p)
|
|
#define xdg_mime_get_mime_parents XDG_ENTRY(get_mime_parents)
|
|
#define xdg_mime_list_mime_parents XDG_ENTRY(list_mime_parents)
|
|
#define xdg_mime_unalias_mime_type XDG_ENTRY(unalias_mime_type)
|
|
-#define _xdg_mime_unalias_mime_type XDG_ENTRY(unalias_mime_type_p)
|
|
#define xdg_mime_get_max_buffer_extents XDG_ENTRY(get_max_buffer_extents)
|
|
#define xdg_mime_shutdown XDG_ENTRY(shutdown)
|
|
#define xdg_mime_dump XDG_ENTRY(dump)
|
|
#define xdg_mime_register_reload_callback XDG_ENTRY(register_reload_callback)
|
|
#define xdg_mime_remove_callback XDG_ENTRY(remove_callback)
|
|
#define xdg_mime_type_unknown XDG_ENTRY(type_unknown)
|
|
+#define xdg_mime_get_icon XDG_ENTRY(get_icon)
|
|
+#define xdg_mime_get_generic_icon XDG_ENTRY(get_generic_icon)
|
|
+
|
|
+#define _xdg_mime_mime_type_equal XDG_RESERVED_ENTRY(mime_type_equal)
|
|
+#define _xdg_mime_mime_type_subclass XDG_RESERVED_ENTRY(mime_type_subclass)
|
|
+#define _xdg_mime_unalias_mime_type XDG_RESERVED_ENTRY(unalias_mime_type)
|
|
#endif
|
|
|
|
extern const char xdg_mime_type_unknown[];
|
|
#define XDG_MIME_TYPE_UNKNOWN xdg_mime_type_unknown
|
|
|
|
const char *xdg_mime_get_mime_type_for_data (const void *data,
|
|
- size_t len);
|
|
+ size_t len,
|
|
+ int *result_prio);
|
|
const char *xdg_mime_get_mime_type_for_file (const char *file_name,
|
|
struct stat *statbuf);
|
|
const char *xdg_mime_get_mime_type_from_file_name (const char *file_name);
|
|
+int xdg_mime_get_mime_types_from_file_name(const char *file_name,
|
|
+ const char *mime_types[],
|
|
+ int n_mime_types);
|
|
int xdg_mime_is_valid_mime_type (const char *mime_type);
|
|
int xdg_mime_mime_type_equal (const char *mime_a,
|
|
const char *mime_b);
|
|
@@ -91,6 +103,8 @@ int xdg_mime_mime_type_subclass
|
|
const char **xdg_mime_get_mime_parents (const char *mime);
|
|
char ** xdg_mime_list_mime_parents (const char *mime);
|
|
const char *xdg_mime_unalias_mime_type (const char *mime);
|
|
+const char *xdg_mime_get_icon (const char *mime);
|
|
+const char *xdg_mime_get_generic_icon (const char *mime);
|
|
int xdg_mime_get_max_buffer_extents (void);
|
|
void xdg_mime_shutdown (void);
|
|
void xdg_mime_dump (void);
|
|
@@ -102,11 +116,9 @@ void xdg_mime_remove_callback
|
|
/* Private versions of functions that don't call xdg_mime_init () */
|
|
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);
|
|
int _xdg_mime_mime_type_subclass (const char *mime,
|
|
const char *base);
|
|
-const char *_xdg_mime_unalias_mime_type (const char *mime);
|
|
+const char *_xdg_mime_unalias_mime_type (const char *mime);
|
|
|
|
|
|
#ifdef __cplusplus
|
|
diff -up gnome-vfs-2.22.0/libgnomevfs/xdgmimeint.c.xdgmime gnome-vfs-2.22.0/libgnomevfs/xdgmimeint.c
|
|
--- gnome-vfs-2.22.0/libgnomevfs/xdgmimeint.c.xdgmime 2008-03-10 15:12:45.000000000 -0400
|
|
+++ gnome-vfs-2.22.0/libgnomevfs/xdgmimeint.c 2008-07-24 10:42:40.000000000 -0400
|
|
@@ -26,7 +26,7 @@
|
|
*/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
-#include <config.h>
|
|
+#include "config.h"
|
|
#endif
|
|
|
|
#include "xdgmimeint.h"
|
|
@@ -152,3 +152,40 @@ _xdg_get_base_name (const char *file_nam
|
|
else
|
|
return base_name + 1;
|
|
}
|
|
+
|
|
+xdg_unichar_t *
|
|
+_xdg_convert_to_ucs4 (const char *source, int *len)
|
|
+{
|
|
+ xdg_unichar_t *out;
|
|
+ int i;
|
|
+ const char *p;
|
|
+
|
|
+ out = malloc (sizeof (xdg_unichar_t) * (strlen (source) + 1));
|
|
+
|
|
+ p = source;
|
|
+ i = 0;
|
|
+ while (*p)
|
|
+ {
|
|
+ out[i++] = _xdg_utf8_to_ucs4 (p);
|
|
+ p = _xdg_utf8_next_char (p);
|
|
+ }
|
|
+ out[i] = 0;
|
|
+ *len = i;
|
|
+
|
|
+ return out;
|
|
+}
|
|
+
|
|
+void
|
|
+_xdg_reverse_ucs4 (xdg_unichar_t *source, int len)
|
|
+{
|
|
+ xdg_unichar_t c;
|
|
+ int i;
|
|
+
|
|
+ for (i = 0; i < len - i - 1; i++)
|
|
+ {
|
|
+ c = source[i];
|
|
+ source[i] = source[len - i - 1];
|
|
+ source[len - i - 1] = c;
|
|
+ }
|
|
+}
|
|
+
|
|
diff -up gnome-vfs-2.22.0/libgnomevfs/xdgmimeint.h.xdgmime gnome-vfs-2.22.0/libgnomevfs/xdgmimeint.h
|
|
--- gnome-vfs-2.22.0/libgnomevfs/xdgmimeint.h.xdgmime 2008-03-10 15:12:45.000000000 -0400
|
|
+++ gnome-vfs-2.22.0/libgnomevfs/xdgmimeint.h 2008-07-24 10:42:40.000000000 -0400
|
|
@@ -46,11 +46,13 @@ typedef unsigned short xdg_uint16_t;
|
|
typedef unsigned int xdg_uint32_t;
|
|
|
|
#ifdef XDG_PREFIX
|
|
-#define _xdg_utf8_skip XDG_ENTRY(utf8_skip)
|
|
-#define _xdg_utf8_to_ucs4 XDG_ENTRY(utf8_to_ucs4)
|
|
-#define _xdg_ucs4_to_lower XDG_ENTRY(ucs4_to_lower)
|
|
-#define _xdg_utf8_validate XDG_ENTRY(utf8_validate)
|
|
-#define _xdg_get_base_name XDG_ENTRY(get_ase_name)
|
|
+#define _xdg_utf8_skip XDG_RESERVED_ENTRY(utf8_skip)
|
|
+#define _xdg_utf8_to_ucs4 XDG_RESERVED_ENTRY(utf8_to_ucs4)
|
|
+#define _xdg_ucs4_to_lower XDG_RESERVED_ENTRY(ucs4_to_lower)
|
|
+#define _xdg_utf8_validate XDG_RESERVED_ENTRY(utf8_validate)
|
|
+#define _xdg_get_base_name XDG_RESERVED_ENTRY(get_base_name)
|
|
+#define _xdg_convert_to_ucs4 XDG_RESERVED_ENTRY(convert_to_ucs4)
|
|
+#define _xdg_reverse_ucs4 XDG_RESERVED_ENTRY(reverse_ucs4)
|
|
#endif
|
|
|
|
#define SWAP_BE16_TO_LE16(val) (xdg_uint16_t)(((xdg_uint16_t)(val) << 8)|((xdg_uint16_t)(val) >> 8))
|
|
@@ -68,6 +70,8 @@ extern const char *const _xdg_utf8_skip;
|
|
xdg_unichar_t _xdg_utf8_to_ucs4 (const char *source);
|
|
xdg_unichar_t _xdg_ucs4_to_lower (xdg_unichar_t source);
|
|
int _xdg_utf8_validate (const char *source);
|
|
+xdg_unichar_t *_xdg_convert_to_ucs4 (const char *source, int *len);
|
|
+void _xdg_reverse_ucs4 (xdg_unichar_t *source, int len);
|
|
const char *_xdg_get_base_name (const char *file_name);
|
|
|
|
#endif /* __XDG_MIME_INT_H__ */
|
|
diff -up gnome-vfs-2.22.0/libgnomevfs/xdgmimemagic.c.xdgmime gnome-vfs-2.22.0/libgnomevfs/xdgmimemagic.c
|
|
--- gnome-vfs-2.22.0/libgnomevfs/xdgmimemagic.c.xdgmime 2008-03-10 15:12:45.000000000 -0400
|
|
+++ gnome-vfs-2.22.0/libgnomevfs/xdgmimemagic.c 2008-07-24 10:42:40.000000000 -0400
|
|
@@ -26,7 +26,7 @@
|
|
*/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
-#include <config.h>
|
|
+#include "config.h"
|
|
#endif
|
|
|
|
#include <assert.h>
|
|
@@ -47,6 +47,10 @@
|
|
#define TRUE (!FALSE)
|
|
#endif
|
|
|
|
+#if !defined getc_unlocked && !defined HAVE_GETC_UNLOCKED
|
|
+# define getc_unlocked(fp) getc (fp)
|
|
+#endif
|
|
+
|
|
typedef struct XdgMimeMagicMatch XdgMimeMagicMatch;
|
|
typedef struct XdgMimeMagicMatchlet XdgMimeMagicMatchlet;
|
|
|
|
@@ -472,9 +476,7 @@ _xdg_mime_magic_parse_magic_line (FILE
|
|
/* We clean up the matchlet, byte swapping if needed */
|
|
if (matchlet->word_size > 1)
|
|
{
|
|
-#if LITTLE_ENDIAN
|
|
int i;
|
|
-#endif
|
|
if (matchlet->value_length % matchlet->word_size != 0)
|
|
{
|
|
_xdg_mime_magic_matchlet_free (matchlet);
|
|
@@ -654,34 +656,24 @@ 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)
|
|
{
|
|
XdgMimeMagicMatch *match;
|
|
const char *mime_type;
|
|
int n;
|
|
- int priority;
|
|
- int had_match;
|
|
+ int prio;
|
|
|
|
+ prio = 0;
|
|
mime_type = NULL;
|
|
- priority = 0;
|
|
- had_match = 0;
|
|
for (match = mime_magic->match_list; match; match = match->next)
|
|
{
|
|
if (_xdg_mime_magic_match_compare_to_data (match, data, len))
|
|
{
|
|
- if (!had_match || match->priority > priority ||
|
|
- (mime_type != NULL && _xdg_mime_mime_type_subclass (match->mime_type, mime_type)))
|
|
- {
|
|
- mime_type = match->mime_type;
|
|
- priority = match->priority;
|
|
- }
|
|
- else if (had_match && match->priority == priority)
|
|
- /* multiple unrelated patterns with the same priority matched,
|
|
- * so we can't tell what type this is. */
|
|
- mime_type = NULL;
|
|
-
|
|
- had_match = 1;
|
|
+ prio = match->priority;
|
|
+ mime_type = match->mime_type;
|
|
+ break;
|
|
}
|
|
else
|
|
{
|
|
@@ -702,6 +694,9 @@ _xdg_mime_magic_lookup_data (XdgMimeMagi
|
|
mime_type = mime_types[n];
|
|
}
|
|
}
|
|
+
|
|
+ if (result_prio)
|
|
+ *result_prio = prio;
|
|
|
|
return mime_type;
|
|
}
|
|
diff -up gnome-vfs-2.22.0/libgnomevfs/xdgmimemagic.h.xdgmime gnome-vfs-2.22.0/libgnomevfs/xdgmimemagic.h
|
|
--- gnome-vfs-2.22.0/libgnomevfs/xdgmimemagic.h.xdgmime 2008-03-10 15:12:45.000000000 -0400
|
|
+++ gnome-vfs-2.22.0/libgnomevfs/xdgmimemagic.h 2008-07-24 10:42:40.000000000 -0400
|
|
@@ -33,12 +33,12 @@
|
|
typedef struct XdgMimeMagic XdgMimeMagic;
|
|
|
|
#ifdef XDG_PREFIX
|
|
-#define _xdg_mime_glob_read_from_file XDG_ENTRY(glob_read_from_file)
|
|
-#define _xdg_mime_magic_new XDG_ENTRY(magic_new)
|
|
-#define _xdg_mime_magic_read_from_file XDG_ENTRY(magic_read_from_file)
|
|
-#define _xdg_mime_magic_free XDG_ENTRY(magic_free)
|
|
-#define _xdg_mime_magic_get_buffer_extents XDG_ENTRY(magic_get_buffer_extents)
|
|
-#define _xdg_mime_magic_lookup_data XDG_ENTRY(magic_lookup_data)
|
|
+#define _xdg_mime_glob_read_from_file XDG_RESERVED_ENTRY(glob_read_from_file)
|
|
+#define _xdg_mime_magic_new XDG_RESERVED_ENTRY(magic_new)
|
|
+#define _xdg_mime_magic_read_from_file XDG_RESERVED_ENTRY(magic_read_from_file)
|
|
+#define _xdg_mime_magic_free XDG_RESERVED_ENTRY(magic_free)
|
|
+#define _xdg_mime_magic_get_buffer_extents XDG_RESERVED_ENTRY(magic_get_buffer_extents)
|
|
+#define _xdg_mime_magic_lookup_data XDG_RESERVED_ENTRY(magic_lookup_data)
|
|
#endif
|
|
|
|
|
|
@@ -50,6 +50,7 @@ int _xdg_mime_magic_get_buffer
|
|
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);
|
|
|
|
diff -up gnome-vfs-2.22.0/libgnomevfs/xdgmimeparent.c.xdgmime gnome-vfs-2.22.0/libgnomevfs/xdgmimeparent.c
|
|
--- gnome-vfs-2.22.0/libgnomevfs/xdgmimeparent.c.xdgmime 2008-03-10 15:12:45.000000000 -0400
|
|
+++ gnome-vfs-2.22.0/libgnomevfs/xdgmimeparent.c 2008-07-24 10:42:40.000000000 -0400
|
|
@@ -26,7 +26,7 @@
|
|
*/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
-#include <config.h>
|
|
+#include "config.h"
|
|
#endif
|
|
|
|
#include "xdgmimeparent.h"
|
|
diff -up gnome-vfs-2.22.0/libgnomevfs/xdgmimeparent.h.xdgmime gnome-vfs-2.22.0/libgnomevfs/xdgmimeparent.h
|
|
--- gnome-vfs-2.22.0/libgnomevfs/xdgmimeparent.h.xdgmime 2008-03-10 15:12:45.000000000 -0400
|
|
+++ gnome-vfs-2.22.0/libgnomevfs/xdgmimeparent.h 2008-07-24 10:42:40.000000000 -0400
|
|
@@ -33,10 +33,11 @@
|
|
typedef struct XdgParentList XdgParentList;
|
|
|
|
#ifdef XDG_PREFIX
|
|
-#define _xdg_mime_parent_read_from_file XDG_ENTRY(parent_read_from_file)
|
|
-#define _xdg_mime_parent_list_new XDG_ENTRY(parent_list_new)
|
|
-#define _xdg_mime_parent_list_free XDG_ENTRY(parent_list_free)
|
|
-#define _xdg_mime_parent_list_lookup XDG_ENTRY(parent_list_lookup)
|
|
+#define _xdg_mime_parent_read_from_file XDG_RESERVED_ENTRY(parent_read_from_file)
|
|
+#define _xdg_mime_parent_list_new XDG_RESERVED_ENTRY(parent_list_new)
|
|
+#define _xdg_mime_parent_list_free XDG_RESERVED_ENTRY(parent_list_free)
|
|
+#define _xdg_mime_parent_list_lookup XDG_RESERVED_ENTRY(parent_list_lookup)
|
|
+#define _xdg_mime_parent_list_dump XDG_RESERVED_ENTRY(parent_list_dump)
|
|
#endif
|
|
|
|
void _xdg_mime_parent_read_from_file (XdgParentList *list,
|