static void gkd_secret_service_ensure_client (GkdSecretService *self, const gchar *caller) { ServiceClient *client; client = g_hash_table_lookup (self->clients, caller); if (client == NULL) { initialize_service_client (self, caller); } }
static void service_dispatch_message (GkdSecretService *self, DBusMessage *message) { DBusMessage *reply = NULL; const gchar *caller; ServiceClient *client; const gchar *path; gpointer object; g_assert (GKD_SECRET_IS_SERVICE (self)); g_assert (message); /* The first thing we do is try to allocate a client context */ caller = dbus_message_get_sender (message); if (caller == NULL) { reply = dbus_message_new_error (message, DBUS_ERROR_FAILED, "Could not not identify calling client application"); dbus_connection_send (self->connection, reply, NULL); dbus_message_unref (reply); return; } client = g_hash_table_lookup (self->clients, caller); if (client == NULL) { initialize_service_client (self, message); return; /* This function called again, when client is initialized */ } path = dbus_message_get_path (message); g_return_if_fail (path); /* Dispatched to a session or prompt */ if (object_path_has_prefix (path, SECRET_SESSION_PREFIX) || object_path_has_prefix (path, SECRET_PROMPT_PREFIX)) { object = g_hash_table_lookup (client->dispatch, path); if (object == NULL) reply = gkd_secret_error_no_such_object (message); else reply = gkd_secret_dispatch_message (GKD_SECRET_DISPATCH (object), message); /* Dispatched to a collection, off it goes */ } else if (object_path_has_prefix (path, SECRET_COLLECTION_PREFIX) || object_path_has_prefix (path, SECRET_ALIAS_PREFIX)) { reply = gkd_secret_objects_dispatch (self->objects, message); /* Addressed to the service */ } else if (g_str_equal (path, SECRET_SERVICE_PATH)) { reply = service_message_handler (self, message); } /* Should we send an error? */ if (!reply && dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_METHOD_CALL) { if (!dbus_message_get_no_reply (message)) { reply = dbus_message_new_error_printf (message, DBUS_ERROR_UNKNOWN_METHOD, "Method \"%s\" with signature \"%s\" on interface \"%s\" doesn't exist\n", dbus_message_get_member (message), dbus_message_get_signature (message), dbus_message_get_interface (message)); } } if (reply) { dbus_connection_send (self->connection, reply, NULL); dbus_message_unref (reply); } }