More work with dbus.

This commit is contained in:
Jaime Thomas
2009-04-19 01:54:14 +00:00
parent b7cf7fc4b9
commit edc3306315
4 changed files with 178 additions and 85 deletions

View File

@@ -2,48 +2,15 @@
#include "ecdb.h"
void _ecdb_hal_device_all_cb(void *data, void *reply_data, DBusError *error);
void _ecdb_hal_volume_all_cb(void *data, void *reply_data, DBusError *error);
void _ecdb_hal_device_handle(void *data, void *reply_data, DBusError *error);
void _ecdb_hal_volume_removed_cb(void *data, DBusMessage *msg);
void _ecdb_hal_volume_added_cb(void *data, DBusMessage *msg);
void _ecdb_hal_volume_handle(void *data, void *reply_data, DBusError *error);
void _ecdb_hal_volume_cb(void *data, void *reply_data, DBusError *error);
void _ecdb_hal_volume_handle(void *data, void *reply_data, DBusError *error);
void _ecdb_hal_unmount_cb(void *data, void *reply_data, DBusError *error);
void
_ecdb_hal_volume_handle(void *data, void *reply_data, DBusError *error)
{
E_Hal_Device_Get_All_Properties_Return *ret;
char *udi, *str;
int err;
ret = reply_data;
udi = data;
if ((!ret) || (!udi))
{
EINA_ERROR_PWARN("NULL udi or reply!\n");
return;
}
if (dbus_error_is_set(error))
{
/* XXX Handle this error here */
dbus_error_free(error);
return;
}
if ((e_hal_property_bool_get(ret, "volume.is_disc", &err)) && (!err))
{
str = e_hal_property_string_get(ret, "info.parent", &err);
if ((str) && (!err))
{
e_hal_device_get_all_properties(em->conn, str, _ecdb_hal_device_handle,
str);
}
}
FREE(udi);
}
void _ecdb_hal_volumes_init(void);
void
_ecdb_hal_device_handle(void *data, void *reply_data, DBusError *error)
@@ -82,7 +49,9 @@ _ecdb_hal_device_handle(void *data, void *reply_data, DBusError *error)
if (!strcmp(drive->location, str))
{
if (!ecdb_update_drive_info(drive, ret, udi))
{
EINA_ERROR_PWARN("Couldn't update old drive info!\n");
}
printf("Recreating old...\n");
ecdb_print_drive_info();
@@ -102,11 +71,18 @@ _ecdb_hal_device_handle(void *data, void *reply_data, DBusError *error)
printf("Creating new...\n");
ecdb_print_drive_info();
/* Check to see if we have acquired all of the drives */
if (eina_list_count(em->drives) >= em->init_count)
{
em->init_count = 0;
_ecdb_hal_volumes_init();
}
}
}
void
_ecdb_hal_device_removed_cb(void *data __UNUSED__, DBusMessage *msg)
_ecdb_hal_volume_removed_cb(void *data __UNUSED__, DBusMessage *msg)
{
DBusError err;
Eina_List *l;
@@ -118,14 +94,19 @@ _ecdb_hal_device_removed_cb(void *data __UNUSED__, DBusMessage *msg)
DBUS_TYPE_INVALID);
printf("Removed: %s\n", udi);
/*
* 1. Find the drive that has been removed.
* 2. Update it with libburn
*/
EINA_LIST_FOREACH(em->drives, l, drive)
{
if (!strcmp(drive->udi, udi))
{
drive->fresh_info = FALSE;
drive->status = 0;
FREE(drive->type);
}
}
}
void
_ecdb_hal_device_added_cb(void *data __UNUSED__, DBusMessage *msg)
_ecdb_hal_volume_added_cb(void *data __UNUSED__, DBusMessage *msg)
{
DBusError err;
char *udi;
@@ -161,19 +142,19 @@ _ecdb_hal_volume_cb(void *data, void *reply_data, DBusError *error)
if (ret->boolean)
{
e_hal_device_get_all_properties(em->conn, udi, _ecdb_hal_device_handle,
e_hal_device_get_all_properties(em->conn, udi, _ecdb_hal_volume_handle,
udi);
}
}
void
_ecdb_hal_device_all_cb(void *data, void *reply_data, DBusError *error)
_ecdb_hal_device_all_cb(void *data __UNUSED__, void *reply_data,
DBusError *error)
{
char *udi;
Eina_List *l;
E_Hal_Manager_Find_Device_By_Capability_Return *ret;
udi = data;
ret = reply_data;
if ((!ret) || (!ret->strings))
@@ -186,6 +167,7 @@ _ecdb_hal_device_all_cb(void *data, void *reply_data, DBusError *error)
return;
}
em->init_count = eina_list_count(ret->strings);
EINA_LIST_FOREACH(ret->strings, l, udi)
{
e_hal_device_get_all_properties(em->conn, udi, _ecdb_hal_device_handle,
@@ -203,20 +185,6 @@ ecdb_hal_init(void)
return 0;
}
em->dev_added = e_dbus_signal_handler_add(em->conn, "org.freedesktop.Hal",
"/org/freedesktop/Hal/Manager",
"org.freedesktop.Hal.Manager",
"DeviceAdded",
_ecdb_hal_device_added_cb, NULL);
em->dev_removed = e_dbus_signal_handler_add(em->conn,
"org.freedesktop.Hal",
"/org/freedesktop/Hal/Manager",
"org.freedesktop.Hal.Manager",
"DeviceRemoved",
_ecdb_hal_device_removed_cb, NULL);
e_hal_manager_find_device_by_capability(em->conn, "storage.cdrom",
_ecdb_hal_device_all_cb, NULL);
@@ -251,3 +219,111 @@ _ecdb_hal_unmount_cb(void *data, void *reply_data __UNUSED__, DBusError *error)
dbus_error_free(error);
}
}
void
_ecdb_hal_volumes_init()
{
em->dev_added = e_dbus_signal_handler_add(em->conn, "org.freedesktop.Hal",
"/org/freedesktop/Hal/Manager",
"org.freedesktop.Hal.Manager",
"DeviceAdded",
_ecdb_hal_volume_added_cb, NULL);
em->dev_removed = e_dbus_signal_handler_add(em->conn,
"org.freedesktop.Hal",
"/org/freedesktop/Hal/Manager",
"org.freedesktop.Hal.Manager",
"DeviceRemoved",
_ecdb_hal_volume_removed_cb, NULL);
e_hal_manager_find_device_by_capability(em->conn, "volume.disc",
_ecdb_hal_volume_all_cb, NULL);
}
void
_ecdb_hal_volume_all_cb(void *data __UNUSED__, void *reply_data,
DBusError *error)
{
char *udi;
Eina_List *l;
E_Hal_Manager_Find_Device_By_Capability_Return *ret;
ret = reply_data;
if ((!ret) || (!ret->strings))
return;
if (dbus_error_is_set(error))
{
/* XXX Handle this here */
dbus_error_free(error);
return;
}
EINA_LIST_FOREACH(ret->strings, l, udi)
{
e_hal_device_get_all_properties(em->conn, udi, _ecdb_hal_volume_handle,
NULL);
}
}
void
_ecdb_hal_volume_handle(void *data, void *reply_data, DBusError *error)
{
E_Hal_Device_Get_All_Properties_Return *ret;
Ecdb_Drive_Info *drive;
Eina_List *l;
char *udi;
int err;
ret = reply_data;
if (!ret)
return;
if (dbus_error_is_set(error))
{
/* XXX Handle this better */
dbus_error_free(error);
return;
}
/* Ignore volumes that are not discs */
if ((!e_hal_property_bool_get(ret, "volume.is_disc", &err)) || (err))
return;
/* Get the parent udi */
udi = e_hal_property_string_get(ret, "info.parent", NULL);
/* Find the drive this volume belongs to */
EINA_LIST_FOREACH(em->drives, l, drive)
{
if (!strcmp(udi, drive->udi))
{
drive->capacity = e_hal_property_uint64_get(ret,
"volume.disc.capacity", NULL);
if (e_hal_property_bool_get(ret, "volume.disc.is_blank", NULL))
drive->status |= ECDB_DISC_BLANK;
if (e_hal_property_bool_get(ret, "volume.disc.is_appendable", NULL))
drive->status |= ECDB_DISC_APPENDABLE;
if (e_hal_property_bool_get(ret, "volume.disc.is_rewritable", NULL))
drive->status |= ECDB_DISC_REWRITABLE;
drive->type = e_hal_property_string_get(ret, "volume.disc.type", NULL);
/* Also refresh the drive, for write speeds */
e_hal_device_get_all_properties(em->conn, udi,
_ecdb_hal_device_handle, udi);
break;
}
}
FREE(data);
FREE(udi);
}