summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--daemon/Makefile.am3
-rw-r--r--daemon/gvfsbackendmtp.c35
-rw-r--r--daemon/gvfsbackendmtp.h3
3 files changed, 31 insertions, 10 deletions
diff --git a/daemon/Makefile.am b/daemon/Makefile.am
index c6dd5ca9..1ef61398 100644
--- a/daemon/Makefile.am
+++ b/daemon/Makefile.am
@@ -495,7 +495,8 @@ gvfsd_mtp_CPPFLAGS = \
-DBACKEND_TYPES='"mtp", G_VFS_TYPE_BACKEND_MTP,' \
$(GUDEV_CFLAGS) $(LIBMTP_CFLAGS)
-gvfsd_mtp_LDADD = $(libraries) $(GUDEV_LIBS) $(LIBMTP_LIBS)
+gvfsd_mtp_LDADD = $(libraries) $(GUDEV_LIBS) $(LIBMTP_LIBS) \
+ $(top_builddir)/common/libgvfscommon-gphoto2.la
gvfsd_http_SOURCES = \
gvfshttpinputstream.c gvfshttpinputstream.h \
diff --git a/daemon/gvfsbackendmtp.c b/daemon/gvfsbackendmtp.c
index 8f1c4df6..9f1d84de 100644
--- a/daemon/gvfsbackendmtp.c
+++ b/daemon/gvfsbackendmtp.c
@@ -54,6 +54,7 @@
#include "gvfsjobcreatemonitor.h"
#include "gvfsjobmakedirectory.h"
#include "gvfsmonitor.h"
+#include "gvfsgphoto2utils.h"
/* ------------------------------------------------------------------------------------------------- */
@@ -785,9 +786,10 @@ mtp_heartbeat (GVfsBackendMtp *backend)
}
static char *
-get_dev_path_from_host (GVfsJob *job,
- GUdevClient *gudev_client,
- const char *host)
+get_dev_path_and_device_from_host (GVfsJob *job,
+ GUdevClient *gudev_client,
+ const char *host,
+ GUdevDevice **device)
{
/* turn usb:001,041 string into an udev device name */
if (!g_str_has_prefix (host, "[usb:")) {
@@ -811,15 +813,14 @@ get_dev_path_from_host (GVfsJob *job,
DEBUG ("(II) get_dev_path_from_host: Parsed '%s' into device name %s\n", host, dev_path);
/* find corresponding GUdevDevice */
- GUdevDevice *device = g_udev_client_query_by_device_file (gudev_client, dev_path);
- if (!device) {
+ *device = g_udev_client_query_by_device_file (gudev_client, dev_path);
+ if (!*device) {
g_free (dev_path);
g_vfs_job_failed_literal (G_VFS_JOB (job),
G_IO_ERROR, G_IO_ERROR_NOT_FOUND,
_("Couldn't find matching udev device."));
return NULL;
}
- g_object_unref (device);
return dev_path;
}
@@ -832,6 +833,7 @@ do_mount (GVfsBackend *backend,
gboolean is_automount)
{
GVfsBackendMtp *op_backend = G_VFS_BACKEND_MTP (backend);
+ GUdevDevice *device;
DEBUG ("(I) do_mount\n");
@@ -851,7 +853,10 @@ do_mount (GVfsBackend *backend,
return;
}
- char *dev_path = get_dev_path_from_host (G_VFS_JOB (job), op_backend->gudev_client, host);
+ char *dev_path = get_dev_path_and_device_from_host (G_VFS_JOB (job),
+ op_backend->gudev_client,
+ host,
+ &device);
if (dev_path == NULL) {
g_object_unref (op_backend->gudev_client);
/* get_dev_path_from_host() sets job state. */
@@ -859,6 +864,11 @@ do_mount (GVfsBackend *backend,
}
op_backend->dev_path = dev_path;
+ op_backend->volume_name = g_vfs_get_volume_name (device, "ID_MTP");
+ op_backend->volume_icon = g_vfs_get_volume_icon (device);
+ op_backend->volume_symbolic_icon = g_vfs_get_volume_symbolic_icon (device);
+ g_object_unref (device);
+
op_backend->on_uevent_id =
g_signal_connect_object (op_backend->gudev_client, "uevent",
G_CALLBACK (on_uevent), op_backend, 0);
@@ -928,6 +938,9 @@ do_unmount (GVfsBackend *backend, GVfsJobUnmount *job,
op_backend->on_uevent_id);
g_object_unref (op_backend->gudev_client);
g_clear_pointer (&op_backend->dev_path, g_free);
+ g_clear_pointer (&op_backend->volume_name, g_free);
+ g_clear_pointer (&op_backend->volume_icon, g_free);
+ g_clear_pointer (&op_backend->volume_symbolic_icon, g_free);
LIBMTP_Release_Device (op_backend->device);
g_mutex_unlock (&op_backend->mutex);
@@ -1063,16 +1076,20 @@ get_device_info (GVfsBackendMtp *backend, GFileInfo *info)
char *friendlyname = LIBMTP_Get_Friendlyname (device);
g_file_info_set_display_name (info, friendlyname == NULL ?
- _("Unnamed Device") : friendlyname);
+ backend->volume_name : friendlyname);
free (friendlyname);
g_file_info_set_content_type (info, "inode/directory");
g_file_info_set_size (info, 0);
- GIcon *icon = g_themed_icon_new ("multimedia-player");
+ GIcon *icon = g_themed_icon_new (backend->volume_icon);
g_file_info_set_icon (info, icon);
g_object_unref (icon);
+ icon = g_themed_icon_new (backend->volume_symbolic_icon);
+ g_file_info_set_symbolic_icon (info, icon);
+ g_object_unref (icon);
+
g_file_info_set_attribute_boolean (info, G_FILE_ATTRIBUTE_ACCESS_CAN_READ, TRUE);
g_file_info_set_attribute_boolean (info, G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE, FALSE);
g_file_info_set_attribute_boolean (info, G_FILE_ATTRIBUTE_ACCESS_CAN_DELETE, FALSE);
diff --git a/daemon/gvfsbackendmtp.h b/daemon/gvfsbackendmtp.h
index ce2159d8..c45618b8 100644
--- a/daemon/gvfsbackendmtp.h
+++ b/daemon/gvfsbackendmtp.h
@@ -52,6 +52,9 @@ struct _GVfsBackendMtp
GMutex mutex;
LIBMTP_mtpdevice_t *device;
char *dev_path;
+ char *volume_name;
+ char *volume_icon;
+ char *volume_symbolic_icon;
GHashTable *file_cache;