Branch data Line data Source code
1 : : // SPDX-License-Identifier: GPL-3.0-or-later
2 : : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
3 : :
4 : : #define G_LOG_DOMAIN "valent-application-plugin"
5 : :
6 : : #include "config.h"
7 : :
8 : : #include <gio/gio.h>
9 : :
10 : : #include "valent-debug.h"
11 : : #include "valent-extension.h"
12 : :
13 : : #include "valent-application-plugin.h"
14 : :
15 : :
16 : : /**
17 : : * ValentApplicationPlugin:
18 : : *
19 : : * An abstract base class for application plugins.
20 : : *
21 : : * `ValentApplicationPlugin` is a base class for plugins that operate in the
22 : : * scope of the application. This usually means integrating the application with
23 : : * the host environment (eg. XDG Autostart).
24 : : *
25 : : * ## Implementation Notes
26 : : *
27 : : * Implementations may handle application events by overriding the appropriate
28 : : * virtual function, including [vfunc@Valent.ApplicationPlugin.activate] to
29 : : * handle activation, [vfunc@Valent.ApplicationPlugin.command_line] to handle
30 : : * CLI options, or [vfunc@Valent.ApplicationPlugin.open] to handle files.
31 : : *
32 : : * ## `.plugin` File
33 : : *
34 : : * Application plugins have no special fields in the `.plugin` file.
35 : : *
36 : : * Since: 1.0
37 : : */
38 : :
39 [ + + + - ]: 568 : G_DEFINE_ABSTRACT_TYPE (ValentApplicationPlugin, valent_application_plugin, VALENT_TYPE_EXTENSION)
40 : :
41 : : /* LCOV_EXCL_START */
42 : : static gboolean
43 : : valent_application_plugin_real_activate (ValentApplicationPlugin *plugin)
44 : : {
45 : : g_assert (VALENT_IS_APPLICATION_PLUGIN (plugin));
46 : :
47 : : return FALSE;
48 : : }
49 : :
50 : : static int
51 : : valent_application_plugin_real_command_line (ValentApplicationPlugin *plugin,
52 : : GApplicationCommandLine *command_line)
53 : : {
54 : : g_assert (VALENT_IS_APPLICATION_PLUGIN (plugin));
55 : : g_assert (G_IS_APPLICATION_COMMAND_LINE (command_line));
56 : :
57 : : return 0;
58 : : }
59 : :
60 : : static gboolean
61 : : valent_application_plugin_real_dbus_register (ValentApplicationPlugin *plugin,
62 : : GDBusConnection *connection,
63 : : const char *object_path,
64 : : GError **error)
65 : : {
66 : : g_assert (VALENT_IS_APPLICATION_PLUGIN (plugin));
67 : : g_assert (G_IS_DBUS_CONNECTION (connection));
68 : : g_assert (g_variant_is_object_path (object_path));
69 : : g_assert (error == NULL || *error == NULL);
70 : :
71 : : return TRUE;
72 : : }
73 : :
74 : : static void
75 : : valent_application_plugin_real_dbus_unregister (ValentApplicationPlugin *plugin,
76 : : GDBusConnection *connection,
77 : : const char *object_path)
78 : : {
79 : : g_assert (VALENT_IS_APPLICATION_PLUGIN (plugin));
80 : : g_assert (G_IS_DBUS_CONNECTION (connection));
81 : : g_assert (g_variant_is_object_path (object_path));
82 : : }
83 : :
84 : : static gboolean
85 : : valent_application_plugin_real_open (ValentApplicationPlugin *plugin,
86 : : GFile **files,
87 : : int n_files,
88 : : const char *hint)
89 : : {
90 : : g_assert (VALENT_IS_APPLICATION_PLUGIN (plugin));
91 : : g_assert (files != NULL);
92 : : g_assert (n_files > 0);
93 : : g_assert (hint != NULL);
94 : :
95 : : return FALSE;
96 : : }
97 : :
98 : : static void
99 : : valent_application_plugin_real_shutdown (ValentApplicationPlugin *plugin)
100 : : {
101 : : g_assert (VALENT_IS_APPLICATION_PLUGIN (plugin));
102 : : }
103 : :
104 : : static void
105 : : valent_application_plugin_real_startup (ValentApplicationPlugin *plugin)
106 : : {
107 : : g_assert (VALENT_IS_APPLICATION_PLUGIN (plugin));
108 : : }
109 : : /* LCOV_EXCL_STOP */
110 : :
111 : : /*
112 : : * GObject
113 : : */
114 : : static void
115 : 58 : valent_application_plugin_class_init (ValentApplicationPluginClass *klass)
116 : : {
117 : 58 : klass->activate = valent_application_plugin_real_activate;
118 : 58 : klass->command_line = valent_application_plugin_real_command_line;
119 : 58 : klass->dbus_register = valent_application_plugin_real_dbus_register;
120 : 58 : klass->dbus_unregister = valent_application_plugin_real_dbus_unregister;
121 : 58 : klass->open = valent_application_plugin_real_open;
122 : 58 : klass->shutdown = valent_application_plugin_real_shutdown;
123 : 58 : klass->startup = valent_application_plugin_real_startup;
124 : : }
125 : :
126 : : static void
127 : 20 : valent_application_plugin_init (ValentApplicationPlugin *adapter)
128 : : {
129 : 20 : }
130 : :
131 : : /**
132 : : * valent_application_plugin_activate: (virtual activate)
133 : : * @plugin: a `ValentApplicationPlugin`
134 : : *
135 : : * Handle activation of the application.
136 : : *
137 : : * Implementations should override this method to handle activation, as
138 : : * a result of [signal@Gio.Application::activate] being emitted on the primary
139 : : * instance of the application.
140 : : *
141 : : * Returns: %TRUE if handled, or %FALSE if not
142 : : *
143 : : * Since: 1.0
144 : : */
145 : : gboolean
146 : 6 : valent_application_plugin_activate (ValentApplicationPlugin *plugin)
147 : : {
148 : 6 : gboolean ret;
149 : :
150 : 6 : VALENT_ENTRY;
151 : :
152 [ + - ]: 6 : g_return_val_if_fail (VALENT_IS_APPLICATION_PLUGIN (plugin), FALSE);
153 : :
154 : 6 : ret = VALENT_APPLICATION_PLUGIN_GET_CLASS (plugin)->activate (plugin);
155 : :
156 : 6 : VALENT_RETURN (ret);
157 : : }
158 : :
159 : : /**
160 : : * valent_application_plugin_command_line: (virtual command_line)
161 : : * @plugin: a `ValentApplicationPlugin`
162 : : * @command_line: a `GApplicationCommandLine`
163 : : *
164 : : * Handle the given command-line options.
165 : : *
166 : : * Implementations should override this method to handle command-line options,
167 : : * as a result of [signal@Gio.Application::command-line] being emitted on the
168 : : * primary instance of the application.
169 : : *
170 : : * Returns: an integer that is set as the exit status for the calling process
171 : : *
172 : : * Since: 1.0
173 : : */
174 : : int
175 : 0 : valent_application_plugin_command_line (ValentApplicationPlugin *plugin,
176 : : GApplicationCommandLine *command_line)
177 : : {
178 : 0 : int ret;
179 : :
180 : 0 : VALENT_ENTRY;
181 : :
182 [ # # ]: 0 : g_return_val_if_fail (VALENT_IS_APPLICATION_PLUGIN (plugin), 1);
183 [ # # # # : 0 : g_return_val_if_fail (G_IS_APPLICATION_COMMAND_LINE (command_line), 1);
# # # # ]
184 : :
185 : 0 : ret = VALENT_APPLICATION_PLUGIN_GET_CLASS (plugin)->command_line (plugin,
186 : : command_line);
187 : :
188 : 0 : VALENT_RETURN (ret);
189 : : }
190 : :
191 : : /**
192 : : * valent_application_plugin_dbus_register: (virtual dbus_register)
193 : : * @plugin: a `ValentApplicationPlugin`
194 : : * @connection: a `Gio.DBusCOnnection`
195 : : * @object_path: a D-Bus object path
196 : : * @error: (nullable): a `GError`
197 : : *
198 : : * Handle the D-Bus registration phase of the application.
199 : : *
200 : : * Implementations may override this method to export extra objects on the
201 : : * bus, that need to exist before the application tries to own the bus name.
202 : : *
203 : : * D-Bus registration will be aborted if %FALSE is returned, so implementations
204 : : * may return %TRUE and report the error by other means if it is not intended
205 : : * to be fatal.
206 : : *
207 : : * Returns: %TRUE, or %FALSE with @error set
208 : : *
209 : : * Since: 1.0
210 : : */
211 : : gboolean
212 : 7 : valent_application_plugin_dbus_register (ValentApplicationPlugin *plugin,
213 : : GDBusConnection *connection,
214 : : const char *object_path,
215 : : GError **error)
216 : : {
217 : 7 : gboolean ret;
218 : :
219 : 7 : VALENT_ENTRY;
220 : :
221 [ + - ]: 7 : g_return_val_if_fail (VALENT_IS_APPLICATION_PLUGIN (plugin), FALSE);
222 [ + - + - : 7 : g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), FALSE);
- + - - ]
223 [ - + ]: 7 : g_return_val_if_fail (g_variant_is_object_path (object_path), FALSE);
224 [ + + - + ]: 7 : g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
225 : :
226 : 7 : ret = VALENT_APPLICATION_PLUGIN_GET_CLASS (plugin)->dbus_register (plugin,
227 : : connection,
228 : : object_path,
229 : : error);
230 : :
231 : 7 : VALENT_RETURN (ret);
232 : : }
233 : :
234 : : /**
235 : : * valent_application_plugin_dbus_unregister: (virtual dbus_unregister)
236 : : * @plugin: a `ValentApplicationPlugin`
237 : : * @connection: a `Gio.DBusCOnnection`
238 : : * @object_path: a D
239 : : *
240 : : * Handle the D-Bus unregistration phase of the application.
241 : : *
242 : : * Implementations should override this method to unexport anything exported in
243 : : * [vfunc@Valent.ApplicationPlugin.dbus_register].
244 : : *
245 : : * Since: 1.0
246 : : */
247 : : void
248 : 7 : valent_application_plugin_dbus_unregister (ValentApplicationPlugin *plugin,
249 : : GDBusConnection *connection,
250 : : const char *object_path)
251 : : {
252 : 7 : VALENT_ENTRY;
253 : :
254 [ + - ]: 7 : g_return_if_fail (VALENT_IS_APPLICATION_PLUGIN (plugin));
255 [ + - + - : 7 : g_return_if_fail (G_IS_DBUS_CONNECTION (connection));
- + - - ]
256 [ - + ]: 7 : g_return_if_fail (g_variant_is_object_path (object_path));
257 : :
258 : 7 : VALENT_APPLICATION_PLUGIN_GET_CLASS (plugin)->dbus_unregister (plugin,
259 : : connection,
260 : : object_path);
261 : :
262 : 7 : VALENT_EXIT;
263 : : }
264 : :
265 : : /**
266 : : * valent_application_plugin_open: (virtual open)
267 : : * @plugin: a `ValentApplicationPlugin`
268 : : * @files: (array length=n_files): an array of `GFiles` to open
269 : : * @n_files: the length of the @files array
270 : : * @hint: (not nullable): a hint (or "")
271 : : *
272 : : * Open the given files.
273 : : *
274 : : * Implementations should override this method to handle files and URIs, as
275 : : * a result of [signal@Gio.Application::open] being emitted on the primary
276 : : * instance of the application.
277 : : *
278 : : * Returns: %TRUE if handled, or %FALSE if not
279 : : *
280 : : * Since: 1.0
281 : : */
282 : : gboolean
283 : 2 : valent_application_plugin_open (ValentApplicationPlugin *plugin,
284 : : GFile **files,
285 : : int n_files,
286 : : const char *hint)
287 : : {
288 : 2 : gboolean ret;
289 : :
290 : 2 : VALENT_ENTRY;
291 : :
292 [ + - ]: 2 : g_return_val_if_fail (VALENT_IS_APPLICATION_PLUGIN (plugin), FALSE);
293 [ - + ]: 2 : g_return_val_if_fail (files != NULL, FALSE);
294 [ - + ]: 2 : g_return_val_if_fail (n_files > 0, FALSE);
295 [ - + ]: 2 : g_return_val_if_fail (hint != NULL, FALSE);
296 : :
297 : 2 : ret = VALENT_APPLICATION_PLUGIN_GET_CLASS (plugin)->open (plugin,
298 : : files,
299 : : n_files,
300 : : hint);
301 : :
302 : 2 : VALENT_RETURN (ret);
303 : : }
304 : :
305 : : /**
306 : : * valent_application_plugin_shutdown: (virtual shutdown)
307 : : * @plugin: a `ValentApplicationPlugin`
308 : : *
309 : : * Handle the shutdown phase of the application.
310 : : *
311 : : * Implementations should override this method to reverse anything done in
312 : : * [vfunc@Valent.ApplicationPlugin.startup].
313 : : *
314 : : * Since: 1.0
315 : : */
316 : : void
317 : 14 : valent_application_plugin_shutdown (ValentApplicationPlugin *plugin)
318 : : {
319 : 14 : VALENT_ENTRY;
320 : :
321 [ + - ]: 14 : g_return_if_fail (VALENT_IS_APPLICATION_PLUGIN (plugin));
322 : :
323 : 14 : VALENT_APPLICATION_PLUGIN_GET_CLASS (plugin)->shutdown (plugin);
324 : :
325 : 14 : VALENT_EXIT;
326 : : }
327 : :
328 : : /**
329 : : * valent_application_plugin_startup: (virtual startup)
330 : : * @plugin: a `ValentApplicationPlugin`
331 : : *
332 : : * Handle the startup phase of the application.
333 : : *
334 : : * Implementations may override this method to perform setup task that should
335 : : * only happen on the primary instance.
336 : : *
337 : : * Since: 1.0
338 : : */
339 : : void
340 : 14 : valent_application_plugin_startup (ValentApplicationPlugin *plugin)
341 : : {
342 : 14 : VALENT_ENTRY;
343 : :
344 [ + - ]: 14 : g_return_if_fail (VALENT_IS_APPLICATION_PLUGIN (plugin));
345 : :
346 : 14 : VALENT_APPLICATION_PLUGIN_GET_CLASS (plugin)->startup (plugin);
347 : :
348 : 14 : VALENT_EXIT;
349 : : }
350 : :
|