summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomas Bzatek <tbzatek@redhat.com>2009-03-09 17:26:25 +0100
committerTomas Bzatek <tbzatek@redhat.com>2009-03-09 17:26:25 +0100
commitacf6257fd280266c8a4618b3830c9bfbd974d74f (patch)
tree7c7dc6d7dc41ba4c8f42f255122157db2787f22b
parentd41de27fbc89a5dea19a1bcd9e30fc82ad7b68ec (diff)
downloadnautilus-gdu-acf6257fd280266c8a4618b3830c9bfbd974d74f.tar.gz
nautilus-gdu-acf6257fd280266c8a4618b3830c9bfbd974d74f.tar.xz
nautilus-gdu-acf6257fd280266c8a4618b3830c9bfbd974d74f.zip
Handle G_FILE_ATTRIBUTE_MOUNTABLE_UNIX_DEVICE_FILE from gdu-based gvfs
-rw-r--r--TODO5
-rw-r--r--src/nautilus-gdu.c159
2 files changed, 57 insertions, 107 deletions
diff --git a/TODO b/TODO
index 233f2db..079e07d 100644
--- a/TODO
+++ b/TODO
@@ -17,7 +17,8 @@ Standalone mode:
DONE - carefully count references (valgrind)
DONE - UI cleanup: get rid of those twin icons (show them only when expanded)
find a way how to expand the combo box to full width
- - desktop file + icon
+ DONE - desktop file
+ - icon
DONE - display insensitive placeholder item "Please select a volume to format"
@@ -26,7 +27,7 @@ Standalone mode:
DONE, NEEDS_TESTING - monitor device/presentable events like eject, umount etc. (try to pull the USB key out and window should disappear)
- show custom icon if user has set it in Nautilus
- is firmware needed for some devices?
-- different partition tables?
+DONE - different partition tables?
DONE - what to do if device is blank (zeroed, no MBR)?
DONE - handle read only device - gdu_device_is_read_only() - test with DVD-RAM media
- stay consistent with volume labels in Nautilus and gdu (requires gvfs-devicekit port)
diff --git a/src/nautilus-gdu.c b/src/nautilus-gdu.c
index d006a7e..39c396b 100644
--- a/src/nautilus-gdu.c
+++ b/src/nautilus-gdu.c
@@ -41,6 +41,8 @@ static void nautilus_gdu_class_init (NautilusGDUClass *class);
static GType nautilus_gdu_type = 0;
+/* TODO: push upstream */
+#define G_FILE_ATTRIBUTE_MOUNTABLE_UNIX_DEVICE_FILE "mountable::unix-device-file"
@@ -53,30 +55,37 @@ find_presentable_from_file (NautilusFileInfo *nautilus_file)
GFileInfo *info;
GError *error;
GFileType file_type;
+ GMount *mount;
+ GVolume *volume;
char *mount_path = NULL;
+ char *device_file = NULL;
g_return_val_if_fail (nautilus_file != NULL, NULL);
file = nautilus_file_info_get_location (nautilus_file);
g_return_val_if_fail (file != NULL, NULL);
file_type = nautilus_file_info_get_file_type (nautilus_file);
-#if 0
- /* is file native? (not local, but at least locally mounted) */
- if (! g_file_is_native (file)) {
- g_object_unref (file);
- return NULL;
- }
-#endif
-
/* first try to find mount target from a mountable */
if (file_type == G_FILE_TYPE_MOUNTABLE || file_type == G_FILE_TYPE_SHORTCUT) {
- mount_path = nautilus_file_info_get_activation_uri (nautilus_file);
- if (mount_path == NULL) {
- error = NULL;
+ /* get a mount if exists and extract device file from it */
+ mount = nautilus_file_info_get_mount (nautilus_file);
+ if (mount) {
+ mount_path = nautilus_file_info_get_activation_uri (nautilus_file);
+ volume = g_mount_get_volume (mount);
+ if (volume) {
+ device_file = g_volume_get_identifier (volume, "unix-device");
+ g_object_unref (volume);
+ }
+ g_object_unref (mount);
+ }
- /* TODO: retrieve HAL/DeviceKit device ID for non-mounted devices */
- info = g_file_query_info (file, G_FILE_ATTRIBUTE_STANDARD_TARGET_URI, G_FILE_QUERY_INFO_NONE, NULL, &error);
+ /* not mounted, assuming we've been spawned from computer:// */
+ if (mount_path == NULL && device_file == NULL) {
+ error = NULL;
+ /* retrieve DeviceKit device ID for non-mounted devices */
+ info = g_file_query_info (file, G_FILE_ATTRIBUTE_STANDARD_TARGET_URI "," G_FILE_ATTRIBUTE_MOUNTABLE_UNIX_DEVICE_FILE, G_FILE_QUERY_INFO_NONE, NULL, &error);
if (info) {
+ device_file = g_file_info_get_attribute_as_string (info, G_FILE_ATTRIBUTE_MOUNTABLE_UNIX_DEVICE_FILE);
mount_path = g_file_info_get_attribute_as_string (info, G_FILE_ATTRIBUTE_STANDARD_TARGET_URI);
g_object_unref (info);
}
@@ -102,10 +111,17 @@ find_presentable_from_file (NautilusFileInfo *nautilus_file)
}
}
- if (mount_path) {
+
+ if (device_file)
+ presentable = find_presentable_from_device_path (device_file);
+ else
+ if (mount_path)
presentable = find_presentable_from_mount_path (mount_path);
+
+ if (device_file)
+ g_free (device_file);
+ if (mount_path)
g_free (mount_path);
- }
g_object_unref (file);
return presentable;
@@ -123,110 +139,30 @@ format_callback (NautilusMenuItem *item,
nautilus_gdu_spawn_dialog (presentable, FALSE);
}
-static GList *
-nautilus_gdu_get_background_items (NautilusMenuProvider *provider,
- GtkWidget *window,
- NautilusFileInfo *file_info)
-{
-// g_print ("nautilus_gdu_get_background_items\n");
- /* not used */
- return NULL;
-}
-
GList *
nautilus_gdu_get_file_items (NautilusMenuProvider *provider,
GtkWidget *window,
GList *files)
{
NautilusMenuItem *item;
- GTimeVal start_time, stop_time;
-
- g_get_current_time (&start_time);
+ GduPresentable *presentable;
if (g_list_length (files) != 1) {
return NULL;
}
-
-#if 0
- g_print ("nautilus_gdu_get_file_items: item[0] uri '%s', type = %d, activation_uri '%s', name '%s'\n",
- nautilus_file_info_get_uri (files->data),
- nautilus_file_info_get_file_type (files->data),
- nautilus_file_info_get_activation_uri (files->data),
- nautilus_file_info_get_name (files->data));
-
- GError *error = NULL;
- GMount *mount;
- mount = g_file_find_enclosing_mount (nautilus_file_info_get_location(files->data), NULL, &error);
- g_print ("nautilus_gdu_get_file_items: mount = %p\n", mount);
- if (error) {
- g_print ("nautilus_gdu_get_file_items: error = %s\n", error->message);
- }
-
- GFileInfo *info;
-
- error = NULL;
- info = g_file_query_info (nautilus_file_info_get_location (files->data),
- G_FILE_ATTRIBUTE_STANDARD_TARGET_URI "," G_FILE_ATTRIBUTE_ID_FILE ","
- G_FILE_ATTRIBUTE_ID_FILESYSTEM "," G_FILE_ATTRIBUTE_MOUNTABLE_UNIX_DEVICE ","
- G_FILE_ATTRIBUTE_MOUNTABLE_HAL_UDI "," G_FILE_ATTRIBUTE_UNIX_DEVICE ","
- G_FILE_ATTRIBUTE_UNIX_IS_MOUNTPOINT, G_FILE_QUERY_INFO_NONE, NULL, &error);
- if (info) {
- g_print ("nautilus_gdu_get_file_items: G_FILE_ATTRIBUTE_STANDARD_TARGET_URI = %s\n", g_file_info_get_attribute_as_string (info, G_FILE_ATTRIBUTE_STANDARD_TARGET_URI));
- g_print ("nautilus_gdu_get_file_items: G_FILE_ATTRIBUTE_ID_FILE = %s\n", g_file_info_get_attribute_as_string (info, G_FILE_ATTRIBUTE_ID_FILE));
- g_print ("nautilus_gdu_get_file_items: G_FILE_ATTRIBUTE_ID_FILESYSTEM = %s\n", g_file_info_get_attribute_as_string (info, G_FILE_ATTRIBUTE_ID_FILESYSTEM));
- g_print ("nautilus_gdu_get_file_items: G_FILE_ATTRIBUTE_MOUNTABLE_UNIX_DEVICE = %d\n", g_file_info_get_attribute_uint32 (info, G_FILE_ATTRIBUTE_MOUNTABLE_UNIX_DEVICE));
- g_print ("nautilus_gdu_get_file_items: G_FILE_ATTRIBUTE_MOUNTABLE_HAL_UDI = %s\n", g_file_info_get_attribute_as_string (info, G_FILE_ATTRIBUTE_MOUNTABLE_HAL_UDI));
- g_print ("nautilus_gdu_get_file_items: G_FILE_ATTRIBUTE_UNIX_DEVICE = %d\n", g_file_info_get_attribute_uint32 (info, G_FILE_ATTRIBUTE_UNIX_DEVICE));
- g_print ("nautilus_gdu_get_file_items: G_FILE_ATTRIBUTE_UNIX_IS_MOUNTPOINT = %d\n", g_file_info_get_attribute_boolean (info, G_FILE_ATTRIBUTE_UNIX_IS_MOUNTPOINT));
- }
- if (error) {
- g_print ("nautilus_gdu_get_file_items: error = %s\n", error->message);
- }
-
-
- /* GDU stuff */
- GduPool *pool;
- GList *presentables;
- GduPresentable *presentable;
- GduDevice *device;
-
- pool = gdu_pool_new ();
- presentables = gdu_pool_get_presentables (pool);
-
-
-
- while (presentables != NULL) {
- presentable = presentables->data;
- device = gdu_presentable_get_device (presentable);
- g_print ("nautilus_gdu_get_file_items: found presentable name '%s', mounted as %s, \n device %s, object_path %s, uuid %s\n",
- gdu_presentable_get_name (presentable), gdu_device_get_mount_path (device), gdu_device_get_device_file (device),
- gdu_device_get_object_path (device), gdu_device_id_get_uuid (device));
- g_object_unref (device);
- g_object_unref (presentable);
- presentables = g_list_next (presentables);
- }
-
-
- if (presentables)
- g_list_free (presentables);
- g_object_unref (pool);
-
-#else
- GduPresentable *presentable;
-#endif
-
-
presentable = find_presentable_from_file (files->data);
-
- g_get_current_time (&stop_time);
- g_print ("I spent %ld ms searching for DK presentable\n", (stop_time.tv_sec - start_time.tv_sec) * 1000 + (stop_time.tv_usec - start_time.tv_usec) / 1000);
-
if (! presentable)
return NULL;
- item = nautilus_menu_item_new ("NautilusGDU::format", _("_Format..."), _("Open dummy dialog"), "palimpsest");
- g_object_set_data (G_OBJECT (item), "NautilusGDU::screen", gtk_widget_get_screen (window));
+ /* TODO: icon */
+ item = nautilus_menu_item_new ("NautilusGDU::format",
+ _("_Format..."),
+ _("Create new filesystem on the selected device"),
+ "palimpsest");
+ g_object_set_data (G_OBJECT (item),
+ "NautilusGDU::screen",
+ gtk_widget_get_screen (window));
g_object_set_data_full (G_OBJECT (item), "presentable",
g_object_ref (presentable),
(GDestroyNotify) g_object_unref);
@@ -240,6 +176,7 @@ nautilus_gdu_get_file_items (NautilusMenuProvider *provider,
}
+#if 0
GList *
nautilus_gdu_get_toolbar_items (NautilusMenuProvider *provider,
GtkWidget *window,
@@ -250,13 +187,25 @@ nautilus_gdu_get_toolbar_items (NautilusMenuProvider *provider,
return NULL;
}
+static GList *
+nautilus_gdu_get_background_items (NautilusMenuProvider *provider,
+ GtkWidget *window,
+ NautilusFileInfo *file_info)
+{
+ g_print ("nautilus_gdu_get_background_items\n");
+ /* not used */
+ return NULL;
+}
+#endif
static void
nautilus_gdu_menu_provider_iface_init (NautilusMenuProviderIface *iface)
{
- iface->get_background_items = nautilus_gdu_get_background_items;
iface->get_file_items = nautilus_gdu_get_file_items;
+#if 0
+ iface->get_background_items = nautilus_gdu_get_background_items;
iface->get_toolbar_items = nautilus_gdu_get_toolbar_items;
+#endif
}
static void