/** * 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; }