/** * cd_sensor_add_cap: **/ void cd_sensor_add_cap (CdSensor *sensor, CdSensorCap cap) { cd_bitfield_add (sensor->priv->caps, cap); cd_sensor_dbus_emit_property_changed (sensor, "Capabilities", cd_sensor_get_variant_for_caps (sensor->priv->caps)); }
/** * cd_sensor_add_cap: **/ void cd_sensor_add_cap (CdSensor *sensor, CdSensorCap cap) { CdSensorPrivate *priv = GET_PRIVATE (sensor); cd_bitfield_add (priv->caps, cap); cd_sensor_dbus_emit_property_changed (sensor, "Capabilities", cd_sensor_get_variant_for_caps (priv->caps)); }
/** * cd_sensor_set_from_device: **/ gboolean cd_sensor_set_from_device (CdSensor *sensor, GUdevDevice *device, GError **error) { CdSensorCap cap; CdSensorPrivate *priv = sensor->priv; const gchar *images[] = { "attach", "calibrate", "screen", NULL }; const gchar *images_md[] = { CD_SENSOR_METADATA_IMAGE_ATTACH, CD_SENSOR_METADATA_IMAGE_CALIBRATE, CD_SENSOR_METADATA_IMAGE_SCREEN, NULL }; const gchar *kind_str; const gchar *model_tmp = NULL; const gchar *vendor_tmp = NULL; const gchar * const *caps_str; gboolean ret; gboolean use_database; gchar *tmp; guint i; /* 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") && g_udev_device_has_property (device, "ID_MODEL_FROM_DATABASE"); /* vendor */ if (use_database) vendor_tmp = g_udev_device_get_property (device, "ID_VENDOR_FROM_DATABASE"); if (vendor_tmp == NULL) vendor_tmp = g_udev_device_get_property (device, "ID_VENDOR"); if (vendor_tmp == NULL) vendor_tmp = g_udev_device_get_sysfs_attr (device, "manufacturer"); if (vendor_tmp == NULL) vendor_tmp = "unknown"; priv->vendor = g_strdup (vendor_tmp); /* make name sane */ g_strdelimit (priv->vendor, "_", ' '); /* model */ if (use_database) model_tmp = g_udev_device_get_property (device, "ID_MODEL_FROM_DATABASE"); if (model_tmp == NULL) model_tmp = g_udev_device_get_property (device, "ID_MODEL"); if (model_tmp == NULL) model_tmp = g_udev_device_get_sysfs_attr (device, "product"); if (model_tmp == NULL) model_tmp = "Unknown"; cd_sensor_set_model (sensor, model_tmp); /* make name sane */ g_strdelimit (priv->model, "_", ' '); /* try to get type */ kind_str = g_udev_device_get_property (device, "COLORD_SENSOR_KIND"); priv->kind = cd_sensor_kind_from_string (kind_str); if (priv->kind == CD_SENSOR_KIND_UNKNOWN) { ret = FALSE; g_set_error (error, 1, 0, "failed to recognize color device: %s - %s", vendor_tmp, model_tmp); goto out; } /* get caps */ caps_str = g_udev_device_get_property_as_strv (device, "COLORD_SENSOR_CAPS"); if (caps_str != NULL) { for (i = 0; caps_str[i] != NULL; i++) { cap = cd_sensor_cap_from_string (caps_str[i]); if (cap != CD_SENSOR_CAP_UNKNOWN) { cd_bitfield_add (priv->caps, cap); } else { g_warning ("Unknown sensor cap %s on %s", caps_str[i], kind_str); } } } /* is the sensor embeded, e.g. on the W700? */ ret = g_udev_device_get_property_as_boolean (device, "COLORD_SENSOR_EMBEDDED"); if (ret) priv->embedded = TRUE; /* add image metadata if the files exist */ for (i = 0; images[i] != NULL; i++) { tmp = g_strdup_printf ("%s/colord/icons/%s-%s.svg", DATADIR, kind_str, images[i]); if (g_file_test (tmp, G_FILE_TEST_EXISTS)) { g_debug ("helper image %s found", tmp); g_hash_table_insert (priv->metadata, g_strdup (images_md[i]), tmp); } else { g_debug ("helper image %s not found", tmp); g_free (tmp); } } /* some properties might not be valid in the GUdevDevice if the * device changes as this is only a snapshot */ priv->device = g_object_ref (device); /* success */ ret = TRUE; out: return ret; }