static gboolean default_can_eject (RBDeviceSource *source) { gboolean result = FALSE; GVolume *volume = NULL; GMount *mount = NULL; if (g_object_class_find_property (G_OBJECT_GET_CLASS (source), "volume")) { g_object_get (source, "volume", &volume, NULL); } if (g_object_class_find_property (G_OBJECT_GET_CLASS (source), "mount")) { g_object_get (source, "mount", &mount, NULL); } if (volume != NULL) { result = g_volume_can_eject (volume); g_object_unref (volume); if (mount != NULL) { g_object_unref (mount); } } else if (mount != NULL) { result = g_mount_can_eject (mount) || g_mount_can_unmount (mount); if (mount != NULL) { g_object_unref (mount); } } return result; }
static gboolean rb_removable_media_manager_source_can_eject (RBRemovableMediaManager *mgr) { RBRemovableMediaManagerPrivate *priv = GET_PRIVATE (mgr); GVolume *volume; GMount *mount; gboolean result; if (RB_IS_REMOVABLE_MEDIA_SOURCE (priv->selected_source) == FALSE) { return FALSE; } g_object_get (priv->selected_source, "volume", &volume, NULL); if (volume != NULL) { result = g_volume_can_eject (volume); g_object_unref (volume); return result; } g_object_get (priv->selected_source, "mount", &mount, NULL); if (mount != NULL) { result = g_mount_can_eject (mount) || g_mount_can_unmount (mount); g_object_unref (mount); return result; } return FALSE; }
static void rb_removable_media_manager_cmd_eject_medium (GtkAction *action, RBRemovableMediaManager *mgr) { RBRemovableMediaManagerPrivate *priv = GET_PRIVATE (mgr); RBRemovableMediaSource *source = RB_REMOVABLE_MEDIA_SOURCE (priv->selected_source); GVolume *volume; GMount *mount; /* try ejecting based on volume first, then based on the mount, * and finally try unmounting. */ g_object_get (source, "volume", &volume, NULL); if (volume != NULL) { if (g_volume_can_eject (volume)) { rb_debug ("ejecting volume"); g_volume_eject (volume, G_MOUNT_UNMOUNT_NONE, NULL, (GAsyncReadyCallback) rb_removable_media_manager_eject_cb, g_object_ref (mgr)); } else { /* this should never happen; the eject command will be * insensitive if the selected source cannot be ejected. */ rb_debug ("don't know what to do with this volume"); } g_object_unref (volume); return; } g_object_get (source, "mount", &mount, NULL); if (mount != NULL) { if (g_mount_can_eject (mount)) { rb_debug ("ejecting mount"); g_mount_eject (mount, G_MOUNT_UNMOUNT_NONE, NULL, (GAsyncReadyCallback) rb_removable_media_manager_eject_cb, g_object_ref (mgr)); } else if (g_mount_can_unmount (mount)) { rb_debug ("unmounting mount"); g_mount_unmount (mount, G_MOUNT_UNMOUNT_NONE, NULL, (GAsyncReadyCallback) rb_removable_media_manager_unmount_cb, g_object_ref (mgr)); } else { /* this should never happen; the eject command will be * insensitive if the selected source cannot be ejected. */ rb_debug ("don't know what to do with this mount"); } g_object_unref (mount); } }
void vfs_backend_unmount (const gchar *cURI, int iVolumeID, CairoDockFMMountCallback pCallback, Icon *icon, CairoContainer *pContainer) { g_return_if_fail (cURI != NULL); cd_message ("%s (%s)", __func__, cURI); gchar *cTargetURI = NULL; GMount *pMount = _cd_find_mount_from_uri (cURI, &cTargetURI); if (pMount == NULL || ! G_IS_MOUNT (pMount)) { return ; } if ( ! g_mount_can_unmount (pMount)) return ; gboolean bCanEject = g_mount_can_eject (pMount); gboolean bCanUnmount = g_mount_can_unmount (pMount); cd_message ("eject:%d / unmount:%d\n", bCanEject, bCanUnmount); if (! bCanEject && ! bCanUnmount) return ; gpointer *data2 = g_new (gpointer, 5); data2[0] = pCallback; data2[1] = GINT_TO_POINTER (bCanEject ? 2 : 0); data2[2] = g_mount_get_name (pMount); data2[3] = icon; data2[4] = pContainer; if (bCanEject) g_mount_eject (pMount, G_MOUNT_UNMOUNT_NONE, NULL, (GAsyncReadyCallback) _vfs_backend_mount_callback, data2); else g_mount_unmount (pMount, G_MOUNT_UNMOUNT_NONE , NULL, (GAsyncReadyCallback) _vfs_backend_mount_callback, data2); }
/** * eog_util_file_is_persistent: * @file: a #GFile * * Checks whether @file is a non-removable local mount. * * Returns: %TRUE if @file is in a non-removable mount, * %FALSE otherwise or when it is remote. **/ gboolean eog_util_file_is_persistent (GFile *file) { GMount *mount; if (!g_file_is_native (file)) return FALSE; mount = g_file_find_enclosing_mount (file, NULL, NULL); if (mount) { if (g_mount_can_unmount (mount)) { return FALSE; } } return TRUE; }
void GioLister::UnmountDevice(const QString &id) { QMutexLocker l(&mutex_); if (!devices_.contains(id)) return; const DeviceInfo& info = devices_[id]; if (!info.mount) return; if (info.volume) { if (g_volume_can_eject(info.volume)) { g_volume_eject_with_operation( info.volume, G_MOUNT_UNMOUNT_NONE, NULL, NULL, (GAsyncReadyCallback) VolumeEjectFinished, NULL); g_object_unref(info.volume); return; } } if (g_mount_can_eject(info.mount)) { g_mount_eject_with_operation( info.mount, G_MOUNT_UNMOUNT_NONE, NULL, NULL, (GAsyncReadyCallback) MountEjectFinished, NULL); } else if (g_mount_can_unmount(info.mount)) { g_mount_unmount_with_operation( info.mount, G_MOUNT_UNMOUNT_NONE, NULL, NULL, (GAsyncReadyCallback) MountUnmountFinished, NULL); } }
static void list_mounts (GList *mounts, int indent, gboolean only_with_no_volume) { GList *l; int c; GMount *mount; GVolume *volume; char *name, *uuid, *uri; GFile *root, *default_location; GIcon *icon; char **x_content_types; char *type_name; const gchar *sort_key; for (c = 0, l = mounts; l != NULL; l = l->next, c++) { mount = (GMount *) l->data; if (only_with_no_volume) { volume = g_mount_get_volume (mount); if (volume != NULL) { g_object_unref (volume); continue; } } name = g_mount_get_name (mount); root = g_mount_get_root (mount); uri = g_file_get_uri (root); g_print ("%*sMount(%d): %s -> %s\n", indent, "", c, name, uri); type_name = get_type_name (mount); g_print ("%*sType: %s\n", indent+2, "", type_name); g_free (type_name); if (extra_detail) { uuid = g_mount_get_uuid (mount); if (uuid) g_print ("%*suuid=%s\n", indent + 2, "", uuid); default_location = g_mount_get_default_location (mount); if (default_location) { char *loc_uri = g_file_get_uri (default_location); g_print ("%*sdefault_location=%s\n", indent + 2, "", loc_uri); g_free (loc_uri); g_object_unref (default_location); } icon = g_mount_get_icon (mount); if (icon) { if (G_IS_THEMED_ICON (icon)) show_themed_icon_names (G_THEMED_ICON (icon), indent + 2); g_object_unref (icon); } x_content_types = g_mount_guess_content_type_sync (mount, FALSE, NULL, NULL); if (x_content_types != NULL && g_strv_length (x_content_types) > 0) { int n; g_print ("%*sx_content_types:", indent + 2, ""); for (n = 0; x_content_types[n] != NULL; n++) g_print (" %s", x_content_types[n]); g_print ("\n"); } g_strfreev (x_content_types); g_print ("%*scan_unmount=%d\n", indent + 2, "", g_mount_can_unmount (mount)); g_print ("%*scan_eject=%d\n", indent + 2, "", g_mount_can_eject (mount)); g_print ("%*sis_shadowed=%d\n", indent + 2, "", g_mount_is_shadowed (mount)); sort_key = g_mount_get_sort_key (mount); if (sort_key != NULL) g_print ("%*ssort_key=%s\n", indent + 2, "", sort_key); g_free (uuid); } g_object_unref (root); g_free (name); g_free (uri); } }
static gboolean xfdesktop_volume_icon_populate_context_menu(XfdesktopIcon *icon, GtkWidget *menu) { XfdesktopVolumeIcon *volume_icon = XFDESKTOP_VOLUME_ICON(icon); GVolume *volume = volume_icon->priv->volume; GtkWidget *mi, *img; GMount *mount; const gchar *icon_name, *icon_label; icon_name = GTK_STOCK_OPEN; img = gtk_image_new_from_stock(GTK_STOCK_OPEN, GTK_ICON_SIZE_MENU); gtk_widget_show(img); mi = gtk_image_menu_item_new_with_mnemonic(_("_Open")); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(mi), img); gtk_widget_show(mi); gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi); g_signal_connect_swapped(G_OBJECT(mi), "activate", G_CALLBACK(xfdesktop_icon_activated), icon); mi = gtk_separator_menu_item_new(); gtk_widget_show(mi); gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi); mount = g_volume_get_mount(volume); if(mount && g_volume_can_eject(volume)) { icon_name = "media-eject"; icon_label = _("E_ject Volume"); xfdesktop_volume_icon_add_context_menu_option(icon, icon_name, icon_label, menu, G_CALLBACK(xfdesktop_volume_icon_menu_eject)); } if(mount && g_mount_can_unmount(mount)) { icon_name = NULL; icon_label = _("_Unmount Volume"); xfdesktop_volume_icon_add_context_menu_option(icon, icon_name, icon_label, menu, G_CALLBACK(xfdesktop_volume_icon_menu_unmount)); } if(!mount && g_volume_can_mount(volume)) { icon_name = NULL; icon_label = _("_Mount Volume"); xfdesktop_volume_icon_add_context_menu_option(icon, icon_name, icon_label, menu, G_CALLBACK(xfdesktop_volume_icon_menu_mount)); } if(mount) g_object_unref(mount); mi = gtk_separator_menu_item_new(); gtk_widget_show(mi); gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi); icon_name = GTK_STOCK_PROPERTIES; icon_label = _("P_roperties..."); if(!volume_icon->priv->file_info) xfdesktop_volume_icon_add_context_menu_option(icon, icon_name, icon_label, menu, NULL); else { xfdesktop_volume_icon_add_context_menu_option(icon, icon_name, icon_label, menu, G_CALLBACK(xfdesktop_volume_icon_menu_properties)); } return TRUE; }
static void default_eject (RBDeviceSource *source) { GVolume *volume = NULL; GMount *mount = NULL; if (g_object_class_find_property (G_OBJECT_GET_CLASS (source), "volume")) { g_object_get (source, "volume", &volume, NULL); } if (g_object_class_find_property (G_OBJECT_GET_CLASS (source), "mount")) { g_object_get (source, "mount", &mount, NULL); } /* try ejecting based on volume first, then based on the mount, * and finally try unmounting. */ if (volume != NULL) { if (g_volume_can_eject (volume)) { rb_debug ("ejecting volume"); g_volume_eject_with_operation (volume, G_MOUNT_UNMOUNT_NONE, NULL, NULL, (GAsyncReadyCallback) eject_cb, NULL); } else { /* this should never happen; the eject command will be * insensitive if the selected source cannot be ejected. */ rb_debug ("don't know what to do with this volume"); } } else if (mount != NULL) { if (g_mount_can_eject (mount)) { rb_debug ("ejecting mount"); g_mount_eject_with_operation (mount, G_MOUNT_UNMOUNT_NONE, NULL, NULL, (GAsyncReadyCallback) eject_cb, NULL); } else if (g_mount_can_unmount (mount)) { rb_debug ("unmounting mount"); g_mount_unmount_with_operation (mount, G_MOUNT_UNMOUNT_NONE, NULL, NULL, (GAsyncReadyCallback) unmount_cb, NULL); } else { /* this should never happen; the eject command will be * insensitive if the selected source cannot be ejected. */ rb_debug ("don't know what to do with this mount"); } } if (volume != NULL) { g_object_unref (volume); } if (mount != NULL) { g_object_unref (mount); } }
static VALUE rg_can_unmount_p(VALUE self) { return CBOOL2RVAL(g_mount_can_unmount(_SELF(self))); }
gboolean brasero_gio_operation_umount (GVolume *gvolume, GCancellable *cancel, gboolean wait, GError **error) { GMount *mount; gboolean result; BRASERO_MEDIA_LOG ("Unmounting volume"); if (!gvolume) { BRASERO_MEDIA_LOG ("No volume"); return TRUE; } mount = g_volume_get_mount (gvolume); if (!mount) { BRASERO_MEDIA_LOG ("No mount"); return TRUE; } if (!g_mount_can_unmount (mount)) { /* NOTE: that can happen when for example a blank medium is * mounted on burn:// */ BRASERO_MEDIA_LOG ("Mount can't unmount"); return FALSE; } if (wait) { gulong umount_sig; BraseroGioOperation *op; op = g_new0 (BraseroGioOperation, 1); op->cancel = cancel; umount_sig = g_signal_connect_after (mount, "unmounted", G_CALLBACK (brasero_gio_operation_umounted_cb), op); /* NOTE: we own a reference to mount * object so no need to ref it even more */ g_mount_unmount_with_operation (mount, G_MOUNT_UNMOUNT_NONE, NULL, cancel, brasero_gio_operation_umount_finish, op); result = brasero_gio_operation_wait_for_operation_end (op, error); brasero_gio_operation_destroy (op); g_signal_handler_disconnect (mount, umount_sig); } else { g_mount_unmount_with_operation (mount, G_MOUNT_UNMOUNT_NONE, NULL, cancel, NULL, /* callback */ NULL); result = TRUE; } g_object_unref (mount); BRASERO_MEDIA_LOG ("Unmount result = %d", result); return result; }
static void _tile_eject_cb (MpdStorageDeviceTile *tile, MpdDevicesTile *self) { MpdDevicesTilePrivate *priv = GET_PRIVATE (self); char const *uri; GList *mounts; GList *iter; uri = mpd_storage_device_tile_get_mount_point (tile); mounts = g_volume_monitor_get_mounts (priv->monitor); iter = g_list_find_custom (mounts, uri, (GCompareFunc) _find_mount_cb); if (iter) { GMount *mount = G_MOUNT (iter->data); GDrive *drive; GVolume *vol; gboolean ejected = TRUE; drive = g_mount_get_drive (mount); vol = g_mount_get_volume (mount); if (drive && g_drive_can_eject (drive)) { g_debug ("%s() ejecting drive %s", __FUNCTION__, uri); g_drive_eject_with_operation (drive, G_MOUNT_UNMOUNT_NONE, NULL, NULL, (GAsyncReadyCallback)_drive_eject_cb, tile); } else if (vol && g_volume_can_eject (vol)) { g_debug ("%s() ejecting volume %s", __FUNCTION__, uri); g_volume_eject_with_operation (vol, G_MOUNT_UNMOUNT_NONE, NULL, NULL, (GAsyncReadyCallback)_vol_eject_cb, tile); } else if (g_mount_can_eject (mount)) { g_debug ("%s() ejecting mount %s", __FUNCTION__, uri); g_mount_eject_with_operation (mount, G_MOUNT_UNMOUNT_NONE, NULL, NULL, (GAsyncReadyCallback) _mount_eject_cb, tile); } else if (g_mount_can_unmount (mount)) { g_debug ("%s() unmounting mount %s", __FUNCTION__, uri); g_mount_unmount_with_operation (mount, G_MOUNT_UNMOUNT_NONE, NULL, NULL, (GAsyncReadyCallback) _mount_unmount_cb, tile); } else { ejected = FALSE; g_warning ("Eject or unmount not possible"); } mx_widget_set_disabled (MX_WIDGET (tile), ejected); /* TODO: inform user of ejection with text inside the tile: * For that (and other reasons) this code really should be inside * MpdStorageDeviceTile */ /* TODO: we want to start a 2s timeout here, and if not done sync'ing when * expired show the message "Ejecting ..." */ if (drive) { g_object_unref (drive); } if (vol) { g_object_unref (vol); } } g_list_foreach (mounts, (GFunc) g_object_unref, NULL); g_list_free (mounts); }