static void uevent_cb (GUdevClient *client, const char *action, GUdevDevice *device, RBRemovableMediaManager *mgr) { RBRemovableMediaManagerPrivate *priv = GET_PRIVATE (mgr); GUdevDeviceNumber devnum; devnum = g_udev_device_get_device_number (device); rb_debug ("%s event for %s (%x)", action, g_udev_device_get_sysfs_path (device), devnum); if (g_str_equal (action, "add")) { RBSource *source = NULL; /* probably need to filter out devices related to things we've already seen.. */ if (g_hash_table_lookup (priv->device_mapping, GINT_TO_POINTER (devnum)) != NULL) { rb_debug ("already have a source for this device"); return; } g_signal_emit (mgr, rb_removable_media_manager_signals[CREATE_SOURCE_DEVICE], 0, device, &source); if (source != NULL) { rb_debug ("created a source for this device"); g_hash_table_insert (priv->device_mapping, GINT_TO_POINTER (devnum), source); rb_removable_media_manager_append_media_source (mgr, source); } } else if (g_str_equal (action, "remove")) { RBSource *source; source = g_hash_table_lookup (priv->device_mapping, GINT_TO_POINTER (devnum)); if (source) { rb_debug ("removing the source created for this device"); rb_source_delete_thyself (source); } } }
static void rb_removable_media_manager_add_mount (RBRemovableMediaManager *mgr, GMount *mount) { RBRemovableMediaManagerPrivate *priv = GET_PRIVATE (mgr); RBSource *source = NULL; GVolume *volume; GFile *mount_root; char *mountpoint; MPIDDevice *device_info; g_assert (mount != NULL); if (g_hash_table_lookup (priv->mount_mapping, mount) != NULL) { return; } if (g_mount_is_shadowed (mount) != FALSE) { return; } volume = g_mount_get_volume (mount); if (volume == NULL) { rb_debug ("Unhandled media, no volume for mount"); return; } /* if we've already created a source for the volume, * don't do anything with the mount. */ if (g_hash_table_lookup (priv->volume_mapping, volume) != NULL) { rb_debug ("already created a source for the volume, so ignoring the mount"); g_object_unref (volume); return; } dump_volume_identifiers (volume); g_object_unref (volume); /* look the device up in the device info database */ mount_root = g_mount_get_root (mount); if (mount_root == NULL) { rb_debug ("unable to get mount root, can't create a source for this mount"); return; } mountpoint = g_file_get_path (mount_root); g_object_unref (mount_root); device_info = mpid_device_new (mountpoint); g_free (mountpoint); g_signal_emit (G_OBJECT (mgr), rb_removable_media_manager_signals[CREATE_SOURCE_MOUNT], 0, mount, device_info, &source); if (source) { g_hash_table_insert (priv->mount_mapping, mount, source); rb_removable_media_manager_append_media_source (mgr, source); } else { rb_debug ("Unhandled media"); } g_object_unref (device_info); }
static void rb_removable_media_manager_add_volume (RBRemovableMediaManager *mgr, GVolume *volume) { RBRemovableMediaManagerPrivate *priv = GET_PRIVATE (mgr); RBRemovableMediaSource *source = NULL; GMount *mount; g_assert (volume != NULL); if (g_hash_table_lookup (priv->volume_mapping, volume) != NULL) { return; } mount = g_volume_get_mount (volume); if (mount != NULL) { #if GLIB_CHECK_VERSION(2, 20, 0) if (g_mount_is_shadowed (mount) != FALSE) { rb_debug ("mount is shadowed, so ignoring the volume"); g_object_unref (mount); return; } #endif if (g_hash_table_lookup (priv->mount_mapping, mount) != NULL) { /* this can probably never happen, but it's OK */ rb_debug ("already created a source for the mount, so ignoring the volume"); g_object_unref (mount); return; } g_object_unref (mount); } dump_volume_identifiers (volume); g_signal_emit (G_OBJECT (mgr), rb_removable_media_manager_signals[CREATE_SOURCE_VOLUME], 0, volume, &source); if (source) { g_hash_table_insert (priv->volume_mapping, volume, source); rb_removable_media_manager_append_media_source (mgr, RB_SOURCE (source)); } else { rb_debug ("Unhandled media"); } }
static void uevent_cb (GUdevClient *client, const char *action, GUdevDevice *device, RBRemovableMediaManager *mgr) { RBRemovableMediaManagerPrivate *priv = GET_PRIVATE (mgr); guint64 devnum; devnum = (guint64) g_udev_device_get_device_number (device); rb_debug ("%s event for %s (%"G_GINT64_MODIFIER"x)", action, g_udev_device_get_sysfs_path (device), devnum); if (g_str_equal (action, "add")) { RBSource *source = NULL; /* probably need to filter out devices related to things we've already seen.. */ if (g_hash_table_lookup (priv->device_mapping, &devnum) != NULL) { rb_debug ("already have a source for this device"); } else { g_signal_emit (mgr, rb_removable_media_manager_signals[CREATE_SOURCE_DEVICE], 0, device, &source); if (source != NULL) { guint64 *key = g_new0 (guint64, 1); rb_debug ("created a source for this device"); key[0] = devnum; g_hash_table_insert (priv->device_mapping, key, source); rb_removable_media_manager_append_media_source (mgr, source); } } } else if (g_str_equal (action, "remove")) { RBSource *source; source = g_hash_table_lookup (priv->device_mapping, &devnum); if (source) { rb_debug ("removing the source created for this device"); rb_display_page_delete_thyself (RB_DISPLAY_PAGE (source)); } } }