Skip to content

Instantly share code, notes, and snippets.

@roman-yepishev
Created September 10, 2013 05:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save roman-yepishev/6505376 to your computer and use it in GitHub Desktop.
Save roman-yepishev/6505376 to your computer and use it in GitHub Desktop.
Set content type for files uploaded via gvfs-mtp
diff -ur ../gvfs-1.16.3.orig/daemon/gvfsbackendmtp.c ./daemon/gvfsbackendmtp.c
--- ../gvfs-1.16.3.orig/daemon/gvfsbackendmtp.c 2013-09-10 08:20:43.199638261 +0300
+++ ./daemon/gvfsbackendmtp.c 2013-09-10 08:27:06.859955187 +0300
@@ -33,6 +33,7 @@
#include <glib/gstdio.h>
#include <glib/gi18n.h>
#include <gio/gio.h>
+#include <glib.h>
#include <libmtp.h>
@@ -111,11 +112,38 @@
G_DEFINE_TYPE (GVfsBackendMtp, g_vfs_backend_mtp, G_VFS_TYPE_BACKEND)
+static struct {
+ char *key;
+ LIBMTP_filetype_t value;
+} _content_type_map[] = {
+ { "audio/mpeg", LIBMTP_FILETYPE_MP3 },
+ { "audio/ogg", LIBMTP_FILETYPE_OGG },
+ { "audio/x-wav", LIBMTP_FILETYPE_WAV },
+ { "audio/aac", LIBMTP_FILETYPE_AAC },
+ { "audio/flac", LIBMTP_FILETYPE_FLAC },
+ { "text/plain", LIBMTP_FILETYPE_TEXT },
+ { "text/html", LIBMTP_FILETYPE_HTML },
+ { (char *)NULL, 0 }
+};
+
+GDestroyNotify
+g_vfs_backend_mtp_map_value_free(gpointer value) {
+ if (value) {
+ free(value);
+ }
+}
+
static void
g_vfs_backend_mtp_init (GVfsBackendMtp *backend)
{
DEBUG ("(I) g_vfs_backend_mtp_init");
GMountSpec *mount_spec;
+ GHashTable *content_type_map = g_hash_table_new_full(g_str_hash,
+ g_str_equal,
+ NULL,
+ (GDestroyNotify) g_vfs_backend_mtp_map_value_free);
+ int i = 0;
+ LIBMTP_filetype_t filetype = LIBMTP_FILETYPE_UNKNOWN;
g_mutex_init (&backend->mutex);
g_vfs_backend_set_display_name (G_VFS_BACKEND (backend), "mtp");
@@ -127,6 +155,17 @@
backend->monitors = g_hash_table_new (NULL, NULL);
+ while (_content_type_map[i].key != NULL) {
+ LIBMTP_filetype_t *file_type = malloc(sizeof(LIBMTP_filetype_t));
+ *file_type = _content_type_map[i].value;
+
+ g_hash_table_insert(content_type_map, _content_type_map[i].key, file_type);
+
+ i++;
+ }
+
+ backend->content_type_map = content_type_map;
+
DEBUG ("(I) g_vfs_backend_mtp_init done.");
}
@@ -151,6 +190,8 @@
g_hash_table_unref (backend->monitors);
g_mutex_clear (&backend->mutex);
+ g_hash_table_destroy(backend->content_type_map);
+
(*G_OBJECT_CLASS (g_vfs_backend_mtp_parent_class)->finalize) (object);
DEBUG ("(I) g_vfs_backend_mtp_finalize done.");
@@ -1298,7 +1339,7 @@
}
GError *error = NULL;
- info = g_file_query_info (file, G_FILE_ATTRIBUTE_STANDARD_SIZE,
+ info = g_file_query_info (file, G_FILE_ATTRIBUTE_STANDARD_SIZE "," G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
G_FILE_QUERY_INFO_NONE,
G_VFS_JOB (job)->cancellable,
&error);
@@ -1312,7 +1353,17 @@
mtpfile->filename = strdup (elements[ne-1]);
mtpfile->parent_id = parent_id;
mtpfile->storage_id = strtol (elements[1], NULL, 10);
- mtpfile->filetype = LIBMTP_FILETYPE_UNKNOWN;
+
+ LIBMTP_filetype_t *filetype = NULL;
+ filetype = g_hash_table_lookup(G_VFS_BACKEND_MTP(backend)->content_type_map,
+ g_file_info_get_content_type(info));
+
+ if (filetype != NULL) {
+ mtpfile->filetype = *filetype;
+ } else {
+ mtpfile->filetype = LIBMTP_FILETYPE_UNKNOWN;
+ }
+
mtpfile->filesize = g_file_info_get_size (info);
MtpProgressData mtp_progress_data;
diff -ur ../gvfs-1.16.3.orig/daemon/gvfsbackendmtp.h ./daemon/gvfsbackendmtp.h
--- ../gvfs-1.16.3.orig/daemon/gvfsbackendmtp.h 2013-09-10 08:20:43.104636511 +0300
+++ ./daemon/gvfsbackendmtp.h 2013-09-10 08:19:58.555899863 +0300
@@ -57,6 +57,8 @@
GHashTable *monitors;
guint hb_id;
gint unmount_started;
+
+ GHashTable *content_type_map;
};
struct _GVfsBackendMtpClass
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment