Merge lp:~khurshid-alam/unity-settings-daemon/sharing-plugin-test into lp:unity-settings-daemon
- sharing-plugin-test
- Merge into trunk
Proposed by
Khurshid Alam
Status: | Merged |
---|---|
Merge reported by: | Jeremy Bícha |
Merged at revision: | not available |
Proposed branch: | lp:~khurshid-alam/unity-settings-daemon/sharing-plugin-test |
Merge into: | lp:unity-settings-daemon |
Diff against target: |
1130 lines (+1029/-1) 11 files modified
configure.ac (+21/-0) debian/control (+1/-0) debian/rules (+1/-1) plugins/Makefile.am (+1/-0) plugins/sharing/Makefile.am (+49/-0) plugins/sharing/gsd-sharing-enums.h (+34/-0) plugins/sharing/gsd-sharing-manager.c (+822/-0) plugins/sharing/gsd-sharing-manager.h (+56/-0) plugins/sharing/gsd-sharing-plugin.c (+28/-0) plugins/sharing/sharing.gnome-settings-plugin.in (+9/-0) plugins/sharing/test-sharing.c (+7/-0) |
To merge this branch: | bzr merge lp:~khurshid-alam/unity-settings-daemon/sharing-plugin-test |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Jeremy Bícha | Pending | ||
Review via email: mp+339446@code.launchpad.net |
Commit message
Add sharing plugin
we are importing sharing panel from gnome-control-
Description of the change
PPA: unity7maintaine
Testing: https:/
The related control center branch is https:/
To post a comment you must log in.
Revision history for this message
Jeremy Bícha (jbicha) wrote : | # |
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'configure.ac' |
2 | --- configure.ac 2017-03-24 03:49:07 +0000 |
3 | +++ configure.ac 2018-02-24 12:26:52 +0000 |
4 | @@ -58,6 +58,7 @@ |
5 | GSETTINGS_DESKTOP_SCHEMAS_REQUIRED_VERSION=3.7.2.1 |
6 | XRANDR_REQUIRED_VERSION=1.3 |
7 | XEXT_REQUIRED_VERSION=1.1 |
8 | +NM_REQUIRED_VERSION=1.0 |
9 | |
10 | EXTRA_COMPILE_WARNINGS(yes) |
11 | |
12 | @@ -376,6 +377,24 @@ |
13 | |
14 | AC_SUBST(NSS_DATABASE) |
15 | |
16 | +dnl --------------------------------------------------------------------------- |
17 | +dnl Sharing plugin |
18 | +dnl --------------------------------------------------------------------------- |
19 | + |
20 | +AC_ARG_ENABLE(network-manager, |
21 | + AS_HELP_STRING([--disable-network-manager], |
22 | + [Disable NetworkManager support]), |
23 | + enable_network_manager=$enableval, |
24 | + enable_network_manager=yes) |
25 | + |
26 | +if test "x$enable_network_manager" = "xyes" ; then |
27 | + NM_MODULE="libnm >= $NM_REQUIRED_VERSION" |
28 | + AC_DEFINE(HAVE_NETWORK_MANAGER, 1, [Defined if NetworkManager support is enabled]) |
29 | +else |
30 | + NM_MODULE= |
31 | +fi |
32 | + |
33 | +PKG_CHECK_MODULES(SHARING, gio-2.0 $NM_MODULE) |
34 | |
35 | # --------------------------------------------------------------------------- |
36 | # Enable Profiling |
37 | @@ -497,6 +516,7 @@ |
38 | plugins/orientation/Makefile |
39 | plugins/remote-display/Makefile |
40 | plugins/screensaver-proxy/Makefile |
41 | +plugins/sharing/Makefile |
42 | plugins/smartcard/Makefile |
43 | plugins/sound/Makefile |
44 | plugins/updates/Makefile |
45 | @@ -537,6 +557,7 @@ |
46 | |
47 | Session tracking: ${SESSION_TRACKING} |
48 | LCMS DICT support: ${have_new_lcms} |
49 | + NetworkManager support: ${enable_network_manager} |
50 | IBus support: ${enable_ibus} |
51 | Fcitx support: ${enable_fcitx} |
52 | Libnotify support: ${have_libnotify} |
53 | |
54 | === modified file 'debian/control' |
55 | --- debian/control 2017-09-22 00:32:24 +0000 |
56 | +++ debian/control 2018-02-24 12:26:52 +0000 |
57 | @@ -12,6 +12,7 @@ |
58 | libdbus-glib-1-dev (>= 0.74), |
59 | libglib2.0-dev (>= 2.35.3), |
60 | libgtk-3-dev (>= 3.7.8), |
61 | + libnm-dev (>= 1.0) [linux-any], |
62 | libnotify-dev (>= 0.7.0), |
63 | libxt-dev, |
64 | libxi-dev, |
65 | |
66 | === modified file 'debian/rules' |
67 | --- debian/rules 2018-02-14 12:40:59 +0000 |
68 | +++ debian/rules 2018-02-24 12:26:52 +0000 |
69 | @@ -8,7 +8,7 @@ |
70 | |
71 | DEB_DH_MAKESHLIBS_ARGS_ALL += -X/usr/lib/unity-settings-daemon-1.0 |
72 | DEB_CONFIGURE_SCRIPT := ./autogen.sh |
73 | -DEB_CONFIGURE_EXTRA_FLAGS = --disable-packagekit --enable-ibus --enable-fcitx |
74 | +DEB_CONFIGURE_EXTRA_FLAGS = --disable-packagekit --enable-ibus --enable-fcitx --enable-network-manager |
75 | |
76 | build/unity-settings-daemon:: |
77 | gcc -o gnome-settings-daemon/gnome-update-wallpaper-cache debian/gnome-update-wallpaper-cache.c `pkg-config --cflags --libs glib-2.0 gdk-3.0 gdk-x11-3.0 gio-2.0 gnome-desktop-3.0` |
78 | |
79 | === modified file 'plugins/Makefile.am' |
80 | --- plugins/Makefile.am 2017-03-24 03:49:07 +0000 |
81 | +++ plugins/Makefile.am 2018-02-24 12:26:52 +0000 |
82 | @@ -16,6 +16,7 @@ |
83 | mouse \ |
84 | remote-display \ |
85 | screensaver-proxy \ |
86 | + sharing \ |
87 | sound \ |
88 | xrandr \ |
89 | xsettings \ |
90 | |
91 | === added directory 'plugins/sharing' |
92 | === added file 'plugins/sharing/Makefile.am' |
93 | --- plugins/sharing/Makefile.am 1970-01-01 00:00:00 +0000 |
94 | +++ plugins/sharing/Makefile.am 2018-02-24 12:26:52 +0000 |
95 | @@ -0,0 +1,49 @@ |
96 | +plugin_name = sharing |
97 | + |
98 | +plugin_LTLIBRARIES = libsharing.la |
99 | + |
100 | +libsharing_la_SOURCES = \ |
101 | + gsd-sharing-manager.c \ |
102 | + gsd-sharing-manager.h \ |
103 | + gsd-sharing-enums.h \ |
104 | + gsd-sharing-plugin.c |
105 | + |
106 | +libsharing_la_CPPFLAGS = \ |
107 | + -I$(top_srcdir)/gnome-settings-daemon \ |
108 | + -I$(top_builddir)/gnome-settings-daemon \ |
109 | + -DGNOME_SETTINGS_LOCALEDIR=\""$(datadir)/locale"\" \ |
110 | + $(AM_CPPFLAGS) |
111 | + |
112 | +libsharing_la_CFLAGS = \ |
113 | + -I$(top_srcdir)/plugins/common \ |
114 | + $(SHARING_CFLAGS) \ |
115 | + $(PLUGIN_CFLAGS) \ |
116 | + $(SETTINGS_PLUGIN_CFLAGS) \ |
117 | + $(AM_CFLAGS) |
118 | + |
119 | +libsharing_la_LDFLAGS = $(GSD_PLUGIN_LDFLAGS) |
120 | + |
121 | +libsharing_la_LIBADD = $(SETTINGS_PLUGIN_LIBS) $(SHARING_LIBS) |
122 | + |
123 | +noinst_PROGRAMS = gsd-test-sharing |
124 | +gsd_test_sharing_SOURCES = \ |
125 | + gsd-sharing-manager.c \ |
126 | + gsd-sharing-manager.h \ |
127 | + test-sharing.c |
128 | + |
129 | +gsd_test_sharing_CFLAGS = $(libsharing_la_CFLAGS) |
130 | +gsd_test_sharing_CPPFLAGS = $(libsharing_la_CPPFLAGS) |
131 | +gsd_test_sharing_LDADD = \ |
132 | + $(top_builddir)/gnome-settings-daemon/libgsd.la \ |
133 | + $(SHARING_LIBS) \ |
134 | + $(SETTINGS_PLUGIN_LIBS) |
135 | + |
136 | +plugin_in_files = sharing.gnome-settings-plugin.in |
137 | + |
138 | +plugin_DATA = $(plugin_in_files:.gnome-settings-plugin.in=.gnome-settings-plugin) |
139 | + |
140 | +EXTRA_DIST = $(plugin_in_files) |
141 | +CLEANFILES = $(plugin_DATA) |
142 | +DISTCLEANFILES = $(plugin_DATA) |
143 | + |
144 | +@GSD_INTLTOOL_PLUGIN_RULE@ |
145 | |
146 | === added file 'plugins/sharing/gsd-sharing-enums.h' |
147 | --- plugins/sharing/gsd-sharing-enums.h 1970-01-01 00:00:00 +0000 |
148 | +++ plugins/sharing/gsd-sharing-enums.h 2018-02-24 12:26:52 +0000 |
149 | @@ -0,0 +1,34 @@ |
150 | +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- |
151 | + * |
152 | + * Copyright (C) 2014 Bastien Nocera <hadess@hadess.net> |
153 | + * |
154 | + * This program is free software; you can redistribute it and/or modify |
155 | + * it under the terms of the GNU General Public License as published by |
156 | + * the Free Software Foundation; either version 2 of the License, or |
157 | + * (at your option) any later version. |
158 | + * |
159 | + * This program is distributed in the hope that it will be useful, |
160 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
161 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
162 | + * GNU General Public License for more details. |
163 | + * |
164 | + * You should have received a copy of the GNU General Public License |
165 | + * along with this program; if not, see <http://www.gnu.org/licenses/>. |
166 | + * |
167 | + */ |
168 | + |
169 | +#ifndef __GSD_SHARING_ENUMS_H |
170 | +#define __GSD_SHARING_ENUMS_H |
171 | + |
172 | +G_BEGIN_DECLS |
173 | + |
174 | +typedef enum { |
175 | + GSD_SHARING_STATUS_OFFLINE, |
176 | + GSD_SHARING_STATUS_DISABLED_MOBILE_BROADBAND, |
177 | + GSD_SHARING_STATUS_DISABLED_LOW_SECURITY, |
178 | + GSD_SHARING_STATUS_AVAILABLE |
179 | +} GsdSharingStatus; |
180 | + |
181 | +G_END_DECLS |
182 | + |
183 | +#endif /* __GSD_SHARING_ENUMS_H */ |
184 | |
185 | === added file 'plugins/sharing/gsd-sharing-manager.c' |
186 | --- plugins/sharing/gsd-sharing-manager.c 1970-01-01 00:00:00 +0000 |
187 | +++ plugins/sharing/gsd-sharing-manager.c 2018-02-24 12:26:52 +0000 |
188 | @@ -0,0 +1,822 @@ |
189 | +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- |
190 | + * |
191 | + * Copyright (C) 2014 Bastien Nocera <hadess@hadess.net> |
192 | + * |
193 | + * This program is free software; you can redistribute it and/or modify |
194 | + * it under the terms of the GNU General Public License as published by |
195 | + * the Free Software Foundation; either version 2 of the License, or |
196 | + * (at your option) any later version. |
197 | + * |
198 | + * This program is distributed in the hope that it will be useful, |
199 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
200 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
201 | + * GNU General Public License for more details. |
202 | + * |
203 | + * You should have received a copy of the GNU General Public License |
204 | + * along with this program; if not, see <http://www.gnu.org/licenses/>. |
205 | + * |
206 | + */ |
207 | + |
208 | +#include "config.h" |
209 | + |
210 | +#include <locale.h> |
211 | +#include <glib.h> |
212 | +#include <gio/gio.h> |
213 | +#include <gio/gdesktopappinfo.h> |
214 | +#include <glib/gstdio.h> |
215 | + |
216 | +#ifdef HAVE_NETWORK_MANAGER |
217 | +#include <NetworkManager.h> |
218 | +#endif /* HAVE_NETWORK_MANAGER */ |
219 | + |
220 | +#include "gnome-settings-plugin.h" |
221 | +#include "gnome-settings-profile.h" |
222 | +#include "gsd-sharing-manager.h" |
223 | +#include "gsd-sharing-enums.h" |
224 | + |
225 | +#define GSD_SHARING_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GSD_TYPE_SHARING_MANAGER, GsdSharingManagerPrivate)) |
226 | + |
227 | +typedef struct { |
228 | + const char *name; |
229 | + GSettings *settings; |
230 | + gboolean started; |
231 | + GSubprocess *process; |
232 | +} ServiceInfo; |
233 | + |
234 | +struct GsdSharingManagerPrivate |
235 | +{ |
236 | + GDBusNodeInfo *introspection_data; |
237 | + guint name_id; |
238 | + GDBusConnection *connection; |
239 | + |
240 | + GCancellable *cancellable; |
241 | +#ifdef HAVE_NETWORK_MANAGER |
242 | + NMClient *client; |
243 | +#endif /* HAVE_NETWORK_MANAGER */ |
244 | + |
245 | + GHashTable *services; |
246 | + |
247 | + char *current_network; |
248 | + char *current_network_name; |
249 | + char *carrier_type; |
250 | + GsdSharingStatus sharing_status; |
251 | +}; |
252 | + |
253 | +#define GSD_SHARING_DBUS_NAME GSD_DBUS_NAME ".Sharing" |
254 | +#define GSD_SHARING_DBUS_PATH GSD_DBUS_PATH "/Sharing" |
255 | + |
256 | +static const gchar introspection_xml[] = |
257 | +"<node>" |
258 | +" <interface name='org.gnome.SettingsDaemon.Sharing'>" |
259 | +" <annotation name='org.freedesktop.DBus.GLib.CSymbol' value='gsd_sharing_manager'/>" |
260 | +" <property name='CurrentNetwork' type='s' access='read'/>" |
261 | +" <property name='CurrentNetworkName' type='s' access='read'/>" |
262 | +" <property name='CarrierType' type='s' access='read'/>" |
263 | +" <property name='SharingStatus' type='u' access='read'/>" |
264 | +" <method name='EnableService'>" |
265 | +" <arg name='service-name' direction='in' type='s'/>" |
266 | +" </method>" |
267 | +" <method name='DisableService'>" |
268 | +" <arg name='service-name' direction='in' type='s'/>" |
269 | +" <arg name='network' direction='in' type='s'/>" |
270 | +" </method>" |
271 | +" <method name='ListNetworks'>" |
272 | +" <arg name='service-name' direction='in' type='s'/>" |
273 | +" <arg name='networks' direction='out' type='a(sss)'/>" |
274 | +" </method>" |
275 | +" </interface>" |
276 | +"</node>"; |
277 | + |
278 | +static void gsd_sharing_manager_class_init (GsdSharingManagerClass *klass); |
279 | +static void gsd_sharing_manager_init (GsdSharingManager *manager); |
280 | +static void gsd_sharing_manager_finalize (GObject *object); |
281 | + |
282 | +G_DEFINE_TYPE (GsdSharingManager, gsd_sharing_manager, G_TYPE_OBJECT) |
283 | + |
284 | +static gpointer manager_object = NULL; |
285 | + |
286 | +static const char * const services[] = { |
287 | + "rygel", |
288 | + "vino-server", |
289 | + "gnome-user-share-webdav" |
290 | +}; |
291 | + |
292 | +static void |
293 | +gsd_sharing_manager_start_service (GsdSharingManager *manager, |
294 | + ServiceInfo *service) |
295 | +{ |
296 | + GDesktopAppInfo *app; |
297 | + const char *exec; |
298 | + char *desktop, **argvp; |
299 | + GError *error = NULL; |
300 | + |
301 | + if (service->started) |
302 | + return; |
303 | + g_debug ("About to start %s", service->name); |
304 | + |
305 | + desktop = g_strdup_printf ("%s.desktop", service->name); |
306 | + app = g_desktop_app_info_new (desktop); |
307 | + g_free (desktop); |
308 | + |
309 | + if (!app) { |
310 | + g_warning ("Could not find desktop file for service '%s'", service->name); |
311 | + return; |
312 | + } |
313 | + |
314 | + exec = g_app_info_get_commandline (G_APP_INFO (app)); |
315 | + |
316 | + if (!g_shell_parse_argv (exec, NULL, &argvp, &error)) { |
317 | + g_warning ("Could not parse command-line '%s': %s", exec, error->message); |
318 | + g_error_free (error); |
319 | + g_object_unref (app); |
320 | + return; |
321 | + } |
322 | + |
323 | + service->process = g_subprocess_newv ((const gchar * const*) argvp, G_SUBPROCESS_FLAGS_NONE, &error); |
324 | + |
325 | + if (!service->process) { |
326 | + g_warning ("Could not start command-line '%s': %s", exec, error->message); |
327 | + g_error_free (error); |
328 | + service->started = FALSE; |
329 | + } else { |
330 | + service->started = TRUE; |
331 | + } |
332 | + |
333 | + g_strfreev (argvp); |
334 | + g_object_unref (app); |
335 | +} |
336 | + |
337 | +#ifdef HAVE_NETWORK_MANAGER |
338 | +static gboolean |
339 | +service_is_enabled_on_current_connection (GsdSharingManager *manager, |
340 | + ServiceInfo *service) |
341 | +{ |
342 | + char **connections; |
343 | + int j; |
344 | + gboolean ret; |
345 | + connections = g_settings_get_strv (service->settings, "enabled-connections"); |
346 | + ret = FALSE; |
347 | + for (j = 0; connections[j] != NULL; j++) { |
348 | + if (g_strcmp0 (connections[j], manager->priv->current_network) == 0) { |
349 | + ret = TRUE; |
350 | + break; |
351 | + } |
352 | + } |
353 | + |
354 | + g_strfreev (connections); |
355 | + return ret; |
356 | +} |
357 | +#else |
358 | +static gboolean |
359 | +service_is_enabled_on_current_connection (GsdSharingManager *manager, |
360 | + ServiceInfo *service) |
361 | +{ |
362 | + return FALSE; |
363 | +} |
364 | +#endif /* HAVE_NETWORK_MANAGER */ |
365 | + |
366 | +static void |
367 | +gsd_sharing_manager_stop_service (GsdSharingManager *manager, |
368 | + ServiceInfo *service) |
369 | +{ |
370 | + if (!service->started || |
371 | + service->process == NULL) { |
372 | + return; |
373 | + } |
374 | + |
375 | + g_debug ("About to stop %s", service->name); |
376 | + |
377 | + g_subprocess_send_signal (service->process, SIGTERM); |
378 | + g_clear_object (&service->process); |
379 | + service->started = FALSE; |
380 | +} |
381 | + |
382 | +static void |
383 | +gsd_sharing_manager_sync_services (GsdSharingManager *manager) |
384 | +{ |
385 | + GList *services, *l; |
386 | + |
387 | + services = g_hash_table_get_values (manager->priv->services); |
388 | + |
389 | + for (l = services; l != NULL; l = l->next) { |
390 | + ServiceInfo *service = l->data; |
391 | + gboolean should_be_started = FALSE; |
392 | + |
393 | + if (manager->priv->sharing_status == GSD_SHARING_STATUS_AVAILABLE && |
394 | + service_is_enabled_on_current_connection (manager, service)) |
395 | + should_be_started = TRUE; |
396 | + |
397 | + if (service->started != should_be_started) { |
398 | + if (service->started) |
399 | + gsd_sharing_manager_stop_service (manager, service); |
400 | + else |
401 | + gsd_sharing_manager_start_service (manager, service); |
402 | + } |
403 | + } |
404 | + g_list_free (services); |
405 | +} |
406 | + |
407 | +#ifdef HAVE_NETWORK_MANAGER |
408 | +static void |
409 | +properties_changed (GsdSharingManager *manager) |
410 | +{ |
411 | + GVariantBuilder props_builder; |
412 | + GVariant *props_changed = NULL; |
413 | + |
414 | + /* not yet connected to the session bus */ |
415 | + if (manager->priv->connection == NULL) |
416 | + return; |
417 | + |
418 | + g_variant_builder_init (&props_builder, G_VARIANT_TYPE ("a{sv}")); |
419 | + |
420 | + g_variant_builder_add (&props_builder, "{sv}", "CurrentNetwork", |
421 | + g_variant_new_string (manager->priv->current_network)); |
422 | + g_variant_builder_add (&props_builder, "{sv}", "CurrentNetworkName", |
423 | + g_variant_new_string (manager->priv->current_network_name)); |
424 | + g_variant_builder_add (&props_builder, "{sv}", "CarrierType", |
425 | + g_variant_new_string (manager->priv->carrier_type)); |
426 | + g_variant_builder_add (&props_builder, "{sv}", "SharingStatus", |
427 | + g_variant_new_uint32 (manager->priv->sharing_status)); |
428 | + |
429 | + props_changed = g_variant_new ("(s@a{sv}@as)", GSD_SHARING_DBUS_NAME, |
430 | + g_variant_builder_end (&props_builder), |
431 | + g_variant_new_strv (NULL, 0)); |
432 | + |
433 | + g_dbus_connection_emit_signal (manager->priv->connection, |
434 | + NULL, |
435 | + GSD_SHARING_DBUS_PATH, |
436 | + "org.freedesktop.DBus.Properties", |
437 | + "PropertiesChanged", |
438 | + props_changed, NULL); |
439 | +} |
440 | + |
441 | +static char ** |
442 | +get_connections_for_service (GsdSharingManager *manager, |
443 | + const char *service_name) |
444 | +{ |
445 | + ServiceInfo *service; |
446 | + |
447 | + service = g_hash_table_lookup (manager->priv->services, service_name); |
448 | + return g_settings_get_strv (service->settings, "enabled-connections"); |
449 | +} |
450 | +#else |
451 | +static char ** |
452 | +get_connections_for_service (GsdSharingManager *manager, |
453 | + const char *service_name) |
454 | +{ |
455 | + const char * const * connections [] = { NULL }; |
456 | + return g_strdupv ((char **) connections); |
457 | +} |
458 | +#endif /* HAVE_NETWORK_MANAGER */ |
459 | + |
460 | +static gboolean |
461 | +check_service (GsdSharingManager *manager, |
462 | + const char *service_name, |
463 | + GError **error) |
464 | +{ |
465 | + if (g_hash_table_lookup (manager->priv->services, service_name)) |
466 | + return TRUE; |
467 | + |
468 | + g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, |
469 | + "Invalid service name '%s'", service_name); |
470 | + return FALSE; |
471 | +} |
472 | + |
473 | +static gboolean |
474 | +gsd_sharing_manager_enable_service (GsdSharingManager *manager, |
475 | + const char *service_name, |
476 | + GError **error) |
477 | +{ |
478 | + ServiceInfo *service; |
479 | + char **connections; |
480 | + GPtrArray *array; |
481 | + guint i; |
482 | + |
483 | + if (!check_service (manager, service_name, error)) |
484 | + return FALSE; |
485 | + |
486 | + if (manager->priv->sharing_status != GSD_SHARING_STATUS_AVAILABLE) { |
487 | + g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, |
488 | + "Sharing cannot be enabled on this network, status is '%d'", manager->priv->sharing_status); |
489 | + return FALSE; |
490 | + } |
491 | + |
492 | + service = g_hash_table_lookup (manager->priv->services, service_name); |
493 | + connections = g_settings_get_strv (service->settings, "enabled-connections"); |
494 | + array = g_ptr_array_new (); |
495 | + for (i = 0; connections[i] != NULL; i++) { |
496 | + if (g_strcmp0 (connections[i], manager->priv->current_network) == 0) |
497 | + goto bail; |
498 | + g_ptr_array_add (array, connections[i]); |
499 | + } |
500 | + g_ptr_array_add (array, manager->priv->current_network); |
501 | + g_ptr_array_add (array, NULL); |
502 | + |
503 | + g_settings_set_strv (service->settings, "enabled-connections", (const gchar *const *) array->pdata); |
504 | + |
505 | +bail: |
506 | + |
507 | + gsd_sharing_manager_start_service (manager, service); |
508 | + |
509 | + g_ptr_array_unref (array); |
510 | + g_strfreev (connections); |
511 | + |
512 | + return TRUE; |
513 | +} |
514 | + |
515 | +static gboolean |
516 | +gsd_sharing_manager_disable_service (GsdSharingManager *manager, |
517 | + const char *service_name, |
518 | + const char *network_name, |
519 | + GError **error) |
520 | +{ |
521 | + ServiceInfo *service; |
522 | + char **connections; |
523 | + GPtrArray *array; |
524 | + guint i; |
525 | + |
526 | + if (!check_service (manager, service_name, error)) |
527 | + return FALSE; |
528 | + |
529 | + service = g_hash_table_lookup (manager->priv->services, service_name); |
530 | + connections = g_settings_get_strv (service->settings, "enabled-connections"); |
531 | + array = g_ptr_array_new (); |
532 | + for (i = 0; connections[i] != NULL; i++) { |
533 | + if (g_strcmp0 (connections[i], network_name) != 0) |
534 | + g_ptr_array_add (array, connections[i]); |
535 | + } |
536 | + g_ptr_array_add (array, NULL); |
537 | + |
538 | + g_settings_set_strv (service->settings, "enabled-connections", (const gchar *const *) array->pdata); |
539 | + g_ptr_array_unref (array); |
540 | + g_strfreev (connections); |
541 | + |
542 | + if (g_str_equal (network_name, manager->priv->current_network)) |
543 | + gsd_sharing_manager_stop_service (manager, service); |
544 | + |
545 | + return TRUE; |
546 | +} |
547 | + |
548 | +#ifdef HAVE_NETWORK_MANAGER |
549 | +static const char * |
550 | +get_type_and_name_for_connection_uuid (GsdSharingManager *manager, |
551 | + const char *uuid, |
552 | + const char **name) |
553 | +{ |
554 | + NMRemoteConnection *conn; |
555 | + const char *type; |
556 | + |
557 | + if (!manager->priv->client) |
558 | + return NULL; |
559 | + |
560 | + conn = nm_client_get_connection_by_uuid (manager->priv->client, uuid); |
561 | + if (!conn) |
562 | + return NULL; |
563 | + type = nm_connection_get_connection_type (NM_CONNECTION (conn)); |
564 | + *name = nm_connection_get_id (NM_CONNECTION (conn)); |
565 | + |
566 | + return type; |
567 | +} |
568 | +#else |
569 | +static const char * |
570 | +get_type_and_name_for_connection_uuid (GsdSharingManager *manager, |
571 | + const char *id, |
572 | + const char **name) |
573 | +{ |
574 | + return NULL; |
575 | +} |
576 | +#endif /* HAVE_NETWORK_MANAGER */ |
577 | + |
578 | +#ifdef HAVE_NETWORK_MANAGER |
579 | +static gboolean |
580 | +connection_is_low_security (GsdSharingManager *manager, |
581 | + const char *uuid) |
582 | +{ |
583 | + NMRemoteConnection *conn; |
584 | + |
585 | + if (!manager->priv->client) |
586 | + return TRUE; |
587 | + |
588 | + conn = nm_client_get_connection_by_uuid (manager->priv->client, uuid); |
589 | + if (!conn) |
590 | + return TRUE; |
591 | + |
592 | + /* Disable sharing on open Wi-Fi |
593 | + * XXX: Also do this for WEP networks? */ |
594 | + return (nm_connection_get_setting_wireless_security (NM_CONNECTION (conn)) == NULL); |
595 | +} |
596 | +#endif /* HAVE_NETWORK_MANAGER */ |
597 | + |
598 | +static GVariant * |
599 | +gsd_sharing_manager_list_networks (GsdSharingManager *manager, |
600 | + const char *service_name, |
601 | + GError **error) |
602 | +{ |
603 | + char **connections; |
604 | + GVariantBuilder builder; |
605 | + guint i; |
606 | + |
607 | + if (!check_service (manager, service_name, error)) |
608 | + return NULL; |
609 | + |
610 | +#ifdef HAVE_NETWORK_MANAGER |
611 | + if (!manager->priv->client) { |
612 | + g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_FAILED, "Not ready yet"); |
613 | + return NULL; |
614 | + } |
615 | +#endif /* HAVE_NETWORK_MANAGER */ |
616 | + |
617 | + connections = get_connections_for_service (manager, service_name); |
618 | + |
619 | + g_variant_builder_init (&builder, G_VARIANT_TYPE ("(a(sss))")); |
620 | + g_variant_builder_open (&builder, G_VARIANT_TYPE ("a(sss)")); |
621 | + |
622 | + for (i = 0; connections[i] != NULL; i++) { |
623 | + const char *type, *name; |
624 | + |
625 | + type = get_type_and_name_for_connection_uuid (manager, connections[i], &name); |
626 | + if (!type) |
627 | + continue; |
628 | + |
629 | + g_variant_builder_add (&builder, "(sss)", connections[i], name, type); |
630 | + } |
631 | + g_strfreev (connections); |
632 | + |
633 | + g_variant_builder_close (&builder); |
634 | + |
635 | + return g_variant_builder_end (&builder); |
636 | +} |
637 | + |
638 | +static GVariant * |
639 | +handle_get_property (GDBusConnection *connection, |
640 | + const gchar *sender, |
641 | + const gchar *object_path, |
642 | + const gchar *interface_name, |
643 | + const gchar *property_name, |
644 | + GError **error, |
645 | + gpointer user_data) |
646 | +{ |
647 | + GsdSharingManager *manager = GSD_SHARING_MANAGER (user_data); |
648 | + |
649 | + /* Check session pointer as a proxy for whether the manager is in the |
650 | + start or stop state */ |
651 | + if (manager->priv->connection == NULL) |
652 | + return NULL; |
653 | + |
654 | + if (g_strcmp0 (property_name, "CurrentNetwork") == 0) { |
655 | + return g_variant_new_string (manager->priv->current_network); |
656 | + } |
657 | + |
658 | + if (g_strcmp0 (property_name, "CurrentNetworkName") == 0) { |
659 | + return g_variant_new_string (manager->priv->current_network_name); |
660 | + } |
661 | + |
662 | + if (g_strcmp0 (property_name, "CarrierType") == 0) { |
663 | + return g_variant_new_string (manager->priv->carrier_type); |
664 | + } |
665 | + |
666 | + if (g_strcmp0 (property_name, "SharingStatus") == 0) { |
667 | + return g_variant_new_uint32 (manager->priv->sharing_status); |
668 | + } |
669 | + |
670 | + return NULL; |
671 | +} |
672 | + |
673 | +static void |
674 | +handle_method_call (GDBusConnection *connection, |
675 | + const gchar *sender, |
676 | + const gchar *object_path, |
677 | + const gchar *interface_name, |
678 | + const gchar *method_name, |
679 | + GVariant *parameters, |
680 | + GDBusMethodInvocation *invocation, |
681 | + gpointer user_data) |
682 | +{ |
683 | + GsdSharingManager *manager = (GsdSharingManager *) user_data; |
684 | + |
685 | + g_debug ("Calling method '%s' for sharing", method_name); |
686 | + |
687 | + /* Check session pointer as a proxy for whether the manager is in the |
688 | + start or stop state */ |
689 | + if (manager->priv->connection == NULL) |
690 | + return; |
691 | + |
692 | + if (g_strcmp0 (method_name, "EnableService") == 0) { |
693 | + const char *service; |
694 | + GError *error = NULL; |
695 | + |
696 | + g_variant_get (parameters, "(&s)", &service); |
697 | + if (!gsd_sharing_manager_enable_service (manager, service, &error)) |
698 | + g_dbus_method_invocation_take_error (invocation, error); |
699 | + else |
700 | + g_dbus_method_invocation_return_value (invocation, NULL); |
701 | + } else if (g_strcmp0 (method_name, "DisableService") == 0) { |
702 | + const char *service; |
703 | + const char *network_name; |
704 | + GError *error = NULL; |
705 | + |
706 | + g_variant_get (parameters, "(&s&s)", &service, &network_name); |
707 | + if (!gsd_sharing_manager_disable_service (manager, service, network_name, &error)) |
708 | + g_dbus_method_invocation_take_error (invocation, error); |
709 | + else |
710 | + g_dbus_method_invocation_return_value (invocation, NULL); |
711 | + } else if (g_strcmp0 (method_name, "ListNetworks") == 0) { |
712 | + const char *service; |
713 | + GError *error = NULL; |
714 | + GVariant *variant; |
715 | + |
716 | + g_variant_get (parameters, "(&s)", &service); |
717 | + variant = gsd_sharing_manager_list_networks (manager, service, &error); |
718 | + if (!variant) |
719 | + g_dbus_method_invocation_take_error (invocation, error); |
720 | + else |
721 | + g_dbus_method_invocation_return_value (invocation, variant); |
722 | + } |
723 | +} |
724 | + |
725 | +static const GDBusInterfaceVTable interface_vtable = |
726 | +{ |
727 | + handle_method_call, |
728 | + handle_get_property, |
729 | + NULL |
730 | +}; |
731 | + |
732 | +static void |
733 | +on_bus_gotten (GObject *source_object, |
734 | + GAsyncResult *res, |
735 | + GsdSharingManager *manager) |
736 | +{ |
737 | + GDBusConnection *connection; |
738 | + GError *error = NULL; |
739 | + |
740 | + connection = g_bus_get_finish (res, &error); |
741 | + if (connection == NULL) { |
742 | + if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) |
743 | + g_warning ("Could not get session bus: %s", error->message); |
744 | + g_error_free (error); |
745 | + return; |
746 | + } |
747 | + manager->priv->connection = connection; |
748 | + |
749 | + g_dbus_connection_register_object (connection, |
750 | + GSD_SHARING_DBUS_PATH, |
751 | + manager->priv->introspection_data->interfaces[0], |
752 | + &interface_vtable, |
753 | + manager, |
754 | + NULL, |
755 | + NULL); |
756 | + |
757 | + manager->priv->name_id = g_bus_own_name_on_connection (connection, |
758 | + GSD_SHARING_DBUS_NAME, |
759 | + G_BUS_NAME_OWNER_FLAGS_NONE, |
760 | + NULL, |
761 | + NULL, |
762 | + NULL, |
763 | + NULL); |
764 | +} |
765 | + |
766 | +#ifdef HAVE_NETWORK_MANAGER |
767 | +static void |
768 | +primary_connection_changed (GObject *gobject, |
769 | + GParamSpec *pspec, |
770 | + gpointer user_data) |
771 | +{ |
772 | + GsdSharingManager *manager = user_data; |
773 | + NMActiveConnection *a_con; |
774 | + |
775 | + a_con = nm_client_get_primary_connection (manager->priv->client); |
776 | + |
777 | + g_clear_pointer (&manager->priv->current_network, g_free); |
778 | + g_clear_pointer (&manager->priv->current_network_name, g_free); |
779 | + g_clear_pointer (&manager->priv->carrier_type, g_free); |
780 | + |
781 | + if (a_con) { |
782 | + manager->priv->current_network = g_strdup (nm_active_connection_get_uuid (a_con)); |
783 | + manager->priv->current_network_name = g_strdup (nm_active_connection_get_id (a_con)); |
784 | + manager->priv->carrier_type = g_strdup (nm_active_connection_get_connection_type (a_con)); |
785 | + if (manager->priv->carrier_type == NULL) |
786 | + manager->priv->carrier_type = g_strdup (""); |
787 | + } else { |
788 | + manager->priv->current_network = g_strdup (""); |
789 | + manager->priv->current_network_name = g_strdup (""); |
790 | + manager->priv->carrier_type = g_strdup (""); |
791 | + } |
792 | + |
793 | + if (!a_con) { |
794 | + manager->priv->sharing_status = GSD_SHARING_STATUS_OFFLINE; |
795 | + } else if (*(manager->priv->carrier_type) == '\0') { |
796 | + /* Missing carrier type information? */ |
797 | + manager->priv->sharing_status = GSD_SHARING_STATUS_OFFLINE; |
798 | + } else if (g_str_equal (manager->priv->carrier_type, "bluetooth") || |
799 | + g_str_equal (manager->priv->carrier_type, "gsm") || |
800 | + g_str_equal (manager->priv->carrier_type, "cdma")) { |
801 | + manager->priv->sharing_status = GSD_SHARING_STATUS_DISABLED_MOBILE_BROADBAND; |
802 | + } else if (g_str_equal (manager->priv->carrier_type, "802-11-wireless")) { |
803 | + if (connection_is_low_security (manager, manager->priv->current_network)) |
804 | + manager->priv->sharing_status = GSD_SHARING_STATUS_DISABLED_LOW_SECURITY; |
805 | + else |
806 | + manager->priv->sharing_status = GSD_SHARING_STATUS_AVAILABLE; |
807 | + } else { |
808 | + manager->priv->sharing_status = GSD_SHARING_STATUS_AVAILABLE; |
809 | + } |
810 | + |
811 | + g_debug ("current network: %s", manager->priv->current_network); |
812 | + g_debug ("current network name: %s", manager->priv->current_network_name); |
813 | + g_debug ("conn type: %s", manager->priv->carrier_type); |
814 | + g_debug ("status: %d", manager->priv->sharing_status); |
815 | + |
816 | + properties_changed (manager); |
817 | + gsd_sharing_manager_sync_services (manager); |
818 | +} |
819 | + |
820 | +static void |
821 | +nm_client_ready (GObject *source_object, |
822 | + GAsyncResult *res, |
823 | + gpointer user_data) |
824 | +{ |
825 | + GsdSharingManager *manager = user_data; |
826 | + GError *error = NULL; |
827 | + NMClient *client; |
828 | + |
829 | + client = nm_client_new_finish (res, &error); |
830 | + if (!client) { |
831 | + if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) |
832 | + g_warning ("Couldn't get NMClient: %s", error->message); |
833 | + g_error_free (error); |
834 | + return; |
835 | + } |
836 | + manager->priv->client = client; |
837 | + |
838 | + g_signal_connect (G_OBJECT (client), "notify::primary-connection", |
839 | + G_CALLBACK (primary_connection_changed), manager); |
840 | + |
841 | + primary_connection_changed (NULL, NULL, manager); |
842 | +} |
843 | + |
844 | +#endif /* HAVE_NETWORK_MANAGER */ |
845 | + |
846 | +#define RYGEL_BUS_NAME "org.gnome.Rygel1" |
847 | +#define RYGEL_OBJECT_PATH "/org/gnome/Rygel1" |
848 | +#define RYGEL_INTERFACE_NAME "org.gnome.Rygel1" |
849 | + |
850 | +static void |
851 | +gsd_sharing_manager_disable_rygel (void) |
852 | +{ |
853 | + GDBusConnection *connection; |
854 | + gchar *path; |
855 | + |
856 | + path = g_build_filename (g_get_user_config_dir (), "autostart", |
857 | + "rygel.desktop", NULL); |
858 | + if (!g_file_test (path, G_FILE_TEST_IS_SYMLINK | G_FILE_TEST_IS_REGULAR)) |
859 | + goto out; |
860 | + |
861 | + g_unlink (path); |
862 | + |
863 | + connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL); |
864 | + if (connection) { |
865 | + g_dbus_connection_call (connection, RYGEL_BUS_NAME, RYGEL_OBJECT_PATH, RYGEL_INTERFACE_NAME, |
866 | + "Shutdown", NULL, NULL, G_DBUS_CALL_FLAGS_NONE, -1, |
867 | + NULL, NULL, NULL); |
868 | + } |
869 | + g_object_unref (connection); |
870 | + |
871 | + out: |
872 | + g_free (path); |
873 | +} |
874 | + |
875 | +gboolean |
876 | +gsd_sharing_manager_start (GsdSharingManager *manager, |
877 | + GError **error) |
878 | +{ |
879 | + g_debug ("Starting sharing manager"); |
880 | + gnome_settings_profile_start (NULL); |
881 | + |
882 | + manager->priv->introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL); |
883 | + g_assert (manager->priv->introspection_data != NULL); |
884 | + |
885 | + gsd_sharing_manager_disable_rygel (); |
886 | + |
887 | + manager->priv->cancellable = g_cancellable_new (); |
888 | +#ifdef HAVE_NETWORK_MANAGER |
889 | + nm_client_new_async (manager->priv->cancellable, nm_client_ready, manager); |
890 | +#endif /* HAVE_NETWORK_MANAGER */ |
891 | + |
892 | + /* Start process of owning a D-Bus name */ |
893 | + g_bus_get (G_BUS_TYPE_SESSION, |
894 | + manager->priv->cancellable, |
895 | + (GAsyncReadyCallback) on_bus_gotten, |
896 | + manager); |
897 | + |
898 | + gnome_settings_profile_end (NULL); |
899 | + return TRUE; |
900 | +} |
901 | + |
902 | +void |
903 | +gsd_sharing_manager_stop (GsdSharingManager *manager) |
904 | +{ |
905 | + g_debug ("Stopping sharing manager"); |
906 | + |
907 | + manager->priv->sharing_status = GSD_SHARING_STATUS_OFFLINE; |
908 | + gsd_sharing_manager_sync_services (manager); |
909 | + |
910 | + if (manager->priv->cancellable) { |
911 | + g_cancellable_cancel (manager->priv->cancellable); |
912 | + g_clear_object (&manager->priv->cancellable); |
913 | + } |
914 | + |
915 | +#ifdef HAVE_NETWORK_MANAGER |
916 | + g_clear_object (&manager->priv->client); |
917 | +#endif /* HAVE_NETWORK_MANAGER */ |
918 | + |
919 | + if (manager->priv->name_id != 0) { |
920 | + g_bus_unown_name (manager->priv->name_id); |
921 | + manager->priv->name_id = 0; |
922 | + } |
923 | + |
924 | + g_clear_pointer (&manager->priv->introspection_data, g_dbus_node_info_unref); |
925 | + g_clear_object (&manager->priv->connection); |
926 | + |
927 | + g_clear_pointer (&manager->priv->current_network, g_free); |
928 | + g_clear_pointer (&manager->priv->current_network_name, g_free); |
929 | + g_clear_pointer (&manager->priv->carrier_type, g_free); |
930 | +} |
931 | + |
932 | +static void |
933 | +gsd_sharing_manager_class_init (GsdSharingManagerClass *klass) |
934 | +{ |
935 | + GObjectClass *object_class = G_OBJECT_CLASS (klass); |
936 | + |
937 | + object_class->finalize = gsd_sharing_manager_finalize; |
938 | + |
939 | + g_type_class_add_private (klass, sizeof (GsdSharingManagerPrivate)); |
940 | +} |
941 | + |
942 | +static void |
943 | +service_free (gpointer pointer) |
944 | +{ |
945 | + ServiceInfo *service = pointer; |
946 | + |
947 | + g_clear_object (&service->settings); |
948 | + g_free (service); |
949 | +} |
950 | + |
951 | +static void |
952 | +gsd_sharing_manager_init (GsdSharingManager *manager) |
953 | +{ |
954 | + guint i; |
955 | + |
956 | + manager->priv = GSD_SHARING_MANAGER_GET_PRIVATE (manager); |
957 | + manager->priv->services = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, service_free); |
958 | + |
959 | + /* Default state */ |
960 | + manager->priv->current_network = g_strdup (""); |
961 | + manager->priv->current_network_name = g_strdup (""); |
962 | + manager->priv->carrier_type = g_strdup (""); |
963 | + manager->priv->sharing_status = GSD_SHARING_STATUS_OFFLINE; |
964 | + |
965 | + for (i = 0; i < G_N_ELEMENTS (services); i++) { |
966 | + ServiceInfo *service; |
967 | + char *path; |
968 | + |
969 | + service = g_new0 (ServiceInfo, 1); |
970 | + service->name = services[i]; |
971 | + path = g_strdup_printf ("/org/gnome/settings-daemon/plugins/sharing/%s/", services[i]); |
972 | + service->settings = g_settings_new_with_path ("org.gnome.settings-daemon.plugins.sharing.service", path); |
973 | + g_free (path); |
974 | + |
975 | + g_hash_table_insert (manager->priv->services, (gpointer) services[i], service); |
976 | + } |
977 | +} |
978 | + |
979 | +static void |
980 | +gsd_sharing_manager_finalize (GObject *object) |
981 | +{ |
982 | + GsdSharingManager *manager; |
983 | + |
984 | + g_return_if_fail (object != NULL); |
985 | + g_return_if_fail (GSD_IS_SHARING_MANAGER (object)); |
986 | + |
987 | + manager = GSD_SHARING_MANAGER (object); |
988 | + |
989 | + g_return_if_fail (manager->priv != NULL); |
990 | + |
991 | + gsd_sharing_manager_stop (manager); |
992 | + |
993 | + g_hash_table_unref (manager->priv->services); |
994 | + |
995 | + G_OBJECT_CLASS (gsd_sharing_manager_parent_class)->finalize (object); |
996 | +} |
997 | + |
998 | +GsdSharingManager * |
999 | +gsd_sharing_manager_new (void) |
1000 | +{ |
1001 | + if (manager_object != NULL) { |
1002 | + g_object_ref (manager_object); |
1003 | + } else { |
1004 | + manager_object = g_object_new (GSD_TYPE_SHARING_MANAGER, NULL); |
1005 | + g_object_add_weak_pointer (manager_object, |
1006 | + (gpointer *) &manager_object); |
1007 | + } |
1008 | + |
1009 | + return GSD_SHARING_MANAGER (manager_object); |
1010 | +} |
1011 | |
1012 | === added file 'plugins/sharing/gsd-sharing-manager.h' |
1013 | --- plugins/sharing/gsd-sharing-manager.h 1970-01-01 00:00:00 +0000 |
1014 | +++ plugins/sharing/gsd-sharing-manager.h 2018-02-24 12:26:52 +0000 |
1015 | @@ -0,0 +1,56 @@ |
1016 | +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- |
1017 | + * |
1018 | + * Copyright (C) 2007 William Jon McCann <mccann@jhu.edu> |
1019 | + * |
1020 | + * This program is free software; you can redistribute it and/or modify |
1021 | + * it under the terms of the GNU General Public License as published by |
1022 | + * the Free Software Foundation; either version 2 of the License, or |
1023 | + * (at your option) any later version. |
1024 | + * |
1025 | + * This program is distributed in the hope that it will be useful, |
1026 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
1027 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
1028 | + * GNU General Public License for more details. |
1029 | + * |
1030 | + * You should have received a copy of the GNU General Public License |
1031 | + * along with this program; if not, see <http://www.gnu.org/licenses/>. |
1032 | + * |
1033 | + */ |
1034 | + |
1035 | +#ifndef __GSD_SHARING_MANAGER_H |
1036 | +#define __GSD_SHARING_MANAGER_H |
1037 | + |
1038 | +#include <glib-object.h> |
1039 | + |
1040 | +G_BEGIN_DECLS |
1041 | + |
1042 | +#define GSD_TYPE_SHARING_MANAGER (gsd_sharing_manager_get_type ()) |
1043 | +#define GSD_SHARING_MANAGER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GSD_TYPE_SHARING_MANAGER, GsdSharingManager)) |
1044 | +#define GSD_SHARING_MANAGER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GSD_TYPE_SHARING_MANAGER, GsdSharingManagerClass)) |
1045 | +#define GSD_IS_SHARING_MANAGER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GSD_TYPE_SHARING_MANAGER)) |
1046 | +#define GSD_IS_SHARING_MANAGER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GSD_TYPE_SHARING_MANAGER)) |
1047 | +#define GSD_SHARING_MANAGER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GSD_TYPE_SHARING_MANAGER, GsdSharingManagerClass)) |
1048 | + |
1049 | +typedef struct GsdSharingManagerPrivate GsdSharingManagerPrivate; |
1050 | + |
1051 | +typedef struct |
1052 | +{ |
1053 | + GObject parent; |
1054 | + GsdSharingManagerPrivate *priv; |
1055 | +} GsdSharingManager; |
1056 | + |
1057 | +typedef struct |
1058 | +{ |
1059 | + GObjectClass parent_class; |
1060 | +} GsdSharingManagerClass; |
1061 | + |
1062 | +GType gsd_sharing_manager_get_type (void); |
1063 | + |
1064 | +GsdSharingManager * gsd_sharing_manager_new (void); |
1065 | +gboolean gsd_sharing_manager_start (GsdSharingManager *manager, |
1066 | + GError **error); |
1067 | +void gsd_sharing_manager_stop (GsdSharingManager *manager); |
1068 | + |
1069 | +G_END_DECLS |
1070 | + |
1071 | +#endif /* __GSD_SHARING_MANAGER_H */ |
1072 | |
1073 | === added file 'plugins/sharing/gsd-sharing-plugin.c' |
1074 | --- plugins/sharing/gsd-sharing-plugin.c 1970-01-01 00:00:00 +0000 |
1075 | +++ plugins/sharing/gsd-sharing-plugin.c 2018-02-24 12:26:52 +0000 |
1076 | @@ -0,0 +1,28 @@ |
1077 | +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- |
1078 | + * |
1079 | + * Copyright (C) 2007 William Jon McCann <mccann@jhu.edu> |
1080 | + * |
1081 | + * This program is free software; you can redistribute it and/or modify |
1082 | + * it under the terms of the GNU General Public License as published by |
1083 | + * the Free Software Foundation; either version 2, or (at your option) |
1084 | + * any later version. |
1085 | + * |
1086 | + * This program is distributed in the hope that it will be useful, |
1087 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
1088 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
1089 | + * GNU General Public License for more details. |
1090 | + * |
1091 | + * You should have received a copy of the GNU General Public License |
1092 | + * along with this program; if not, see <http://www.gnu.org/licenses/>. |
1093 | + * |
1094 | + */ |
1095 | + |
1096 | +#include "config.h" |
1097 | + |
1098 | +#include <glib/gi18n-lib.h> |
1099 | +#include <gmodule.h> |
1100 | + |
1101 | +#include "gnome-settings-plugin.h" |
1102 | +#include "gsd-sharing-manager.h" |
1103 | + |
1104 | +GNOME_SETTINGS_PLUGIN_REGISTER (GsdSharing, gsd_sharing) |
1105 | |
1106 | === added file 'plugins/sharing/sharing.gnome-settings-plugin.in' |
1107 | --- plugins/sharing/sharing.gnome-settings-plugin.in 1970-01-01 00:00:00 +0000 |
1108 | +++ plugins/sharing/sharing.gnome-settings-plugin.in 2018-02-24 12:26:52 +0000 |
1109 | @@ -0,0 +1,9 @@ |
1110 | +[GNOME Settings Plugin] |
1111 | +Module=sharing |
1112 | +IAge=0 |
1113 | +# 100 is the default load Priority |
1114 | +Priority=100 |
1115 | +Name=Sharing |
1116 | +Description=Sharing plugin |
1117 | +Authors=Bastien Nocera <hadess@hadess.net> |
1118 | +Copyright=Copyright © 2014 AUTHOR |
1119 | |
1120 | === added file 'plugins/sharing/test-sharing.c' |
1121 | --- plugins/sharing/test-sharing.c 1970-01-01 00:00:00 +0000 |
1122 | +++ plugins/sharing/test-sharing.c 2018-02-24 12:26:52 +0000 |
1123 | @@ -0,0 +1,7 @@ |
1124 | +#define NEW gsd_sharing_manager_new |
1125 | +#define START gsd_sharing_manager_start |
1126 | +#define STOP gsd_sharing_manager_stop |
1127 | +#define MANAGER GsdSharingManager |
1128 | +#include "gsd-sharing-manager.h" |
1129 | + |
1130 | +#include "test-plugin.h" |
I am closing this merge proposal since I believe this feature was already uploaded with a different merge proposal.