/** * cd_sensor_dump: * @sensor: a valid #CdSensor instance * @data: A valid #GString for the returned data * @error: a #GError or %NULL * * Dumps the unstructured device data to a string. * * Return value: %TRUE for success. **/ gboolean cd_sensor_dump (CdSensor *sensor, GString *data, GError **error) { CdSensorPrivate *priv = GET_PRIVATE (sensor); /* write common sensor details */ g_string_append (data, "// AUTOMATICALLY GENERATED -- DO NOT EDIT\n"); g_string_append_printf (data, "generic-dump-version:%i\n", 1); g_string_append_printf (data, "kind:%s\n", cd_sensor_kind_to_string (priv->kind)); g_string_append_printf (data, "vendor:%s\n", priv->vendor); g_string_append_printf (data, "model:%s\n", priv->model); g_string_append_printf (data, "serial-number:%s\n", priv->serial); /* no type */ if (priv->desc == NULL) { g_set_error_literal (error, CD_SENSOR_ERROR, CD_SENSOR_ERROR_INTERNAL, "need to load sensor! [cd_sensor_load]"); return FALSE; } /* dump sensor */ if (priv->desc->dump_device == NULL) { g_set_error_literal (error, CD_SENSOR_ERROR, CD_SENSOR_ERROR_INTERNAL, "no klass support"); return FALSE; } /* proxy */ return priv->desc->dump_device (sensor, data, error); }
/** * cd_sensor_set_index: **/ void cd_sensor_set_index (CdSensor *sensor, guint idx) { gchar *id; id = g_strdup_printf ("%s-%02i", cd_sensor_kind_to_string (sensor->priv->kind), idx); cd_sensor_set_id (sensor, id); g_free (id); }
/** * cd_sensor_set_index: **/ void cd_sensor_set_index (CdSensor *sensor, guint idx) { CdSensorPrivate *priv = GET_PRIVATE (sensor); g_autofree gchar *id = NULL; id = g_strdup_printf ("%s-%02i", cd_sensor_kind_to_string (priv->kind), idx); cd_sensor_set_id (sensor, id); }
/** * cd_sensor_dbus_get_property: **/ static GVariant * cd_sensor_dbus_get_property (GDBusConnection *connection_, const gchar *sender, const gchar *object_path, const gchar *interface_name, const gchar *property_name, GError **error, gpointer user_data) { CdSensor *sensor = CD_SENSOR (user_data); CdSensorPrivate *priv = GET_PRIVATE (sensor); if (g_strcmp0 (property_name, CD_SENSOR_PROPERTY_ID) == 0) return g_variant_new_string (priv->id); if (g_strcmp0 (property_name, CD_SENSOR_PROPERTY_KIND) == 0) return g_variant_new_string (cd_sensor_kind_to_string (priv->kind)); if (g_strcmp0 (property_name, CD_SENSOR_PROPERTY_STATE) == 0) return g_variant_new_string (cd_sensor_state_to_string (priv->state)); if (g_strcmp0 (property_name, CD_SENSOR_PROPERTY_MODE) == 0) return g_variant_new_string (cd_sensor_cap_to_string (priv->mode)); if (g_strcmp0 (property_name, CD_SENSOR_PROPERTY_SERIAL) == 0) return cd_sensor_get_nullable_for_string (priv->serial); if (g_strcmp0 (property_name, CD_SENSOR_PROPERTY_MODEL) == 0) return cd_sensor_get_nullable_for_string (priv->model); if (g_strcmp0 (property_name, CD_SENSOR_PROPERTY_VENDOR) == 0) return cd_sensor_get_nullable_for_string (priv->vendor); if (g_strcmp0 (property_name, CD_SENSOR_PROPERTY_NATIVE) == 0) return g_variant_new_boolean (priv->native); if (g_strcmp0 (property_name, CD_SENSOR_PROPERTY_LOCKED) == 0) return g_variant_new_boolean (priv->locked); if (g_strcmp0 (property_name, CD_SENSOR_PROPERTY_EMBEDDED) == 0) return g_variant_new_boolean (priv->embedded); if (g_strcmp0 (property_name, CD_SENSOR_PROPERTY_CAPABILITIES) == 0) return cd_sensor_get_variant_for_caps (priv->caps); if (g_strcmp0 (property_name, CD_SENSOR_PROPERTY_OPTIONS) == 0) return cd_sensor_get_options_as_variant (sensor); if (g_strcmp0 (property_name, CD_SENSOR_PROPERTY_METADATA) == 0) return cd_sensor_get_metadata_as_variant (sensor); /* return an error */ g_set_error (error, CD_SENSOR_ERROR, CD_SENSOR_ERROR_INTERNAL, "failed to get sensor property %s", property_name); return NULL; }
/** * cd_sensor_load: * @sensor: a valid #CdSensor instance * @kind: the sensor kind, e.g %CD_SENSOR_KIND_HUEY * * Sets the device kind. **/ gboolean cd_sensor_load (CdSensor *sensor, GError **error) { CdSensorIface *desc; gboolean ret = FALSE; gchar *backend_name = NULL; gchar *path = NULL; gchar *path_fallback = NULL; GModule *handle; /* no module */ if (sensor->priv->kind == CD_SENSOR_KIND_UNKNOWN) { ret = TRUE; goto out; } /* can we load a module? */ backend_name = g_strdup_printf ("libcolord_sensor_%s." G_MODULE_SUFFIX, cd_sensor_kind_to_string (sensor->priv->kind)); path = g_build_filename (LIBDIR, "colord-sensors", backend_name, NULL); g_debug ("Trying to load sensor driver: %s", path); handle = g_module_open (path, G_MODULE_BIND_LOCAL); if (handle == NULL) { g_debug ("opening module %s failed : %s", backend_name, g_module_error ()); g_debug ("Trying to fall back to : libcolord_sensor_argyll"); path_fallback = g_build_filename (LIBDIR, "colord-sensors", "libcolord_sensor_argyll.so", NULL); handle = g_module_open (path_fallback, G_MODULE_BIND_LOCAL); } if (handle == NULL) { g_set_error (error, 1, 0, "opening module %s (and fallback) failed : %s", backend_name, g_module_error ()); goto out; } /* dlload module if it exists */ desc = sensor->priv->desc = g_new0 (CdSensorIface, 1); /* connect up exported methods */ g_module_symbol (handle, "cd_sensor_get_sample_async", (gpointer *)&desc->get_sample_async); g_module_symbol (handle, "cd_sensor_get_sample_finish", (gpointer *)&desc->get_sample_finish); g_module_symbol (handle, "cd_sensor_set_options_async", (gpointer *)&desc->set_options_async); g_module_symbol (handle, "cd_sensor_set_options_finish", (gpointer *)&desc->set_options_finish); g_module_symbol (handle, "cd_sensor_coldplug", (gpointer *)&desc->coldplug); g_module_symbol (handle, "cd_sensor_dump_device", (gpointer *)&desc->dump_device); g_module_symbol (handle, "cd_sensor_lock_async", (gpointer *)&desc->lock_async); g_module_symbol (handle, "cd_sensor_lock_finish", (gpointer *)&desc->lock_finish); g_module_symbol (handle, "cd_sensor_unlock_async", (gpointer *)&desc->unlock_async); g_module_symbol (handle, "cd_sensor_unlock_finish", (gpointer *)&desc->unlock_finish); /* coldplug with data */ if (desc->coldplug != NULL) { ret = desc->coldplug (sensor, error); if (!ret) goto out; } out: // g_module_close (handle); g_free (backend_name); g_free (path); g_free (path_fallback); return ret; }
/** * cd_sensor_load: * @sensor: a valid #CdSensor instance * @kind: the sensor kind, e.g %CD_SENSOR_KIND_HUEY * * Sets the device kind. **/ gboolean cd_sensor_load (CdSensor *sensor, GError **error) { CdSensorPrivate *priv = GET_PRIVATE (sensor); CdSensorIface *desc; GModule *handle; const gchar *module_name; g_autofree gchar *backend_name = NULL; g_autofree gchar *path_fallback = NULL; g_autofree gchar *path = NULL; /* no module */ if (priv->kind == CD_SENSOR_KIND_UNKNOWN) return TRUE; /* some modules are shared */ switch (priv->kind) { case CD_SENSOR_KIND_COLORHUG: case CD_SENSOR_KIND_COLORHUG2: module_name = "colorhug"; break; default: module_name = cd_sensor_kind_to_string (priv->kind); break; } /* can we load a module? */ backend_name = g_strdup_printf ("libcolord_sensor_%s." G_MODULE_SUFFIX, module_name); path = g_build_filename (LIBDIR, "colord-sensors", backend_name, NULL); g_debug ("Trying to load sensor driver: %s", path); handle = g_module_open (path, G_MODULE_BIND_LOCAL); if (handle == NULL) { g_debug ("opening module %s failed : %s", backend_name, g_module_error ()); g_debug ("Trying to fall back to : libcolord_sensor_argyll"); path_fallback = g_build_filename (LIBDIR, "colord-sensors", "libcolord_sensor_argyll.so", NULL); handle = g_module_open (path_fallback, G_MODULE_BIND_LOCAL); } if (handle == NULL) { g_set_error (error, 1, 0, "opening module %s (and fallback) failed : %s", backend_name, g_module_error ()); return FALSE; } /* dlload module if it exists */ desc = priv->desc = g_new0 (CdSensorIface, 1); /* connect up exported methods */ g_module_symbol (handle, "cd_sensor_get_sample_async", (gpointer *)&desc->get_sample_async); g_module_symbol (handle, "cd_sensor_get_sample_finish", (gpointer *)&desc->get_sample_finish); g_module_symbol (handle, "cd_sensor_get_spectrum_async", (gpointer *)&desc->get_spectrum_async); g_module_symbol (handle, "cd_sensor_get_spectrum_finish", (gpointer *)&desc->get_spectrum_finish); g_module_symbol (handle, "cd_sensor_set_options_async", (gpointer *)&desc->set_options_async); g_module_symbol (handle, "cd_sensor_set_options_finish", (gpointer *)&desc->set_options_finish); g_module_symbol (handle, "cd_sensor_coldplug", (gpointer *)&desc->coldplug); g_module_symbol (handle, "cd_sensor_dump_device", (gpointer *)&desc->dump_device); g_module_symbol (handle, "cd_sensor_lock_async", (gpointer *)&desc->lock_async); g_module_symbol (handle, "cd_sensor_lock_finish", (gpointer *)&desc->lock_finish); g_module_symbol (handle, "cd_sensor_unlock_async", (gpointer *)&desc->unlock_async); g_module_symbol (handle, "cd_sensor_unlock_finish", (gpointer *)&desc->unlock_finish); /* coldplug with data */ if (desc->coldplug != NULL) return desc->coldplug (sensor, error); return TRUE; }