Add initial dbus api and wrapper client library

This commit is contained in:
Jussi Kukkonen 2009-03-30 18:54:47 +03:00
parent e1f2e694f2
commit 9a417300f0
18 changed files with 1239 additions and 8 deletions

View File

@ -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

View File

@ -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

View File

@ -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?

1
interfaces/Makefile.am Normal file
View File

@ -0,0 +1 @@
noinst_DATA = syncevo.xml syncevo-marshal.list

View File

@ -0,0 +1,3 @@
VOID:STRING,INT,INT,INT,INT
VOID:STRING,STRING,INT,INT,INT,INT
VOID:STRING,STRING

65
interfaces/syncevo.xml Normal file
View File

@ -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>

View File

@ -0,0 +1,3 @@
[D-BUS Service]
Name=org.Moblin.SyncEvolution
Exec=@libexecdir@/syncevo-dbus-server

View File

@ -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

295
src/syncevo-dbus-server.cpp Normal file
View File

@ -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;
}

36
src/syncevo-dbus-server.h Normal file
View File

@ -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

11
syncevo-dbus.pc.in Normal file
View File

@ -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

53
syncevo-dbus/Makefile.am Normal file
View File

@ -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 >> $@

1
syncevo-dbus/README Normal file
View File

@ -0,0 +1 @@
This is the C wrapper for the SyncEvolution DBus API

View File

@ -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);
}
}

View File

@ -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

453
syncevo-dbus/syncevo-dbus.c Normal file
View File

@ -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);
}

View File

@ -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

49
syncevo-dbus/test.c Normal file
View File

@ -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);
}