1 /* vi: set et sw=4 ts=4 cino=t0,(0: */
2 /* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
4 * This file is part of tlm
6 * Copyright (C) 2014 Intel Corporation.
8 * Contact: Imran Zaman <imran.zaman@intel.com>
10 * This library is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2.1 of the License, or (at your option) any later version.
15 * This library is distributed in the hope that it will be useful, but
16 * WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with this library; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
27 #include "common/tlm-log.h"
28 #include "common/tlm-error.h"
29 #include "common/dbus/tlm-dbus.h"
31 #include "tlm-dbus-login-adapter.h"
32 #include "tlm-dbus-utils.h"
43 static GParamSpec *properties[N_PROPERTIES];
45 struct _TlmDbusLoginAdapterPrivate
47 GDBusConnection *connection;
48 TlmDbusLogin *dbus_obj;
51 G_DEFINE_TYPE (TlmDbusLoginAdapter, tlm_dbus_login_adapter, G_TYPE_OBJECT)
53 #define TLM_DBUS_LOGIN_ADAPTER_GET_PRIV(obj) \
54 G_TYPE_INSTANCE_GET_PRIVATE ((obj), TLM_TYPE_LOGIN_ADAPTER, \
55 TlmDbusLoginAdapterPrivate)
65 static guint signals[SIG_MAX];
69 TlmDbusLoginAdapter *self,
70 GDBusMethodInvocation *invocation,
72 const gchar *username,
73 const gchar *password,
74 const GVariant *environ,
79 TlmDbusLoginAdapter *self,
80 GDBusMethodInvocation *invocation,
82 const gchar *username,
83 const gchar *password,
84 const GVariant *environ,
89 TlmDbusLoginAdapter *self,
90 GDBusMethodInvocation *invocation,
101 TlmDbusLoginAdapter *self = TLM_DBUS_LOGIN_ADAPTER (object);
103 switch (property_id) {
104 case PROP_CONNECTION:
105 self->priv->connection = g_value_get_object(value);
108 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
119 TlmDbusLoginAdapter *self = TLM_DBUS_LOGIN_ADAPTER (object);
121 switch (property_id) {
122 case PROP_CONNECTION:
123 g_value_set_object (value, self->priv->connection);
126 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
134 TlmDbusLoginAdapter *self = TLM_DBUS_LOGIN_ADAPTER (object);
136 DBG("- unregistering dbus login adaptor.");
138 if (self->priv->dbus_obj) {
139 g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (
140 self->priv->dbus_obj));
141 g_object_unref (self->priv->dbus_obj);
142 self->priv->dbus_obj = NULL;
145 G_OBJECT_CLASS (tlm_dbus_login_adapter_parent_class)->dispose (
154 G_OBJECT_CLASS (tlm_dbus_login_adapter_parent_class)->finalize (
159 tlm_dbus_login_adapter_class_init (
160 TlmDbusLoginAdapterClass *klass)
162 GObjectClass* object_class = G_OBJECT_CLASS (klass);
164 g_type_class_add_private (object_class,
165 sizeof (TlmDbusLoginAdapterPrivate));
167 object_class->get_property = _get_property;
168 object_class->set_property = _set_property;
169 object_class->dispose = _dispose;
170 object_class->finalize = _finalize;
172 properties[PROP_CONNECTION] = g_param_spec_object (
175 "DBus connection used",
176 G_TYPE_DBUS_CONNECTION,
177 G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
179 g_object_class_install_properties (object_class, N_PROPERTIES, properties);
181 signals[SIG_LOGIN_USER] = g_signal_new ("login-user",
182 TLM_TYPE_LOGIN_ADAPTER,
194 G_TYPE_DBUS_METHOD_INVOCATION);
196 signals[SIG_LOGOUT_USER] = g_signal_new ("logout-user",
197 TLM_TYPE_LOGIN_ADAPTER,
206 G_TYPE_DBUS_METHOD_INVOCATION);
208 signals[SIG_SWITCH_USER] = g_signal_new ("switch-user",
209 TLM_TYPE_LOGIN_ADAPTER,
221 G_TYPE_DBUS_METHOD_INVOCATION);
225 tlm_dbus_login_adapter_init (TlmDbusLoginAdapter *self)
227 self->priv = TLM_DBUS_LOGIN_ADAPTER_GET_PRIV(self);
229 self->priv->connection = 0;
230 self->priv->dbus_obj = tlm_dbus_login_skeleton_new ();
235 TlmDbusLoginAdapter *self,
236 GDBusMethodInvocation *invocation,
237 const gchar *seat_id,
238 const gchar *username,
239 const gchar *password,
240 const GVariant *environment,
243 GError *error = NULL;
246 g_return_val_if_fail (self && TLM_IS_DBUS_LOGIN_ADAPTER(self), FALSE);
248 if (!seat_id || !username || !password) {
249 error = TLM_GET_ERROR_FOR_ID (TLM_ERROR_INVALID_INPUT,
251 g_dbus_method_invocation_return_gerror (invocation, error);
252 g_error_free (error);
256 g_signal_emit (self, signals[SIG_LOGIN_USER], 0, seat_id, username,
257 password, environment, invocation);
263 _handle_logout_user (
264 TlmDbusLoginAdapter *self,
265 GDBusMethodInvocation *invocation,
266 const gchar *seat_id,
269 GError *error = NULL;
272 g_return_val_if_fail (self && TLM_IS_DBUS_LOGIN_ADAPTER(self),
276 error = TLM_GET_ERROR_FOR_ID (TLM_ERROR_INVALID_INPUT,
278 g_dbus_method_invocation_return_gerror (invocation, error);
279 g_error_free (error);
283 g_signal_emit (self, signals[SIG_LOGOUT_USER], 0, seat_id, invocation);
289 _handle_switch_user (
290 TlmDbusLoginAdapter *self,
291 GDBusMethodInvocation *invocation,
292 const gchar *seat_id,
293 const gchar *username,
294 const gchar *password,
295 const GVariant *environment,
298 GError *error = NULL;
301 g_return_val_if_fail (self && TLM_IS_DBUS_LOGIN_ADAPTER(self),
304 if (!seat_id || !username || !password) {
305 error = TLM_GET_ERROR_FOR_ID (TLM_ERROR_INVALID_INPUT,
307 g_dbus_method_invocation_return_gerror (invocation, error);
308 g_error_free (error);
312 g_signal_emit (self, signals[SIG_SWITCH_USER], 0, seat_id, username,
313 password, environment, invocation);
318 TlmDbusLoginAdapter *
319 tlm_dbus_login_adapter_new_with_connection (
320 GDBusConnection *bus_connection)
323 TlmDbusLoginAdapter *adapter = TLM_DBUS_LOGIN_ADAPTER (g_object_new (
324 TLM_TYPE_LOGIN_ADAPTER, "connection", bus_connection, NULL));
326 if (!g_dbus_interface_skeleton_export (
327 G_DBUS_INTERFACE_SKELETON(adapter->priv->dbus_obj),
328 adapter->priv->connection, TLM_LOGIN_OBJECTPATH, &err)) {
329 WARN ("failed to register object: %s", err->message);
331 g_object_unref (adapter);
335 DBG("(+) started login interface '%p' at path '%s' on connection"
336 " '%p'", adapter, TLM_LOGIN_OBJECTPATH, bus_connection);
338 g_signal_connect_swapped (adapter->priv->dbus_obj,
339 "handle-login-user", G_CALLBACK (_handle_login_user), adapter);
340 g_signal_connect_swapped (adapter->priv->dbus_obj,
341 "handle-logout-user", G_CALLBACK(_handle_logout_user), adapter);
342 g_signal_connect_swapped (adapter->priv->dbus_obj,
343 "handle-switch-user", G_CALLBACK(_handle_switch_user), adapter);
349 tlm_dbus_login_adapter_request_completed (
350 TlmDbusRequest *request,
353 g_return_if_fail (request && request->dbus_adapter &&
354 TLM_IS_DBUS_LOGIN_ADAPTER(request->dbus_adapter));
356 TlmDbusLoginAdapter *adapter = TLM_DBUS_LOGIN_ADAPTER (
357 request->dbus_adapter);
359 g_dbus_method_invocation_return_gerror (request->invocation, error);
363 switch (request->type) {
364 case TLM_DBUS_REQUEST_TYPE_LOGIN_USER:
365 tlm_dbus_login_complete_login_user (adapter->priv->dbus_obj,
366 request->invocation);
368 case TLM_DBUS_REQUEST_TYPE_LOGOUT_USER:
369 tlm_dbus_login_complete_logout_user (adapter->priv->dbus_obj,
370 request->invocation);
372 case TLM_DBUS_REQUEST_TYPE_SWITCH_USER:
373 tlm_dbus_login_complete_switch_user (adapter->priv->dbus_obj,
374 request->invocation);