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