Add initial dbus api and wrapper client library
This commit is contained in:
parent
e1f2e694f2
commit
9a417300f0
|
@ -1,10 +1,26 @@
|
|||
## Process this file with automake to produce Makefile.in
|
||||
|
||||
ACLOCAL_AMFLAGS = -I m4
|
||||
SUBDIRS = src test
|
||||
|
||||
EXTRA_DIST = HACKING description configure-pre.in configure-post.in autogen.sh Makefile-gen.am Doxyfile
|
||||
MAINTAINERCLEANFILES = Makefile.in config.h.in config.guess config.sub configure depcomp install-sh ltmain.sh missing mkinstalldirs
|
||||
if COND_DBUS
|
||||
pkgconfigdir = $(libdir)/pkgconfig
|
||||
pkgconfig_DATA = syncevo-dbus.pc
|
||||
|
||||
servicedir = $(DBUS_SERVICES_DIR)
|
||||
service_in_files = org.Moblin.SyncEvolution.service.in
|
||||
service_DATA = $(service_in_files:.service.in=.service)
|
||||
$(service_DATA): $(service_in_files) Makefile
|
||||
@sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@
|
||||
|
||||
DBUS_DIRS = interfaces syncevo-dbus
|
||||
endif
|
||||
|
||||
SUBDIRS = src $(DBUS_DIRS) test
|
||||
|
||||
EXTRA_DIST = HACKING description configure-pre.in configure-post.in autogen.sh Makefile-gen.am Doxyfile $(service_in_files) syncevo-dbus.pc.in
|
||||
DISTCLEANFILES = $(service_DATA) syncevo-dbus.pc
|
||||
MAINTAINERCLEANFILES = Makefile.in config.h.in config.guess config.sub configure depcomp install-sh ltmain.sh missing mkinstalldirs
|
||||
DISTCHECK_CONFIGURE_FLAGS = --with-sync4j=@FUNAMBOL@
|
||||
|
||||
# binary distribution
|
||||
distbin : README all
|
||||
|
|
|
@ -79,14 +79,15 @@ AC_DEFINE_UNQUOTED(DEVICE_TYPE, "$DEVICE_TYPE", "SyncML DevInf DevType")
|
|||
|
||||
AC_CHECK_HEADERS(stdarg.h valgrind/valgrind.h execinfo.h)
|
||||
|
||||
AC_DEFINE(SYNTHESIS, 1, "using Synthesis engine")
|
||||
|
||||
AC_CONFIG_FILES(Makefile interfaces/Makefile syncevo-dbus/Makefile src/Makefile src/core/Makefile test/Makefile syncevo-dbus.pc)
|
||||
AC_OUTPUT
|
||||
|
||||
echo
|
||||
echo CONFIGURATION SUMMARY
|
||||
for backend in $BACKENDS; do
|
||||
eval echo $backend: \${enable_${backend}}
|
||||
done
|
||||
echo "DBus service: $enable_dbus_service"
|
||||
echo
|
||||
|
||||
AC_DEFINE(SYNTHESIS, 1, "using Synthesis engine")
|
||||
|
||||
AC_CONFIG_FILES(Makefile src/Makefile src/core/Makefile test/Makefile)
|
||||
AC_OUTPUT
|
||||
|
|
|
@ -81,6 +81,35 @@ AC_ARG_ENABLE(maemo,
|
|||
MODIFY_SYNCCOMPARE='-e "s/use encoding/#use encoding/;" -e "s/:utf8//;"'])
|
||||
AC_SUBST(MODIFY_SYNCCOMPARE)
|
||||
|
||||
|
||||
AC_ARG_ENABLE(dbus-service,
|
||||
AS_HELP_STRING([--enable-dbus-service],
|
||||
[enables building the dbus service executable and the wrapper library for it]),
|
||||
enable_dbus_service="yes", enable_dbus_service="no")
|
||||
|
||||
AM_CONDITIONAL([COND_DBUS], [test "$enable_dbus_service" = "yes"])
|
||||
|
||||
PKG_CHECK_MODULES(DBUS_GLIB, dbus-glib-1 glib-2.0,
|
||||
have_dbus_glib="yes",
|
||||
have_dbus_glib="no")
|
||||
AC_SUBST(DBUS_GLIB_CFLAGS)
|
||||
AC_SUBST(DBUS_GLIB_LIBS)
|
||||
|
||||
if test $enable_dbus_service == "yes"; then
|
||||
if test $have_dbus_glib == "no"; then
|
||||
AC_ERROR(Missing dbus-glib-1 or glib-2.0 while trying to build dbus service)
|
||||
fi
|
||||
AC_PATH_PROG(DBUS_BINDING_TOOL, dbus-binding-tool)
|
||||
AC_PATH_PROG(GLIB_GENMARSHAL, glib-genmarshal)
|
||||
fi
|
||||
DBUS_SERVICES_DIR="${datadir}/dbus-1/services"
|
||||
AC_SUBST(DBUS_SERVICES_DIR)
|
||||
AC_DEFINE_UNQUOTED(DBUS_SERVICES_DIR, "$DBUS_SERVICES_DIR", [Location of D-Bus services directory])
|
||||
|
||||
|
||||
|
||||
PKG_CHECK_MODULES(SYNTHESIS, "synthesis")
|
||||
|
||||
AC_CHECK_HEADERS(signal.h dlfcn.h)
|
||||
|
||||
# cppunit needed?
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
noinst_DATA = syncevo.xml syncevo-marshal.list
|
|
@ -0,0 +1,3 @@
|
|||
VOID:STRING,INT,INT,INT,INT
|
||||
VOID:STRING,STRING,INT,INT,INT,INT
|
||||
VOID:STRING,STRING
|
|
@ -0,0 +1,65 @@
|
|||
<?xml version="1.0"?>
|
||||
<node name="/" xmlns:doc="http://www.freedesktop.org/dbus/1.0/doc.dtd">
|
||||
|
||||
<interface name="org.Moblin.SyncEvolution">
|
||||
|
||||
<method name="StartSync">
|
||||
<!-- no return value, check signals for results -->
|
||||
<arg type="s" name="server" direction="in" />
|
||||
<arg type="a(si)" name="sources" direction="in" />
|
||||
</method>
|
||||
<method name="AbortSync">
|
||||
<!-- no return value, check signals for results -->
|
||||
<arg type="s" name="server" direction="in" />
|
||||
</method>
|
||||
|
||||
<!-- for now the progress signals are a direct copy from synthesis -->
|
||||
<signal name="Progress">
|
||||
<arg type="s" name="server" />
|
||||
<arg type="i" name="type" />
|
||||
<arg type="i" name="extra1" />
|
||||
<arg type="i" name="extra2" />
|
||||
<arg type="i" name="extra3" />
|
||||
</signal>
|
||||
<signal name="SourceProgress">
|
||||
<arg type="s" name="server" />
|
||||
<arg type="s" name="source" />
|
||||
<arg type="i" name="type" />
|
||||
<arg type="i" name="extra1" />
|
||||
<arg type="i" name="extra2" />
|
||||
<arg type="i" name="extra3" />
|
||||
</signal>
|
||||
|
||||
<signal name="ServerMessage">
|
||||
<arg type="s" name="server" />
|
||||
<arg type="s" name="message" />
|
||||
</signal>
|
||||
|
||||
|
||||
<signal name="NeedPassword">
|
||||
<arg type="s" name="server" />
|
||||
</signal>
|
||||
<method name="setPassword">
|
||||
<!-- no return value, check signals for results -->
|
||||
<arg type="s" name="server" direction="in"/>
|
||||
<arg type="s" name="password" direction="in"/>
|
||||
</method>
|
||||
|
||||
|
||||
<method name="GetServers">
|
||||
<arg type="as" name="servers" direction="out" />
|
||||
</method>
|
||||
<method name="GetServerConfig">
|
||||
<arg type="s" name="server" direction="in" />
|
||||
<arg type="a(sss)" name="properties" direction="out"/>
|
||||
<!-- properties array:
|
||||
namespace, property_name, value
|
||||
"calendar", "sync", "disabled" -->
|
||||
</method>
|
||||
<method name="SetServerConfig">
|
||||
<arg type="s" name="server" direction="in" />
|
||||
<arg type="a(sss)" name="properties" direction="in"/>
|
||||
</method>
|
||||
|
||||
</interface>
|
||||
</node>
|
|
@ -0,0 +1,3 @@
|
|||
[D-BUS Service]
|
||||
Name=org.Moblin.SyncEvolution
|
||||
Exec=@libexecdir@/syncevo-dbus-server
|
|
@ -1,12 +1,17 @@
|
|||
BACKENDS = @BACKENDS@
|
||||
SUBDIRS = $(SYNTHESIS_SUBDIR) core $(BACKENDS)
|
||||
DIST_SUBDIRS = core $(BACKENDS)
|
||||
BUILT_SOURCES =
|
||||
|
||||
AM_CPPFLAGS = $(SUBDIRS:%=-I$(srcdir)/%) -I$(srcdir)/../test $(BACKEND_CPPFLAGS) $(GLIB_CFLAGS)
|
||||
|
||||
EXTRA_PROGRAMS =
|
||||
TESTS =
|
||||
bin_PROGRAMS = syncevolution
|
||||
if COND_DBUS
|
||||
libexec_PROGRAMS = syncevo-dbus-server
|
||||
endif
|
||||
|
||||
bin_SCRIPTS = synccompare
|
||||
SYNCEVOLUTION_DEP =
|
||||
if ENABLE_MODULES
|
||||
|
@ -106,6 +111,28 @@ distclean-local:
|
|||
rm -rf $(SYNTHESIS_SUBDIR)
|
||||
rm -rf $(CLEAN_CLIENT_SRC)
|
||||
|
||||
|
||||
if COND_DBUS
|
||||
BUILT_SOURCES += syncevo-dbus-glue.h
|
||||
|
||||
syncevo_dbus_server_SOURCES = syncevo-marshal.c syncevo-dbus-server.cpp
|
||||
syncevo_dbus_server_LDADD = $(DBUS_GLIB_LIBS)
|
||||
syncevo_dbus_server_CPPFLAGS = $(DBUS_GLIB_CFLAGS) $(AM_CPPFLAGS)
|
||||
|
||||
%-glue.h: stamp-%-glue.h
|
||||
@true
|
||||
stamp-%-glue.h: $(srcdir)/../interfaces/syncevo.xml
|
||||
$(DBUS_BINDING_TOOL) --prefix=syncevo --mode=glib-server $< > xgen-$(@F) \
|
||||
&& (cmp -s xgen-$(@F) $(@F:stamp-%=%) || cp xgen-$(@F) $(@F:stamp-%=%)) \
|
||||
&& rm -f xgen-$(@F) \
|
||||
&& echo timestamp > $(@F)
|
||||
syncevo-marshal.h: $(srcdir)/../interfaces/syncevo-marshal.list $(GLIB_GENMARSHAL)
|
||||
$(GLIB_GENMARSHAL) $< --header --prefix=syncevo_marshal > $@
|
||||
syncevo-marshal.c: $(srcdir)/../interfaces/syncevo-marshal.list syncevo-marshal.h $(GLIB_GENMARSHAL)
|
||||
echo "#include \"syncevo-marshal.h\"" > $@ \
|
||||
&& $(GLIB_GENMARSHAL) --prefix=syncevo_marshal $(srcdir)/../interfaces/syncevo-marshal.list --body >> $@
|
||||
endif
|
||||
|
||||
# With --disable-shared autotools links against libfunambol.a which does not
|
||||
# pull any of the test suites into the test binary, so they would not be
|
||||
# executed. The workaround is to explicitly set them as undefined on the
|
||||
|
|
|
@ -0,0 +1,295 @@
|
|||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <limits.h>
|
||||
|
||||
|
||||
#include <dbus/dbus-glib-bindings.h>
|
||||
|
||||
#include "syncevo-dbus-server.h"
|
||||
#include "syncevo-marshal.h"
|
||||
static gboolean syncevo_start_sync (SyncevoDBusServer *obj, char *server, GPtrArray *sources, DBusGMethodInvocation *context);
|
||||
static gboolean syncevo_abort_sync (SyncevoDBusServer *obj, char *server, DBusGMethodInvocation *context);
|
||||
static gboolean syncevo_set_password (SyncevoDBusServer *obj, char *server, char *password, DBusGMethodInvocation *context);
|
||||
static gboolean syncevo_get_servers (SyncevoDBusServer *obj, char ***servers, DBusGMethodInvocation *context);
|
||||
static gboolean syncevo_get_server_config (SyncevoDBusServer *obj, char *server, GPtrArray **options, DBusGMethodInvocation *context);
|
||||
static gboolean syncevo_set_server_config (SyncevoDBusServer *obj, char *server, GPtrArray *options, DBusGMethodInvocation *context);
|
||||
#include "syncevo-dbus-glue.h"
|
||||
|
||||
#define SYNCEVO_SOURCE_TYPE (dbus_g_type_get_struct ("GValueArray", G_TYPE_STRING, G_TYPE_INT, G_TYPE_INVALID))
|
||||
typedef GValueArray SyncevoSource;
|
||||
|
||||
#define SYNCEVO_OPTION_TYPE (dbus_g_type_get_struct ("GValueArray", G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID))
|
||||
typedef GValueArray SyncevoOption;
|
||||
|
||||
SyncevoSource*
|
||||
syncevo_source_new (char *name, int mode)
|
||||
{
|
||||
GValue val = {0, };
|
||||
|
||||
g_value_init (&val, SYNCEVO_SOURCE_TYPE);
|
||||
g_value_take_boxed (&val, dbus_g_type_specialized_construct (SYNCEVO_SOURCE_TYPE));
|
||||
dbus_g_type_struct_set (&val, 0, name, 1, mode, G_MAXUINT);
|
||||
|
||||
return (SyncevoSource*) g_value_get_boxed (&val);
|
||||
}
|
||||
|
||||
void
|
||||
syncevo_source_get (SyncevoSource *source, const char **name, int *mode)
|
||||
{
|
||||
if (name) {
|
||||
*name = g_value_get_string (g_value_array_get_nth (source, 0));
|
||||
}
|
||||
if (mode) {
|
||||
*mode = g_value_get_int (g_value_array_get_nth (source, 1));
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
syncevo_source_free (SyncevoSource *source)
|
||||
{
|
||||
if (source) {
|
||||
g_boxed_free (SYNCEVO_SOURCE_TYPE, source);
|
||||
}
|
||||
}
|
||||
|
||||
SyncevoOption*
|
||||
syncevo_option_new (char *ns, char *key, char *value)
|
||||
{
|
||||
GValue val = {0, };
|
||||
|
||||
g_value_init (&val, SYNCEVO_OPTION_TYPE);
|
||||
g_value_take_boxed (&val, dbus_g_type_specialized_construct (SYNCEVO_OPTION_TYPE));
|
||||
dbus_g_type_struct_set (&val, 0, ns, 1, key, 2, value, G_MAXUINT);
|
||||
|
||||
return (SyncevoOption*) g_value_get_boxed (&val);
|
||||
}
|
||||
|
||||
void
|
||||
syncevo_option_get (SyncevoOption *option, const char **ns, const char **key, const char **value)
|
||||
{
|
||||
if (ns) {
|
||||
*ns = g_value_get_string (g_value_array_get_nth (option, 0));
|
||||
}
|
||||
if (key) {
|
||||
*key = g_value_get_string (g_value_array_get_nth (option, 1));
|
||||
}
|
||||
if (value) {
|
||||
*value = g_value_get_string (g_value_array_get_nth (option, 2));
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
syncevo_option_free (SyncevoOption *option)
|
||||
{
|
||||
if (option) {
|
||||
g_boxed_free (SYNCEVO_OPTION_TYPE, option);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
enum {
|
||||
PROGRESS,
|
||||
SOURCE_PROGRESS,
|
||||
SERVER_MESSAGE,
|
||||
NEED_PASSWORD,
|
||||
LAST_SIGNAL
|
||||
};
|
||||
static guint signals[LAST_SIGNAL] = {0};
|
||||
|
||||
G_DEFINE_TYPE (SyncevoDBusServer, syncevo_dbus_server, G_TYPE_OBJECT);
|
||||
|
||||
static gboolean
|
||||
syncevo_start_sync (SyncevoDBusServer *obj,
|
||||
char *server,
|
||||
GPtrArray *sources,
|
||||
DBusGMethodInvocation *context)
|
||||
{
|
||||
g_print ("Sync! Sending a fake progress signal...\n");
|
||||
g_signal_emit (obj, signals[PROGRESS], 0,
|
||||
server, 0, 1, 2, 3);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
syncevo_abort_sync (SyncevoDBusServer *obj,
|
||||
char *server,
|
||||
DBusGMethodInvocation *context)
|
||||
{
|
||||
return FALSE;
|
||||
|
||||
}
|
||||
static gboolean
|
||||
syncevo_set_password (SyncevoDBusServer *obj,
|
||||
char *server,
|
||||
char *password,
|
||||
DBusGMethodInvocation *context)
|
||||
{
|
||||
return FALSE;
|
||||
|
||||
}
|
||||
static gboolean
|
||||
syncevo_get_servers (SyncevoDBusServer *obj,
|
||||
char ***servers,
|
||||
DBusGMethodInvocation *context)
|
||||
{
|
||||
return FALSE;
|
||||
|
||||
}
|
||||
static gboolean
|
||||
syncevo_get_server_config (SyncevoDBusServer *obj,
|
||||
char *server,
|
||||
GPtrArray **options,
|
||||
DBusGMethodInvocation *context)
|
||||
{
|
||||
SyncevoOption *option;
|
||||
|
||||
if (!options) {
|
||||
/* TODO set error*/
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
g_debug ("Returning fake server config");
|
||||
*options = g_ptr_array_new ();
|
||||
|
||||
option = syncevo_option_new (g_strdup("notes"), g_strdup("sync"), g_strdup("disabled"));
|
||||
g_ptr_array_add (*options, option);
|
||||
option = syncevo_option_new (g_strdup("addressbook"), g_strdup("sync"), g_strdup("disabled"));
|
||||
g_ptr_array_add (*options, option);
|
||||
option = syncevo_option_new (g_strdup("memo"), g_strdup("sync"), g_strdup("disabled"));
|
||||
g_ptr_array_add (*options, option);
|
||||
option = syncevo_option_new (g_strdup("calendar"), g_strdup("sync"), g_strdup("two-way"));
|
||||
g_ptr_array_add (*options, option);
|
||||
option = syncevo_option_new (g_strdup("calendar"), g_strdup("uri"), g_strdup("cal2"));
|
||||
g_ptr_array_add (*options, option);
|
||||
|
||||
option = syncevo_option_new (NULL, g_strdup("syncURL"), g_strdup("http://sync.scheduleworld.com/funambol/ds"));
|
||||
g_ptr_array_add (*options, option);
|
||||
option = syncevo_option_new (NULL, g_strdup("username"), g_strdup("jku@goto.fi"));
|
||||
g_ptr_array_add (*options, option);
|
||||
option = syncevo_option_new (NULL, g_strdup("password"), g_strdup("XXXXXXXXX"));
|
||||
g_ptr_array_add (*options, option);
|
||||
option = syncevo_option_new (NULL, g_strdup("deviceId"), g_strdup("sc-pim-7eabdd2e-8712-455a-b9af-16fd2da242fe"));
|
||||
g_ptr_array_add (*options, option);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
static gboolean
|
||||
syncevo_set_server_config (SyncevoDBusServer *obj,
|
||||
char *server,
|
||||
GPtrArray *options,
|
||||
DBusGMethodInvocation *context)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
syncevo_dbus_server_class_init(SyncevoDBusServerClass *klass)
|
||||
{
|
||||
GError *error = NULL;
|
||||
|
||||
klass->connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
|
||||
if (klass->connection == NULL)
|
||||
{
|
||||
g_warning("Unable to connect to dbus: %s", error->message);
|
||||
g_error_free (error);
|
||||
return;
|
||||
}
|
||||
|
||||
signals[PROGRESS] = g_signal_new ("progress",
|
||||
G_TYPE_FROM_CLASS (klass),
|
||||
(GSignalFlags)(G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE),
|
||||
G_STRUCT_OFFSET (SyncevoDBusServerClass, progress),
|
||||
NULL, NULL,
|
||||
syncevo_marshal_VOID__STRING_INT_INT_INT_INT,
|
||||
G_TYPE_NONE,
|
||||
5, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT);
|
||||
signals[SOURCE_PROGRESS] = g_signal_new ("source-progress",
|
||||
G_TYPE_FROM_CLASS (klass),
|
||||
(GSignalFlags)(G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE),
|
||||
G_STRUCT_OFFSET (SyncevoDBusServerClass, source_progress),
|
||||
NULL, NULL,
|
||||
syncevo_marshal_VOID__STRING_STRING_INT_INT_INT_INT,
|
||||
G_TYPE_NONE,
|
||||
6, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT);
|
||||
signals[SERVER_MESSAGE] = g_signal_new ("server-message",
|
||||
G_TYPE_FROM_CLASS (klass),
|
||||
(GSignalFlags)(G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE),
|
||||
G_STRUCT_OFFSET (SyncevoDBusServerClass, server_message),
|
||||
NULL, NULL,
|
||||
syncevo_marshal_VOID__STRING_STRING,
|
||||
G_TYPE_NONE,
|
||||
2, G_TYPE_STRING, G_TYPE_STRING);
|
||||
signals[NEED_PASSWORD] = g_signal_new ("need-password",
|
||||
G_TYPE_FROM_CLASS (klass),
|
||||
(GSignalFlags)(G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE),
|
||||
G_STRUCT_OFFSET (SyncevoDBusServerClass, need_password),
|
||||
NULL, NULL,
|
||||
g_cclosure_marshal_VOID__VOID,
|
||||
G_TYPE_NONE,
|
||||
0);
|
||||
|
||||
/* dbus_glib_syncevo_object_info is provided in the generated glue file */
|
||||
dbus_g_object_type_install_info (SYNCEVO_TYPE_DBUS_SERVER, &dbus_glib_syncevo_object_info);
|
||||
}
|
||||
|
||||
static void
|
||||
syncevo_dbus_server_init(SyncevoDBusServer *obj)
|
||||
{
|
||||
GError *error = NULL;
|
||||
DBusGProxy *proxy;
|
||||
guint request_ret;
|
||||
SyncevoDBusServerClass *klass = SYNCEVO_DBUS_SERVER_GET_CLASS (obj);
|
||||
|
||||
dbus_g_connection_register_g_object (klass->connection,
|
||||
"/org/Moblin/SyncEvolution",
|
||||
G_OBJECT (obj));
|
||||
|
||||
proxy = dbus_g_proxy_new_for_name (klass->connection,
|
||||
DBUS_SERVICE_DBUS,
|
||||
DBUS_PATH_DBUS,
|
||||
DBUS_INTERFACE_DBUS);
|
||||
|
||||
if(!org_freedesktop_DBus_request_name (proxy,
|
||||
"org.Moblin.SyncEvolution",
|
||||
0, &request_ret,
|
||||
&error)) {
|
||||
g_warning("Unable to register service: %s", error->message);
|
||||
g_error_free (error);
|
||||
}
|
||||
g_object_unref (proxy);
|
||||
|
||||
}
|
||||
|
||||
GMainLoop *loop;
|
||||
|
||||
void niam(int sig)
|
||||
{
|
||||
g_main_loop_quit (loop);
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
SyncevoDBusServer *server;
|
||||
|
||||
signal(SIGTERM, niam);
|
||||
signal(SIGINT, niam);
|
||||
|
||||
g_type_init ();
|
||||
|
||||
server = (SyncevoDBusServer*)g_object_new (SYNCEVO_TYPE_DBUS_SERVER, NULL);
|
||||
|
||||
loop = g_main_loop_new (NULL, FALSE);
|
||||
g_main_loop_run (loop);
|
||||
|
||||
g_main_loop_unref (loop);
|
||||
g_object_unref (server);
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
#ifndef __SYNCEVO_DBUS_SERVER_H
|
||||
#define __SYNCEVO_DBUS_SERVER_H
|
||||
|
||||
#include <glib-object.h>
|
||||
#include <dbus/dbus-glib.h>
|
||||
|
||||
#define SYNCEVO_TYPE_DBUS_SERVER (syncevo_dbus_server_get_type ())
|
||||
#define SYNCEVO_DBUS_SERVER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SYNCEVO_TYPE_DBUS_SERVER, SyncevoDBusServerClass))
|
||||
|
||||
typedef struct _SyncevoDBusServer {
|
||||
GObject parent_object;
|
||||
} SyncevoDBusServer;
|
||||
|
||||
typedef struct _SyncevoDBusServerClass {
|
||||
GObjectClass parent_class;
|
||||
DBusGConnection *connection;
|
||||
void (*progress) (SyncevoDBusServer *service,
|
||||
char *server,
|
||||
int type,
|
||||
int extra1, int extra2, int extra3);
|
||||
void (*source_progress) (SyncevoDBusServer *service,
|
||||
char *server,
|
||||
char *source,
|
||||
int type,
|
||||
int extra1, int extra2, int extra3);
|
||||
void (*server_message) (SyncevoDBusServer *service,
|
||||
char *server,
|
||||
char *message);
|
||||
void (*need_password) (SyncevoDBusServer *service,
|
||||
char *server);
|
||||
} SyncevoDBusServerClass;
|
||||
|
||||
GType syncevo_dbus_server_get_type (void);
|
||||
|
||||
|
||||
#endif // __SYNCEVO_DBUS_SERVER_H
|
|
@ -0,0 +1,11 @@
|
|||
prefix=@prefix@
|
||||
exec_prefix=@exec_prefix@
|
||||
libdir=@libdir@
|
||||
includedir=@includedir@
|
||||
|
||||
Name: syncevo-dbus
|
||||
Description: SyncEvolution D-Bus API wrapper
|
||||
Version: @VERSION@
|
||||
Cflags: -I${includedir}
|
||||
Requires: dbus-glib-1
|
||||
Libs: -L${libdir} -lsyncevo-dbus
|
|
@ -0,0 +1,53 @@
|
|||
lib_LTLIBRARIES = libsyncevo-dbus.la
|
||||
|
||||
noinst_PROGRAMS = \
|
||||
test-syncevo-dbus
|
||||
|
||||
test_syncevo_dbus_SOURCES = test.c
|
||||
test_syncevo_dbus_LDADD = $(DBUS_GLIB_LIBS) libsyncevo-dbus.la
|
||||
test_syncevo_dbus_CFLAGS = $(DBUS_GLIB_CFLAGS)
|
||||
|
||||
BUILT_SOURCES = \
|
||||
$(nodist_libsyncevo_dbus_la_SOURCES)
|
||||
|
||||
nodist_libsyncevo_dbus_la_SOURCES = \
|
||||
syncevo-marshal.c \
|
||||
syncevo-marshal.h \
|
||||
syncevo-bindings.h
|
||||
|
||||
libsyncevo_dbus_la_SOURCES = \
|
||||
$(syncevo_dbus_headers) \
|
||||
syncevo-dbus-types.c \
|
||||
syncevo-dbus.c
|
||||
|
||||
libsyncevo_dbus_la_CFLAGS = \
|
||||
-I$(top_srcdir) \
|
||||
-I$(top_builddir) \
|
||||
$(DBUS_GLIB_CFLAGS)
|
||||
|
||||
libsyncevo_dbus_la_LIBADD = \
|
||||
$(DBUS_GLIB_LIBS)
|
||||
|
||||
syncevo_dbus_headers = \
|
||||
syncevo-dbus-types.h \
|
||||
syncevo-dbus.h
|
||||
|
||||
libsyncevo_dbus_includedir = $(includedir)/syncevo-dbus
|
||||
libsyncevo_dbus_include_HEADERS = \
|
||||
$(syncevo_dbus_headers)
|
||||
|
||||
CLEANFILES = $(BUILT_SOURCES)
|
||||
|
||||
%-bindings.h: stamp-%-bindings.h
|
||||
@true
|
||||
stamp-%-bindings.h: ../interfaces/%.xml
|
||||
$(DBUS_BINDING_TOOL) --mode=glib-client --prefix=syncevo $< > xgen-$(@F) \
|
||||
&& (cmp -s xgen-$(@F) $(@F:stamp-%=%) || cp xgen-$(@F) $(@F:stamp-%=%)) \
|
||||
&& rm -f xgen-$(@F) \
|
||||
&& echo timestamp > $(@F)
|
||||
|
||||
syncevo-marshal.h: ../interfaces/syncevo-marshal.list $(GLIB_GENMARSHAL)
|
||||
$(GLIB_GENMARSHAL) $< --header --prefix=syncevo_marshal > $@
|
||||
syncevo-marshal.c: ../interfaces/syncevo-marshal.list syncevo-marshal.h $(GLIB_GENMARSHAL)
|
||||
echo "#include \"syncevo-marshal.h\"" > $@ \
|
||||
&& $(GLIB_GENMARSHAL) --prefix=syncevo_marshal $(srcdir)/../interfaces/syncevo-marshal.list --body >> $@
|
|
@ -0,0 +1 @@
|
|||
This is the C wrapper for the SyncEvolution DBus API
|
|
@ -0,0 +1,69 @@
|
|||
#include "syncevo-dbus-types.h"
|
||||
|
||||
SyncevoSource*
|
||||
syncevo_source_new (char *name, int mode)
|
||||
{
|
||||
GValue val = {0, };
|
||||
|
||||
g_value_init (&val, SYNCEVO_SOURCE_TYPE);
|
||||
g_value_take_boxed (&val, dbus_g_type_specialized_construct (SYNCEVO_SOURCE_TYPE));
|
||||
dbus_g_type_struct_set (&val, 0, name, 1, mode, G_MAXUINT);
|
||||
|
||||
return (SyncevoSource*) g_value_get_boxed (&val);
|
||||
}
|
||||
|
||||
void
|
||||
syncevo_source_get (SyncevoSource *source, const char **name, int *mode)
|
||||
{
|
||||
if (name) {
|
||||
*name = g_value_get_string (g_value_array_get_nth (source, 0));
|
||||
}
|
||||
if (mode) {
|
||||
*mode = g_value_get_int (g_value_array_get_nth (source, 1));
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
syncevo_source_free (SyncevoSource *source)
|
||||
{
|
||||
if (source) {
|
||||
g_boxed_free (SYNCEVO_SOURCE_TYPE, source);
|
||||
}
|
||||
}
|
||||
|
||||
SyncevoOption*
|
||||
syncevo_option_new (char *ns, char *key, char *value)
|
||||
{
|
||||
GValue val = {0, };
|
||||
|
||||
g_value_init (&val, SYNCEVO_OPTION_TYPE);
|
||||
g_value_take_boxed (&val, dbus_g_type_specialized_construct (SYNCEVO_OPTION_TYPE));
|
||||
dbus_g_type_struct_set (&val, 0, ns, 1, key, 2, value, G_MAXUINT);
|
||||
|
||||
return (SyncevoOption*) g_value_get_boxed (&val);
|
||||
}
|
||||
|
||||
void
|
||||
syncevo_option_get (SyncevoOption *option, const char **ns, const char **key, const char **value)
|
||||
{
|
||||
if (ns) {
|
||||
*ns = g_value_get_string (g_value_array_get_nth (option, 0));
|
||||
}
|
||||
if (key) {
|
||||
*key = g_value_get_string (g_value_array_get_nth (option, 1));
|
||||
}
|
||||
if (value) {
|
||||
*value = g_value_get_string (g_value_array_get_nth (option, 2));
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
syncevo_option_free (SyncevoOption *option)
|
||||
{
|
||||
if (option) {
|
||||
g_boxed_free (SYNCEVO_OPTION_TYPE, option);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
#ifndef __SYNCEVO_DBUS_TYPES_H__
|
||||
#define __SYNCEVO_DBUS_TYPES_H__
|
||||
|
||||
#include <glib.h>
|
||||
#include <dbus/dbus-glib.h>
|
||||
|
||||
#define SYNCEVO_SOURCE_TYPE (dbus_g_type_get_struct ("GValueArray", G_TYPE_STRING, G_TYPE_INT, G_TYPE_INVALID))
|
||||
typedef GValueArray SyncevoSource;
|
||||
|
||||
#define SYNCEVO_OPTION_TYPE (dbus_g_type_get_struct ("GValueArray", G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID))
|
||||
typedef GValueArray SyncevoOption;
|
||||
|
||||
SyncevoOption* syncevo_option_new (char *ns, char *key, char *value);
|
||||
void syncevo_option_get (SyncevoOption *option, const char **ns, const char **key, const char **value);
|
||||
void syncevo_option_free (SyncevoOption *option);
|
||||
|
||||
SyncevoSource* syncevo_source_new (char *name, int mode);
|
||||
void syncevo_source_get (SyncevoSource *source, const char **name, int *mode);
|
||||
void syncevo_source_free (SyncevoSource *source);
|
||||
|
||||
|
||||
#endif
|
|
@ -0,0 +1,453 @@
|
|||
#include <glib-object.h>
|
||||
|
||||
#include "syncevo-dbus.h"
|
||||
#include "syncevo-marshal.h"
|
||||
#include "syncevo-bindings.h"
|
||||
|
||||
typedef struct _SyncevoAsyncData {
|
||||
SyncevoService *service;
|
||||
GCallback callback;
|
||||
gpointer userdata;
|
||||
} SyncevoAsyncData;
|
||||
|
||||
|
||||
enum {
|
||||
PROGRESS,
|
||||
SOURCE_PROGRESS,
|
||||
SERVER_MESSAGE,
|
||||
NEED_PASSWORD,
|
||||
LAST_SIGNAL
|
||||
};
|
||||
|
||||
typedef struct _SyncevoServicePrivate {
|
||||
DBusGProxy *proxy;
|
||||
} SyncevoServicePrivate;
|
||||
|
||||
#define GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), SYNCEVO_TYPE_SERVICE, SyncevoServicePrivate))
|
||||
|
||||
static void progress_cb (DBusGProxy *proxy,
|
||||
char *server,
|
||||
int type,
|
||||
int extra1, int extra2, int extra3,
|
||||
SyncevoService *service);
|
||||
static void source_progress_cb (DBusGProxy *proxy,
|
||||
char *server,
|
||||
char *source,
|
||||
int type,
|
||||
int extra1, int extra2, int extra3,
|
||||
SyncevoService *service);
|
||||
static void server_message_cb (DBusGProxy *proxy,
|
||||
char *server,
|
||||
char *message,
|
||||
SyncevoService *service);
|
||||
static void need_password_cb (DBusGProxy *proxy,
|
||||
char *server,
|
||||
SyncevoService *service);
|
||||
|
||||
G_DEFINE_TYPE (SyncevoService, syncevo_service, G_TYPE_OBJECT);
|
||||
|
||||
static guint32 signals[LAST_SIGNAL] = {0, };
|
||||
|
||||
static void
|
||||
finalize (GObject *object)
|
||||
{
|
||||
SyncevoServicePrivate *priv;
|
||||
|
||||
priv = GET_PRIVATE (object);
|
||||
|
||||
G_OBJECT_CLASS (syncevo_service_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
dispose (GObject *object)
|
||||
{
|
||||
SyncevoServicePrivate *priv;
|
||||
|
||||
priv = GET_PRIVATE (object);
|
||||
|
||||
if (priv->proxy) {
|
||||
dbus_g_proxy_disconnect_signal (priv->proxy, "Progress",
|
||||
G_CALLBACK (progress_cb),
|
||||
object);
|
||||
dbus_g_proxy_disconnect_signal (priv->proxy, "SourceProgress",
|
||||
G_CALLBACK (progress_cb),
|
||||
object);
|
||||
dbus_g_proxy_disconnect_signal (priv->proxy, "ServerMessage",
|
||||
G_CALLBACK (progress_cb),
|
||||
object);
|
||||
dbus_g_proxy_disconnect_signal (priv->proxy, "NeedPassword",
|
||||
G_CALLBACK (progress_cb),
|
||||
object);
|
||||
|
||||
g_object_unref (priv->proxy);
|
||||
priv->proxy = NULL;
|
||||
}
|
||||
|
||||
G_OBJECT_CLASS (syncevo_service_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
static void progress_cb (DBusGProxy *proxy,
|
||||
char *server,
|
||||
int type,
|
||||
int extra1, int extra2, int extra3,
|
||||
SyncevoService *service)
|
||||
{
|
||||
g_signal_emit (service, signals[PROGRESS], 0,
|
||||
server, type, extra1, extra2, extra3);
|
||||
}
|
||||
|
||||
static void source_progress_cb (DBusGProxy *proxy,
|
||||
char *server,
|
||||
char *source,
|
||||
int type,
|
||||
int extra1, int extra2, int extra3,
|
||||
SyncevoService *service)
|
||||
{
|
||||
g_signal_emit (service, signals[SOURCE_PROGRESS], 0,
|
||||
server, source, type, extra1, extra2, extra3);
|
||||
}
|
||||
|
||||
static void server_message_cb (DBusGProxy *proxy,
|
||||
char *server,
|
||||
char *message,
|
||||
SyncevoService *service)
|
||||
{
|
||||
g_signal_emit (service, signals[SERVER_MESSAGE], 0,
|
||||
server, message);
|
||||
}
|
||||
|
||||
static void need_password_cb (DBusGProxy *proxy,
|
||||
char *server,
|
||||
SyncevoService *service)
|
||||
{
|
||||
g_signal_emit (service, signals[NEED_PASSWORD], 0,
|
||||
server);
|
||||
}
|
||||
|
||||
static GObject *
|
||||
constructor (GType type,
|
||||
guint n_construct_properties,
|
||||
GObjectConstructParam *construct_properties)
|
||||
{
|
||||
SyncevoService *service;
|
||||
SyncevoServicePrivate *priv;
|
||||
DBusGConnection *connection;
|
||||
GError *error;
|
||||
|
||||
service = SYNCEVO_SERVICE (G_OBJECT_CLASS (syncevo_service_parent_class)->constructor
|
||||
(type, n_construct_properties, construct_properties));
|
||||
priv = GET_PRIVATE (service);
|
||||
|
||||
error = NULL;
|
||||
connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
|
||||
if (connection == NULL) {
|
||||
g_printerr ("Failed to open connection to bus: %s\n",
|
||||
error->message);
|
||||
g_error_free (error);
|
||||
|
||||
priv->proxy = NULL;
|
||||
return G_OBJECT (service);
|
||||
}
|
||||
|
||||
priv->proxy = dbus_g_proxy_new_for_name (connection,
|
||||
SYNCEVO_SERVICE_DBUS_SERVICE,
|
||||
SYNCEVO_SERVICE_DBUS_PATH,
|
||||
SYNCEVO_SERVICE_DBUS_INTERFACE);
|
||||
dbus_g_object_register_marshaller (syncevo_marshal_VOID__STRING_INT_INT_INT_INT,
|
||||
G_TYPE_NONE,
|
||||
G_TYPE_STRING,
|
||||
G_TYPE_INT,
|
||||
G_TYPE_INT,
|
||||
G_TYPE_INT,
|
||||
G_TYPE_INT,
|
||||
G_TYPE_INVALID);
|
||||
dbus_g_object_register_marshaller (syncevo_marshal_VOID__STRING_STRING_INT_INT_INT_INT,
|
||||
G_TYPE_NONE,
|
||||
G_TYPE_STRING,
|
||||
G_TYPE_STRING,
|
||||
G_TYPE_INT,
|
||||
G_TYPE_INT,
|
||||
G_TYPE_INT,
|
||||
G_TYPE_INT,
|
||||
G_TYPE_INVALID);
|
||||
dbus_g_object_register_marshaller (syncevo_marshal_VOID__STRING_STRING,
|
||||
G_TYPE_NONE,
|
||||
G_TYPE_STRING,
|
||||
G_TYPE_STRING,
|
||||
G_TYPE_INVALID);
|
||||
|
||||
dbus_g_proxy_add_signal (priv->proxy, "Progress",
|
||||
G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INVALID);
|
||||
dbus_g_proxy_connect_signal (priv->proxy, "Progress",
|
||||
G_CALLBACK (progress_cb), service, NULL);
|
||||
dbus_g_proxy_add_signal (priv->proxy, "SourceProgress",
|
||||
G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INVALID);
|
||||
dbus_g_proxy_connect_signal (priv->proxy, "SourceProgress",
|
||||
G_CALLBACK (source_progress_cb), service, NULL);
|
||||
dbus_g_proxy_add_signal (priv->proxy, "ServerMessage",
|
||||
G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID);
|
||||
dbus_g_proxy_connect_signal (priv->proxy, "ServerMessage",
|
||||
G_CALLBACK (server_message_cb), service, NULL);
|
||||
dbus_g_proxy_add_signal (priv->proxy, "NeedPassword",
|
||||
G_TYPE_INVALID);
|
||||
dbus_g_proxy_connect_signal (priv->proxy, "NeedPassword",
|
||||
G_CALLBACK (need_password_cb), service, NULL);
|
||||
|
||||
return G_OBJECT (service);
|
||||
}
|
||||
|
||||
static void
|
||||
syncevo_service_class_init (SyncevoServiceClass *klass)
|
||||
{
|
||||
GObjectClass *o_class = (GObjectClass *) klass;
|
||||
|
||||
o_class->finalize = finalize;
|
||||
o_class->dispose = dispose;
|
||||
o_class->constructor = constructor;
|
||||
|
||||
g_type_class_add_private (klass, sizeof (SyncevoServicePrivate));
|
||||
|
||||
signals[PROGRESS] = g_signal_new ("progress",
|
||||
G_TYPE_FROM_CLASS (klass),
|
||||
G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE,
|
||||
G_STRUCT_OFFSET (SyncevoServiceClass, progress),
|
||||
NULL, NULL,
|
||||
syncevo_marshal_VOID__STRING_INT_INT_INT_INT,
|
||||
G_TYPE_NONE,
|
||||
5, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT);
|
||||
signals[SOURCE_PROGRESS] = g_signal_new ("source-progress",
|
||||
G_TYPE_FROM_CLASS (klass),
|
||||
G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE,
|
||||
G_STRUCT_OFFSET (SyncevoServiceClass, source_progress),
|
||||
NULL, NULL,
|
||||
syncevo_marshal_VOID__STRING_STRING_INT_INT_INT_INT,
|
||||
G_TYPE_NONE,
|
||||
6, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT);
|
||||
signals[SERVER_MESSAGE] = g_signal_new ("server-message",
|
||||
G_TYPE_FROM_CLASS (klass),
|
||||
G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE,
|
||||
G_STRUCT_OFFSET (SyncevoServiceClass, server_message),
|
||||
NULL, NULL,
|
||||
syncevo_marshal_VOID__STRING_STRING,
|
||||
G_TYPE_NONE,
|
||||
2, G_TYPE_STRING, G_TYPE_STRING);
|
||||
signals[NEED_PASSWORD] = g_signal_new ("need-password",
|
||||
G_TYPE_FROM_CLASS (klass),
|
||||
G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE,
|
||||
G_STRUCT_OFFSET (SyncevoServiceClass, need_password),
|
||||
NULL, NULL,
|
||||
g_cclosure_marshal_VOID__VOID,
|
||||
G_TYPE_NONE,
|
||||
0);
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
syncevo_service_init (SyncevoService *service)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
SyncevoService *
|
||||
syncevo_service_get_default ()
|
||||
{
|
||||
static SyncevoService *default_service = NULL;
|
||||
|
||||
if (default_service == NULL) {
|
||||
default_service = g_object_new (SYNCEVO_TYPE_SERVICE, NULL);
|
||||
g_object_add_weak_pointer (G_OBJECT (default_service),
|
||||
(gpointer) &default_service);
|
||||
return default_service;
|
||||
}
|
||||
|
||||
return g_object_ref (default_service);
|
||||
}
|
||||
|
||||
|
||||
|
||||
gboolean syncevo_service_start_sync (SyncevoService *service,
|
||||
char *server,
|
||||
GPtrArray *sources,
|
||||
GError **error)
|
||||
{
|
||||
SyncevoServicePrivate *priv;
|
||||
|
||||
priv = GET_PRIVATE (service);
|
||||
return org_Moblin_SyncEvolution_start_sync (priv->proxy,
|
||||
server,
|
||||
sources,
|
||||
error);
|
||||
}
|
||||
|
||||
gboolean syncevo_service_abort_sync (SyncevoService *service,
|
||||
char *server,
|
||||
GError **error)
|
||||
{
|
||||
SyncevoServicePrivate *priv;
|
||||
|
||||
priv = GET_PRIVATE (service);
|
||||
return org_Moblin_SyncEvolution_abort_sync (priv->proxy,
|
||||
server,
|
||||
error);
|
||||
}
|
||||
|
||||
gboolean syncevo_service_set_password (SyncevoService *service,
|
||||
char *server,
|
||||
char *password,
|
||||
GError **error)
|
||||
{
|
||||
SyncevoServicePrivate *priv;
|
||||
|
||||
priv = GET_PRIVATE (service);
|
||||
return org_Moblin_SyncEvolution_set_password (priv->proxy,
|
||||
server,
|
||||
password,
|
||||
error);
|
||||
}
|
||||
|
||||
gboolean syncevo_service_get_servers (SyncevoService *service,
|
||||
char ***servers,
|
||||
GError **error)
|
||||
{
|
||||
SyncevoServicePrivate *priv;
|
||||
|
||||
priv = GET_PRIVATE (service);
|
||||
return org_Moblin_SyncEvolution_get_servers (priv->proxy,
|
||||
servers,
|
||||
error);
|
||||
}
|
||||
|
||||
static void
|
||||
get_servers_async_callback (DBusGProxy *proxy,
|
||||
char **servers,
|
||||
GError *error,
|
||||
SyncevoAsyncData *data)
|
||||
{
|
||||
(*(SyncevoGetServersCb)data->callback) (data->service,
|
||||
servers,
|
||||
error,
|
||||
data->userdata);
|
||||
g_slice_free (SyncevoAsyncData, data);
|
||||
}
|
||||
|
||||
void
|
||||
syncevo_service_get_servers_async (SyncevoService *service,
|
||||
SyncevoGetServersCb callback,
|
||||
gpointer userdata)
|
||||
{
|
||||
SyncevoAsyncData *data;
|
||||
SyncevoServicePrivate *priv;
|
||||
|
||||
priv = GET_PRIVATE (service);
|
||||
|
||||
data = g_slice_new0 (SyncevoAsyncData);
|
||||
data->service = service;
|
||||
data->callback = G_CALLBACK (callback);
|
||||
data->userdata = userdata;
|
||||
|
||||
org_Moblin_SyncEvolution_get_servers_async
|
||||
(priv->proxy,
|
||||
(org_Moblin_SyncEvolution_get_servers_reply) get_servers_async_callback,
|
||||
data);
|
||||
}
|
||||
|
||||
gboolean syncevo_service_get_server_config (SyncevoService *service,
|
||||
char *server,
|
||||
GPtrArray **options,
|
||||
GError **error)
|
||||
{
|
||||
SyncevoServicePrivate *priv;
|
||||
|
||||
priv = GET_PRIVATE (service);
|
||||
return org_Moblin_SyncEvolution_get_server_config (priv->proxy,
|
||||
server,
|
||||
options,
|
||||
error);
|
||||
}
|
||||
|
||||
static void
|
||||
get_server_config_async_callback (DBusGProxy *proxy,
|
||||
GPtrArray *options,
|
||||
GError *error,
|
||||
SyncevoAsyncData *data)
|
||||
{
|
||||
(*(SyncevoGetServerConfigCb)data->callback) (data->service,
|
||||
options,
|
||||
error,
|
||||
data->userdata);
|
||||
g_slice_free (SyncevoAsyncData, data);
|
||||
}
|
||||
|
||||
void
|
||||
syncevo_service_get_server_config_async (SyncevoService *service,
|
||||
char *server,
|
||||
SyncevoGetServerConfigCb callback,
|
||||
gpointer userdata)
|
||||
{
|
||||
SyncevoAsyncData *data;
|
||||
SyncevoServicePrivate *priv;
|
||||
|
||||
priv = GET_PRIVATE (service);
|
||||
|
||||
data = g_slice_new0 (SyncevoAsyncData);
|
||||
data->service = service;
|
||||
data->callback = G_CALLBACK (callback);
|
||||
data->userdata = userdata;
|
||||
|
||||
org_Moblin_SyncEvolution_get_server_config_async
|
||||
(priv->proxy,
|
||||
server,
|
||||
(org_Moblin_SyncEvolution_get_server_config_reply) get_server_config_async_callback,
|
||||
data);
|
||||
}
|
||||
|
||||
|
||||
gboolean syncevo_service_set_server_config (SyncevoService *service,
|
||||
char *server,
|
||||
GPtrArray *options,
|
||||
GError **error)
|
||||
{
|
||||
SyncevoServicePrivate *priv;
|
||||
|
||||
priv = GET_PRIVATE (service);
|
||||
return org_Moblin_SyncEvolution_set_server_config (priv->proxy,
|
||||
server,
|
||||
options,
|
||||
error);
|
||||
}
|
||||
|
||||
static void
|
||||
set_server_config_async_callback (DBusGProxy *proxy,
|
||||
GError *error,
|
||||
SyncevoAsyncData *data)
|
||||
{
|
||||
(*(SyncevoSetServerConfigCb)data->callback) (data->service,
|
||||
error,
|
||||
data->userdata);
|
||||
g_slice_free (SyncevoAsyncData, data);
|
||||
}
|
||||
|
||||
void
|
||||
syncevo_service_set_server_config_async (SyncevoService *service,
|
||||
char *server,
|
||||
GPtrArray *options,
|
||||
SyncevoSetServerConfigCb callback,
|
||||
gpointer userdata)
|
||||
{
|
||||
SyncevoAsyncData *data;
|
||||
SyncevoServicePrivate *priv;
|
||||
|
||||
priv = GET_PRIVATE (service);
|
||||
|
||||
data = g_slice_new0 (SyncevoAsyncData);
|
||||
data->service = service;
|
||||
data->callback = G_CALLBACK (callback);
|
||||
data->userdata = userdata;
|
||||
|
||||
org_Moblin_SyncEvolution_set_server_config_async
|
||||
(priv->proxy,
|
||||
server,
|
||||
options,
|
||||
(org_Moblin_SyncEvolution_set_server_config_reply) set_server_config_async_callback,
|
||||
data);
|
||||
}
|
|
@ -0,0 +1,97 @@
|
|||
#ifndef __SYNCEVO_SERVICE_H__
|
||||
#define __SYNCEVO_SERVICE_H__
|
||||
|
||||
#include <glib-object.h>
|
||||
#include "syncevo-dbus-types.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define SYNCEVO_SERVICE_DBUS_SERVICE "org.Moblin.SyncEvolution"
|
||||
#define SYNCEVO_SERVICE_DBUS_PATH "/org/Moblin/SyncEvolution"
|
||||
#define SYNCEVO_SERVICE_DBUS_INTERFACE "org.Moblin.SyncEvolution"
|
||||
|
||||
#define SYNCEVO_TYPE_SERVICE (syncevo_service_get_type ())
|
||||
#define SYNCEVO_SERVICE(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), SYNCEVO_TYPE_SERVICE, SyncevoService))
|
||||
#define SYNCEVO_IS_SERVICE(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), SYNCEVO_TYPE_SERVICE))
|
||||
|
||||
|
||||
typedef struct _SyncevoService {
|
||||
GObject parent_object;
|
||||
} SyncevoService;
|
||||
|
||||
typedef struct _SyncevoServiceClass {
|
||||
GObjectClass parent_class;
|
||||
|
||||
void (*progress) (SyncevoService *service,
|
||||
char *server,
|
||||
int type,
|
||||
int extra1, int extra2, int extra3);
|
||||
void (*source_progress) (SyncevoService *service,
|
||||
char *server,
|
||||
char *source,
|
||||
int type,
|
||||
int extra1, int extra2, int extra3);
|
||||
void (*server_message) (SyncevoService *service,
|
||||
char *server,
|
||||
char *message);
|
||||
void (*need_password) (SyncevoService *service,
|
||||
char *server);
|
||||
} SyncevoServiceClass;
|
||||
|
||||
GType syncevo_service_get_type (void);
|
||||
|
||||
SyncevoService *syncevo_service_get_default ();
|
||||
|
||||
gboolean syncevo_service_start_sync (SyncevoService *service,
|
||||
char *server,
|
||||
GPtrArray *sources,
|
||||
GError **error);
|
||||
gboolean syncevo_service_abort_sync (SyncevoService *service,
|
||||
char *server,
|
||||
GError **error);
|
||||
gboolean syncevo_service_set_password (SyncevoService *service,
|
||||
char *server,
|
||||
char *password,
|
||||
GError **error);
|
||||
|
||||
|
||||
gboolean syncevo_service_get_servers (SyncevoService *service,
|
||||
char ***servers,
|
||||
GError **error);
|
||||
typedef void (*SyncevoGetServersCb) (SyncevoService *service,
|
||||
char **servers,
|
||||
GError *error,
|
||||
gpointer userdata);
|
||||
void syncevo_service_get_servers_async (SyncevoService *service,
|
||||
SyncevoGetServersCb callback,
|
||||
gpointer userdata);
|
||||
|
||||
gboolean syncevo_service_get_server_config (SyncevoService *service,
|
||||
char *server,
|
||||
GPtrArray **options,
|
||||
GError **error);
|
||||
typedef void (*SyncevoGetServerConfigCb) (SyncevoService *service,
|
||||
GPtrArray *options,
|
||||
GError *error,
|
||||
gpointer userdata);
|
||||
void syncevo_service_get_server_config_async (SyncevoService *service,
|
||||
char *server,
|
||||
SyncevoGetServerConfigCb callback,
|
||||
gpointer userdata);
|
||||
|
||||
gboolean syncevo_service_set_server_config (SyncevoService *service,
|
||||
char *server,
|
||||
GPtrArray *options,
|
||||
GError **error);
|
||||
typedef void (*SyncevoSetServerConfigCb) (SyncevoService *service,
|
||||
GError *error,
|
||||
gpointer userdata);
|
||||
void syncevo_service_set_server_config_async (SyncevoService *service,
|
||||
char *server,
|
||||
GPtrArray *options,
|
||||
SyncevoSetServerConfigCb callback,
|
||||
gpointer userdata);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif
|
|
@ -0,0 +1,49 @@
|
|||
/* test program for the C wrapper for the SyncEvolution DBus interface */
|
||||
|
||||
#include "syncevo-dbus.h"
|
||||
|
||||
|
||||
void
|
||||
progress_cb (SyncevoService *service, char *server, int type, int extra1, int extra2, int extra3)
|
||||
{
|
||||
g_print ("Got signal 'progress': %s: %d %d %d %d\n",
|
||||
server, type, extra1, extra2, extra3);
|
||||
}
|
||||
|
||||
int main ()
|
||||
{
|
||||
SyncevoService *service;
|
||||
SyncevoSource *source;
|
||||
GPtrArray *sources;
|
||||
GMainLoop *loop;
|
||||
GError *error = NULL;
|
||||
char* source_name = "calendar";
|
||||
int source_mode = 1;
|
||||
|
||||
|
||||
g_type_init ();
|
||||
|
||||
service = syncevo_service_get_default();
|
||||
|
||||
/*for some reason the dbus type system fails unless a connection has been created...
|
||||
workaround: create SyncEvoService first */
|
||||
source = syncevo_source_new (source_name, source_mode);
|
||||
sources = g_ptr_array_new ();
|
||||
g_ptr_array_add (sources, source);
|
||||
|
||||
g_signal_connect (service, "progress",
|
||||
G_CALLBACK (progress_cb), NULL);
|
||||
if (!syncevo_service_start_sync (service, "scheduleworld", sources, &error)) {
|
||||
g_printerr ("StartSync failed :%s\n", error->message);
|
||||
g_error_free (error);
|
||||
} else {
|
||||
g_print ("StartSync ok, waiting for signals\n");
|
||||
loop = g_main_loop_new (NULL, FALSE);
|
||||
g_main_loop_run (loop);
|
||||
g_main_loop_unref (loop);
|
||||
}
|
||||
|
||||
g_ptr_array_free (sources, FALSE);
|
||||
syncevo_source_free (source);
|
||||
g_object_unref (service);
|
||||
}
|
Loading…
Reference in New Issue