summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Faure <faure@kde.org>2011-09-29 17:26:33 +0200
committerDavid Faure <faure@kde.org>2011-09-29 17:26:33 +0200
commit5181175d5fdaa3832b0fd094cda0120b1fe92af6 (patch)
tree791d4e3796d3ff7ea54c6c4b63edb83edef3bddf
parent755fb0b6698af8a8a3b9c633572561ccce0f5402 (diff)
Implement text vs binary fallback; support for application/x-zerosize
-rw-r--r--src/xdgmime.c18
-rw-r--r--src/xdgmime.h6
-rw-r--r--src/xdgmimecache.c9
-rw-r--r--src/xdgmimeint.c15
-rw-r--r--src/xdgmimeint.h1
5 files changed, 42 insertions, 7 deletions
diff --git a/src/xdgmime.c b/src/xdgmime.c
index c3b21cb..c7b16bb 100644
--- a/src/xdgmime.c
+++ b/src/xdgmime.c
@@ -66,2 +66,4 @@ static int n_caches = 0;
const char xdg_mime_type_unknown[] = "application/octet-stream";
+const char xdg_mime_type_empty[] = "application/x-zerosize";
+const char xdg_mime_type_textplain[] = "text/plain";
@@ -469,2 +471,8 @@ xdg_mime_get_mime_type_for_data (const void *data,
+ if (len == 0)
+ {
+ *result_prio = 100;
+ return XDG_MIME_TYPE_EMPTY;
+ }
+
xdg_mime_init ();
@@ -472,5 +480,5 @@ xdg_mime_get_mime_type_for_data (const void *data,
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);
+ 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);
@@ -479,3 +487,3 @@ xdg_mime_get_mime_type_for_data (const void *data,
- return XDG_MIME_TYPE_UNKNOWN;
+ return _xdg_binary_or_text_fallback(data, len);
}
@@ -558,3 +566,3 @@ xdg_mime_get_mime_type_for_file (const char *file_name,
- return XDG_MIME_TYPE_UNKNOWN;
+ return _xdg_binary_or_text_fallback(data, bytes_read);
}
diff --git a/src/xdgmime.h b/src/xdgmime.h
index d3031a3..6a34edf 100644
--- a/src/xdgmime.h
+++ b/src/xdgmime.h
@@ -70,2 +70,4 @@ typedef void (*XdgMimeDestroy) (void *user_data);
#define xdg_mime_type_unknown XDG_ENTRY(type_unknown)
+#define xdg_mime_type_empty XDG_ENTRY(type_empty)
+#define xdg_mime_type_textplain XDG_ENTRY(type_textplain)
#define xdg_mime_get_icon XDG_ENTRY(get_icon)
@@ -79,3 +81,7 @@ typedef void (*XdgMimeDestroy) (void *user_data);
extern const char xdg_mime_type_unknown[];
+extern const char xdg_mime_type_empty[];
+extern const char xdg_mime_type_textplain[];
#define XDG_MIME_TYPE_UNKNOWN xdg_mime_type_unknown
+#define XDG_MIME_TYPE_EMPTY xdg_mime_type_empty
+#define XDG_MIME_TYPE_TEXTPLAIN xdg_mime_type_textplain
diff --git a/src/xdgmimecache.c b/src/xdgmimecache.c
index 1e99b3e..41b13e9 100644
--- a/src/xdgmimecache.c
+++ b/src/xdgmimecache.c
@@ -695,3 +695,2 @@ cache_get_mime_type_for_data (const void *data,
{
-
if (mime_types[n])
@@ -700,3 +699,3 @@ cache_get_mime_type_for_data (const void *data,
- return XDG_MIME_TYPE_UNKNOWN;
+ return NULL;
}
@@ -745,2 +744,5 @@ _xdg_mime_cache_get_mime_type_for_file (const char *file_name,
+ if (statbuf->st_size == 0)
+ return XDG_MIME_TYPE_EMPTY;
+
if (!S_ISREG (statbuf->st_mode))
@@ -774,2 +776,5 @@ _xdg_mime_cache_get_mime_type_for_file (const char *file_name,
+ if (!mime_type)
+ mime_type = _xdg_binary_or_text_fallback(data, bytes_read);
+
free (data);
diff --git a/src/xdgmimeint.c b/src/xdgmimeint.c
index d372d2c..cf789d9 100644
--- a/src/xdgmimeint.c
+++ b/src/xdgmimeint.c
@@ -191 +191,16 @@ _xdg_reverse_ucs4 (xdg_unichar_t *source, int len)
+const char *
+_xdg_binary_or_text_fallback(const void *data, size_t len)
+{
+ unsigned char *chardata;
+ int i;
+
+ chardata = (unsigned char *) data;
+ for (i = 0; i < 32 && i < len; ++i)
+ {
+ if (chardata[i] < 32 && chardata[i] != 9 && chardata[i] != 10 && chardata[i] != 13)
+ return XDG_MIME_TYPE_UNKNOWN; /* binary data */
+ }
+
+ return XDG_MIME_TYPE_TEXTPLAIN;
+}
diff --git a/src/xdgmimeint.h b/src/xdgmimeint.h
index 232c808..9e8b2cb 100644
--- a/src/xdgmimeint.h
+++ b/src/xdgmimeint.h
@@ -75,2 +75,3 @@ void _xdg_reverse_ucs4 (xdg_unichar_t *source, int len);
const char *_xdg_get_base_name (const char *file_name);
+const char *_xdg_binary_or_text_fallback(const void *data, size_t len);