summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Hughes <richard@hughsie.com>2016-04-18 20:49:43 +0100
committerRichard Hughes <richard@hughsie.com>2016-04-18 20:49:43 +0100
commit003e401b6b76bc8ae445b0c152f7ff41d1eaab5e (patch)
treebb5fd37538bbeac5347c3b4682ef2c8cbde9c586
parent5256a11638c797809c183f2e468475f6a5fb7a52 (diff)
downloadcolord-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.c20
-rw-r--r--src/cd-sensor.h1
-rw-r--r--src/sensors/cd-sensor-argyll.c21
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;
}