示例#1
0
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);
    }
}
示例#2
0
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;
}