From eeac836f256fe07004d67e13c3c89532982af9bd Mon Sep 17 00:00:00 2001 From: Richard Hughes Date: Mon, 20 Jul 2015 10:57:28 +0100 Subject: [PATCH] Allow creating devices with the same device ID from different users --- src/cd-device-array.c | 13 ++++++++----- src/cd-device-array.h | 9 ++++++++- src/cd-main.c | 15 ++++++++++----- src/cd-self-test.c | 7 +++++-- 4 files changed, 31 insertions(+), 13 deletions(-) diff --git a/src/cd-device-array.c b/src/cd-device-array.c index 88d4b2c..41a9597 100644 --- a/src/cd-device-array.c +++ b/src/cd-device-array.c @@ -76,7 +76,8 @@ cd_device_array_remove (CdDeviceArray *device_array, CdDevice *device) CdDevice * cd_device_array_get_by_id_owner (CdDeviceArray *device_array, const gchar *id, - guint owner) + guint owner, + CdDeviceArrayFlags flags) { CdDeviceArrayPrivate *priv = device_array->priv; CdDevice *device_tmp; @@ -90,10 +91,12 @@ cd_device_array_get_by_id_owner (CdDeviceArray *device_array, if (g_strcmp0 (cd_device_get_id (device_tmp), id) == 0) return g_object_ref (device_tmp); } - for (i = 0; i < priv->array->len; i++) { - device_tmp = g_ptr_array_index (priv->array, i); - if (g_strcmp0 (cd_device_get_id (device_tmp), id) == 0) - return g_object_ref (device_tmp); + if (flags & CD_DEVICE_ARRAY_FLAG_OWNER_OPTIONAL) { + for (i = 0; i < priv->array->len; i++) { + device_tmp = g_ptr_array_index (priv->array, i); + if (g_strcmp0 (cd_device_get_id (device_tmp), id) == 0) + return g_object_ref (device_tmp); + } } return NULL; } diff --git a/src/cd-device-array.h b/src/cd-device-array.h index b625dbf..31dc067 100644 --- a/src/cd-device-array.h +++ b/src/cd-device-array.h @@ -50,6 +50,12 @@ struct _CdDeviceArrayClass GObjectClass parent_class; }; +typedef enum { + CD_DEVICE_ARRAY_FLAG_NONE = 0, + CD_DEVICE_ARRAY_FLAG_OWNER_OPTIONAL = 1, + CD_DEVICE_ARRAY_FLAG_LAST, +} CdDeviceArrayFlags; + GType cd_device_array_get_type (void); CdDeviceArray *cd_device_array_new (void); @@ -59,7 +65,8 @@ void cd_device_array_remove (CdDeviceArray *device_array, CdDevice *device); CdDevice *cd_device_array_get_by_id_owner (CdDeviceArray *device_array, const gchar *id, - guint owner); + guint owner, + CdDeviceArrayFlags flags); CdDevice *cd_device_array_get_by_object_path (CdDeviceArray *device_array, const gchar *object_path); CdDevice *cd_device_array_get_by_property (CdDeviceArray *device_array, diff --git a/src/cd-main.c b/src/cd-main.c index b5b3a4f..37817e3 100644 --- a/src/cd-main.c +++ b/src/cd-main.c @@ -720,7 +720,8 @@ cd_main_profile_auto_add_from_db (CdMainPrivate *priv, device_id_tmp = g_ptr_array_index (array, i); device_tmp = cd_device_array_get_by_id_owner (priv->devices_array, device_id_tmp, - cd_profile_get_owner (profile)); + cd_profile_get_owner (profile), + CD_DEVICE_ARRAY_FLAG_OWNER_OPTIONAL); if (device_tmp == NULL) continue; @@ -747,7 +748,8 @@ cd_main_profile_auto_add_from_md (CdMainPrivate *priv, return; device = cd_device_array_get_by_id_owner (priv->devices_array, device_id, - cd_profile_get_owner (profile)); + cd_profile_get_owner (profile), + CD_DEVICE_ARRAY_FLAG_OWNER_OPTIONAL); if (device == NULL) return; cd_main_auto_add_from_md (priv, device, profile); @@ -1022,7 +1024,8 @@ cd_main_daemon_method_call (GDBusConnection *connection, const gchar *sender, sender, device_id); device = cd_device_array_get_by_id_owner (priv->devices_array, device_id, - uid); + uid, + CD_DEVICE_ARRAY_FLAG_OWNER_OPTIONAL); if (device == NULL) { g_dbus_method_invocation_return_error (invocation, CD_CLIENT_ERROR, @@ -1279,7 +1282,8 @@ cd_main_daemon_method_call (GDBusConnection *connection, const gchar *sender, } device = cd_device_array_get_by_id_owner (priv->devices_array, device_id, - uid); + uid, + CD_DEVICE_ARRAY_FLAG_NONE); if (device != NULL) { /* where we try to manually add an existing * virtual device, which means promoting it to @@ -1399,7 +1403,8 @@ cd_main_daemon_method_call (GDBusConnection *connection, const gchar *sender, sender, device_id); device = cd_device_array_get_by_id_owner (priv->devices_array, device_id, - uid); + uid, + CD_DEVICE_ARRAY_FLAG_OWNER_OPTIONAL); if (device == NULL) { /* fall back to checking the object path */ device = cd_device_array_get_by_object_path (priv->devices_array, diff --git a/src/cd-self-test.c b/src/cd-self-test.c index 4a76d07..6536d3c 100644 --- a/src/cd-self-test.c +++ b/src/cd-self-test.c @@ -178,10 +178,13 @@ colord_device_array_func (void) cd_device_array_add (device_array, device); g_object_unref (device); - device = cd_device_array_get_by_id_owner (device_array, "does not exist", 0); + device = cd_device_array_get_by_id_owner (device_array, "does not exist", 0, CD_DEVICE_ARRAY_FLAG_OWNER_OPTIONAL); g_assert (device == NULL); - device = cd_device_array_get_by_id_owner (device_array, "dave", 0); + device = cd_device_array_get_by_id_owner (device_array, "dave", 999, CD_DEVICE_ARRAY_FLAG_NONE); + g_assert (device == NULL); + + device = cd_device_array_get_by_id_owner (device_array, "dave", 0, CD_DEVICE_ARRAY_FLAG_OWNER_OPTIONAL); g_assert (device != NULL); g_assert_cmpstr (cd_device_get_id (device), ==, "dave"); g_object_unref (device); -- 2.4.3