static void g_udisks_volume_monitor_init(GUDisksVolumeMonitor *self) { self->con = dbus_g_bus_get(DBUS_BUS_SYSTEM, NULL); if(self->con) { GPtrArray* ret; /* FIXME: handle disconnecting from dbus */ self->udisks_proxy = dbus_g_proxy_new_for_name(self->con, "org.freedesktop.UDisks", "/org/freedesktop/UDisks", "org.freedesktop.UDisks"); if(org_freedesktop_UDisks_enumerate_devices(self->udisks_proxy, &ret, NULL)) { int i; char** paths = (char**)ret->pdata; for(i=0; i<ret->len;++i) add_device(self, self->udisks_proxy, paths[i], FALSE); g_ptr_array_free(ret, TRUE); } dbus_g_proxy_add_signal(self->udisks_proxy, "DeviceAdded", DBUS_TYPE_G_OBJECT_PATH, G_TYPE_INVALID); dbus_g_proxy_add_signal(self->udisks_proxy, "DeviceRemoved", DBUS_TYPE_G_OBJECT_PATH, G_TYPE_INVALID); dbus_g_proxy_add_signal(self->udisks_proxy, "DeviceChanged", DBUS_TYPE_G_OBJECT_PATH, G_TYPE_INVALID); dbus_g_proxy_connect_signal(self->udisks_proxy, "DeviceAdded", G_CALLBACK(on_device_added), self, NULL); dbus_g_proxy_connect_signal(self->udisks_proxy, "DeviceRemoved", G_CALLBACK(on_device_removed), self, NULL); dbus_g_proxy_connect_signal(self->udisks_proxy, "DeviceChanged", G_CALLBACK(on_device_changed), self, NULL); /* find drives for volumes */ if(self->volumes && self->drives) g_list_foreach(self->volumes, (GFunc)update_volume_drive, self); } }
gboolean wmvm_do_udisks_init(void) { GPtrArray *devices; GError *error; int n; #if !GLIB_CHECK_VERSION(2,35,0) g_type_init(); #endif dbus_g_object_register_marshaller (udisks_marshal_VOID__BOXED_BOOLEAN_STRING_UINT_BOOLEAN_DOUBLE, G_TYPE_NONE, DBUS_TYPE_G_OBJECT_PATH, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_BOOLEAN, G_TYPE_DOUBLE, G_TYPE_INVALID); if (!init_udisks_connection()) { return FALSE; } /* prime the list of devices */ error = NULL; if (!org_freedesktop_UDisks_enumerate_devices(udisks_proxy, &devices, &error)) { g_message("Error enumerating devices: %s", error->message); g_error_free(error); return FALSE; } for (n = 0; n < (int) devices->len; n++) udisks_device_added(udisks_proxy, g_ptr_array_index(devices, n), NULL); g_ptr_array_foreach(devices, (GFunc) g_free, NULL); g_ptr_array_free(devices, TRUE); return TRUE; }