1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
2  *
3  * Copyright (C) 2012 Red Hat, Inc.
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2, or (at your option)
8  * any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, see <http://www.gnu.org/licenses/>.
17  */
18 
19 #include "config.h"
20 
21 #include <glib-object.h>
22 #include <glib/gi18n.h>
23 
24 #include "gsm-system.h"
25 
26 #include "gsm-systemd.h"
27 
28 #ifdef HAVE_CONSOLEKIT
29 #include "gsm-consolekit.h"
30 #endif
31 
32 enum {
33         REQUEST_COMPLETED,
34         SHUTDOWN_PREPARED,
35         LAST_SIGNAL
36 };
37 
38 enum {
39         PROP_0,
40         PROP_ACTIVE
41 };
42 
43 static guint signals[LAST_SIGNAL] = { 0 };
44 
G_DEFINE_INTERFACE(GsmSystem,gsm_system,G_TYPE_OBJECT)45 G_DEFINE_INTERFACE (GsmSystem, gsm_system, G_TYPE_OBJECT)
46 
47 static void
48 gsm_system_default_init (GsmSystemInterface *iface)
49 {
50         GParamSpec *pspec;
51         signals [REQUEST_COMPLETED] =
52                 g_signal_new ("request-completed",
53                               GSM_TYPE_SYSTEM,
54                               G_SIGNAL_RUN_LAST,
55                               G_STRUCT_OFFSET (GsmSystemInterface, request_completed),
56                               NULL, NULL, NULL,
57                               G_TYPE_NONE,
58                               1, G_TYPE_POINTER);
59         signals[SHUTDOWN_PREPARED] =
60                  g_signal_new ("shutdown-prepared",
61                                GSM_TYPE_SYSTEM,
62                                G_SIGNAL_RUN_LAST,
63                                G_STRUCT_OFFSET (GsmSystemInterface, shutdown_prepared),
64                                NULL, NULL, NULL,
65                                G_TYPE_NONE,
66                                1, G_TYPE_BOOLEAN);
67         pspec = g_param_spec_boolean ("active",
68                                       "Active",
69                                       "Whether or not session is active",
70                                       TRUE,
71                                       G_PARAM_READWRITE | G_PARAM_CONSTRUCT);
72         g_object_interface_install_property (iface, pspec);
73 }
74 
75 typedef GObject GsmSystemNull;
76 typedef GObjectClass GsmSystemNullClass;
77 
do_nothing(void)78 static void do_nothing (void) { }
return_true(void)79 static gboolean return_true (void) { return TRUE; }
return_false(void)80 static gboolean return_false (void) { return TRUE; }
81 
82 static void
gsm_system_null_init_iface(GsmSystemInterface * iface)83 gsm_system_null_init_iface (GsmSystemInterface *iface)
84 {
85         iface->can_switch_user   = (void *) return_false;
86         iface->can_stop          = (void *) return_false;
87         iface->can_restart       = (void *) return_false;
88         iface->can_restart_to_firmware_setup = (void *) return_false;
89         iface->set_restart_to_firmware_setup = (void *) do_nothing;
90         iface->can_suspend       = (void *) return_false;
91         iface->can_hibernate     = (void *) return_false;
92         iface->attempt_stop      = (void *) do_nothing;
93         iface->attempt_restart   = (void *) do_nothing;
94         iface->suspend           = (void *) do_nothing;
95         iface->hibernate         = (void *) do_nothing;
96         iface->set_session_idle  = (void *) do_nothing;
97         iface->is_login_session  = (void *) return_true;
98         iface->set_inhibitors    = (void *) do_nothing;
99         iface->prepare_shutdown  = (void *) do_nothing;
100         iface->complete_shutdown = (void *) do_nothing;
101         iface->is_last_session_for_user = (void *) return_false;
102 }
103 
104 static void
gsm_system_null_init(GsmSystemNull * gsn)105 gsm_system_null_init (GsmSystemNull *gsn)
106 {
107 }
108 
109 static void
gsm_system_null_get_property(GObject * object,guint prop_id,GValue * value,GParamSpec * pspec)110 gsm_system_null_get_property (GObject *object, guint prop_id,
111                               GValue *value, GParamSpec *pspec)
112 {
113         g_value_set_boolean (value, TRUE);
114 }
115 
116 static void
gsm_system_null_class_init(GsmSystemNullClass * class)117 gsm_system_null_class_init (GsmSystemNullClass *class)
118 {
119         class->get_property = gsm_system_null_get_property;
120         class->set_property = (void *) do_nothing;
121 
122         g_object_class_override_property (class, 1, "active");
123 }
124 
125 static GType gsm_system_null_get_type (void);
G_DEFINE_TYPE_WITH_CODE(GsmSystemNull,gsm_system_null,G_TYPE_OBJECT,G_IMPLEMENT_INTERFACE (GSM_TYPE_SYSTEM,gsm_system_null_init_iface))126 G_DEFINE_TYPE_WITH_CODE (GsmSystemNull, gsm_system_null, G_TYPE_OBJECT,
127                          G_IMPLEMENT_INTERFACE (GSM_TYPE_SYSTEM, gsm_system_null_init_iface))
128 
129 GQuark
130 gsm_system_error_quark (void)
131 {
132         static GQuark error_quark = 0;
133 
134         if (error_quark == 0) {
135                 error_quark = g_quark_from_static_string ("gsm-system-error");
136         }
137 
138         return error_quark;
139 }
140 
141 gboolean
gsm_system_can_switch_user(GsmSystem * system)142 gsm_system_can_switch_user (GsmSystem *system)
143 {
144         return GSM_SYSTEM_GET_IFACE (system)->can_switch_user (system);
145 }
146 
147 gboolean
gsm_system_can_stop(GsmSystem * system)148 gsm_system_can_stop (GsmSystem *system)
149 {
150         return GSM_SYSTEM_GET_IFACE (system)->can_stop (system);
151 }
152 
153 gboolean
gsm_system_can_restart(GsmSystem * system)154 gsm_system_can_restart (GsmSystem *system)
155 {
156         return GSM_SYSTEM_GET_IFACE (system)->can_restart (system);
157 }
158 
159 gboolean
gsm_system_can_restart_to_firmware_setup(GsmSystem * system)160 gsm_system_can_restart_to_firmware_setup (GsmSystem *system)
161 {
162         return GSM_SYSTEM_GET_IFACE (system)->can_restart_to_firmware_setup (system);
163 }
164 
165 void
gsm_system_set_restart_to_firmware_setup(GsmSystem * system,gboolean enable)166 gsm_system_set_restart_to_firmware_setup (GsmSystem *system,
167                                           gboolean   enable)
168 {
169         GSM_SYSTEM_GET_IFACE (system)->set_restart_to_firmware_setup (system, enable);
170 }
171 
172 gboolean
gsm_system_can_suspend(GsmSystem * system)173 gsm_system_can_suspend (GsmSystem *system)
174 {
175         return GSM_SYSTEM_GET_IFACE (system)->can_suspend (system);
176 }
177 
178 gboolean
gsm_system_can_hibernate(GsmSystem * system)179 gsm_system_can_hibernate (GsmSystem *system)
180 {
181         return GSM_SYSTEM_GET_IFACE (system)->can_hibernate (system);
182 }
183 
184 void
gsm_system_attempt_stop(GsmSystem * system)185 gsm_system_attempt_stop (GsmSystem *system)
186 {
187         GSM_SYSTEM_GET_IFACE (system)->attempt_stop (system);
188 }
189 
190 void
gsm_system_attempt_restart(GsmSystem * system)191 gsm_system_attempt_restart (GsmSystem *system)
192 {
193         GSM_SYSTEM_GET_IFACE (system)->attempt_restart (system);
194 }
195 
196 void
gsm_system_suspend(GsmSystem * system)197 gsm_system_suspend (GsmSystem *system)
198 {
199         GSM_SYSTEM_GET_IFACE (system)->suspend (system);
200 }
201 
202 void
gsm_system_hibernate(GsmSystem * system)203 gsm_system_hibernate (GsmSystem *system)
204 {
205         GSM_SYSTEM_GET_IFACE (system)->hibernate (system);
206 }
207 
208 void
gsm_system_set_session_idle(GsmSystem * system,gboolean is_idle)209 gsm_system_set_session_idle (GsmSystem *system,
210                              gboolean   is_idle)
211 {
212         GSM_SYSTEM_GET_IFACE (system)->set_session_idle (system, is_idle);
213 }
214 
215 void
gsm_system_set_inhibitors(GsmSystem * system,GsmInhibitorFlag flags)216 gsm_system_set_inhibitors (GsmSystem        *system,
217                            GsmInhibitorFlag  flags)
218 {
219         GSM_SYSTEM_GET_IFACE (system)->set_inhibitors (system, flags);
220 }
221 
222 gboolean
gsm_system_is_login_session(GsmSystem * system)223 gsm_system_is_login_session (GsmSystem *system)
224 {
225         return GSM_SYSTEM_GET_IFACE (system)->is_login_session (system);
226 }
227 
228 gboolean
gsm_system_is_last_session_for_user(GsmSystem * system)229 gsm_system_is_last_session_for_user (GsmSystem *system)
230 {
231         return GSM_SYSTEM_GET_IFACE (system)->is_last_session_for_user (system);
232 }
233 
234 /**
235  * gsm_system_is_active:
236  *
237  * Returns: %TRUE if the current session is in the foreground
238  * Since: 3.8
239  */
240 gboolean
gsm_system_is_active(GsmSystem * system)241 gsm_system_is_active (GsmSystem *system)
242 {
243         gboolean is_active;
244         g_object_get ((GObject*)system, "active", &is_active, NULL);
245         return is_active;
246 }
247 
248 void
gsm_system_prepare_shutdown(GsmSystem * system,gboolean restart)249 gsm_system_prepare_shutdown  (GsmSystem *system,
250                               gboolean   restart)
251 {
252         GSM_SYSTEM_GET_IFACE (system)->prepare_shutdown (system, restart);
253 }
254 
255 void
gsm_system_complete_shutdown(GsmSystem * system)256 gsm_system_complete_shutdown (GsmSystem *system)
257 {
258         GSM_SYSTEM_GET_IFACE (system)->complete_shutdown (system);
259 }
260 
261 GsmSystem *
gsm_get_system(void)262 gsm_get_system (void)
263 {
264         static GsmSystem *system = NULL;
265 
266         if (system == NULL) {
267                 system = GSM_SYSTEM (gsm_systemd_new ());
268                 if (system != NULL) {
269                         g_debug ("Using systemd for session tracking");
270                 }
271         }
272 
273 #ifdef HAVE_CONSOLEKIT
274         if (system == NULL) {
275                 system = GSM_SYSTEM (gsm_consolekit_new ());
276                 if (system != NULL) {
277                         g_debug ("Using ConsoleKit for session tracking");
278                 }
279         }
280 #endif
281 
282         if (system == NULL) {
283                 system = g_object_new (gsm_system_null_get_type (), NULL);
284                 g_warning ("Using null backend for session tracking");
285         }
286 
287         return g_object_ref (system);
288 }
289