2 * Copyright (C) 2009 Intel Corporation
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) version 3.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20 #include <glib-object.h>
23 #include "syncevo-dbus.h"
24 #include "syncevo-marshal.h"
25 #include "syncevo-bindings.h"
27 typedef struct _SyncevoAsyncData {
28 SyncevoService *service;
41 typedef struct _SyncevoServicePrivate {
43 } SyncevoServicePrivate;
45 #define GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), SYNCEVO_TYPE_SERVICE, SyncevoServicePrivate))
47 static void progress_cb (DBusGProxy *proxy,
51 int extra1, int extra2, int extra3,
52 SyncevoService *service);
53 static void server_message_cb (DBusGProxy *proxy,
56 SyncevoService *service);
57 static void proxy_destroyed (DBusGProxy *proxy,
58 SyncevoService *service);
60 G_DEFINE_TYPE (SyncevoService, syncevo_service, G_TYPE_OBJECT);
62 static guint32 signals[LAST_SIGNAL] = {0, };
65 finalize (GObject *object)
67 SyncevoServicePrivate *priv;
69 priv = GET_PRIVATE (object);
71 G_OBJECT_CLASS (syncevo_service_parent_class)->finalize (object);
75 dispose (GObject *object)
77 SyncevoServicePrivate *priv;
79 priv = GET_PRIVATE (object);
82 dbus_g_proxy_disconnect_signal (priv->proxy, "Progress",
83 G_CALLBACK (progress_cb),
85 dbus_g_proxy_disconnect_signal (priv->proxy, "ServerMessage",
86 G_CALLBACK (server_message_cb),
89 g_object_unref (priv->proxy);
93 G_OBJECT_CLASS (syncevo_service_parent_class)->dispose (object);
96 static void progress_cb (DBusGProxy *proxy,
100 int extra1, int extra2, int extra3,
101 SyncevoService *service)
103 g_signal_emit (service, signals[PROGRESS], 0,
104 server, source, type, extra1, extra2, extra3);
107 static void server_message_cb (DBusGProxy *proxy,
110 SyncevoService *service)
112 g_signal_emit (service, signals[SERVER_MESSAGE], 0,
117 syncevo_service_get_new_proxy (SyncevoService *service)
119 DBusGConnection *connection;
122 SyncevoServicePrivate *priv;
125 priv = GET_PRIVATE (service);
128 connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
129 if (connection == NULL) {
130 g_printerr ("Failed to open connection to bus: %s\n",
132 g_error_free (error);
137 /* we want to use dbus_g_proxy_new_for_name_owner() for the destroy signal
138 * so need to start the service by hand by using DBUS proxy: */
139 proxy = dbus_g_proxy_new_for_name (connection,
142 DBUS_INTERFACE_DBUS);
143 if (!dbus_g_proxy_call (proxy, "StartServiceByName", NULL,
144 G_TYPE_STRING, SYNCEVO_SERVICE_DBUS_SERVICE,
147 G_TYPE_UINT, &result,
149 g_warning ("StartServiceByName call failed");
151 g_object_unref (proxy);
154 proxy = dbus_g_proxy_new_for_name_owner (connection,
155 SYNCEVO_SERVICE_DBUS_SERVICE,
156 SYNCEVO_SERVICE_DBUS_PATH,
157 SYNCEVO_SERVICE_DBUS_INTERFACE,
160 g_printerr ("dbus_g_proxy_new_for_name_owner() failed");
165 dbus_g_proxy_add_signal (proxy, "Progress",
166 G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INVALID);
167 dbus_g_proxy_connect_signal (proxy, "Progress",
168 G_CALLBACK (progress_cb), service, NULL);
169 dbus_g_proxy_add_signal (proxy, "ServerMessage",
170 G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID);
171 dbus_g_proxy_connect_signal (proxy, "ServerMessage",
172 G_CALLBACK (server_message_cb), service, NULL);
174 g_signal_connect (proxy, "destroy",
175 G_CALLBACK (proxy_destroyed), service);
182 proxy_destroyed (DBusGProxy *proxy,
183 SyncevoService *service)
185 SyncevoServicePrivate *priv;
186 priv = GET_PRIVATE (service);
189 g_object_unref (priv->proxy);
193 g_signal_emit (service, signals[SERVER_SHUTDOWN], 0);
197 constructor (GType type,
198 guint n_construct_properties,
199 GObjectConstructParam *construct_properties)
201 SyncevoService *service;
202 SyncevoServicePrivate *priv;
204 service = SYNCEVO_SERVICE (G_OBJECT_CLASS (syncevo_service_parent_class)->constructor
205 (type, n_construct_properties, construct_properties));
206 priv = GET_PRIVATE (service);
208 dbus_g_object_register_marshaller (syncevo_marshal_VOID__STRING_STRING_INT_INT_INT_INT,
217 dbus_g_object_register_marshaller (syncevo_marshal_VOID__STRING_STRING,
223 syncevo_service_get_new_proxy (service);
225 return G_OBJECT (service);
229 syncevo_service_class_init (SyncevoServiceClass *klass)
231 GObjectClass *o_class = (GObjectClass *) klass;
233 o_class->finalize = finalize;
234 o_class->dispose = dispose;
235 o_class->constructor = constructor;
237 g_type_class_add_private (klass, sizeof (SyncevoServicePrivate));
239 signals[PROGRESS] = g_signal_new ("progress",
240 G_TYPE_FROM_CLASS (klass),
241 G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE,
242 G_STRUCT_OFFSET (SyncevoServiceClass, progress),
244 syncevo_marshal_VOID__STRING_STRING_INT_INT_INT_INT,
246 6, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT);
247 signals[SERVER_MESSAGE] = g_signal_new ("server-message",
248 G_TYPE_FROM_CLASS (klass),
249 G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE,
250 G_STRUCT_OFFSET (SyncevoServiceClass, server_message),
252 syncevo_marshal_VOID__STRING_STRING,
254 2, G_TYPE_STRING, G_TYPE_STRING);
255 signals[SERVER_SHUTDOWN] = g_signal_new ("server-shutdown",
256 G_TYPE_FROM_CLASS (klass),
257 G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE,
258 G_STRUCT_OFFSET (SyncevoServiceClass, server_shutdown),
260 g_cclosure_marshal_VOID__VOID,
266 syncevo_service_init (SyncevoService *service)
272 syncevo_service_get_default ()
274 static SyncevoService *default_service = NULL;
276 if (default_service == NULL) {
277 default_service = g_object_new (SYNCEVO_TYPE_SERVICE, NULL);
278 g_object_add_weak_pointer (G_OBJECT (default_service),
279 (gpointer) &default_service);
280 return default_service;
283 return g_object_ref (default_service);
288 gboolean syncevo_service_start_sync (SyncevoService *service,
293 SyncevoServicePrivate *priv;
295 priv = GET_PRIVATE (service);
297 if (!priv->proxy && !syncevo_service_get_new_proxy (service)) {
299 *error = g_error_new_literal (g_quark_from_static_string ("syncevo-service"),
300 SYNCEVO_SERVICE_ERROR_COULD_NOT_START,
301 "Could not start service");
306 return org_Moblin_SyncEvolution_start_sync (priv->proxy,
312 gboolean syncevo_service_abort_sync (SyncevoService *service,
316 SyncevoServicePrivate *priv;
318 priv = GET_PRIVATE (service);
320 if (!priv->proxy && !syncevo_service_get_new_proxy (service)) {
322 *error = g_error_new_literal (g_quark_from_static_string ("syncevo-service"),
323 SYNCEVO_SERVICE_ERROR_COULD_NOT_START,
324 "Could not start service");
329 return org_Moblin_SyncEvolution_abort_sync (priv->proxy,
335 abort_sync_async_callback (DBusGProxy *proxy,
337 SyncevoAsyncData *data)
339 (*(SyncevoAbortSyncCb)data->callback) (data->service,
342 g_slice_free (SyncevoAsyncData, data);
346 abort_sync_async_error (SyncevoAsyncData *data)
350 error = g_error_new_literal (g_quark_from_static_string ("syncevo-service"),
351 SYNCEVO_SERVICE_ERROR_COULD_NOT_START,
352 "Could not start service");
353 (*(SyncevoAbortSyncCb)data->callback) (data->service,
356 g_slice_free (SyncevoAsyncData, data);
360 syncevo_service_abort_sync_async (SyncevoService *service,
362 SyncevoAbortSyncCb callback,
365 SyncevoAsyncData *data;
366 SyncevoServicePrivate *priv;
368 priv = GET_PRIVATE (service);
370 data = g_slice_new0 (SyncevoAsyncData);
371 data->service = service;
372 data->callback = G_CALLBACK (callback);
373 data->userdata = userdata;
375 if (!priv->proxy && !syncevo_service_get_new_proxy (service)) {
376 g_idle_add ((GSourceFunc)abort_sync_async_error, data);
380 org_Moblin_SyncEvolution_abort_sync_async
383 (org_Moblin_SyncEvolution_abort_sync_reply) abort_sync_async_callback,
388 gboolean syncevo_service_get_servers (SyncevoService *service,
392 SyncevoServicePrivate *priv;
394 priv = GET_PRIVATE (service);
396 if (!priv->proxy && !syncevo_service_get_new_proxy (service)) {
398 *error = g_error_new_literal (g_quark_from_static_string ("syncevo-service"),
399 SYNCEVO_SERVICE_ERROR_COULD_NOT_START,
400 "Could not start service");
405 return org_Moblin_SyncEvolution_get_servers (priv->proxy,
411 get_servers_async_callback (DBusGProxy *proxy,
414 SyncevoAsyncData *data)
416 (*(SyncevoGetServersCb)data->callback) (data->service,
420 g_slice_free (SyncevoAsyncData, data);
424 get_servers_async_error (SyncevoAsyncData *data)
428 error = g_error_new_literal (g_quark_from_static_string ("syncevo-service"),
429 SYNCEVO_SERVICE_ERROR_COULD_NOT_START,
430 "Could not start service");
431 (*(SyncevoGetServersCb)data->callback) (data->service,
435 g_slice_free (SyncevoAsyncData, data);
439 syncevo_service_get_servers_async (SyncevoService *service,
440 SyncevoGetServersCb callback,
443 SyncevoAsyncData *data;
444 SyncevoServicePrivate *priv;
446 priv = GET_PRIVATE (service);
448 data = g_slice_new0 (SyncevoAsyncData);
449 data->service = service;
450 data->callback = G_CALLBACK (callback);
451 data->userdata = userdata;
453 if (!priv->proxy && !syncevo_service_get_new_proxy (service)) {
454 g_idle_add ((GSourceFunc)get_servers_async_error, data);
458 org_Moblin_SyncEvolution_get_servers_async
460 (org_Moblin_SyncEvolution_get_servers_reply) get_servers_async_callback,
464 gboolean syncevo_service_get_templates (SyncevoService *service,
465 GPtrArray **templates,
468 SyncevoServicePrivate *priv;
470 priv = GET_PRIVATE (service);
472 if (!priv->proxy && !syncevo_service_get_new_proxy (service)) {
474 *error = g_error_new_literal (g_quark_from_static_string ("syncevo-service"),
475 SYNCEVO_SERVICE_ERROR_COULD_NOT_START,
476 "Could not start service");
481 return org_Moblin_SyncEvolution_get_templates (priv->proxy,
487 get_templates_async_callback (DBusGProxy *proxy,
488 GPtrArray *templates,
490 SyncevoAsyncData *data)
492 (*(SyncevoGetTemplatesCb)data->callback) (data->service,
496 g_slice_free (SyncevoAsyncData, data);
500 get_templates_async_error (SyncevoAsyncData *data)
504 error = g_error_new_literal (g_quark_from_static_string ("syncevo-service"),
505 SYNCEVO_SERVICE_ERROR_COULD_NOT_START,
506 "Could not start service");
507 (*(SyncevoGetTemplatesCb)data->callback) (data->service,
511 g_slice_free (SyncevoAsyncData, data);
514 void syncevo_service_get_templates_async (SyncevoService *service,
515 SyncevoGetTemplatesCb callback,
518 SyncevoAsyncData *data;
519 SyncevoServicePrivate *priv;
521 priv = GET_PRIVATE (service);
523 data = g_slice_new0 (SyncevoAsyncData);
524 data->service = service;
525 data->callback = G_CALLBACK (callback);
526 data->userdata = userdata;
528 if (!priv->proxy && !syncevo_service_get_new_proxy (service)) {
529 g_idle_add ((GSourceFunc)get_templates_async_error, data);
533 org_Moblin_SyncEvolution_get_templates_async
535 (org_Moblin_SyncEvolution_get_templates_reply) get_templates_async_callback,
539 gboolean syncevo_service_get_template_config (SyncevoService *service,
544 SyncevoServicePrivate *priv;
546 priv = GET_PRIVATE (service);
548 if (!priv->proxy && !syncevo_service_get_new_proxy (service)) {
550 *error = g_error_new_literal (g_quark_from_static_string ("syncevo-service"),
551 SYNCEVO_SERVICE_ERROR_COULD_NOT_START,
552 "Could not start service");
557 return org_Moblin_SyncEvolution_get_template_config (priv->proxy,
564 get_template_config_async_callback (DBusGProxy *proxy,
567 SyncevoAsyncData *data)
569 (*(SyncevoGetTemplateConfigCb)data->callback) (data->service,
573 g_slice_free (SyncevoAsyncData, data);
577 get_template_config_async_error (SyncevoAsyncData *data)
581 error = g_error_new_literal (g_quark_from_static_string ("syncevo-service"),
582 SYNCEVO_SERVICE_ERROR_COULD_NOT_START,
583 "Could not start service");
584 (*(SyncevoGetTemplateConfigCb)data->callback) (data->service,
588 g_slice_free (SyncevoAsyncData, data);
592 syncevo_service_get_template_config_async (SyncevoService *service,
594 SyncevoGetServerConfigCb callback,
597 SyncevoAsyncData *data;
598 SyncevoServicePrivate *priv;
600 priv = GET_PRIVATE (service);
602 data = g_slice_new0 (SyncevoAsyncData);
603 data->service = service;
604 data->callback = G_CALLBACK (callback);
605 data->userdata = userdata;
607 if (!priv->proxy && !syncevo_service_get_new_proxy (service)) {
608 g_idle_add ((GSourceFunc)get_template_config_async_error, data);
612 org_Moblin_SyncEvolution_get_template_config_async
615 (org_Moblin_SyncEvolution_get_server_config_reply) get_template_config_async_callback,
619 gboolean syncevo_service_get_server_config (SyncevoService *service,
624 SyncevoServicePrivate *priv;
626 priv = GET_PRIVATE (service);
628 if (!priv->proxy && !syncevo_service_get_new_proxy (service)) {
630 *error = g_error_new_literal (g_quark_from_static_string ("syncevo-service"),
631 SYNCEVO_SERVICE_ERROR_COULD_NOT_START,
632 "Could not start service");
637 return org_Moblin_SyncEvolution_get_server_config (priv->proxy,
644 get_server_config_async_callback (DBusGProxy *proxy,
647 SyncevoAsyncData *data)
649 (*(SyncevoGetServerConfigCb)data->callback) (data->service,
653 g_slice_free (SyncevoAsyncData, data);
657 get_server_config_async_error (SyncevoAsyncData *data)
661 error = g_error_new_literal (g_quark_from_static_string ("syncevo-service"),
662 SYNCEVO_SERVICE_ERROR_COULD_NOT_START,
663 "Could not start service");
664 (*(SyncevoGetServerConfigCb)data->callback) (data->service,
668 g_slice_free (SyncevoAsyncData, data);
672 syncevo_service_get_server_config_async (SyncevoService *service,
674 SyncevoGetServerConfigCb callback,
677 SyncevoAsyncData *data;
678 SyncevoServicePrivate *priv;
680 priv = GET_PRIVATE (service);
682 data = g_slice_new0 (SyncevoAsyncData);
683 data->service = service;
684 data->callback = G_CALLBACK (callback);
685 data->userdata = userdata;
687 if (!priv->proxy && !syncevo_service_get_new_proxy (service)) {
688 g_idle_add ((GSourceFunc)get_server_config_async_error, data);
692 org_Moblin_SyncEvolution_get_server_config_async
695 (org_Moblin_SyncEvolution_get_server_config_reply) get_server_config_async_callback,
700 gboolean syncevo_service_set_server_config (SyncevoService *service,
705 SyncevoServicePrivate *priv;
707 priv = GET_PRIVATE (service);
709 if (!priv->proxy && !syncevo_service_get_new_proxy (service)) {
711 *error = g_error_new_literal (g_quark_from_static_string ("syncevo-service"),
712 SYNCEVO_SERVICE_ERROR_COULD_NOT_START,
713 "Could not start service");
718 return org_Moblin_SyncEvolution_set_server_config (priv->proxy,
725 set_server_config_async_callback (DBusGProxy *proxy,
727 SyncevoAsyncData *data)
729 (*(SyncevoSetServerConfigCb)data->callback) (data->service,
732 g_slice_free (SyncevoAsyncData, data);
736 set_server_config_async_error (SyncevoAsyncData *data)
740 error = g_error_new_literal (g_quark_from_static_string ("syncevo-service"),
741 SYNCEVO_SERVICE_ERROR_COULD_NOT_START,
742 "Could not start service");
743 (*(SyncevoSetServerConfigCb)data->callback) (data->service,
746 g_slice_free (SyncevoAsyncData, data);
750 syncevo_service_set_server_config_async (SyncevoService *service,
753 SyncevoSetServerConfigCb callback,
756 SyncevoAsyncData *data;
757 SyncevoServicePrivate *priv;
759 priv = GET_PRIVATE (service);
761 data = g_slice_new0 (SyncevoAsyncData);
762 data->service = service;
763 data->callback = G_CALLBACK (callback);
764 data->userdata = userdata;
766 if (!priv->proxy && !syncevo_service_get_new_proxy (service)) {
767 g_idle_add ((GSourceFunc)set_server_config_async_error, data);
771 org_Moblin_SyncEvolution_set_server_config_async
775 (org_Moblin_SyncEvolution_set_server_config_reply) set_server_config_async_callback,
780 syncevo_service_remove_server_config (SyncevoService *service,
784 SyncevoServicePrivate *priv;
786 priv = GET_PRIVATE (service);
788 if (!priv->proxy && !syncevo_service_get_new_proxy (service)) {
790 *error = g_error_new_literal (g_quark_from_static_string ("syncevo-service"),
791 SYNCEVO_SERVICE_ERROR_COULD_NOT_START,
792 "Could not start service");
797 return org_Moblin_SyncEvolution_remove_server_config (priv->proxy,
803 remove_server_config_async_callback (DBusGProxy *proxy,
805 SyncevoAsyncData *data)
807 (*(SyncevoRemoveServerConfigCb)data->callback) (data->service,
810 g_slice_free (SyncevoAsyncData, data);
814 remove_server_config_async_error (SyncevoAsyncData *data)
818 error = g_error_new_literal (g_quark_from_static_string ("syncevo-service"),
819 SYNCEVO_SERVICE_ERROR_COULD_NOT_START,
820 "Could not start service");
821 (*(SyncevoRemoveServerConfigCb)data->callback) (data->service,
824 g_slice_free (SyncevoAsyncData, data);
828 syncevo_service_remove_server_config_async (SyncevoService *service,
830 SyncevoRemoveServerConfigCb callback,
833 SyncevoAsyncData *data;
834 SyncevoServicePrivate *priv;
836 priv = GET_PRIVATE (service);
838 data = g_slice_new0 (SyncevoAsyncData);
839 data->service = service;
840 data->callback = G_CALLBACK (callback);
841 data->userdata = userdata;
843 if (!priv->proxy && !syncevo_service_get_new_proxy (service)) {
844 g_idle_add ((GSourceFunc)remove_server_config_async_error, data);
848 org_Moblin_SyncEvolution_remove_server_config_async
851 (org_Moblin_SyncEvolution_remove_server_config_reply) remove_server_config_async_callback,
856 syncevo_service_get_sync_reports (SyncevoService *service,
862 SyncevoServicePrivate *priv;
864 priv = GET_PRIVATE (service);
866 if (!priv->proxy && !syncevo_service_get_new_proxy (service)) {
868 *error = g_error_new_literal (g_quark_from_static_string ("syncevo-service"),
869 SYNCEVO_SERVICE_ERROR_COULD_NOT_START,
870 "Could not start service");
875 return org_Moblin_SyncEvolution_get_sync_reports (
884 get_sync_reports_async_callback (DBusGProxy *proxy,
887 SyncevoAsyncData *data)
889 (*(SyncevoGetSyncReportsCb)data->callback) (data->service,
893 g_slice_free (SyncevoAsyncData, data);
897 get_sync_reports_async_error (SyncevoAsyncData *data)
901 error = g_error_new_literal (g_quark_from_static_string ("syncevo-service"),
902 SYNCEVO_SERVICE_ERROR_COULD_NOT_START,
903 "Could not start service");
904 (*(SyncevoGetSyncReportsCb)data->callback) (data->service,
908 g_slice_free (SyncevoAsyncData, data);
912 syncevo_service_get_sync_reports_async (SyncevoService *service,
915 SyncevoGetSyncReportsCb callback,
918 SyncevoAsyncData *data;
919 SyncevoServicePrivate *priv;
921 priv = GET_PRIVATE (service);
923 data = g_slice_new0 (SyncevoAsyncData);
924 data->service = service;
925 data->callback = G_CALLBACK (callback);
926 data->userdata = userdata;
928 if (!priv->proxy && !syncevo_service_get_new_proxy (service)) {
929 g_idle_add ((GSourceFunc)get_sync_reports_async_error, data);
933 org_Moblin_SyncEvolution_get_sync_reports_async
937 (org_Moblin_SyncEvolution_get_sync_reports_reply) get_sync_reports_async_callback,