diff options
author | Richard Hughes <richard@hughsie.com> | 2016-04-18 20:49:43 +0100 |
---|---|---|
committer | Richard Hughes <richard@hughsie.com> | 2016-04-18 20:49:43 +0100 |
commit | 003e401b6b76bc8ae445b0c152f7ff41d1eaab5e (patch) | |
tree | bb5fd37538bbeac5347c3b4682ef2c8cbde9c586 | |
parent | 5256a11638c797809c183f2e468475f6a5fb7a52 (diff) | |
download | colord-003e401b6b76bc8ae445b0c152f7ff41d1eaab5e.tar.gz |
Use the USB path to match the ArgyllCMS port
Fixes https://github.com/hughsie/colord/issues/24
-rw-r--r-- | src/cd-sensor.c | 20 | ||||
-rw-r--r-- | src/cd-sensor.h | 1 | ||||
-rw-r--r-- | src/sensors/cd-sensor-argyll.c | 21 |
3 files changed, 32 insertions, 10 deletions
diff --git a/src/cd-sensor.c b/src/cd-sensor.c index ba75048..d3aa099 100644 --- a/src/cd-sensor.c +++ b/src/cd-sensor.c @@ -105,6 +105,7 @@ typedef struct gboolean locked; guint64 caps; gchar *object_path; + gchar *usb_path; guint watcher_id; GDBusConnection *connection; guint registration_id; @@ -1307,6 +1308,16 @@ cd_sensor_get_device_path (CdSensor *sensor) #endif } +/** + * cd_sensor_get_usb_path: + **/ +const gchar * +cd_sensor_get_usb_path (CdSensor *sensor) +{ + CdSensorPrivate *priv = GET_PRIVATE (sensor); + return priv->usb_path; +} + #ifdef HAVE_GUSB /** * cd_sensor_open_usb_device: @@ -1409,6 +1420,8 @@ cd_sensor_set_from_device (CdSensor *sensor, gboolean use_database; gchar *tmp; guint i; + guint8 busnum; + guint8 devnum; /* only use the database if we found both the VID and the PID */ use_database = g_udev_device_has_property (device, "ID_VENDOR_FROM_DATABASE") && @@ -1490,6 +1503,12 @@ cd_sensor_set_from_device (CdSensor *sensor, * device changes as this is only a snapshot */ priv->device = g_object_ref (device); + /* create USB path */ + busnum = g_udev_device_get_sysfs_attr_as_int (priv->device, "busnum"); + devnum = g_udev_device_get_sysfs_attr_as_int (priv->device, "devnum"); + priv->usb_path = g_strdup_printf ("/dev/bus/usb/%03i/%03i", + busnum, devnum); + /* success */ return TRUE; } @@ -1758,6 +1777,7 @@ cd_sensor_finalize (GObject *object) g_free (priv->serial); g_free (priv->id); g_free (priv->object_path); + g_free (priv->usb_path); g_hash_table_unref (priv->options); g_hash_table_unref (priv->metadata); #ifdef HAVE_GUSB diff --git a/src/cd-sensor.h b/src/cd-sensor.h index 736f9cd..403760d 100644 --- a/src/cd-sensor.h +++ b/src/cd-sensor.h @@ -66,6 +66,7 @@ GQuark cd_sensor_error_quark (void); const gchar *cd_sensor_get_id (CdSensor *sensor); const gchar *cd_sensor_get_object_path (CdSensor *sensor); const gchar *cd_sensor_get_device_path (CdSensor *sensor); +const gchar *cd_sensor_get_usb_path (CdSensor *sensor); gboolean cd_sensor_register_object (CdSensor *sensor, GDBusConnection *connection, GDBusInterfaceInfo *info, diff --git a/src/sensors/cd-sensor-argyll.c b/src/sensors/cd-sensor-argyll.c index f261fc3..3d35830 100644 --- a/src/sensors/cd-sensor-argyll.c +++ b/src/sensors/cd-sensor-argyll.c @@ -358,6 +358,7 @@ cd_sensor_find_device_details (CdSensor *sensor, GError **error) const gchar *argv[] = { "spotread", "--help", NULL }; const gchar *argyll_name; const gchar *envp[] = { "ARGYLL_NOT_INTERACTIVE=1", NULL }; + const gchar *usb_path; gboolean ret; guint i; guint listno = 0; @@ -378,23 +379,23 @@ cd_sensor_find_device_details (CdSensor *sensor, GError **error) if (!ret) return FALSE; - /* split into lines and search */ - lines = g_strsplit (stdout, "\n", -1); + /* look for the usb /dev/bus/usb/002/003 path first */ + usb_path = cd_sensor_get_usb_path (sensor); argyll_name = cd_sensor_to_argyll_name (sensor); - if (argyll_name == NULL) { - g_set_error_literal (error, - CD_SENSOR_ERROR, - CD_SENSOR_ERROR_INTERNAL, - "Failed to find sensor"); - return FALSE; - } + lines = g_strsplit (stdout, "\n", -1); for (i = 0; lines[i] != NULL; i++) { /* look for the communication port listing of the * device type we have plugged in */ if (g_strstr_len (lines[i], -1, " = ") != NULL) { listno++; - if (g_strstr_len (lines[i], -1, argyll_name) != NULL) { + if (usb_path != NULL && + g_strstr_len (lines[i], -1, usb_path) != NULL) { + priv->communication_port = listno; + break; + } + if (argyll_name != NULL && + g_strstr_len (lines[i], -1, argyll_name) != NULL) { priv->communication_port = listno; break; } |