/** * cd_sensor_unlock_cb: **/ static void cd_sensor_unlock_cb (GObject *source_object, GAsyncResult *res, gpointer user_data) { CdSensor *sensor = CD_SENSOR (source_object); gboolean ret; GDBusMethodInvocation *invocation = (GDBusMethodInvocation *) user_data; GError *error = NULL; /* get the result */ if (sensor->priv->desc != NULL && sensor->priv->desc->unlock_finish != NULL) { ret = sensor->priv->desc->unlock_finish (sensor, res, &error); if (!ret) { g_dbus_method_invocation_return_error (invocation, CD_SENSOR_ERROR, CD_SENSOR_ERROR_NO_SUPPORT, "failed to unlock: %s", error->message); g_error_free (error); goto out; } } cd_sensor_set_locked (sensor, FALSE); g_dbus_method_invocation_return_value (invocation, NULL); out: return; }
/** * cd_sensor_unlock_quietly_cb: **/ static void cd_sensor_unlock_quietly_cb (GObject *source_object, GAsyncResult *res, gpointer user_data) { CdSensor *sensor = CD_SENSOR (source_object); CdSensorPrivate *priv = GET_PRIVATE (sensor); gboolean ret; g_autoptr(GError) error = NULL; /* set here to avoid every sensor doing this */ cd_sensor_set_state (sensor, CD_SENSOR_STATE_IDLE); /* get the result */ if (priv->desc != NULL && priv->desc->unlock_finish != NULL) { ret = priv->desc->unlock_finish (sensor, res, &error); if (!ret) { g_warning ("failed to unlock: %s", error->message); return; } } cd_sensor_set_locked (sensor, FALSE); }
/** * cd_sensor_unlock_cb: **/ static void cd_sensor_unlock_cb (GObject *source_object, GAsyncResult *res, gpointer user_data) { CdSensor *sensor = CD_SENSOR (source_object); CdSensorPrivate *priv = GET_PRIVATE (sensor); GDBusMethodInvocation *invocation = (GDBusMethodInvocation *) user_data; gboolean ret; g_autoptr(GError) error = NULL; /* set here to avoid every sensor doing this */ cd_sensor_set_state (sensor, CD_SENSOR_STATE_IDLE); /* get the result */ if (priv->desc != NULL && priv->desc->unlock_finish != NULL) { ret = priv->desc->unlock_finish (sensor, res, &error); if (!ret) { g_dbus_method_invocation_return_error (invocation, CD_SENSOR_ERROR, CD_SENSOR_ERROR_NO_SUPPORT, "failed to unlock: %s", error->message); return; } } cd_sensor_set_locked (sensor, FALSE); g_dbus_method_invocation_return_value (invocation, NULL); }
/** * _cd_sensor_lock_finish: * * Finish locking the sensor. You don't ever need to call this, and this * method should only be used from the internal self check program. **/ gboolean _cd_sensor_lock_finish (CdSensor *sensor, GAsyncResult *res, GError **error) { gboolean ret = TRUE; g_return_val_if_fail (CD_IS_SENSOR (sensor), FALSE); g_return_val_if_fail (sensor->priv->desc != NULL, FALSE); /* proxy up */ if (sensor->priv->desc->lock_finish) { ret = sensor->priv->desc->lock_finish (sensor, res, error); } cd_sensor_set_locked (sensor, TRUE); return ret; }
/** * cd_sensor_name_vanished_cb: **/ static void cd_sensor_name_vanished_cb (GDBusConnection *connection, const gchar *name, gpointer user_data) { CdSensor *sensor = CD_SENSOR (user_data); /* dummy */ g_debug ("locked sender has vanished without doing Unlock()!"); if (sensor->priv->desc == NULL || sensor->priv->desc->unlock_async == NULL) { cd_sensor_set_locked (sensor, FALSE); goto out; } /* no longer valid */ sensor->priv->desc->unlock_async (sensor, NULL, cd_sensor_unlock_quietly_cb, NULL); out: sensor->priv->watcher_id = 0; }
/** * cd_sensor_unlock_quietly_cb: **/ static void cd_sensor_unlock_quietly_cb (GObject *source_object, GAsyncResult *res, gpointer user_data) { CdSensor *sensor = CD_SENSOR (source_object); gboolean ret; GError *error = NULL; /* get the result */ if (sensor->priv->desc != NULL && sensor->priv->desc->unlock_finish != NULL) { ret = sensor->priv->desc->unlock_finish (sensor, res, &error); if (!ret) { g_warning ("failed to unlock: %s", error->message); g_error_free (error); goto out; } } cd_sensor_set_locked (sensor, FALSE); out: return; }
/** * cd_sensor_dbus_method_call: **/ static void cd_sensor_dbus_method_call (GDBusConnection *connection, const gchar *sender, const gchar *object_path, const gchar *interface_name, const gchar *method_name, GVariant *parameters, GDBusMethodInvocation *invocation, gpointer user_data) { CdSensorCap cap; CdSensor *sensor = CD_SENSOR (user_data); CdSensorPrivate *priv = sensor->priv; const gchar *cap_tmp = NULL; gboolean ret; gchar *key; GError *error = NULL; GHashTable *options = NULL; GVariantIter iter; GVariant *result = NULL; GVariant *value; /* return '' */ if (g_strcmp0 (method_name, "Lock") == 0) { g_debug ("CdSensor %s:Lock()", sender); /* check locked */ if (priv->locked) { g_dbus_method_invocation_return_error (invocation, CD_SENSOR_ERROR, CD_SENSOR_ERROR_ALREADY_LOCKED, "sensor is already locked"); goto out; } /* require auth */ ret = cd_main_sender_authenticated (connection, sender, "org.freedesktop.color-manager.sensor-lock", &error); if (!ret) { g_dbus_method_invocation_return_error (invocation, CD_SENSOR_ERROR, CD_SENSOR_ERROR_FAILED_TO_AUTHENTICATE, "%s", error->message); g_error_free (error); goto out; } /* watch this bus name */ priv->watcher_id = g_bus_watch_name (G_BUS_TYPE_SYSTEM, sender, G_BUS_NAME_WATCHER_FLAGS_NONE, NULL, cd_sensor_name_vanished_cb, sensor, NULL); /* no support */ if (sensor->priv->desc == NULL || sensor->priv->desc->lock_async == NULL) { cd_sensor_set_locked (sensor, TRUE); g_dbus_method_invocation_return_value (invocation, NULL); goto out; } /* proxy */ sensor->priv->desc->lock_async (sensor, NULL, cd_sensor_lock_cb, invocation); goto out; } if (g_strcmp0 (method_name, "Unlock") == 0) { g_debug ("CdSensor %s:Unlock()", sender); /* check locked */ if (!priv->locked) { g_dbus_method_invocation_return_error (invocation, CD_SENSOR_ERROR, CD_SENSOR_ERROR_NOT_LOCKED, "sensor is not yet locked"); goto out; } /* require auth */ ret = cd_main_sender_authenticated (connection, sender, "org.freedesktop.color-manager.sensor-lock", &error); if (!ret) { g_dbus_method_invocation_return_error (invocation, CD_SENSOR_ERROR, CD_SENSOR_ERROR_FAILED_TO_AUTHENTICATE, "%s", error->message); g_error_free (error); goto out; } /* un-watch this bus name */ if (priv->watcher_id != 0) { g_bus_unwatch_name (priv->watcher_id); priv->watcher_id = 0; } /* no support */ if (sensor->priv->desc == NULL || sensor->priv->desc->unlock_async == NULL) { cd_sensor_set_locked (sensor, FALSE); g_dbus_method_invocation_return_value (invocation, NULL); goto out; } /* proxy */ sensor->priv->desc->unlock_async (sensor, NULL, cd_sensor_unlock_cb, invocation); goto out; } /* return 'ddd,d' */ if (g_strcmp0 (method_name, "GetSample") == 0) { g_debug ("CdSensor %s:GetSample()", sender); /* check locked */ if (!priv->locked) { g_dbus_method_invocation_return_error (invocation, CD_SENSOR_ERROR, CD_SENSOR_ERROR_NOT_LOCKED, "sensor is not yet locked"); goto out; } /* check idle */ if (priv->state != CD_SENSOR_STATE_IDLE) { g_dbus_method_invocation_return_error (invocation, CD_SENSOR_ERROR, CD_SENSOR_ERROR_IN_USE, "sensor not idle: %s", cd_sensor_state_to_string (priv->state)); goto out; } /* no support */ if (sensor->priv->desc == NULL || sensor->priv->desc->get_sample_async == NULL) { g_dbus_method_invocation_return_error (invocation, CD_SENSOR_ERROR, CD_SENSOR_ERROR_NO_SUPPORT, "no sensor->get_sample"); goto out; } /* get the type */ g_variant_get (parameters, "(&s)", &cap_tmp); cap = cd_sensor_cap_from_string (cap_tmp); if (cap == CD_SENSOR_CAP_UNKNOWN) { g_dbus_method_invocation_return_error (invocation, CD_SENSOR_ERROR, CD_SENSOR_ERROR_INTERNAL, "cap '%s' unknown", cap_tmp); goto out; } /* proxy */ sensor->priv->desc->get_sample_async (sensor, cap, NULL, cd_sensor_get_sample_cb, invocation); goto out; } /* return '' */ if (g_strcmp0 (method_name, "SetOptions") == 0) { g_debug ("CdSensor %s:SetOptions()", sender); /* check locked */ if (!priv->locked) { g_dbus_method_invocation_return_error (invocation, CD_SENSOR_ERROR, CD_SENSOR_ERROR_NOT_LOCKED, "sensor is not yet locked"); goto out; } /* check idle */ if (priv->state != CD_SENSOR_STATE_IDLE) { g_dbus_method_invocation_return_error (invocation, CD_SENSOR_ERROR, CD_SENSOR_ERROR_IN_USE, "sensor not idle: %s", cd_sensor_state_to_string (priv->state)); goto out; } /* no support */ if (sensor->priv->desc == NULL || sensor->priv->desc->set_options_async == NULL) { g_dbus_method_invocation_return_error (invocation, CD_SENSOR_ERROR, CD_SENSOR_ERROR_NO_SUPPORT, "no sensor options support"); goto out; } /* unwrap the parameters into a hash table */ options = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_variant_unref); result = g_variant_get_child_value (parameters, 0); g_variant_iter_init (&iter, result); while (g_variant_iter_next (&iter, "{sv}", &key, &value)) g_hash_table_insert (options, key, value); /* proxy */ sensor->priv->desc->set_options_async (sensor, options, NULL, cd_sensor_set_options_cb, invocation); goto out; } /* we suck */ g_critical ("failed to process sensor method %s", method_name); out: if (options != NULL) g_hash_table_unref (options); if (result != NULL) g_variant_unref (result); }