Merge branch 'origin/jku' (early part)

Conflicts:
	src/dbus/interfaces/syncevo-server-full.xml

Conflict due to whitespace changes.
This commit is contained in:
Patrick Ohly 2009-11-30 19:46:12 +01:00
commit 03351afe03
34 changed files with 5643 additions and 3800 deletions

View file

@ -271,10 +271,6 @@ AC_ARG_ENABLE(gui,
AM_CONDITIONAL([COND_GUI], [test "$enable_gui" != "no"])
if test $enable_gui == "moblin"; then
AC_DEFINE(USE_MOBLIN_UX, 1, [Use the MUX widget library])
fi
AC_ARG_ENABLE(dbus-service,
AS_HELP_STRING([--enable-dbus-service],
[enables building the dbus service executable and the wrapper library for it]),
@ -335,7 +331,10 @@ case $enable_gui in
esac
if test $enable_gui != "no"; then
gui_modules="glib-2.0 dbus-glib-1 >= 0.60 gtk+-2.0 libglade-2.0 gconf-2.0 gio-2.0 gnome-keyring-1"
gui_modules="glib-2.0 dbus-glib-1 >= 0.60 gtk+-2.0 libglade-2.0 gconf-2.0 gio-2.0"
if test $enable_gui == "moblin"; then
AC_DEFINE(USE_MOBLIN_UX, 1, [Use Moblin UI widgets])
fi
PKG_CHECK_MODULES(UNIQUE, unique-1.0,
have_unique="yes",

View file

@ -1,5 +1,6 @@
src/gtk-ui/main.c
src/gtk-ui/sync-ui.c
src/gtk-ui/sync-ui-config.c
src/gtk-ui/ui.glade
src/gtk-ui/sync.desktop.in
src/gtk-ui/sync-gtk.desktop.in

View file

@ -1,6 +1,6 @@
BACKENDS = @BACKENDS@
service_in_files = org.Moblin.SyncEvolution.service.in
service_in_files = org.syncevolution.service.in
if COND_DBUS
servicedir = $(DBUS_SERVICES_DIR)
service_DATA = $(service_in_files:.service.in=.service)
@ -47,7 +47,7 @@ nobase_dist_sysconf_DATA = $(TEMPLATE_FILES)
DISTCLEANFILES = synccompare
MAINTAINERCLEANFILES = Makefile.in
CLEANFILES = libstdc++.a client-test $(CLIENT_LIB_TEST_FILES) \
org.Moblin.SyncEvolution.service
org.syncevolution.service
# synccompare is created by replacing its 'import Algorithm::Diff;'
# with a simplified copy of Diff.pm.

View file

@ -9,8 +9,7 @@ EXTRA_DIST = syncevo-dbus.pc.in
pkgconfig_DATA = syncevo-dbus.pc
pkgconfigdir = $(libdir)/pkgconfig
noinst_PROGRAMS = \
test-syncevo-dbus
noinst_PROGRAMS = test-syncevo-dbus
test_syncevo_dbus_SOURCES = test.c
test_syncevo_dbus_LDADD = $(DBUS_GLIB_LIBS) libsyncevo-dbus.la
@ -22,7 +21,8 @@ nodist_libsyncevo_dbus_la_SOURCES = \
libsyncevo_dbus_la_SOURCES = \
$(syncevo_dbus_headers) \
syncevo-dbus-types.c \
syncevo-dbus.c
syncevo-server.c \
syncevo-session.c
libsyncevo_dbus_la_CFLAGS = \
-I$(top_srcdir) \
@ -34,7 +34,8 @@ libsyncevo_dbus_la_LIBADD = \
syncevo_dbus_headers = \
syncevo-dbus-types.h \
syncevo-dbus.h
syncevo-server.h \
syncevo-session.h
libsyncevo_dbus_includedir = $(includedir)/syncevo-dbus
libsyncevo_dbus_include_HEADERS = \

View file

@ -1 +1,2 @@
This is the C wrapper for the SyncEvolution DBus API
This is the C wrapper for the SyncEvolution DBus API. It is used by the GTK ui.

View file

@ -4,9 +4,12 @@
%-doc.xml: %-full.xml
$(XSLT) -o $@ $(srcdir)/spec-to-docbook.xsl $<
BUILT_SOURCES = syncevo.xml syncevo-dbus-glue.h syncevo-marshal.c syncevo-marshal.h syncevo-bindings.h syncevo-server-doc.xml syncevo-connection-doc.xml syncevo-session-doc.xml
BUILT_SOURCES = syncevo-marshal.c syncevo-marshal.h \
syncevo-server-bindings.h syncevo-connection-bindings.h syncevo-session-bindings.h \
syncevo-server-glue.h syncevo-connection-glue.h syncevo-session-glue.h \
syncevo-server-doc.xml syncevo-connection-doc.xml syncevo-session-doc.xml \
syncevo-server.xml syncevo-connection.xml syncevo-session.xml
noinst_DATA = syncevo.xml
CLEANFILES = $(noinst_DATA) $(BUILT_SOURCES) stamp-syncevo-dbus-glue.h
EXTRA_DIST = syncevo-marshal.list spec-strip-docs.xsl $(noinst_DATA)
@ -24,9 +27,9 @@ syncevo-marshal.c: $(srcdir)/syncevo-marshal.list syncevo-marshal.h $(GLIB_GENMA
echo "#include \"syncevo-marshal.h\"" > $@ \
&& $(GLIB_GENMARSHAL) --prefix=syncevo_marshal $(srcdir)/syncevo-marshal.list --body >> $@
syncevo-dbus-glue.h: stamp-syncevo-dbus-glue.h
%-glue.h: stamp-%-glue.h
@true
stamp-syncevo-dbus-glue.h: syncevo.xml
stamp-%-glue.h: %.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) \

View file

@ -1,139 +0,0 @@
<?xml version="1.0"?>
<node name="/" xmlns:doc="http://www.freedesktop.org/dbus/1.0/doc.dtd">
<doc:doc>
<doc:summary>SyncEvolution D-Bus Interface</doc:summary>
</doc:doc>
<interface name="org.Moblin.SyncEvolution">
<doc:doc>
<doc:para>
The SyncEvolution object can be used to get and set configurations,
to start synchronizations and to observe synchronization progress.
</doc:para>
</doc:doc>
<method name="StartSync">
<doc:doc>
<doc:summary>Starts a synchronization. This function returns immediately,
use Progress-signal to see when Synchronization is finished.
</doc:summary>
</doc:doc>
<arg type="s" name="server" direction="in">
<doc:doc>
<doc:summary>Server name. Server must be already defined in SyncEvolution</doc:summary>
</doc:doc>
</arg>
<arg type="a(si)" name="sources" direction="in">
<doc:doc>
<doc:summary>Source array with each source containing name and sync mode.
If array is empty, all sources will be synchronized.
</doc:summary>
</doc:doc>
</arg>
</method>
<method name="AbortSync">
<doc:doc>
<doc:summary>Aborts a synchronization. This function returns immediately,
use Progress-signal to see when Synchronization is actually aborted.
</doc:summary>
</doc:doc>
<arg type="s" name="server" direction="in" />
</method>
<!-- for now the progress signal args are a direct copy from synthesis -->
<signal name="Progress">
<doc:doc>
<doc:summary>Signal for synchronization progress. The arguments come
from Synthesis, see TProgressEventEnum in engine_defs.h. Additionally
type -1 means "synchromization finished", with extra1 carrying the
return value of SyncEvolution sync-call.
</doc:summary>
</doc:doc>
<arg type="s" name="server">
<doc:doc>
<doc:summary>Server name, always defined.</doc:summary>
</doc:doc>
</arg>
<arg type="s" name="source">
<doc:doc>
<doc:summary>Source name, only defined if this progress event
relates to a specific source.</doc:summary>
</doc:doc>
</arg>
<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>
<method name="GetTemplates">
<arg type="a(sssb)" name="templates" direction="out">
<doc:doc>
<doc:summary>Template array, where an item consists of template name,
web URL, icon URI and boolean consumerReady.
</doc:summary>
</doc:doc>
</arg>
</method>
<method name="GetTemplateConfig">
<arg type="s" name="template" direction="in" />
<arg type="a(sss)" name="properties" direction="out">
<doc:doc>
<doc:summary>Property array, where array consists of source name, property
name and property value. Source name can be NULL: when it's not defined the
the property is not specific to a source (e.g. username)</doc:summary>
</doc:doc>
</arg>
</method>
<method name="GetServers">
<arg type="a(sssb)" name="servers" direction="out">
<doc:doc>
<doc:summary>Server array, where an item consists of server name,
web URL, icon URI and boolean consumerReady (the latter three from
the corresponding template if it exists).
</doc:summary>
</doc:doc>
</arg>
</method>
<method name="GetServerConfig">
<arg type="s" name="server" direction="in" />
<arg type="a(sss)" name="properties" direction="out">
<doc:doc>
<doc:summary>Property array, where array consists of source name, property
name and property value. Source name can be NULL: when it's not defined the
the property is not specific to a source (e.g. username)</doc:summary>
</doc:doc>
</arg>
</method>
<method name="SetServerConfig">
<doc:doc>
<doc:summary>Updates or creates a Server configuration with given values.
If a server configuration does not exists, a template of same name is
used.
</doc:summary>
</doc:doc>
<arg type="s" name="server" direction="in" />
<arg type="a(sss)" name="properties" direction="in">
<doc:doc>
<doc:summary>Property array, where array consists of source name, property
name and property value. Source name can be NULL: when it's not defined the
the property is not specific to a source (e.g. username)</doc:summary>
</doc:doc>
</arg>
</method>
<method name="RemoveServerConfig">
<arg type="s" name="server" direction="in" />
</method>
<method name ="GetSyncReports">
<arg type="s" name="server" direction="in"/>
<arg type="i" name="count" direction="in"/>
<arg type="a(ia(siiiiiiiiiiiii))" name="reports" direction="out"/>
</method>
</interface>
</node>

View file

@ -1,2 +1,7 @@
VOID:STRING,STRING,INT,INT,INT,INT
VOID:STRING,STRING
VOID:STRING,BOOLEAN
VOID:STRING,STRING,STRING
VOID:STRING,STRING,STRING,STRING,STRING
VOID:INT,BOXED
VOID:UINT,UINT,BOXED

View file

@ -37,6 +37,8 @@
"org.syncevolution.Exception" - catch-all error condition.
"org.syncevolution.NoSuchConfig" - server configuration name is invalid
"org.syncevolution.NoSuchSource" - source name is invalid
"org.syncevolution.SourceUnusable" - CheckSource() may return this
if source is not usable (for various possible reasons).
"org.syncevolution.InvalidCall" - a call is (perhaps no longer) allowed
or suitable in the current situation, like Detach() when the client
is not attached.
@ -66,44 +68,65 @@
</method>
<method name ="GetConfigs">
<doc:doc><doc:description>Get an array of all configured servers (or templates)</doc:description></doc:doc>
<doc:doc><doc:description>
Get an array of all configured servers (or templates)
</doc:description></doc:doc>
<arg type="b" name="template" direction="in">
<doc:doc><doc:summary>if TRUE, will return template names, otherwise will return configured servers</doc:summary></doc:doc>
<doc:doc><doc:summary>
if TRUE, will return template names, otherwise will return
configured servers
</doc:summary></doc:doc>
</arg>
<arg type="as" name="servers" direction="out">
<doc:doc><doc:summary>array of configured server (or template) names</doc:summary></doc:doc>
<doc:doc><doc:summary>
array of configured server (or template) names
</doc:summary></doc:doc>
</arg>
</method>
<method name="GetConfig">
<doc:doc><doc:description>Get the configuration of a specific server (or template)</doc:description></doc:doc>
<doc:doc><doc:description>
Get the configuration of a specific server (or template)
</doc:description></doc:doc>
<arg type="s" name="server" direction="in">
<doc:doc><doc:summary>server name</doc:summary></doc:doc>
</arg>
<arg type="b" name="template" direction="in">
<doc:doc><doc:summary>if TRUE, will return a matching template configuration, otherwise will return a matching server configuration</doc:summary></doc:doc>
<doc:doc><doc:summary>
if TRUE, will return a matching template configuration, otherwise
will return a matching server configuration
</doc:summary></doc:doc>
</arg>
<arg type="a{sa{ss}}" name="configuration" direction="out">
<doc:doc><doc:summary>server (or template) configuration</doc:summary></doc:doc>
<doc:doc><doc:description>The dictionary keys are "source/&lt;source name&gt;" for sources and the empty string for the main server configuration. More keys might be added in the future. The values are "configuration dictionaries" which contain keys and values matching those in the SyncEvolution server configuration files.
Properties which are not set are also not present in the
configuration dictionaries. The semantic difference between
"not set" and "empty" or "set to default" is that unset
values will always use the default value, even after that
changed during a software update. Properties that are set
always use the chosen value.
<doc:doc><doc:summary>
server (or template) configuration
</doc:summary></doc:doc>
<doc:doc><doc:description>
The dictionary keys are "source/&lt;source name&gt;" for
sources and the empty string for the main server
configuration. More keys might be added in the future. The
values are "configuration dictionaries" which contain keys
and values matching those in the SyncEvolution server
configuration files.
Properties which are not set are also not present in the
configuration dictionaries. The semantic difference between
"not set" and "empty" or "set to default" is that unset
values will always use the default value, even after that
changed during a software update. Properties that are set
always use the chosen value.
Note that property keys are case insensitive. The D-Bus
interface specification would allow to send two
properties whose keys only differ in case to the
server. The result is undefined.
</doc:description>
</doc:doc>
Note that property keys are case insensitive. The D-Bus
interface specification would allow to send two
properties whose keys only differ in case to the
server. The result is undefined.
</doc:description></doc:doc>
</arg>
</method>
<method name="CheckPresence">
<doc:doc><doc:description>Checks whether a sync with a particular server can start.</doc:description></doc:doc>
<doc:doc><doc:description>
Checks whether a sync with a particular server can start.
</doc:description></doc:doc>
<arg type="s" name="server" direction="in">
<doc:doc><doc:summary>server name</doc:summary></doc:doc>
</arg>
@ -124,15 +147,22 @@
</method>
<method name="GetReports">
<doc:doc><doc:description>Get synchronization reports for a specific server</doc:description></doc:doc>
<doc:doc><doc:description>
Get synchronization reports for a specific server
</doc:description></doc:doc>
<arg type="s" name="server" direction="in">
<doc:doc><doc:summary>server name</doc:summary></doc:doc>
</arg>
<arg type="u" name="start" direction="in">
<doc:doc><doc:summary>index of the first (newest) report that will be returned; reports are number starting with zero for the newest</doc:summary></doc:doc>
<doc:doc><doc:summary>
index of the first (newest) report that will be returned;
reports are number starting with zero for the newest
</doc:summary></doc:doc>
</arg>
<arg type="u" name="count" direction="in">
<doc:doc><doc:summary>maximum number of returned reports</doc:summary></doc:doc>
<doc:doc><doc:summary>
maximum number of returned reports
</doc:summary></doc:doc>
</arg>
<arg type="aa{ss}" name="reports" direction="out">
<doc:doc><doc:summary>synchronization reports</doc:summary></doc:doc>
@ -196,7 +226,7 @@
<method name="CheckSource">
<doc:doc>
<doc:description>Tests whether the source configuration
is correct. Raises an exception if not.
is correct. Raises the SourceUnusable exception if not.
</doc:description>
</doc:doc>
<arg type="s" name="server" direction="in">
@ -212,7 +242,11 @@
</method>
<method name="StartSession">
<doc:doc><doc:description>Start a session. The object is created instantly but will not be ready for method calls until status changes from "queueing" to "idle". The Detach() method can be called before that.</doc:description></doc:doc>
<doc:doc><doc:description>
Start a session. The object is created instantly but will not be
ready for method calls until status changes from "queueing" to "idle".
The Detach() method can be called before that.
</doc:description></doc:doc>
<arg type="s" name="server" direction="in">
<doc:doc><doc:summary>server name</doc:summary></doc:doc>
</arg>
@ -344,7 +378,10 @@
</method>
<method name="GetSessions">
<doc:doc><doc:description>Get currently existing sessions. This includes active and queueing sessions.</doc:description></doc:doc>
<doc:doc><doc:description>
Get currently existing sessions. This includes active and
queueing sessions.
</doc:description></doc:doc>
<arg type="ao" name="sessions" direction="out">
<doc:doc><doc:summary>array of session D-Bus object paths,
in the order in which they will run, running ones first</doc:summary></doc:doc>
@ -357,7 +394,10 @@
<doc:doc><doc:summary>session D-Bus object path</doc:summary></doc:doc>
</arg>
<arg type="b" name="started">
<doc:doc><doc:summary>TRUE if session was started and is active now (= ready for use), FALSE if it ended</doc:summary></doc:doc>
<doc:doc><doc:summary>
TRUE if session was started and is active now (= ready for use),
FALSE if it ended
</doc:summary></doc:doc>
</arg>
</signal>
@ -379,7 +419,9 @@
</doc:description>
</doc:doc>
<arg type="s" name="server">
<doc:doc><doc:summary>name of the server configuration</doc:summary></doc:doc>
<doc:doc><doc:summary>
name of the server configuration
</doc:summary></doc:doc>
</arg>
<arg type="s" name="status">
<doc:doc>

View file

@ -8,6 +8,9 @@
<method name="GetConfig">
<doc:doc><doc:description>Get the configuration of the server</doc:description></doc:doc>
<arg type="b" name="template" direction="in">
<doc:doc><doc:summary>if TRUE, will return a matching template configuration, otherwise will return a matching server configuration</doc:summary></doc:doc>
</arg>
<arg type="a{sa{ss}}" name="configuration" direction="out">
<doc:doc><doc:summary>server configuration</doc:summary></doc:doc>
<doc:doc><doc:description>See Server.GetConfig() for dictionary description.</doc:description></doc:doc>
@ -108,7 +111,7 @@
<method name="CheckSource">
<doc:doc>
<doc:description>Tests whether the source configuration
is correct. Raises an exception if not.
is correct. Raises the SourceUnusable exception if not.
</doc:description>
</doc:doc>
<arg type="s" name="source" direction="in">
@ -122,16 +125,25 @@
</method>
<method name="Sync">
<doc:doc><doc:description>Start synchronization. The synchronization mode selection for sources works like this: Primarily, use mode from "sources" array. If the source was not found or its mode was empty, use the mode parameter. If mode parameter is empty, use the mode in configuration.
Examples:
* sync all with mode from config
Sync (NULL, ())
* refresh all from server
Sync ("refresh-from-server", ())
* force slow sync for calendar, use mode from config for others
Sync (NULL, (("calendar", "slow")))
* sync only calendar and addressbook, with mode from config
Sync ("none", (("calendar", NULL), ("addressbook", NULL)))
<doc:doc><doc:description>
<doc:para>
Start synchronization. The synchronization mode selection for sources works like this: Primarily, use mode from "sources" array. If the source was not found or its mode was empty, use the mode parameter. If mode parameter is empty, use the mode in configuration.
Examples:
* sync all with mode from config
Sync (NULL, ())
* refresh all from server
Sync ("refresh-from-server", ())
* force slow sync for calendar, use mode from config for others
Sync (NULL, (("calendar", "slow")))
* sync only calendar and addressbook, with mode from config
Sync ("none", (("calendar", NULL), ("addressbook", NULL)))
</doc:para>
<doc:para>
Syncevolution will by default output a sync "diff" in the end of Sync().
Producing the diff can be expensive CPU-wise, so setting the
configuration value "printChanges" to 0 before a Sync() is advised
for clients who are not interested in the diff.
</doc:para>
</doc:description></doc:doc>
<arg type="s" name="mode" direction="in">
<doc:doc><doc:summary>synchronization mode</doc:summary></doc:doc>

View file

@ -17,306 +17,406 @@
* 02110-1301 USA
*/
#include <string.h>
#include <glib.h>
#include <dbus/dbus-glib.h>
#include "syncevo-dbus-types.h"
SyncevoSource*
syncevo_source_new (char *name, int mode)
gboolean
syncevo_config_get_value (SyncevoConfig *config,
const char *source,
const char *key,
char **value)
{
GValue val = {0, };
char *name;
GHashTable *source_config;
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);
g_return_val_if_fail (config, FALSE);
g_return_val_if_fail (value, FALSE);
return (SyncevoSource*) g_value_get_boxed (&val);
if (!source || strlen (source) == 0) {
name = g_strdup ("");
} else {
name = g_strdup_printf ("sources/%s", source);
}
source_config = (GHashTable*)g_hash_table_lookup (config, name);
g_free (name);
if (source_config) {
*value = (char*)g_hash_table_lookup (source_config, key);
return TRUE;
}
return FALSE;
}
void
syncevo_source_get (SyncevoSource *source, const char **name, int *mode)
gboolean
syncevo_config_set_value (SyncevoConfig *config,
const char *source,
const char *key,
const char *value)
{
g_return_if_fail (source);
gboolean changed;
char *name;
char *old_value;
GHashTable *source_config;
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));
}
g_return_val_if_fail (config, FALSE);
g_return_val_if_fail (key, FALSE);
if (!source || strlen (source) == 0) {
name = g_strdup ("");
} else {
name = g_strdup_printf ("sources/%s", source);
}
source_config = (GHashTable*)g_hash_table_lookup (config, name);
if (!source_config) {
source_config = g_hash_table_new (g_str_hash, g_str_equal);
g_hash_table_insert (config, name, source_config);
} else {
g_free (name);
}
old_value = g_hash_table_lookup (source_config, key);
if ((!old_value && !value) ||
(old_value && value && strcmp (old_value, value) == 0)) {
changed = FALSE;
} else {
changed = TRUE;
g_hash_table_insert (source_config, g_strdup (key), g_strdup (value));
}
return changed;
}
void
syncevo_source_free (SyncevoSource *source)
void syncevo_config_foreach_source (SyncevoConfig *config,
ConfigFunc func,
gpointer userdata)
{
if (source) {
g_boxed_free (SYNCEVO_SOURCE_TYPE, source);
}
}
GHashTableIter iter;
char *key;
GHashTable *value;
SyncevoOption*
syncevo_option_new (char *ns, char *key, char *value)
{
GValue val = {0, };
g_hash_table_iter_init (&iter, config);
while (g_hash_table_iter_next (&iter, (gpointer*)&key, (gpointer*)&value)) {
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);
if (key && g_str_has_prefix (key, "source/")) {
char *name;
return (SyncevoOption*) g_value_get_boxed (&val);
}
void
syncevo_option_get (SyncevoOption *option, const char **ns, const char **key, const char **value)
{
g_return_if_fail (option);
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);
}
}
SyncevoServer* syncevo_server_new (char *name, char *url, char *icon, gboolean consumer_ready)
{
GValue val = {0, };
g_value_init (&val, SYNCEVO_SERVER_TYPE);
g_value_take_boxed (&val, dbus_g_type_specialized_construct (SYNCEVO_SERVER_TYPE));
dbus_g_type_struct_set (&val,
0, name,
1, url,
2, icon,
3, consumer_ready,
G_MAXUINT);
return (SyncevoServer*) g_value_get_boxed (&val);
}
void syncevo_server_get (SyncevoServer *server, const char **name, const char **url, const char **icon, gboolean *consumer_ready)
{
g_return_if_fail (server);
if (name) {
*name = g_value_get_string (g_value_array_get_nth (server, 0));
}
if (url) {
*url = g_value_get_string (g_value_array_get_nth (server, 1));
}
if (icon) {
*icon = g_value_get_string (g_value_array_get_nth (server, 2));
}
if (consumer_ready) {
*consumer_ready = g_value_get_boolean (g_value_array_get_nth (server, 3));
}
}
void syncevo_server_free (SyncevoServer *server)
{
if (server) {
g_boxed_free (SYNCEVO_SERVER_TYPE, server);
}
}
SyncevoReport*
syncevo_report_new (char *source)
{
GValue val = {0, };
g_value_init (&val, SYNCEVO_REPORT_TYPE);
g_value_take_boxed (&val, dbus_g_type_specialized_construct (SYNCEVO_REPORT_TYPE));
dbus_g_type_struct_set (&val,
0, source,
G_MAXUINT);
return (SyncevoReport*) g_value_get_boxed (&val);
}
static void
insert_int (SyncevoReport *report, int index, int value)
{
GValue val = {0};
g_value_init (&val, G_TYPE_INT);
g_value_set_int (&val, value);
g_value_array_insert (report, index, &val);
}
void
syncevo_report_set_io (SyncevoReport *report,
int sent_bytes, int received_bytes)
{
g_return_if_fail (report);
insert_int (report, 1, sent_bytes);
insert_int (report, 2, received_bytes);
name = key+7;
func (name, value, userdata);
}
}
}
void
syncevo_report_set_local (SyncevoReport *report,
int adds, int updates, int removes, int rejects)
syncevo_config_free (SyncevoConfig *config)
{
g_return_if_fail (report);
insert_int (report, 3, adds);
insert_int (report, 4, updates);
insert_int (report, 5, removes);
insert_int (report, 6, rejects);
}
void
syncevo_report_set_remote (SyncevoReport *report,
int adds, int updates, int removes, int rejects)
{
g_return_if_fail (report);
insert_int (report, 7, adds);
insert_int (report, 8, updates);
insert_int (report, 9, removes);
insert_int (report, 10, rejects);
}
void
syncevo_report_set_conflicts (SyncevoReport *report,
int local_won, int remote_won, int duplicated)
{
g_return_if_fail (report);
insert_int (report, 11, local_won);
insert_int (report, 12, remote_won);
insert_int (report, 13, duplicated);
/* NOTE: Hashtables gcreated by dbus-glib should free their contents */
g_hash_table_destroy (config);
}
const char*
syncevo_report_get_name (SyncevoReport *report)
syncevo_sync_mode_to_string (SyncevoSyncMode mode)
{
g_return_val_if_fail (report, NULL);
const char *mode_str;
return g_value_get_string (g_value_array_get_nth (report, 0));
switch (mode) {
case SYNCEVO_SYNC_NONE:
mode_str = "none";
break;
case SYNCEVO_SYNC_TWO_WAY:
mode_str = "two-way";
break;
case SYNCEVO_SYNC_SLOW:
mode_str = "slow";
break;
case SYNCEVO_SYNC_REFRESH_FROM_CLIENT:
mode_str = "refresh-from-client";
break;
case SYNCEVO_SYNC_REFRESH_FROM_SERVER:
mode_str = "refresh-from-server";
break;
case SYNCEVO_SYNC_ONE_WAY_FROM_CLIENT:
mode_str = "one-way-from-client";
break;
case SYNCEVO_SYNC_ONE_WAY_FROM_SERVER:
mode_str = "one-way-from-server";
break;
case SYNCEVO_SYNC_DEFAULT:
mode_str = "";
break;
default:
mode_str = "";
break;
}
return mode_str;
}
SyncevoSourceModes*
syncevo_source_modes_new ()
{
return g_hash_table_new_full (g_str_hash, g_str_equal,
NULL, NULL);
}
void
syncevo_report_get_io (SyncevoReport *report,
int *bytes_sent, int *bytes_received)
syncevo_source_modes_add (SyncevoSourceModes *source_modes,
char *source,
SyncevoSyncMode mode)
{
g_return_if_fail (report);
const char *mode_str;
if (bytes_sent) {
*bytes_sent = g_value_get_int (g_value_array_get_nth (report, 1));
}
if (bytes_received) {
*bytes_received = g_value_get_int (g_value_array_get_nth (report, 2));
}
g_return_if_fail (source_modes);
g_return_if_fail (source);
mode_str = syncevo_sync_mode_to_string (mode);
g_hash_table_insert (source_modes, source, (char*)mode_str);
}
void
syncevo_report_get_local (SyncevoReport *report,
int *adds, int *updates, int *removes, int *rejects)
syncevo_source_modes_free (SyncevoSourceModes *source_modes)
{
g_return_if_fail (report);
/* no need to free keys/values */
g_hash_table_destroy (source_modes);
}
if (adds) {
*adds = g_value_get_int (g_value_array_get_nth (report, 3));
}
if (updates) {
*updates = g_value_get_int (g_value_array_get_nth (report, 4));
}
if (removes) {
*removes = g_value_get_int (g_value_array_get_nth (report, 5));
}
if (rejects) {
*rejects = g_value_get_int (g_value_array_get_nth (report, 6));
}
SyncevoSessionStatus
syncevo_session_status_from_string (const char *status_str)
{
SyncevoSessionStatus status;
if (!status_str) {
status = SYNCEVO_STATUS_UNKNOWN;
} else if (g_str_has_prefix (status_str, "queueing")) {
status = SYNCEVO_STATUS_QUEUEING;
} else if (g_str_has_prefix (status_str, "idle")) {
status = SYNCEVO_STATUS_IDLE;
} else if (g_str_has_prefix (status_str, "done")) {
status = SYNCEVO_STATUS_DONE;
} else if (g_str_has_prefix (status_str, "running")) {
status = SYNCEVO_STATUS_RUNNING;
} else if (g_str_has_prefix (status_str, "aborting")) {
status = SYNCEVO_STATUS_ABORTING;
} else if (g_str_has_prefix (status_str, "suspending")) {
status = SYNCEVO_STATUS_SUSPENDING;
} else {
status = SYNCEVO_STATUS_UNKNOWN;
}
return status;
}
void
syncevo_report_get_remote (SyncevoReport *report,
int *adds, int *updates, int *removes, int *rejects)
syncevo_source_statuses_foreach (SyncevoSourceStatuses *source_statuses,
SourceStatusFunc func,
gpointer data)
{
g_return_if_fail (report);
GHashTableIter iter;
GValueArray *source_status;
if (adds) {
*adds = g_value_get_int (g_value_array_get_nth (report, 7));
}
if (updates) {
*updates = g_value_get_int (g_value_array_get_nth (report, 8));
}
if (removes) {
*removes = g_value_get_int (g_value_array_get_nth (report, 9));
}
if (rejects) {
*rejects = g_value_get_int (g_value_array_get_nth (report, 10));
}
char *name;
g_return_if_fail (source_statuses);
g_hash_table_iter_init (&iter, source_statuses);
while (g_hash_table_iter_next (&iter, (gpointer)&name, (gpointer)&source_status)) {
const char *mode_str;
const char *status_str;
SyncevoSyncMode mode;
SyncevoSourceStatus status;
guint error_code;
mode_str = g_value_get_string (g_value_array_get_nth (source_status, 0));
if (!mode_str) {
mode = SYNCEVO_SYNC_UNKNOWN;
} else if (g_str_has_prefix (mode_str, "none")) {
mode = SYNCEVO_SYNC_NONE;
} else if (g_str_has_prefix (mode_str, "two-way")) {
mode = SYNCEVO_SYNC_TWO_WAY;
} else if (g_str_has_prefix (mode_str, "slow")) {
mode = SYNCEVO_SYNC_SLOW;
} else if (g_str_has_prefix (mode_str, "refresh-from-client")) {
mode = SYNCEVO_SYNC_REFRESH_FROM_CLIENT;
} else if (g_str_has_prefix (mode_str, "refresh-from-server")) {
mode = SYNCEVO_SYNC_REFRESH_FROM_SERVER;
} else if (g_str_has_prefix (mode_str, "one-way-from-client")) {
mode = SYNCEVO_SYNC_ONE_WAY_FROM_CLIENT;
} else if (g_str_has_prefix (mode_str, "one-way-from-server")) {
mode = SYNCEVO_SYNC_ONE_WAY_FROM_SERVER;
} else {
mode = SYNCEVO_SYNC_UNKNOWN;
}
status_str = g_value_get_string (g_value_array_get_nth (source_status, 1));
status = syncevo_session_status_from_string (status_str);
error_code = g_value_get_uint (g_value_array_get_nth (source_status, 2));
func (name, mode, status, error_code, data);
}
}
static void
free_source_status_item (char *source,
GValueArray *status_array)
{
g_free (source);
g_boxed_free (SYNCEVO_TYPE_SOURCE_STATUS, status_array);
}
void
syncevo_report_get_conflicts (SyncevoReport *report,
int *local_won, int *remote_won, int *duplicated)
syncevo_source_statuses_free (SyncevoSourceStatuses *source_statuses)
{
g_return_if_fail (report);
g_hash_table_foreach (source_statuses,
(GHFunc)free_source_status_item,
NULL);
g_hash_table_destroy (source_statuses);
}
if (local_won) {
*local_won = g_value_get_int (g_value_array_get_nth (report, 11));
}
if (remote_won) {
*remote_won = g_value_get_int (g_value_array_get_nth (report, 12));
}
if (duplicated) {
*duplicated = g_value_get_int (g_value_array_get_nth (report, 13));
}
/* The return value contents are only valid as long as the
* SyncevoSourceProgresses is. */
SyncevoSourceProgress*
syncevo_source_progresses_get_current (SyncevoSourceProgresses *source_progresses)
{
const char *phase_str, *name;
GHashTableIter iter;
GValueArray *progress_array;
GValue *val;
SyncevoSourceProgress *progress = NULL;
g_return_val_if_fail (source_progresses, FALSE);
g_hash_table_iter_init (&iter, source_progresses);
while (g_hash_table_iter_next (&iter, (gpointer)&name, (gpointer)&progress_array)) {
SyncevoSourcePhase phase;
phase_str = g_value_get_string (g_value_array_get_nth (progress_array, 0));
if (!phase_str) {
phase = SYNCEVO_PHASE_NONE;
} else if (g_str_has_prefix (phase_str, "preparing")) {
phase = SYNCEVO_PHASE_PREPARING;
} else if (g_str_has_prefix (phase_str, "sending")) {
phase = SYNCEVO_PHASE_SENDING;
} else if (g_str_has_prefix (phase_str, "receiving")) {
phase = SYNCEVO_PHASE_RECEIVING;
} else {
phase = SYNCEVO_PHASE_NONE;
}
if (phase == SYNCEVO_PHASE_NONE) {
continue;
}
progress = g_slice_new (SyncevoSourceProgress);
progress->name = g_strdup (name);
progress->phase = phase;
val = g_value_array_get_nth (progress_array, 1);
progress->prepare_current = g_value_get_int (val);
val = g_value_array_get_nth (progress_array, 2);
progress->prepare_total = g_value_get_int (val);
val = g_value_array_get_nth (progress_array, 3);
progress->send_current = g_value_get_int (val);
val = g_value_array_get_nth (progress_array, 4);
progress->send_total = g_value_get_int (val);
val = g_value_array_get_nth (progress_array, 5);
progress->receive_current = g_value_get_int (val);
val = g_value_array_get_nth (progress_array, 6);
progress->receive_total = g_value_get_int (val);
break;
}
return progress;
}
void
syncevo_report_free (SyncevoReport *report)
syncevo_source_progress_free (SyncevoSourceProgress *progress)
{
if (report) {
g_boxed_free (SYNCEVO_REPORT_TYPE, report);
}
g_free (progress->name);
g_slice_free (SyncevoSourceProgress, progress);
}
SyncevoReportArray* syncevo_report_array_new (int end_time, GPtrArray *reports)
static void
free_source_progress_item (char *source,
GValueArray *progress_array)
{
GValue val = {0, };
g_value_init (&val, SYNCEVO_REPORT_ARRAY_TYPE);
g_value_take_boxed (&val, dbus_g_type_specialized_construct (SYNCEVO_REPORT_ARRAY_TYPE));
dbus_g_type_struct_set (&val,
0, end_time,
1, reports,
G_MAXUINT);
return (SyncevoReportArray*) g_value_get_boxed (&val);
}
void syncevo_report_array_get (SyncevoReportArray *array, int *end_time, GPtrArray **reports)
{
g_return_if_fail (array);
if (end_time) {
*end_time = g_value_get_int (g_value_array_get_nth (array, 0));
}
if (reports) {
*reports = g_value_get_boxed (g_value_array_get_nth (array, 1));
}
g_free (source);
g_boxed_free (SYNCEVO_TYPE_SOURCE_PROGRESS, progress_array);
}
void
syncevo_report_array_free (SyncevoReportArray *array)
syncevo_source_progresses_free (SyncevoSourceProgresses *source_progresses)
{
if (array) {
g_boxed_free (SYNCEVO_REPORT_ARRAY_TYPE, array);
}
g_hash_table_foreach (source_progresses,
(GHFunc)free_source_progress_item,
NULL);
g_hash_table_destroy (source_progresses);
}
static void
free_report_item (char *key, char *value)
{
g_free (key);
g_free (value);
}
static void
syncevo_report_free (GHashTable *report)
{
g_hash_table_foreach (report,
(GHFunc)free_report_item,
NULL);
g_hash_table_destroy (report);
}
GHashTable*
syncevo_reports_index (SyncevoReports *reports,
guint index)
{
g_return_val_if_fail (reports, NULL);
return (GHashTable*)g_ptr_array_index (reports, index);
}
guint
syncevo_reports_get_length (SyncevoReports *reports)
{
return reports->len;
}
void
syncevo_reports_free (SyncevoReports *reports)
{
g_ptr_array_foreach (reports,
(GFunc)syncevo_report_free,
NULL);
g_ptr_array_free (reports, TRUE);
}
const char*
syncevo_sessions_index (SyncevoSessions *sessions,
guint index)
{
g_return_val_if_fail (sessions, NULL);
if (index >= sessions->len) {
return NULL;
}
return (const char*)g_ptr_array_index (sessions, index);
}
void
syncevo_sessions_free (SyncevoSessions *sessions)
{
g_ptr_array_foreach (sessions,
(GFunc)g_free,
NULL);
g_ptr_array_free (sessions, TRUE);
}

View file

@ -17,72 +17,136 @@
* 02110-1301 USA
*/
#ifndef __SYNCEVO_DBUS_TYPES_H__
#define __SYNCEVO_DBUS_TYPES_H__
#ifndef __SYNCEVO_TYPES_H__
#define __SYNCEVO_TYPES_H__
#include <glib.h>
#include <dbus/dbus-glib.h>
#define SYNCEVO_DBUS_ERROR_GENERIC_ERROR "org.Moblin.SyncEvolution.GenericError"
#define SYNCEVO_DBUS_ERROR_NO_SUCH_SERVER "org.Moblin.SyncEvolution.NoSuchServer"
#define SYNCEVO_DBUS_ERROR_MISSING_ARGS "org.Moblin.SyncEvolution.MissingArgs"
#define SYNCEVO_DBUS_ERROR_INVALID_CALL "org.Moblin.SyncEvolution.InvalidCall"
#define SYNCEVO_DBUS_ERROR_EXCEPTION "org.syncevolution.Exception"
#define SYNCEVO_DBUS_ERROR_NO_SUCH_CONFIG "org.syncevolution.NoSuchConfig"
#define SYNCEVO_DBUS_ERROR_NO_SUCH_SOURCE "org.syncevolution.NoSuchsource"
#define SYNCEVO_DBUS_ERROR_INVALID_CALL "org.syncevolution.InvalidCall"
#define SYNCEVO_DBUS_ERROR_SOURCE_UNUSABLE "org.syncevolution.SourceUnusable"
#define SYNCEVO_SOURCE_TYPE (dbus_g_type_get_struct ("GValueArray", G_TYPE_STRING, G_TYPE_INT, G_TYPE_INVALID))
typedef GValueArray SyncevoSource;
typedef enum {
SYNCEVO_SYNC_UNKNOWN, /* Cannot be used in Sync */
SYNCEVO_SYNC_DEFAULT, /* cannot be received in GetStatus*/
SYNCEVO_SYNC_NONE,
SYNCEVO_SYNC_TWO_WAY,
SYNCEVO_SYNC_SLOW,
SYNCEVO_SYNC_REFRESH_FROM_CLIENT,
SYNCEVO_SYNC_REFRESH_FROM_SERVER,
SYNCEVO_SYNC_ONE_WAY_FROM_CLIENT,
SYNCEVO_SYNC_ONE_WAY_FROM_SERVER,
} SyncevoSyncMode;
#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;
typedef enum {
SYNCEVO_STATUS_UNKNOWN,
SYNCEVO_STATUS_QUEUEING,
SYNCEVO_STATUS_IDLE,
SYNCEVO_STATUS_RUNNING,
SYNCEVO_STATUS_ABORTING,
SYNCEVO_STATUS_SUSPENDING,
SYNCEVO_STATUS_DONE,
} SyncevoSessionStatus;
#define SYNCEVO_SERVER_TYPE (dbus_g_type_get_struct ("GValueArray", G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_INVALID))
typedef GValueArray SyncevoServer;
typedef enum {
SYNCEVO_SOURCE_IDLE,
SYNCEVO_SOURCE_RUNNING,
SYNCEVO_SOURCE_RUNNING_WAITING,
SYNCEVO_SOURCE_RUNNING_PROCESSING,
SYNCEVO_SOURCE_DONE,
} SyncevoSourceStatus;
#define SYNCEVO_REPORT_TYPE (dbus_g_type_get_struct ("GValueArray", G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INVALID))
typedef GValueArray SyncevoReport;
typedef enum {
SYNCEVO_PHASE_NONE,
SYNCEVO_PHASE_PREPARING,
SYNCEVO_PHASE_SENDING,
SYNCEVO_PHASE_RECEIVING,
} SyncevoSourcePhase;
#define SYNCEVO_REPORT_ARRAY_TYPE (dbus_g_type_get_struct ("GValueArray", G_TYPE_INT, dbus_g_type_get_collection ("GPtrArray", SYNCEVO_REPORT_TYPE)))
typedef GValueArray SyncevoReportArray;
typedef struct {
char *name;
SyncevoSourcePhase phase;
int prepare_current;
int prepare_total;
int send_current;
int send_total;
int receive_current;
int receive_total;
} SyncevoSourceProgress;
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);
#define SYNCEVO_TYPE_SOURCE_STATUS (dbus_g_type_get_struct ("GValueArray", G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_INVALID))
#define SYNCEVO_TYPE_SOURCE_STATUSES (dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, SYNCEVO_TYPE_SOURCE_STATUS))
#define SYNCEVO_TYPE_SOURCE_PROGRESS (dbus_g_type_get_struct ("GValueArray", G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INVALID))
#define SYNCEVO_TYPE_SOURCE_PROGRESSES (dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, SYNCEVO_TYPE_SOURCE_PROGRESS))
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);
SyncevoServer* syncevo_server_new (char *name, char *url, char *icon, gboolean consumer_ready);
void syncevo_server_get (SyncevoServer *server, const char **name, const char **url, const char **icon, gboolean *consumer_ready);
void syncevo_server_free (SyncevoServer *server);
typedef GHashTable SyncevoConfig;
typedef GHashTable SyncevoSourceModes;
typedef GHashTable SyncevoSourceStatuses;
typedef GHashTable SyncevoSourceProgresses;
typedef GPtrArray SyncevoReports;
typedef GPtrArray SyncevoSessions;
SyncevoReport* syncevo_report_new (char *source);
gboolean syncevo_config_get_value (SyncevoConfig *config,
const char *source,
const char *key,
char **value);
gboolean syncevo_config_set_value (SyncevoConfig *config,
const char *source,
const char *key,
const char *value);
void syncevo_report_set_io (SyncevoReport *report,
int sent_bytes, int received_bytes);
void syncevo_report_set_local (SyncevoReport *report,
int adds, int updates, int removes, int rejects);
void syncevo_report_set_remote (SyncevoReport *report,
int adds, int updates, int removes, int rejects);
void syncevo_report_set_conflicts (SyncevoReport *report,
int local_won, int remote_won, int duplicated);
typedef void (*ConfigFunc) (char *name,
GHashTable *source_configuration,
gpointer user_data);
const char* syncevo_report_get_name (SyncevoReport *report);
void syncevo_report_get_io (SyncevoReport *report,
int *bytes_sent, int *bytes_received);
void syncevo_report_get_local (SyncevoReport *report,
int *adds, int *updates, int *removes, int *rejects);
void syncevo_report_get_remote (SyncevoReport *report,
int *adds, int *updates, int *removes, int *rejects);
void syncevo_report_get_conflicts (SyncevoReport *report,
int *local_won, int *remote_won, int *duplicated);
void syncevo_config_foreach_source (SyncevoConfig *config,
ConfigFunc func,
gpointer userdata);
void syncevo_config_free (SyncevoConfig *config);
void syncevo_report_free (SyncevoReport *report);
const char* syncevo_sync_mode_to_string (SyncevoSyncMode mode);
SyncevoSourceModes* syncevo_source_modes_new ();
void syncevo_source_modes_add (SyncevoSourceModes *source_modes,
char *source,
SyncevoSyncMode mode);
void syncevo_source_modes_free (SyncevoSourceModes *source_modes);
SyncevoSessionStatus syncevo_session_status_from_string (const char *status_str);
SyncevoReportArray* syncevo_report_array_new (int end_time, GPtrArray *reports);
void syncevo_report_array_get (SyncevoReportArray *array, int *end_time, GPtrArray **reports);
void syncevo_report_array_free (SyncevoReportArray *array);
typedef void (*SourceStatusFunc) (char *name,
SyncevoSyncMode mode,
SyncevoSourceStatus status,
guint error_code,
gpointer user_data);
void
syncevo_source_statuses_foreach (SyncevoSourceStatuses *source_statuses,
SourceStatusFunc func,
gpointer data);
void syncevo_source_statuses_free (SyncevoSourceStatuses *source_statuses);
SyncevoSourceProgress* syncevo_source_progresses_get_current (SyncevoSourceProgresses *source_progresses);
void syncevo_source_progresses_free (SyncevoSourceProgresses *source_progresses);
void syncevo_source_progress_free (SyncevoSourceProgress *progress);
GHashTable* syncevo_reports_index (SyncevoReports *reports,
guint index);
guint syncevo_reports_get_length (SyncevoReports *reports);
void syncevo_reports_free (SyncevoReports *reports);
const char* syncevo_sessions_index (SyncevoSessions *sessions,
guint index);
void syncevo_sessions_free (SyncevoSessions *sessions);
#endif

View file

@ -1,954 +0,0 @@
/*
* Copyright (C) 2009 Intel Corporation
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) version 3.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA
*/
#include <glib-object.h>
#include <string.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,
SERVER_MESSAGE,
SERVER_SHUTDOWN,
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,
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 proxy_destroyed (DBusGProxy *proxy,
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, "ServerMessage",
G_CALLBACK (server_message_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,
char *source,
int type,
int extra1, int extra2, int extra3,
SyncevoService *service)
{
g_signal_emit (service, signals[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 gboolean
syncevo_service_get_new_proxy (SyncevoService *service)
{
DBusGConnection *connection;
GError *error;
guint32 result;
SyncevoServicePrivate *priv;
DBusGProxy *proxy;
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 FALSE;
}
/* we want to use dbus_g_proxy_new_for_name_owner() for the destroy signal
* so need to start the service by hand by using DBUS proxy: */
proxy = dbus_g_proxy_new_for_name (connection,
DBUS_SERVICE_DBUS,
DBUS_PATH_DBUS,
DBUS_INTERFACE_DBUS);
if (!dbus_g_proxy_call (proxy, "StartServiceByName", NULL,
G_TYPE_STRING, SYNCEVO_SERVICE_DBUS_SERVICE,
G_TYPE_UINT, 0,
G_TYPE_INVALID,
G_TYPE_UINT, &result,
G_TYPE_INVALID)) {
g_warning ("StartServiceByName call failed");
}
g_object_unref (proxy);
/* the real proxy */
proxy = dbus_g_proxy_new_for_name_owner (connection,
SYNCEVO_SERVICE_DBUS_SERVICE,
SYNCEVO_SERVICE_DBUS_PATH,
SYNCEVO_SERVICE_DBUS_INTERFACE,
&error);
if (proxy == NULL) {
g_printerr ("dbus_g_proxy_new_for_name_owner() failed");
priv->proxy = NULL;
return FALSE;
}
dbus_g_proxy_add_signal (proxy, "Progress",
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 (proxy, "Progress",
G_CALLBACK (progress_cb), service, NULL);
dbus_g_proxy_add_signal (proxy, "ServerMessage",
G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID);
dbus_g_proxy_connect_signal (proxy, "ServerMessage",
G_CALLBACK (server_message_cb), service, NULL);
g_signal_connect (proxy, "destroy",
G_CALLBACK (proxy_destroyed), service);
priv->proxy = proxy;
return TRUE;
}
static void
proxy_destroyed (DBusGProxy *proxy,
SyncevoService *service)
{
SyncevoServicePrivate *priv;
priv = GET_PRIVATE (service);
if (priv->proxy) {
g_object_unref (priv->proxy);
}
priv->proxy = NULL;
g_signal_emit (service, signals[SERVER_SHUTDOWN], 0);
}
static GObject *
constructor (GType type,
guint n_construct_properties,
GObjectConstructParam *construct_properties)
{
SyncevoService *service;
SyncevoServicePrivate *priv;
service = SYNCEVO_SERVICE (G_OBJECT_CLASS (syncevo_service_parent_class)->constructor
(type, n_construct_properties, construct_properties));
priv = GET_PRIVATE (service);
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);
syncevo_service_get_new_proxy (service);
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_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[SERVER_SHUTDOWN] = g_signal_new ("server-shutdown",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE,
G_STRUCT_OFFSET (SyncevoServiceClass, server_shutdown),
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);
if (!priv->proxy && !syncevo_service_get_new_proxy (service)) {
if (error) {
*error = g_error_new_literal (g_quark_from_static_string ("syncevo-service"),
SYNCEVO_SERVICE_ERROR_COULD_NOT_START,
"Could not start service");
}
return FALSE;
}
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);
if (!priv->proxy && !syncevo_service_get_new_proxy (service)) {
if (error) {
*error = g_error_new_literal (g_quark_from_static_string ("syncevo-service"),
SYNCEVO_SERVICE_ERROR_COULD_NOT_START,
"Could not start service");
}
return FALSE;
}
return org_Moblin_SyncEvolution_abort_sync (priv->proxy,
server,
error);
}
static void
abort_sync_async_callback (DBusGProxy *proxy,
GError *error,
SyncevoAsyncData *data)
{
(*(SyncevoAbortSyncCb)data->callback) (data->service,
error,
data->userdata);
g_slice_free (SyncevoAsyncData, data);
}
static gboolean
abort_sync_async_error (SyncevoAsyncData *data)
{
GError *error;
error = g_error_new_literal (g_quark_from_static_string ("syncevo-service"),
SYNCEVO_SERVICE_ERROR_COULD_NOT_START,
"Could not start service");
(*(SyncevoAbortSyncCb)data->callback) (data->service,
error,
data->userdata);
g_slice_free (SyncevoAsyncData, data);
return FALSE;
}
void
syncevo_service_abort_sync_async (SyncevoService *service,
char *server,
SyncevoAbortSyncCb 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;
if (!priv->proxy && !syncevo_service_get_new_proxy (service)) {
g_idle_add ((GSourceFunc)abort_sync_async_error, data);
return;
}
org_Moblin_SyncEvolution_abort_sync_async
(priv->proxy,
server,
(org_Moblin_SyncEvolution_abort_sync_reply) abort_sync_async_callback,
data);
}
gboolean syncevo_service_get_servers (SyncevoService *service,
GPtrArray **servers,
GError **error)
{
SyncevoServicePrivate *priv;
priv = GET_PRIVATE (service);
if (!priv->proxy && !syncevo_service_get_new_proxy (service)) {
if (error) {
*error = g_error_new_literal (g_quark_from_static_string ("syncevo-service"),
SYNCEVO_SERVICE_ERROR_COULD_NOT_START,
"Could not start service");
}
return FALSE;
}
return org_Moblin_SyncEvolution_get_servers (priv->proxy,
servers,
error);
}
static void
get_servers_async_callback (DBusGProxy *proxy,
GPtrArray *servers,
GError *error,
SyncevoAsyncData *data)
{
(*(SyncevoGetServersCb)data->callback) (data->service,
servers,
error,
data->userdata);
g_slice_free (SyncevoAsyncData, data);
}
static gboolean
get_servers_async_error (SyncevoAsyncData *data)
{
GError *error;
error = g_error_new_literal (g_quark_from_static_string ("syncevo-service"),
SYNCEVO_SERVICE_ERROR_COULD_NOT_START,
"Could not start service");
(*(SyncevoGetServersCb)data->callback) (data->service,
NULL,
error,
data->userdata);
g_slice_free (SyncevoAsyncData, data);
return FALSE;
}
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;
if (!priv->proxy && !syncevo_service_get_new_proxy (service)) {
g_idle_add ((GSourceFunc)get_servers_async_error, data);
return;
}
org_Moblin_SyncEvolution_get_servers_async
(priv->proxy,
(org_Moblin_SyncEvolution_get_servers_reply) get_servers_async_callback,
data);
}
gboolean syncevo_service_get_templates (SyncevoService *service,
GPtrArray **templates,
GError **error)
{
SyncevoServicePrivate *priv;
priv = GET_PRIVATE (service);
if (!priv->proxy && !syncevo_service_get_new_proxy (service)) {
if (error) {
*error = g_error_new_literal (g_quark_from_static_string ("syncevo-service"),
SYNCEVO_SERVICE_ERROR_COULD_NOT_START,
"Could not start service");
}
return FALSE;
}
return org_Moblin_SyncEvolution_get_templates (priv->proxy,
templates,
error);
}
static void
get_templates_async_callback (DBusGProxy *proxy,
GPtrArray *templates,
GError *error,
SyncevoAsyncData *data)
{
(*(SyncevoGetTemplatesCb)data->callback) (data->service,
templates,
error,
data->userdata);
g_slice_free (SyncevoAsyncData, data);
}
static gboolean
get_templates_async_error (SyncevoAsyncData *data)
{
GError *error;
error = g_error_new_literal (g_quark_from_static_string ("syncevo-service"),
SYNCEVO_SERVICE_ERROR_COULD_NOT_START,
"Could not start service");
(*(SyncevoGetTemplatesCb)data->callback) (data->service,
NULL,
error,
data->userdata);
g_slice_free (SyncevoAsyncData, data);
return FALSE;
}
void syncevo_service_get_templates_async (SyncevoService *service,
SyncevoGetTemplatesCb 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;
if (!priv->proxy && !syncevo_service_get_new_proxy (service)) {
g_idle_add ((GSourceFunc)get_templates_async_error, data);
return;
}
org_Moblin_SyncEvolution_get_templates_async
(priv->proxy,
(org_Moblin_SyncEvolution_get_templates_reply) get_templates_async_callback,
data);
}
gboolean syncevo_service_get_template_config (SyncevoService *service,
char *template,
GPtrArray **options,
GError **error)
{
SyncevoServicePrivate *priv;
priv = GET_PRIVATE (service);
if (!priv->proxy && !syncevo_service_get_new_proxy (service)) {
if (error) {
*error = g_error_new_literal (g_quark_from_static_string ("syncevo-service"),
SYNCEVO_SERVICE_ERROR_COULD_NOT_START,
"Could not start service");
}
return FALSE;
}
return org_Moblin_SyncEvolution_get_template_config (priv->proxy,
template,
options,
error);
}
static void
get_template_config_async_callback (DBusGProxy *proxy,
GPtrArray *options,
GError *error,
SyncevoAsyncData *data)
{
(*(SyncevoGetTemplateConfigCb)data->callback) (data->service,
options,
error,
data->userdata);
g_slice_free (SyncevoAsyncData, data);
}
static gboolean
get_template_config_async_error (SyncevoAsyncData *data)
{
GError *error;
error = g_error_new_literal (g_quark_from_static_string ("syncevo-service"),
SYNCEVO_SERVICE_ERROR_COULD_NOT_START,
"Could not start service");
(*(SyncevoGetTemplateConfigCb)data->callback) (data->service,
NULL,
error,
data->userdata);
g_slice_free (SyncevoAsyncData, data);
return FALSE;
}
void
syncevo_service_get_template_config_async (SyncevoService *service,
char *template,
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;
if (!priv->proxy && !syncevo_service_get_new_proxy (service)) {
g_idle_add ((GSourceFunc)get_template_config_async_error, data);
return;
}
org_Moblin_SyncEvolution_get_template_config_async
(priv->proxy,
template,
(org_Moblin_SyncEvolution_get_server_config_reply) get_template_config_async_callback,
data);
}
gboolean syncevo_service_get_server_config (SyncevoService *service,
char *server,
GPtrArray **options,
GError **error)
{
SyncevoServicePrivate *priv;
priv = GET_PRIVATE (service);
if (!priv->proxy && !syncevo_service_get_new_proxy (service)) {
if (error) {
*error = g_error_new_literal (g_quark_from_static_string ("syncevo-service"),
SYNCEVO_SERVICE_ERROR_COULD_NOT_START,
"Could not start service");
}
return FALSE;
}
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);
}
static gboolean
get_server_config_async_error (SyncevoAsyncData *data)
{
GError *error;
error = g_error_new_literal (g_quark_from_static_string ("syncevo-service"),
SYNCEVO_SERVICE_ERROR_COULD_NOT_START,
"Could not start service");
(*(SyncevoGetServerConfigCb)data->callback) (data->service,
NULL,
error,
data->userdata);
return FALSE;
}
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;
if (!priv->proxy && !syncevo_service_get_new_proxy (service)) {
g_idle_add ((GSourceFunc)get_server_config_async_error, data);
return;
}
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);
if (!priv->proxy && !syncevo_service_get_new_proxy (service)) {
if (error) {
*error = g_error_new_literal (g_quark_from_static_string ("syncevo-service"),
SYNCEVO_SERVICE_ERROR_COULD_NOT_START,
"Could not start service");
}
return FALSE;
}
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);
}
static gboolean
set_server_config_async_error (SyncevoAsyncData *data)
{
GError *error;
error = g_error_new_literal (g_quark_from_static_string ("syncevo-service"),
SYNCEVO_SERVICE_ERROR_COULD_NOT_START,
"Could not start service");
(*(SyncevoSetServerConfigCb)data->callback) (data->service,
error,
data->userdata);
g_slice_free (SyncevoAsyncData, data);
return FALSE;
}
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;
if (!priv->proxy && !syncevo_service_get_new_proxy (service)) {
g_idle_add ((GSourceFunc)set_server_config_async_error, data);
return;
}
org_Moblin_SyncEvolution_set_server_config_async
(priv->proxy,
server,
options,
(org_Moblin_SyncEvolution_set_server_config_reply) set_server_config_async_callback,
data);
}
gboolean
syncevo_service_remove_server_config (SyncevoService *service,
char *server,
GError **error)
{
SyncevoServicePrivate *priv;
priv = GET_PRIVATE (service);
if (!priv->proxy && !syncevo_service_get_new_proxy (service)) {
if (error) {
*error = g_error_new_literal (g_quark_from_static_string ("syncevo-service"),
SYNCEVO_SERVICE_ERROR_COULD_NOT_START,
"Could not start service");
}
return FALSE;
}
return org_Moblin_SyncEvolution_remove_server_config (priv->proxy,
server,
error);
}
static void
remove_server_config_async_callback (DBusGProxy *proxy,
GError *error,
SyncevoAsyncData *data)
{
(*(SyncevoRemoveServerConfigCb)data->callback) (data->service,
error,
data->userdata);
g_slice_free (SyncevoAsyncData, data);
}
static gboolean
remove_server_config_async_error (SyncevoAsyncData *data)
{
GError *error;
error = g_error_new_literal (g_quark_from_static_string ("syncevo-service"),
SYNCEVO_SERVICE_ERROR_COULD_NOT_START,
"Could not start service");
(*(SyncevoRemoveServerConfigCb)data->callback) (data->service,
error,
data->userdata);
g_slice_free (SyncevoAsyncData, data);
return FALSE;
}
void
syncevo_service_remove_server_config_async (SyncevoService *service,
char *server,
SyncevoRemoveServerConfigCb 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;
if (!priv->proxy && !syncevo_service_get_new_proxy (service)) {
g_idle_add ((GSourceFunc)remove_server_config_async_error, data);
return;
}
org_Moblin_SyncEvolution_remove_server_config_async
(priv->proxy,
server,
(org_Moblin_SyncEvolution_remove_server_config_reply) remove_server_config_async_callback,
data);
}
gboolean
syncevo_service_get_sync_reports (SyncevoService *service,
char *server,
int count,
GPtrArray **reports,
GError **error)
{
SyncevoServicePrivate *priv;
priv = GET_PRIVATE (service);
if (!priv->proxy && !syncevo_service_get_new_proxy (service)) {
if (error) {
*error = g_error_new_literal (g_quark_from_static_string ("syncevo-service"),
SYNCEVO_SERVICE_ERROR_COULD_NOT_START,
"Could not start service");
}
return FALSE;
}
return org_Moblin_SyncEvolution_get_sync_reports (
priv->proxy,
server,
count,
reports,
error);
}
static void
get_sync_reports_async_callback (DBusGProxy *proxy,
GPtrArray *reports,
GError *error,
SyncevoAsyncData *data)
{
(*(SyncevoGetSyncReportsCb)data->callback) (data->service,
reports,
error,
data->userdata);
g_slice_free (SyncevoAsyncData, data);
}
static gboolean
get_sync_reports_async_error (SyncevoAsyncData *data)
{
GError *error;
error = g_error_new_literal (g_quark_from_static_string ("syncevo-service"),
SYNCEVO_SERVICE_ERROR_COULD_NOT_START,
"Could not start service");
(*(SyncevoGetSyncReportsCb)data->callback) (data->service,
NULL,
error,
data->userdata);
g_slice_free (SyncevoAsyncData, data);
return FALSE;
}
void
syncevo_service_get_sync_reports_async (SyncevoService *service,
char *server,
int count,
SyncevoGetSyncReportsCb 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;
if (!priv->proxy && !syncevo_service_get_new_proxy (service)) {
g_idle_add ((GSourceFunc)get_sync_reports_async_error, data);
return;
}
org_Moblin_SyncEvolution_get_sync_reports_async
(priv->proxy,
server,
count,
(org_Moblin_SyncEvolution_get_sync_reports_reply) get_sync_reports_async_callback,
data);
}

View file

@ -1,169 +0,0 @@
/*
* Copyright (C) 2009 Intel Corporation
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) version 3.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA
*/
#ifndef __SYNCEVO_SERVICE_H__
#define __SYNCEVO_SERVICE_H__
#include <glib-object.h>
#include "syncevo-dbus-types.h"
G_BEGIN_DECLS
enum SyncevoServiceError{
SYNCEVO_SERVICE_ERROR_COULD_NOT_START = 1,
};
#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,
char *source,
int type,
int extra1, int extra2, int extra3);
void (*server_message) (SyncevoService *service,
char *server,
char *message);
void (*server_shutdown) (SyncevoService *service);
} 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);
typedef void (*SyncevoAbortSyncCb) (SyncevoService *service,
GError *error,
gpointer userdata);
void syncevo_service_abort_sync_async (SyncevoService *service,
char *server,
SyncevoAbortSyncCb callback,
gpointer userdata);
gboolean syncevo_service_get_servers (SyncevoService *service,
GPtrArray **servers,
GError **error);
typedef void (*SyncevoGetServersCb) (SyncevoService *service,
GPtrArray *servers,
GError *error,
gpointer userdata);
void syncevo_service_get_servers_async (SyncevoService *service,
SyncevoGetServersCb callback,
gpointer userdata);
gboolean syncevo_service_get_templates (SyncevoService *service,
GPtrArray **templates,
GError **error);
typedef void (*SyncevoGetTemplatesCb) (SyncevoService *service,
GPtrArray *templates,
GError *error,
gpointer userdata);
void syncevo_service_get_templates_async (SyncevoService *service,
SyncevoGetTemplatesCb callback,
gpointer userdata);
gboolean syncevo_service_get_template_config (SyncevoService *service,
char *template,
GPtrArray **options,
GError **error);
typedef void (*SyncevoGetTemplateConfigCb) (SyncevoService *service,
GPtrArray *options,
GError *error,
gpointer userdata);
void syncevo_service_get_template_config_async (SyncevoService *service,
char *template,
SyncevoGetTemplateConfigCb 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);
gboolean syncevo_service_remove_server_config (SyncevoService *service,
char *server,
GError **error);
typedef void (*SyncevoRemoveServerConfigCb) (SyncevoService *service,
GError *error,
gpointer userdata);
void syncevo_service_remove_server_config_async (SyncevoService *service,
char *server,
SyncevoRemoveServerConfigCb callback,
gpointer userdata);
gboolean syncevo_service_get_sync_reports (SyncevoService *service,
char *server,
int count,
GPtrArray **reports,
GError **error);
typedef void (*SyncevoGetSyncReportsCb) (SyncevoService *service,
GPtrArray *reports,
GError *error,
gpointer userdata);
void syncevo_service_get_sync_reports_async (SyncevoService *service,
char *server,
int count,
SyncevoGetSyncReportsCb callback,
gpointer userdata);
G_END_DECLS
#endif

792
src/dbus/syncevo-server.c Normal file
View file

@ -0,0 +1,792 @@
/*
* Copyright (C) 2009 Intel Corporation
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) version 3.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA
*/
#include <glib-object.h>
#include <string.h>
#include "syncevo-server.h"
#include "syncevo-marshal.h"
#include "syncevo-server-bindings.h"
typedef struct _ServerAsyncData {
SyncevoServer *server;
GCallback callback;
gpointer userdata;
} ServerAsyncData;
enum {
SESSION_CHANGED,
PRESENCE_CHANGED,
INFO_REQUEST,
SHUTDOWN,
LAST_SIGNAL
};
static guint32 signals[LAST_SIGNAL] = {0, };
typedef struct _SyncevoServerPrivate {
DBusGProxy *proxy;
} SyncevoServerPrivate;
#define GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), SYNCEVO_TYPE_SERVER, SyncevoServerPrivate))
G_DEFINE_TYPE (SyncevoServer, syncevo_server, G_TYPE_OBJECT);
static ServerAsyncData*
server_async_data_new (SyncevoServer *server,
GCallback callback,
gpointer userdata)
{
ServerAsyncData *data;
data = g_slice_new0 (ServerAsyncData);
data->server = server;
data->callback = G_CALLBACK (callback);
data->userdata = userdata;
return data;
}
static void
server_async_data_free (ServerAsyncData *data)
{
g_slice_free (ServerAsyncData, data);
}
static void
generic_callback (DBusGProxy *proxy,
GError *error,
ServerAsyncData *data)
{
if (data->callback) {
(*(SyncevoServerGenericCb)data->callback) (data->server,
error,
data->userdata);
}
server_async_data_free (data);
}
static gboolean
generic_error (ServerAsyncData *data)
{
GError *error;
error = g_error_new_literal (SYNCEVO_SERVER_ERROR_QUARK,
SYNCEVO_SERVER_ERROR_NO_DBUS_OBJECT,
"The D-Bus object does not exist");
(*(SyncevoServerGenericCb)data->callback) (data->server,
error,
data->userdata);
server_async_data_free (data);
return FALSE;
}
static void
session_changed_cb (DBusGProxy *proxy,
char *session_path,
gboolean started,
SyncevoServer *server)
{
g_signal_emit (server, signals[SESSION_CHANGED], 0,
session_path, started);
}
static void
presence_cb (DBusGProxy *proxy,
char *configuration,
char *status,
char *transport,
SyncevoServer *server)
{
g_signal_emit (server, signals[PRESENCE_CHANGED], 0,
configuration, status, transport);
}
static void
info_request_cb (DBusGProxy *proxy,
char *id,
char *session_path,
char *state,
char *handler_path,
char *type,
SyncevoServer *server)
{
g_signal_emit (server, signals[INFO_REQUEST], 0,
id, session_path, state, handler_path, type);
}
static void
proxy_destroy_cb (DBusGProxy *proxy,
SyncevoServer *server)
{
SyncevoServerPrivate *priv;
priv = GET_PRIVATE (server);
if (priv->proxy) {
g_object_unref (priv->proxy);
}
priv->proxy = NULL;
g_signal_emit (server, signals[SHUTDOWN], 0);
}
static void
detach_cb (DBusGProxy *proxy,
GError *error,
gpointer userdata)
{
if (error) {
g_warning ("Server.Detach failed: %s", error->message);
g_error_free (error);
}
}
static void
dispose (GObject *object)
{
SyncevoServerPrivate *priv;
priv = GET_PRIVATE (object);
if (priv->proxy) {
dbus_g_proxy_disconnect_signal (priv->proxy, "SessionChanged",
G_CALLBACK (session_changed_cb),
object);
dbus_g_proxy_disconnect_signal (priv->proxy, "Presence",
G_CALLBACK (presence_cb),
object);
dbus_g_proxy_disconnect_signal (priv->proxy, "InfoRequest",
G_CALLBACK (info_request_cb),
object);
dbus_g_proxy_disconnect_signal (priv->proxy, "destroy",
G_CALLBACK (proxy_destroy_cb),
object);
org_syncevolution_Server_detach (priv->proxy, NULL);
g_object_unref (priv->proxy);
priv->proxy = NULL;
}
G_OBJECT_CLASS (syncevo_server_parent_class)->dispose (object);
}
static void
attach_cb (DBusGProxy *proxy,
GError *error,
gpointer userdata)
{
if (error) {
g_warning ("Server.Attach failed: %s", error->message);
g_error_free (error);
}
}
static gboolean
syncevo_server_get_new_proxy (SyncevoServer *server)
{
DBusGConnection *connection;
GError *error;
guint32 result;
SyncevoServerPrivate *priv;
DBusGProxy *proxy;
priv = GET_PRIVATE (server);
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 FALSE;
}
/* we want to use dbus_g_proxy_new_for_name_owner() for the destroy signal
* so need to start the service by hand by using DBUS proxy: */
proxy = dbus_g_proxy_new_for_name (connection,
DBUS_SERVICE_DBUS,
DBUS_PATH_DBUS,
DBUS_INTERFACE_DBUS);
if (!dbus_g_proxy_call (proxy, "StartServiceByName", NULL,
G_TYPE_STRING, DBUS_SERVICE_SYNCEVO_SERVER,
G_TYPE_UINT, 0,
G_TYPE_INVALID,
G_TYPE_UINT, &result,
G_TYPE_INVALID)) {
g_warning ("StartServiceByName call failed");
}
g_object_unref (proxy);
/* the real proxy */
priv->proxy = dbus_g_proxy_new_for_name_owner (connection,
DBUS_SERVICE_SYNCEVO_SERVER,
DBUS_PATH_SYNCEVO_SERVER,
DBUS_INTERFACE_SYNCEVO_SERVER,
&error);
if (priv->proxy == NULL) {
g_printerr ("dbus_g_proxy_new_for_name_owner() failed: %s\n", error->message);
g_error_free (error);
return FALSE;
}
dbus_g_proxy_add_signal (priv->proxy, "SessionChanged",
DBUS_TYPE_G_OBJECT_PATH, G_TYPE_BOOLEAN, G_TYPE_INVALID);
dbus_g_proxy_connect_signal (priv->proxy, "SessionChanged",
G_CALLBACK (session_changed_cb), server, NULL);
dbus_g_proxy_add_signal (priv->proxy, "Presence",
G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID);
dbus_g_proxy_connect_signal (priv->proxy, "Presence",
G_CALLBACK (presence_cb), server, NULL);
dbus_g_proxy_add_signal (priv->proxy, "InfoRequest",
G_TYPE_STRING,
DBUS_TYPE_G_OBJECT_PATH,
G_TYPE_STRING,
DBUS_TYPE_G_OBJECT_PATH,
G_TYPE_STRING,
G_TYPE_INVALID);
dbus_g_proxy_connect_signal (priv->proxy, "InfoRequest",
G_CALLBACK (info_request_cb), server, NULL);
g_signal_connect (priv->proxy, "destroy",
G_CALLBACK (proxy_destroy_cb), server);
org_syncevolution_Server_attach_async (priv->proxy,
(org_syncevolution_Server_attach_reply)attach_cb,
NULL);
return TRUE;
}
static void
syncevo_server_init (SyncevoServer *server)
{
SyncevoServerPrivate *priv;
priv = GET_PRIVATE (server);
/* SessionChanged */
dbus_g_object_register_marshaller (syncevo_marshal_VOID__STRING_BOOLEAN,
G_TYPE_NONE,
DBUS_TYPE_G_OBJECT_PATH,
G_TYPE_BOOLEAN,
G_TYPE_INVALID);
/* Presence */
dbus_g_object_register_marshaller (syncevo_marshal_VOID__STRING_STRING_STRING,
G_TYPE_NONE,
G_TYPE_STRING,
G_TYPE_STRING,
G_TYPE_STRING,
G_TYPE_INVALID);
/* InfoRequest */
dbus_g_object_register_marshaller (syncevo_marshal_VOID__STRING_STRING_STRING_STRING_STRING,
G_TYPE_NONE,
G_TYPE_STRING,
DBUS_TYPE_G_OBJECT_PATH,
G_TYPE_STRING,
DBUS_TYPE_G_OBJECT_PATH,
G_TYPE_STRING,
G_TYPE_INVALID);
syncevo_server_get_new_proxy (server);
}
static void
syncevo_server_class_init (SyncevoServerClass *klass)
{
GObjectClass *o_class = (GObjectClass *) klass;
o_class->dispose = dispose;
g_type_class_add_private (klass, sizeof (SyncevoServerPrivate));
signals[SESSION_CHANGED] =
g_signal_new ("session-changed",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE,
G_STRUCT_OFFSET (SyncevoServerClass, session_changed),
NULL, NULL,
syncevo_marshal_VOID__STRING_BOOLEAN,
G_TYPE_NONE,
2, G_TYPE_STRING, G_TYPE_BOOLEAN);
signals[PRESENCE_CHANGED] =
g_signal_new ("presence-changed",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE,
G_STRUCT_OFFSET (SyncevoServerClass, presence_changed),
NULL, NULL,
syncevo_marshal_VOID__STRING_STRING_STRING,
G_TYPE_NONE,
3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
signals[INFO_REQUEST] =
g_signal_new ("info-request",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE,
G_STRUCT_OFFSET (SyncevoServerClass, info_request),
NULL, NULL,
syncevo_marshal_VOID__STRING_STRING_STRING_STRING_STRING,
G_TYPE_NONE,
5, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
signals[SHUTDOWN] =
g_signal_new ("shutdown",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE,
G_STRUCT_OFFSET (SyncevoServerClass, shutdown),
NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE,
0);
}
SyncevoServer *
syncevo_server_get_default ()
{
static SyncevoServer *server = NULL;
if (server == NULL) {
server = g_object_new (SYNCEVO_TYPE_SERVER, NULL);
g_object_add_weak_pointer (G_OBJECT (server),
(gpointer) &server);
return server;
}
return g_object_ref (server);
}
static void
get_configs_callback (DBusGProxy *proxy,
char **config_names,
GError *error,
ServerAsyncData *data)
{
if (data->callback) {
(*(SyncevoServerGetConfigsCb)data->callback) (data->server,
config_names,
error,
data->userdata);
}
server_async_data_free (data);
}
static gboolean
get_configs_error (ServerAsyncData *data)
{
GError *error;
error = g_error_new_literal (SYNCEVO_SERVER_ERROR_QUARK,
SYNCEVO_SERVER_ERROR_NO_DBUS_OBJECT,
"Could not start service");
(*(SyncevoServerGetConfigsCb)data->callback) (data->server,
NULL,
error,
data->userdata);
server_async_data_free (data);
return FALSE;
}
void
syncevo_server_get_configs (SyncevoServer *syncevo,
gboolean template,
SyncevoServerGetConfigsCb callback,
gpointer userdata)
{
ServerAsyncData *data;
SyncevoServerPrivate *priv;
priv = GET_PRIVATE (syncevo);
data = server_async_data_new (syncevo, G_CALLBACK (callback), userdata);
if (!priv->proxy && !syncevo_server_get_new_proxy (syncevo)) {
if (callback) {
g_idle_add ((GSourceFunc)get_configs_error, data);
}
return;
}
org_syncevolution_Server_get_configs_async
(priv->proxy,
template,
(org_syncevolution_Server_get_configs_reply) get_configs_callback,
data);
}
static void
get_config_callback (DBusGProxy *proxy,
SyncevoConfig *configuration,
GError *error,
ServerAsyncData *data)
{
if (data->callback) {
(*(SyncevoServerGetConfigCb)data->callback) (data->server,
configuration,
error,
data->userdata);
}
server_async_data_free (data);
}
static gboolean
get_config_error (ServerAsyncData *data)
{
GError *error;
error = g_error_new_literal (SYNCEVO_SERVER_ERROR_QUARK,
SYNCEVO_SERVER_ERROR_NO_DBUS_OBJECT,
"Could not start service");
(*(SyncevoServerGetConfigCb)data->callback) (data->server,
NULL,
error,
data->userdata);
server_async_data_free (data);
return FALSE;
}
void
syncevo_server_get_config (SyncevoServer *syncevo,
const char *config_name,
gboolean template,
SyncevoServerGetConfigCb callback,
gpointer userdata)
{
ServerAsyncData *data;
SyncevoServerPrivate *priv;
priv = GET_PRIVATE (syncevo);
data = server_async_data_new (syncevo, G_CALLBACK (callback), userdata);
if (!priv->proxy && !syncevo_server_get_new_proxy (syncevo)) {
if (callback) {
g_idle_add ((GSourceFunc)get_config_error, data);
}
return;
}
org_syncevolution_Server_get_config_async
(priv->proxy,
config_name,
template,
(org_syncevolution_Server_get_config_reply) get_config_callback,
data);
}
static void
get_reports_callback (DBusGProxy *proxy,
SyncevoReports *reports,
GError *error,
ServerAsyncData *data)
{
if (data->callback) {
(*(SyncevoServerGetReportsCb)data->callback) (data->server,
reports,
error,
data->userdata);
}
server_async_data_free (data);
}
static gboolean
get_reports_error (ServerAsyncData *data)
{
GError *error;
error = g_error_new_literal (SYNCEVO_SERVER_ERROR_QUARK,
SYNCEVO_SERVER_ERROR_NO_DBUS_OBJECT,
"Could not start service");
(*(SyncevoServerGetReportsCb)data->callback) (data->server,
NULL,
error,
data->userdata);
server_async_data_free (data);
return FALSE;
}
void
syncevo_server_get_reports (SyncevoServer *syncevo,
const char *config_name,
guint start,
guint count,
SyncevoServerGetReportsCb callback,
gpointer userdata)
{
ServerAsyncData *data;
SyncevoServerPrivate *priv;
priv = GET_PRIVATE (syncevo);
data = server_async_data_new (syncevo, G_CALLBACK (callback), userdata);
if (!priv->proxy && !syncevo_server_get_new_proxy (syncevo)) {
if (callback) {
g_idle_add ((GSourceFunc)get_reports_error, data);
}
return;
}
org_syncevolution_Server_get_reports_async
(priv->proxy,
config_name,
start,
count,
(org_syncevolution_Server_get_reports_reply) get_reports_callback,
data);
}
static void
start_session_callback (SyncevoServer *syncevo,
char *session_path,
GError *error,
ServerAsyncData *data)
{
if (data->callback) {
(*(SyncevoServerStartSessionCb)data->callback) (data->server,
session_path,
error,
data->userdata);
}
server_async_data_free (data);
}
static gboolean
start_session_error (ServerAsyncData *data)
{
GError *error;
error = g_error_new_literal (SYNCEVO_SERVER_ERROR_QUARK,
SYNCEVO_SERVER_ERROR_NO_DBUS_OBJECT,
"Could not start service");
(*(SyncevoServerStartSessionCb)data->callback) (data->server,
NULL,
error,
data->userdata);
server_async_data_free (data);
return FALSE;
}
void
syncevo_server_start_session (SyncevoServer *syncevo,
const char *config_name,
SyncevoServerStartSessionCb callback,
gpointer userdata)
{
ServerAsyncData *data;
SyncevoServerPrivate *priv;
priv = GET_PRIVATE (syncevo);
data = server_async_data_new (syncevo, G_CALLBACK (callback), userdata);
if (!priv->proxy && !syncevo_server_get_new_proxy (syncevo)) {
if (callback) {
g_idle_add ((GSourceFunc)start_session_error, data);
}
return;
}
org_syncevolution_Server_start_session_async
(priv->proxy,
config_name,
(org_syncevolution_Server_start_session_reply) start_session_callback,
data);
}
static void
get_sessions_callback (SyncevoServer *syncevo,
SyncevoSessions *sessions,
GError *error,
ServerAsyncData *data)
{
if (data->callback) {
(*(SyncevoServerGetSessionsCb)data->callback) (data->server,
sessions,
error,
data->userdata);
}
server_async_data_free (data);
}
static gboolean
get_sessions_error (ServerAsyncData *data)
{
GError *error;
error = g_error_new_literal (SYNCEVO_SERVER_ERROR_QUARK,
SYNCEVO_SERVER_ERROR_NO_DBUS_OBJECT,
"Could not start service");
(*(SyncevoServerGetSessionsCb)data->callback) (data->server,
NULL,
error,
data->userdata);
server_async_data_free (data);
return FALSE;
}
void
syncevo_server_get_sessions (SyncevoServer *syncevo,
SyncevoServerGetSessionsCb callback,
gpointer userdata)
{
ServerAsyncData *data;
SyncevoServerPrivate *priv;
priv = GET_PRIVATE (syncevo);
data = server_async_data_new (syncevo, G_CALLBACK (callback), userdata);
if (!priv->proxy && !syncevo_server_get_new_proxy (syncevo)) {
if (callback) {
g_idle_add ((GSourceFunc)get_sessions_error, data);
}
return;
}
org_syncevolution_Server_get_sessions_async
(priv->proxy,
(org_syncevolution_Server_get_reports_reply) get_sessions_callback,
data);
}
static void
check_presence_callback (SyncevoServer *syncevo,
char *status,
char *transport,
GError *error,
ServerAsyncData *data)
{
if (data->callback) {
(*(SyncevoServerGetPresenceCb)data->callback) (data->server,
status,
transport,
error,
data->userdata);
}
server_async_data_free (data);
}
static gboolean
check_presence_error (ServerAsyncData *data)
{
GError *error;
error = g_error_new_literal (SYNCEVO_SERVER_ERROR_QUARK,
SYNCEVO_SERVER_ERROR_NO_DBUS_OBJECT,
"Could not start service");
(*(SyncevoServerGetPresenceCb)data->callback) (data->server,
NULL,
NULL,
error,
data->userdata);
server_async_data_free (data);
return FALSE;
}
void
syncevo_server_get_presence (SyncevoServer *syncevo,
const char *config_name,
SyncevoServerGetPresenceCb callback,
gpointer userdata)
{
ServerAsyncData *data;
SyncevoServerPrivate *priv;
priv = GET_PRIVATE (syncevo);
data = server_async_data_new (syncevo, G_CALLBACK (callback), userdata);
if (!priv->proxy && !syncevo_server_get_new_proxy (syncevo)) {
if (callback) {
g_idle_add ((GSourceFunc)check_presence_error, data);
}
return;
}
org_syncevolution_Server_check_presence_async
(priv->proxy,
config_name,
(org_syncevolution_Server_check_presence_reply) check_presence_callback,
data);
}
void syncevo_server_check_source (SyncevoServer *server,
const char *config,
const char *source,
SyncevoServerGenericCb callback,
gpointer userdata)
{
ServerAsyncData *data;
SyncevoServerPrivate *priv;
priv = GET_PRIVATE (server);
data = server_async_data_new (server, G_CALLBACK (callback), userdata);
if (!priv->proxy) {
if (callback) {
g_idle_add ((GSourceFunc)generic_error, data);
}
return;
}
org_syncevolution_Server_check_source_async
(priv->proxy,
config,
source,
(org_syncevolution_Server_check_source_reply) generic_callback,
data);
}
void
syncevo_server_info_response (SyncevoServer *server,
const char *id,
const char *state,
GHashTable *response,
SyncevoServerGenericCb callback,
gpointer userdata)
{
ServerAsyncData *data;
SyncevoServerPrivate *priv;
priv = GET_PRIVATE (server);
data = server_async_data_new (server, G_CALLBACK (callback), userdata);
if (!priv->proxy) {
if (callback) {
g_idle_add ((GSourceFunc)generic_error, data);
}
return;
}
org_syncevolution_Server_info_response_async
(priv->proxy,
id,
state,
response,
(org_syncevolution_Server_info_response_reply) generic_callback,
data);
}

150
src/dbus/syncevo-server.h Normal file
View file

@ -0,0 +1,150 @@
/*
* Copyright (C) 2009 Intel Corporation
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) version 3.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA
*/
#ifndef __SYNCEVO_SERVER_H__
#define __SYNCEVO_SERVER_H__
#include <glib-object.h>
#include "syncevo-dbus-types.h"
#include "syncevo-session.h"
G_BEGIN_DECLS
enum SyncevoServerError{
SYNCEVO_SERVER_ERROR_NO_DBUS_OBJECT = 1,
};
#define SYNCEVO_SERVER_ERROR_QUARK g_quark_from_static_string ("syncevo-server")
#define DBUS_SERVICE_SYNCEVO_SERVER "org.syncevolution"
#define DBUS_PATH_SYNCEVO_SERVER "/org/syncevolution/Server"
#define DBUS_INTERFACE_SYNCEVO_SERVER "org.syncevolution.Server"
#define SYNCEVO_TYPE_SERVER (syncevo_server_get_type ())
#define SYNCEVO_SERVER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), SYNCEVO_TYPE_SERVER, SyncevoServer))
#define SYNCEVO_IS_SERVER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), SYNCEVO_TYPE_SERVER))
typedef struct _SyncevoServer {
GObject parent_object;
} SyncevoServer;
typedef struct _SyncevoServerClass {
GObjectClass parent_class;
void (*session_changed) (SyncevoServer *syncevo,
char *session_path,
gboolean started);
void (*presence_changed) (SyncevoServer *syncevo,
char *configuration,
char *status,
char *transport);
void (*info_request) (SyncevoServer *syncevo,
char *id,
char *session_path,
char *state,
char *handler_path,
char *type);
void (*shutdown) (SyncevoServer *syncevo);
} SyncevoServerClass;
GType syncevo_server_get_type (void);
SyncevoServer *syncevo_server_get_default ();
typedef void (*SyncevoServerGenericCb) (SyncevoServer *server,
GError *error,
gpointer userdata);
typedef void (*SyncevoServerGetConfigsCb) (SyncevoServer *syncevo,
char **config_names,
GError *error,
gpointer userdata);
void syncevo_server_get_configs (SyncevoServer *syncevo,
gboolean template,
SyncevoServerGetConfigsCb callback,
gpointer userdata);
typedef void (*SyncevoServerGetConfigCb) (SyncevoServer *syncevo,
SyncevoConfig *config,
GError *error,
gpointer userdata);
void syncevo_server_get_config (SyncevoServer *syncevo,
const char *config_name,
gboolean template,
SyncevoServerGetConfigCb callback,
gpointer userdata);
typedef void (*SyncevoServerGetReportsCb) (SyncevoServer *syncevo,
SyncevoReports *reports,
GError *error,
gpointer userdata);
void syncevo_server_get_reports (SyncevoServer *syncevo,
const char *config_name,
guint start,
guint count,
SyncevoServerGetReportsCb callback,
gpointer userdata);
typedef void (*SyncevoServerStartSessionCb) (SyncevoServer *syncevo,
char *session_path,
GError *error,
gpointer userdata);
void syncevo_server_start_session (SyncevoServer *syncevo,
const char *config_name,
SyncevoServerStartSessionCb callback,
gpointer userdata);
typedef void (*SyncevoServerGetSessionsCb) (SyncevoServer *syncevo,
SyncevoSessions *sessions,
GError *error,
gpointer userdata);
void syncevo_server_get_sessions (SyncevoServer *syncevo,
SyncevoServerGetSessionsCb callback,
gpointer userdata);
typedef void (*SyncevoServerGetPresenceCb) (SyncevoServer *syncevo,
char *status,
char *transport,
GError *error,
gpointer userdata);
void syncevo_server_get_presence (SyncevoServer *syncevo,
const char *config_name,
SyncevoServerGetPresenceCb callback,
gpointer userdata);
void syncevo_server_check_source (SyncevoServer *server,
const char *config,
const char *source,
SyncevoServerGenericCb callback,
gpointer userdata);
void syncevo_server_info_response (SyncevoServer *server,
const char *id,
const char *state,
GHashTable *response,
SyncevoServerGenericCb callback,
gpointer userdata);
G_END_DECLS
#endif

688
src/dbus/syncevo-session.c Normal file
View file

@ -0,0 +1,688 @@
/*
* Copyright (C) 2009 Intel Corporation
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) version 3.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA
*/
#include <glib-object.h>
#include <string.h>
#include "syncevo-session.h"
#include "syncevo-marshal.h"
#include "syncevo-session-bindings.h"
typedef struct _SessionAsyncData {
SyncevoSession *session;
GCallback callback;
gpointer userdata;
} SessionAsyncData;
enum {
PROP_0,
PROP_SESSION_PATH,
};
enum {
STATUS_CHANGED,
PROGRESS_CHANGED,
LAST_SIGNAL
};
static guint32 signals[LAST_SIGNAL] = {0, };
typedef struct _SyncevoSessionPrivate {
DBusGProxy *proxy;
char *path;
} SyncevoSessionPrivate;
#define GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), SYNCEVO_TYPE_SESSION, SyncevoSessionPrivate))
G_DEFINE_TYPE (SyncevoSession, syncevo_session, G_TYPE_OBJECT);
static SessionAsyncData*
session_async_data_new (SyncevoSession *session,
GCallback callback,
gpointer userdata)
{
SessionAsyncData *data;
data = g_slice_new0 (SessionAsyncData);
data->session = session;
data->callback = G_CALLBACK (callback);
data->userdata = userdata;
return data;
}
static void
session_async_data_free (SessionAsyncData *data)
{
g_slice_free (SessionAsyncData, data);
}
static void
status_changed_cb (DBusGProxy *proxy,
char *status,
guint error_code,
SyncevoSourceStatuses *source_statuses,
SyncevoSession *session)
{
g_signal_emit (session, signals[STATUS_CHANGED], 0,
syncevo_session_status_from_string (status),
error_code,
source_statuses);
}
static void
progress_changed_cb (DBusGProxy *proxy,
int progress,
SyncevoSourceProgresses *source_progresses,
SyncevoSession *session)
{
g_signal_emit (session, signals[PROGRESS_CHANGED], 0,
progress,
source_progresses);
}
static void
syncevo_session_get_property (GObject *object, guint property_id,
GValue *value, GParamSpec *pspec)
{
SyncevoSession *session = SYNCEVO_SESSION (object);
SyncevoSessionPrivate *priv;
priv = GET_PRIVATE (session);
switch (property_id) {
case PROP_SESSION_PATH:
g_value_set_string (value, priv->path);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
}
static void
syncevo_session_set_path (SyncevoSession *session, const char *path)
{
SyncevoSessionPrivate *priv;
DBusGConnection *connection;
GError *error;
priv = GET_PRIVATE (session);
error = NULL;
priv->path = g_strdup (path);
if (!priv->path) {
return;
}
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;
}
priv->proxy = dbus_g_proxy_new_for_name (connection,
SYNCEVO_SESSION_DBUS_SERVICE,
priv->path,
SYNCEVO_SESSION_DBUS_INTERFACE);
if (priv->proxy == NULL) {
g_printerr ("dbus_g_proxy_new_for_name() failed for path '%s'", priv->path);
return;
}
dbus_g_proxy_add_signal (priv->proxy, "StatusChanged",
G_TYPE_STRING, G_TYPE_UINT, SYNCEVO_TYPE_SOURCE_STATUSES, G_TYPE_INVALID);
dbus_g_proxy_connect_signal (priv->proxy, "StatusChanged",
G_CALLBACK (status_changed_cb), session, NULL);
dbus_g_proxy_add_signal (priv->proxy, "ProgressChanged",
G_TYPE_INT, SYNCEVO_TYPE_SOURCE_PROGRESSES, G_TYPE_INVALID);
dbus_g_proxy_connect_signal (priv->proxy, "ProgressChanged",
G_CALLBACK (progress_changed_cb), session, NULL);
}
static void
syncevo_session_set_property (GObject *object, guint property_id,
const GValue *value, GParamSpec *pspec)
{
SyncevoSession *session = SYNCEVO_SESSION (object);
switch (property_id) {
case PROP_SESSION_PATH:
syncevo_session_set_path (session, g_value_get_string (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
}
static void
dispose (GObject *object)
{
SyncevoSessionPrivate *priv;
priv = GET_PRIVATE (object);
if (priv->proxy) {
dbus_g_proxy_disconnect_signal (priv->proxy, "ProgressChanged",
G_CALLBACK (progress_changed_cb),
object);
dbus_g_proxy_disconnect_signal (priv->proxy, "StatusChanged",
G_CALLBACK (status_changed_cb),
object);
/* TODO: need to do this async... */
org_syncevolution_Session_detach (priv->proxy, NULL);
g_object_unref (priv->proxy);
priv->proxy = NULL;
}
G_OBJECT_CLASS (syncevo_session_parent_class)->dispose (object);
}
static void
syncevo_session_class_init (SyncevoSessionClass *klass)
{
GObjectClass *o_class = (GObjectClass *) klass;
GParamSpec *pspec;
o_class->dispose = dispose;
o_class->set_property = syncevo_session_set_property;
o_class->get_property = syncevo_session_get_property;
g_type_class_add_private (klass, sizeof (SyncevoSessionPrivate));
signals[STATUS_CHANGED] =
g_signal_new ("status-changed",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE,
G_STRUCT_OFFSET (SyncevoSessionClass, status_changed),
NULL, NULL,
syncevo_marshal_VOID__UINT_UINT_BOXED,
G_TYPE_NONE,
3, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_POINTER);
signals[PROGRESS_CHANGED] =
g_signal_new ("progress-changed",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE,
G_STRUCT_OFFSET (SyncevoSessionClass, progress_changed),
NULL, NULL,
syncevo_marshal_VOID__INT_BOXED,
G_TYPE_NONE,
2, G_TYPE_INT, G_TYPE_POINTER);
pspec = g_param_spec_string ("session-path",
"Session path",
"The D-Bus path this Syncevolution session uses",
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
g_object_class_install_property (o_class, PROP_SESSION_PATH, pspec);
}
static void
syncevo_session_init (SyncevoSession *session)
{
SyncevoSessionPrivate *priv;
priv = GET_PRIVATE (session);
/* ProgressChanged */
dbus_g_object_register_marshaller (syncevo_marshal_VOID__INT_BOXED,
G_TYPE_NONE,
G_TYPE_INT,
G_TYPE_BOXED,
G_TYPE_INVALID);
/* StatusChanged */
dbus_g_object_register_marshaller (syncevo_marshal_VOID__UINT_UINT_BOXED,
G_TYPE_NONE,
G_TYPE_STRING,
G_TYPE_UINT,
G_TYPE_BOXED,
G_TYPE_INVALID);
}
static void
generic_callback (DBusGProxy *proxy,
GError *error,
SessionAsyncData *data)
{
if (data->callback) {
(*(SyncevoSessionGenericCb)data->callback) (data->session,
error,
data->userdata);
}
session_async_data_free (data);
}
static gboolean
generic_error (SessionAsyncData *data)
{
GError *error;
error = g_error_new_literal (g_quark_from_static_string ("syncevo-session"),
SYNCEVO_SESSION_ERROR_NO_DBUS_OBJECT,
"The D-Bus object does not exist");
(*(SyncevoSessionGenericCb)data->callback) (data->session,
error,
data->userdata);
session_async_data_free (data);
return FALSE;
}
static void
get_config_callback (DBusGProxy *proxy,
SyncevoConfig *configuration,
GError *error,
SessionAsyncData *data)
{
if (data->callback) {
(*(SyncevoSessionGetConfigCb)data->callback) (data->session,
configuration,
error,
data->userdata);
}
session_async_data_free (data);
}
static gboolean
get_config_error (SessionAsyncData *data)
{
GError *error;
error = g_error_new_literal (g_quark_from_static_string ("syncevo-session"),
SYNCEVO_SESSION_ERROR_NO_DBUS_OBJECT,
"The D-Bus object does not exist");
(*(SyncevoSessionGetConfigCb)data->callback) (data->session,
NULL,
error,
data->userdata);
session_async_data_free (data);
return FALSE;
}
void
syncevo_session_get_config (SyncevoSession *session,
gboolean template,
SyncevoSessionGetConfigCb callback,
gpointer userdata)
{
SessionAsyncData *data;
SyncevoSessionPrivate *priv;
priv = GET_PRIVATE (session);
data = session_async_data_new (session, G_CALLBACK (callback), userdata);
if (!priv->proxy) {
if (callback) {
g_idle_add ((GSourceFunc)get_config_error, data);
}
return;
}
org_syncevolution_Session_get_config_async
(priv->proxy,
template,
(org_syncevolution_Session_get_config_reply) get_config_callback,
data);
}
void
syncevo_session_set_config (SyncevoSession *session,
gboolean update,
gboolean temporary,
SyncevoConfig *config,
SyncevoSessionGenericCb callback,
gpointer userdata)
{
SessionAsyncData *data;
SyncevoSessionPrivate *priv;
priv = GET_PRIVATE (session);
data = session_async_data_new (session, G_CALLBACK (callback), userdata);
if (!priv->proxy) {
if (callback) {
g_idle_add ((GSourceFunc)generic_error, data);
}
return;
}
org_syncevolution_Session_set_config_async
(priv->proxy,
update,
temporary,
config,
(org_syncevolution_Session_set_config_reply) generic_callback,
data);
}
static void
get_reports_callback (DBusGProxy *proxy,
SyncevoReports *reports,
GError *error,
SessionAsyncData *data)
{
if (data->callback) {
(*(SyncevoSessionGetReportsCb)data->callback) (data->session,
reports,
error,
data->userdata);
}
session_async_data_free (data);
}
static gboolean
get_reports_error (SessionAsyncData *data)
{
GError *error;
error = g_error_new_literal (g_quark_from_static_string ("syncevo-session"),
SYNCEVO_SESSION_ERROR_NO_DBUS_OBJECT,
"The D-Bus object does not exist");
(*(SyncevoSessionGetReportsCb)data->callback) (data->session,
NULL,
error,
data->userdata);
session_async_data_free (data);
return FALSE;
}
void
syncevo_session_get_reports (SyncevoSession *session,
guint start,
guint count,
SyncevoSessionGetReportsCb callback,
gpointer userdata)
{
SessionAsyncData *data;
SyncevoSessionPrivate *priv;
priv = GET_PRIVATE (session);
data = session_async_data_new (session, G_CALLBACK (callback), userdata);
if (!priv->proxy) {
if (callback) {
g_idle_add ((GSourceFunc)get_reports_error, data);
}
return;
}
org_syncevolution_Session_get_reports_async
(priv->proxy,
start,
count,
(org_syncevolution_Session_get_reports_reply)get_reports_callback,
data);
}
void
syncevo_session_sync (SyncevoSession *session,
SyncevoSyncMode mode,
SyncevoSourceModes *source_modes,
SyncevoSessionGenericCb callback,
gpointer userdata)
{
SessionAsyncData *data;
SyncevoSessionPrivate *priv;
priv = GET_PRIVATE (session);
data = session_async_data_new (session, G_CALLBACK (callback), userdata);
if (!priv->proxy) {
if (callback) {
g_idle_add ((GSourceFunc)generic_error, data);
}
return;
}
org_syncevolution_Session_sync_async
(priv->proxy,
syncevo_sync_mode_to_string (mode),
source_modes,
(org_syncevolution_Session_sync_reply) generic_callback,
data);
}
void
syncevo_session_abort (SyncevoSession *session,
SyncevoSessionGenericCb callback,
gpointer userdata)
{
SessionAsyncData *data;
SyncevoSessionPrivate *priv;
priv = GET_PRIVATE (session);
data = session_async_data_new (session, G_CALLBACK (callback), userdata);
if (!priv->proxy) {
if (callback) {
g_idle_add ((GSourceFunc)generic_error, data);
}
return;
}
org_syncevolution_Session_abort_async
(priv->proxy,
(org_syncevolution_Session_abort_reply) generic_callback,
data);
}
void
syncevo_session_suspend (SyncevoSession *session,
SyncevoSessionGenericCb callback,
gpointer userdata)
{
SessionAsyncData *data;
SyncevoSessionPrivate *priv;
priv = GET_PRIVATE (session);
data = session_async_data_new (session, G_CALLBACK (callback), userdata);
if (!priv->proxy) {
if (callback) {
g_idle_add ((GSourceFunc)generic_error, data);
}
return;
}
org_syncevolution_Session_suspend_async
(priv->proxy,
(org_syncevolution_Session_suspend_reply) generic_callback,
data);
}
static void
get_status_callback (DBusGProxy *proxy,
char *status,
guint error_code,
SyncevoSourceStatuses *sources,
GError *error,
SessionAsyncData *data)
{
if (data->callback) {
(*(SyncevoSessionGetStatusCb)data->callback) (data->session,
syncevo_session_status_from_string (status),
error_code,
sources,
error,
data->userdata);
}
session_async_data_free (data);
}
static gboolean
get_status_error (SessionAsyncData *data)
{
GError *error;
error = g_error_new_literal (g_quark_from_static_string ("syncevo-session"),
SYNCEVO_SESSION_ERROR_NO_DBUS_OBJECT,
"The D-Bus object does not exist");
(*(SyncevoSessionGetStatusCb)data->callback) (data->session,
SYNCEVO_STATUS_UNKNOWN,
0,
NULL,
error,
data->userdata);
session_async_data_free (data);
return FALSE;
}
void
syncevo_session_get_status (SyncevoSession *session,
SyncevoSessionGetStatusCb callback,
gpointer userdata)
{
SessionAsyncData *data;
SyncevoSessionPrivate *priv;
priv = GET_PRIVATE (session);
data = session_async_data_new (session, G_CALLBACK (callback), userdata);
if (!priv->proxy) {
if (callback) {
g_idle_add ((GSourceFunc)get_status_error, data);
}
return;
}
org_syncevolution_Session_get_status_async
(priv->proxy,
(org_syncevolution_Session_get_status_reply) get_status_callback,
data);
}
static void
get_progress_callback (DBusGProxy *proxy,
int progress,
SyncevoSourceProgresses *source_progresses,
GError *error,
SessionAsyncData *data)
{
if (data->callback) {
(*(SyncevoSessionGetProgressCb)data->callback) (data->session,
progress,
source_progresses,
error,
data->userdata);
}
session_async_data_free (data);
}
static gboolean
get_progress_error (SessionAsyncData *data)
{
GError *error;
error = g_error_new_literal (g_quark_from_static_string ("syncevo-session"),
SYNCEVO_SESSION_ERROR_NO_DBUS_OBJECT,
"The D-Bus object does not exist");
(*(SyncevoSessionGetProgressCb)data->callback) (data->session,
-1,
NULL,
error,
data->userdata);
session_async_data_free (data);
return FALSE;
}
void
syncevo_session_get_progress (SyncevoSession *session,
SyncevoSessionGetProgressCb callback,
gpointer userdata)
{
SessionAsyncData *data;
SyncevoSessionPrivate *priv;
priv = GET_PRIVATE (session);
data = session_async_data_new (session, G_CALLBACK (callback), userdata);
if (!priv->proxy) {
if (callback) {
g_idle_add ((GSourceFunc)get_progress_error, data);
}
return;
}
org_syncevolution_Session_get_progress_async
(priv->proxy,
(org_syncevolution_Session_get_progress_reply) get_progress_callback,
data);
}
void
syncevo_session_check_source (SyncevoSession *session,
const char *source,
SyncevoSessionGenericCb callback,
gpointer userdata)
{
SessionAsyncData *data;
SyncevoSessionPrivate *priv;
priv = GET_PRIVATE (session);
data = session_async_data_new (session, G_CALLBACK (callback), userdata);
if (!priv->proxy) {
if (callback) {
g_idle_add ((GSourceFunc)generic_error, data);
}
return;
}
org_syncevolution_Session_check_source_async
(priv->proxy,
source,
(org_syncevolution_Session_check_source_reply) generic_callback,
data);
}
const char*
syncevo_session_get_path (SyncevoSession *session)
{
SyncevoSessionPrivate *priv;
priv = GET_PRIVATE (session);
return priv->path;
}
SyncevoSession*
syncevo_session_new (const char *path)
{
return g_object_new (SYNCEVO_TYPE_SESSION,
"session-path", path,
NULL);
}

133
src/dbus/syncevo-session.h Normal file
View file

@ -0,0 +1,133 @@
/*
* Copyright (C) 2009 Intel Corporation
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) version 3.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA
*/
#ifndef __SYNCEVO_SESSION_H__
#define __SYNCEVO_SESSION_H__
#include <glib-object.h>
#include "syncevo-dbus-types.h"
G_BEGIN_DECLS
enum SyncevoSessionError{
SYNCEVO_SESSION_ERROR_NO_DBUS_OBJECT = 1,
};
#define SYNCEVO_SESSION_DBUS_SERVICE "org.syncevolution"
#define SYNCEVO_SESSION_DBUS_INTERFACE "org.syncevolution.Session"
#define SYNCEVO_TYPE_SESSION (syncevo_session_get_type ())
#define SYNCEVO_SESSION(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), SYNCEVO_TYPE_SESSION, SyncevoSession))
#define SYNCEVO_IS_SESSION(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), SYNCEVO_TYPE_SESSION))
typedef struct _SyncevoSession {
GObject parent_object;
} SyncevoSession;
typedef struct _SyncevoSessionClass {
GObjectClass parent_class;
void (*status_changed) (SyncevoSession *session,
SyncevoSessionStatus status,
guint error_code,
SyncevoSourceStatuses *source_statuses);
void (*progress_changed) (SyncevoSession *session,
int progress,
SyncevoSourceProgresses *source_progresses);
} SyncevoSessionClass;
GType syncevo_session_get_type (void);
typedef void (*SyncevoSessionGenericCb) (SyncevoSession *session,
GError *error,
gpointer userdata);
typedef void (*SyncevoSessionGetConfigCb) (SyncevoSession *session,
SyncevoConfig *config,
GError *error,
gpointer userdata);
void syncevo_session_get_config (SyncevoSession *session,
gboolean template,
SyncevoSessionGetConfigCb callback,
gpointer userdata);
void syncevo_session_set_config (SyncevoSession *session,
gboolean update,
gboolean temporary,
SyncevoConfig *config,
SyncevoSessionGenericCb callback,
gpointer userdata);
typedef void (*SyncevoSessionGetReportsCb) (SyncevoSession *session,
SyncevoReports *reports,
GError *error,
gpointer userdata);
void syncevo_session_get_reports (SyncevoSession *session,
guint start,
guint count,
SyncevoSessionGetReportsCb callback,
gpointer userdata);
void syncevo_session_sync (SyncevoSession *session,
SyncevoSyncMode mode,
SyncevoSourceModes *source_modes,
SyncevoSessionGenericCb callback,
gpointer userdata);
void syncevo_session_abort (SyncevoSession *session,
SyncevoSessionGenericCb callback,
gpointer userdata);
void syncevo_session_suspend (SyncevoSession *session,
SyncevoSessionGenericCb callback,
gpointer userdata);
typedef void (*SyncevoSessionGetStatusCb) (SyncevoSession *session,
SyncevoSessionStatus status,
guint error_code,
SyncevoSourceStatuses *source_statuses,
GError *error,
gpointer userdata);
void syncevo_session_get_status (SyncevoSession *session,
SyncevoSessionGetStatusCb callback,
gpointer userdata);
typedef void (*SyncevoSessionGetProgressCb) (SyncevoSession *session,
guint progress,
SyncevoSourceProgresses *source_progresses,
GError *error,
gpointer userdata);
void syncevo_session_get_progress (SyncevoSession *session,
SyncevoSessionGetProgressCb callback,
gpointer userdata);
void syncevo_session_check_source (SyncevoSession *session,
const char *source,
SyncevoSessionGenericCb callback,
gpointer userdata);
const char *syncevo_session_get_path (SyncevoSession *session);
SyncevoSession *syncevo_session_new (const char *path);
G_END_DECLS
#endif

View file

@ -17,34 +17,18 @@
* 02110-1301 USA
*/
/* test syncevo dbus */
/* test syncevo dbus client wrappers */
#include "syncevo-dbus.h"
#include "syncevo-server.h"
#include <synthesis/syerror.h>
#include <synthesis/engine_defs.h>
static void
print_option (SyncevoOption *option, gpointer userdata)
{
const char *ns, *key, *value;
syncevo_option_get (option, &ns, &key, &value);
g_debug (" Got option [%s] %s = %s", ns, key, value);
}
static void
print_server (SyncevoServer *temp, gpointer userdata)
{
const char *name, *url, *icon;
gboolean ready;
syncevo_server_get (temp, &name, &url, &icon, &ready);
g_debug (" Got server %s (%s, %s, %sconsumer ready)",
name, url, icon,
ready ? "" : "non-");
}
gboolean stop = FALSE;
GMainLoop *loop;
/*
// This is the old progress callback, here for future reference...
static void
progress_cb (SyncevoService *service,
char *server,
@ -138,67 +122,192 @@ progress_cb (SyncevoService *service,
}
}
*/
static void
get_template_configs_cb(SyncevoServer *server,
char **config_names,
GError *error,
gpointer userdata)
{
char **name;
if (error) {
g_printerr ("GetConfigs error: %s", error->message);
g_error_free (error);
return;
}
g_print ("GetConfigs (template=TRUE):\n");
for (name = config_names; name && *name; name++) {
g_print ("\t%s\n", *name);
}
g_print ("\n");
}
static void
print_config_value (char *key, char *value, gpointer data)
{
g_print ("\t\t%s = %s\n", key, value);
}
static void
print_config (char *key, GHashTable *sourceconfig, gpointer data)
{
g_print ("\tsource = %s\n", key);
g_hash_table_foreach (sourceconfig, (GHFunc)print_config_value, NULL);
}
static void
get_config_cb (SyncevoSession *session,
SyncevoConfig *config,
GError *error,
gpointer userdata)
{
if (error) {
g_printerr ("GetConfig error: %s\n", error->message);
g_error_free (error);
return;
}
g_print ("Session configuration:\n");
g_hash_table_foreach (config, (GHFunc)print_config, NULL);
}
static void
progress_cb (SyncevoSession *session,
int progress,
SyncevoSourceProgresses *source_progresses)
{
g_print ("\tprogress = %d\n", progress);
}
static void
status_cb (SyncevoSession *session,
SyncevoSessionStatus status,
guint error_code,
SyncevoSourceStatuses *source_statuses,
gpointer *data)
{
if (status == SYNCEVO_STATUS_DONE) {
g_print ("Session done.");
g_object_unref (session);
g_main_loop_quit (loop);
}
}
static void
start_session_cb (SyncevoServer *server,
char *path,
GError *error,
gpointer userdata)
{
GHashTable *source_modes;
SyncevoSession *session;
if (error) {
g_printerr ("StartSession error: %s\n", error->message);
g_error_free (error);
return;
}
g_print ("\nTesting Session...\n\n");
session = syncevo_session_new (path);
syncevo_session_get_config (session,
FALSE,
(SyncevoSessionGetConfigCb)get_config_cb,
NULL);
g_signal_connect (session, "progress-changed",
G_CALLBACK (progress_cb), NULL);
g_signal_connect (session, "status-changed",
G_CALLBACK (status_cb), NULL);
/* TODO should wait for session status == idle */
source_modes = g_hash_table_new (g_str_hash, g_str_equal);
syncevo_session_sync (session,
SYNCEVO_SYNC_DEFAULT,
source_modes,
NULL,
NULL);
g_hash_table_unref (source_modes);
}
static void
get_configs_cb(SyncevoServer *server,
char **config_names,
GError *error,
char *service_name)
{
char **name;
if (error) {
g_printerr ("GetConfigs error: %s\n", error->message);
g_error_free (error);
return;
}
g_print ("GetConfigs (template=FALSE):\n");
for (name = config_names; name && *name; name++){
g_print ("\t%s\n", *name);
}
g_print ("\n");
if (stop) {
g_print ("No server given, stopping here.\n");
g_main_loop_quit (loop);
}
}
static void
session_changed_cb (SyncevoServer *server,
char *path,
gboolean active,
gpointer data)
{
g_print ("Session %s is now %s\n",
path,
active ? "active" : "not active");
}
int main (int argc, char *argv[])
{
SyncevoService *service;
GMainLoop *loop;
GPtrArray *sources;
GError *error = NULL;
GPtrArray *array;
char *server = NULL;
SyncevoServer *server;
char *service = NULL;
g_type_init();
if (argc > 1) {
server = argv[1];
g_print ("Testing Server...\n");
server = syncevo_server_get_default ();
syncevo_server_get_configs (server,
TRUE,
(SyncevoServerGetConfigsCb)get_template_configs_cb,
NULL);
syncevo_server_get_configs (server,
FALSE,
(SyncevoServerGetConfigsCb)get_configs_cb,
NULL);
g_signal_connect (server, "session-changed",
G_CALLBACK (session_changed_cb), NULL);
if (argc < 2) {
stop = TRUE;
}
service = syncevo_service_get_default ();
service = argv[1];
if (service)
syncevo_server_start_session (server,
service,
(SyncevoServerStartSessionCb)start_session_cb,
NULL);
array = g_ptr_array_new();
g_print ("Testing syncevo_service_get_servers()\n");
syncevo_service_get_servers (service, &array, &error);
if (error) {
g_error (" syncevo_service_get_servers() failed with %s", error->message);
}
g_ptr_array_foreach (array, (GFunc)print_server, NULL);
array = g_ptr_array_new();
g_print ("Testing syncevo_service_get_templates()\n");
syncevo_service_get_templates (service, &array, &error);
if (error) {
g_error (" syncevo_service_get_templates() failed with %s", error->message);
}
g_ptr_array_foreach (array, (GFunc)print_server, NULL);
if (!server) {
g_print ("No server given, stopping here\n");
return 0;
}
array = g_ptr_array_new();
g_print ("Testing syncevo_service_get_config() with server %s\n", server);
syncevo_service_get_server_config (service, server, &array, &error);
if (error) {
g_error (" syncevo_service_get_server_config() failed with %s", error->message);
}
g_ptr_array_foreach (array, (GFunc)print_option, NULL);
loop = g_main_loop_new (NULL, TRUE);
g_signal_connect (service, "progress", (GCallback)progress_cb, loop);
g_print ("Testing syncevo_service_start_sync() with server %s\n", server);
sources = g_ptr_array_new (); /*empty*/
syncevo_service_start_sync (service,
server,
sources,
&error);
if (error) {
g_error (" syncevo_service_start_sync() failed with %s", error->message);
}
g_main_loop_run (loop);
return 0;

View file

@ -50,8 +50,9 @@ bin_PROGRAMS = $(GUI_PROGRAMS)
sync_ui_SOURCES = \
main.c sync-ui.c sync-ui.h sync-ui-config.c sync-ui-config.h \
mux-frame.c mux-frame.h mux-window.c mux-window.h mux-icon-button.c mux-icon-button.h
nodist_sync_ui_SOURCES = sync-ui-marshal.c sync-ui-marshal.h
mux-frame.c mux-frame.h mux-window.c mux-window.h mux-icon-button.c mux-icon-button.h \
sync-config-widget.c sync-config-widget.h
sync_ui_LDADD = $(GUI_LIBS) $(DBUS_GLIB_LIBS) $(top_builddir)/src/dbus/libsyncevo-dbus.la
sync_ui_CFLAGS = $(GUI_CFLAGS) \
$(DBUS_GLIB_CFLAGS) \
@ -73,26 +74,7 @@ sync_ui_moblin_LDADD = $(sync_ui_LDADD)
sync_ui_moblin_CFLAGS = $(sync_ui_CFLAGS)
sync_ui_moblin_CPPFLAGS = $(sync_ui_CPPFLAGS) -DUSE_MOBLIN_UX
noinst_DATA = sync-ui-marshal.list
if COND_GUI
BUILT_SOURCES = \
syncevo-bindings.h sync-ui-marshal.c sync-ui-marshal.h
endif
CLEANFILES = $(BUILT_SOURCES) \
ui.xml \
sync-moblin.desktop \
$(applications_generated)
%-bindings.h: stamp-%-bindings.h
@true
stamp-%-bindings.h: $(top_builddir)/src/dbus/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)
sync-ui-marshal.h: $(srcdir)/sync-ui-marshal.list $(GLIB_GENMARSHAL)
$(GLIB_GENMARSHAL) $< --header --prefix=sync_ui_marshal > $@
sync-ui-marshal.c: $(srcdir)/sync-ui-marshal.list sync-ui-marshal.h $(GLIB_GENMARSHAL)
echo "#include \"sync-ui-marshal.h\"" > $@ \
&& $(GLIB_GENMARSHAL) --prefix=sync_ui_marshal $(srcdir)/sync-ui-marshal.list --body >> $@

View file

@ -23,6 +23,7 @@
enum {
PROP_0,
PROP_TOGGLEABLE,
PROP_PIXBUF_NORMAL,
PROP_PIXBUF_ACTIVE,
PROP_PIXBUF_PRELIGHT,
@ -40,6 +41,9 @@ mux_icon_button_get_property (GObject *object, guint property_id,
MuxIconButton *btn = MUX_ICON_BUTTON (object);
switch (property_id) {
case PROP_TOGGLEABLE:
g_value_set_boolean (value, btn->toggleable);
break;
case PROP_PIXBUF_NORMAL:
g_value_set_object (value, mux_icon_button_get_pixbuf (btn, GTK_STATE_NORMAL));
break;
@ -68,6 +72,9 @@ mux_icon_button_set_property (GObject *object, guint property_id,
GdkPixbuf *pixbuf;
switch (property_id) {
case PROP_TOGGLEABLE:
btn->toggleable = g_value_get_boolean (value);
break;
case PROP_PIXBUF_NORMAL:
pixbuf = GDK_PIXBUF (g_value_get_object (value));
mux_icon_button_set_pixbuf (btn, GTK_STATE_NORMAL, pixbuf);
@ -127,9 +134,17 @@ mux_icon_button_expose (GtkWidget *widget,
GdkRectangle dirty_area, btn_area;
MuxIconButton *btn = MUX_ICON_BUTTON (widget);
GdkPixbuf *pixbuf;
GtkStateType state;
if (btn->pixbufs[GTK_WIDGET_STATE (widget)]) {
pixbuf = btn->pixbufs[GTK_WIDGET_STATE (widget)];
if (btn->active) {
/* this is a active toggle button */
state = GTK_STATE_ACTIVE;
} else {
state = GTK_WIDGET_STATE (widget);
}
if (btn->pixbufs[state]) {
pixbuf = btn->pixbufs[state];
} else {
pixbuf = btn->pixbufs[GTK_STATE_NORMAL];
}
@ -154,11 +169,22 @@ mux_icon_button_expose (GtkWidget *widget,
return FALSE;
}
static void
mux_icon_button_clicked (GtkButton *button)
{
MuxIconButton *icon_button = MUX_ICON_BUTTON (button);
if (icon_button->toggleable) {
icon_button->active = !icon_button->active;
}
}
static void
mux_icon_button_class_init (MuxIconButtonClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
GtkButtonClass *button_class = GTK_BUTTON_CLASS (klass);
GParamSpec *pspec;
object_class->get_property = mux_icon_button_get_property;
@ -168,6 +194,14 @@ mux_icon_button_class_init (MuxIconButtonClass *klass)
widget_class->size_request = mux_icon_button_size_request;
widget_class->expose_event = mux_icon_button_expose;
button_class->clicked = mux_icon_button_clicked;
pspec = g_param_spec_boolean ("toggleable",
"Toggleable",
"Is icon button button a toggle or normal",
FALSE,
G_PARAM_READWRITE);
g_object_class_install_property (object_class, PROP_TOGGLEABLE, pspec);
pspec = g_param_spec_object ("normal-state-pixbuf",
"Normal state pixbuf",
"GdkPixbuf for GTK_STATE_NORMAL",
@ -206,10 +240,11 @@ mux_icon_button_init (MuxIconButton *self)
}
GtkWidget*
mux_icon_button_new (GdkPixbuf *normal_pixbuf)
mux_icon_button_new (GdkPixbuf *normal_pixbuf, gboolean toggleable)
{
return g_object_new (MUX_TYPE_ICON_BUTTON,
"normal-state-pixbuf", normal_pixbuf,
"toggleable", toggleable,
NULL);
}
@ -233,3 +268,16 @@ mux_icon_button_get_pixbuf (MuxIconButton *button, GtkStateType state)
{
return button->pixbufs[state];
}
void
mux_icon_button_set_active (MuxIconButton *button, gboolean active)
{
button->active = active;
gtk_widget_queue_draw (GTK_WIDGET (button));
}
gboolean
mux_icon_button_get_active (MuxIconButton *button)
{
return button->active;
}

View file

@ -44,6 +44,9 @@ G_BEGIN_DECLS
typedef struct {
GtkButton parent;
GdkPixbuf *pixbufs[5];
gboolean toggleable;
gboolean active;
} MuxIconButton;
typedef struct {
@ -52,12 +55,17 @@ typedef struct {
GType mux_icon_button_get_type (void);
GtkWidget* mux_icon_button_new (GdkPixbuf *normal_pixbuf);
GtkWidget* mux_icon_button_new (GdkPixbuf *normal_pixbuf, gboolean toggleable);
void mux_icon_button_set_pixbuf (MuxIconButton *button, GtkStateType state, GdkPixbuf *pixbuf);
GdkPixbuf* mux_icon_button_get_pixbuf (MuxIconButton *button, GtkStateType state);
/* for togglebuttons */
void mux_icon_button_set_active (MuxIconButton *button, gboolean active);
gboolean mux_icon_button_get_active (MuxIconButton *button);
G_END_DECLS
#endif

View file

@ -47,7 +47,7 @@ enum {
};
enum {
SETTINGS_CLICKED,
SETTINGS_VISIBILITY_CHANGED,
LAST_SIGNAL
};
@ -159,12 +159,37 @@ mux_window_forall (GtkContainer *container,
MuxWindow *mux_win = MUX_WINDOW (container);
GtkBin *bin = GTK_BIN (container);
/* FIXME: call parents forall instead */
/* FIXME: call parents forall instead ? */
if (bin->child)
(* callback) (bin->child, callback_data);
if (mux_win->title_bar)
(* callback) (mux_win->title_bar, callback_data);
if (mux_win->settings)
(* callback) (mux_win->settings, callback_data);
}
static void
mux_window_add (GtkContainer *container,
GtkWidget *widget)
{
MuxWindowClass *klass;
GtkContainerClass *parent_container_class;
GtkBin *bin = GTK_BIN (container);
klass = MUX_WINDOW_GET_CLASS (container);
parent_container_class = GTK_CONTAINER_CLASS (g_type_class_peek_parent (klass));
if (!bin->child) {
GtkWidget *w;
/* create a dummy container so we can hide the contents when settings
* are shown */
w = gtk_vbox_new (FALSE, 0);
parent_container_class->add (container, w);
if (!MUX_WINDOW (container)->settings_visible)
gtk_widget_show (w);
}
gtk_container_add (GTK_CONTAINER (bin->child), widget);
}
static void
@ -172,13 +197,23 @@ mux_window_remove (GtkContainer *container,
GtkWidget *child)
{
MuxWindow *win = MUX_WINDOW (container);
GtkBin *bin = GTK_BIN (container);
if (child == win->title_bar) {
gtk_widget_unparent (win->title_bar);
win->title_bar = NULL;
win->title_label = NULL;
} else {
GTK_CONTAINER_CLASS (mux_window_parent_class)->remove (container, child);
} else if (child == win->settings) {
gtk_widget_unparent (win->settings);
win->settings = NULL;
} else if (bin->child) {
if (bin->child == child) {
/* should call parents remove... */
gtk_widget_unparent (child);
bin->child = NULL;
} else {
gtk_container_remove (GTK_CONTAINER (bin->child), child);
}
}
}
@ -197,6 +232,8 @@ mux_window_size_request (GtkWidget *widget,
gtk_widget_size_request (mux_win->title_bar, &req);
if (bin->child && GTK_WIDGET_VISIBLE (bin->child))
gtk_widget_size_request (bin->child, &req);
if (mux_win->settings && GTK_WIDGET_VISIBLE (mux_win->settings))
gtk_widget_size_request (mux_win->settings, &req);
requisition->width = 1024;
requisition->height = 600;
@ -249,10 +286,13 @@ mux_window_size_allocate (GtkWidget *widget,
gtk_widget_size_allocate (bin->child, &child_allocation);
}
if (mux_win->settings && GTK_WIDGET_VISIBLE (mux_win->settings)) {
gtk_widget_size_allocate (mux_win->settings, &child_allocation);
}
mux_win->child_allocation = child_allocation;
}
static void
mux_window_class_init (MuxWindowClass *klass)
{
@ -272,6 +312,7 @@ mux_window_class_init (MuxWindowClass *klass)
container_class->forall = mux_window_forall;
container_class->remove = mux_window_remove;
container_class->add = mux_window_add;
pspec = g_param_spec_uint ("title-bar-height",
"Title bar height",
@ -308,11 +349,11 @@ mux_window_class_init (MuxWindowClass *klass)
PROP_DECORATIONS,
pspec);
mux_window_signals[SETTINGS_CLICKED] =
g_signal_new ("settings-clicked",
mux_window_signals[SETTINGS_VISIBILITY_CHANGED] =
g_signal_new ("settings-visibility-changed",
G_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (MuxWindowClass, settings_clicked),
G_STRUCT_OFFSET (MuxWindowClass, settings_visibility_changed),
NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0, NULL);
@ -320,9 +361,47 @@ mux_window_class_init (MuxWindowClass *klass)
}
static void
mux_window_settings_clicked (MuxWindow *window)
update_show_settings (MuxWindow *window)
{
g_signal_emit (window, mux_window_signals[SETTINGS_CLICKED], 0, NULL);
GtkBin *bin = GTK_BIN (window);
if (window->settings_visible) {
if (bin->child) {
gtk_widget_hide (bin->child);
}
if (window->settings){
gtk_widget_show (window->settings);
gtk_widget_map (window->settings);
if (window->settings_title) {
gtk_label_set_text (GTK_LABEL (window->title_label),
window->settings_title);
}
}
} else {
if (window->settings) {
gtk_widget_hide (window->settings);
}
if (bin->child) {
gtk_widget_show (bin->child);
}
/* reset the window title */
gtk_label_set_text (GTK_LABEL (window->title_label),
gtk_window_get_title(GTK_WINDOW (window)));
}
g_signal_emit (window, mux_window_signals[SETTINGS_VISIBILITY_CHANGED], 0);
}
static void
mux_window_settings_clicked (MuxIconButton *button, MuxWindow *window)
{
gboolean active;
active = mux_icon_button_get_active (button);;
if (window->settings_visible != active) {
window->settings_visible = active;
update_show_settings (window);
}
}
static void
@ -377,7 +456,7 @@ load_icon (MuxWindow *window, const char *icon_name)
static void
mux_window_build_title_bar (MuxWindow *window)
{
GtkWidget *box, *btn, *sep;
GtkWidget *box, *btn;
GdkPixbuf *pixbuf, *pixbuf_hover;
if (window->title_bar) {
@ -412,24 +491,20 @@ mux_window_build_title_bar (MuxWindow *window)
gtk_widget_show (btn);
}
if (window->decorations & MUX_DECOR_SETTINGS) {
sep = gtk_vseparator_new ();
gtk_box_pack_end (GTK_BOX (box), sep, FALSE, FALSE, 0);
gtk_widget_show (sep);
}
if (window->decorations & MUX_DECOR_SETTINGS) {
pixbuf = load_icon (window, "settings");
pixbuf_hover = load_icon (window, "settings_hover");
btn = g_object_new (MUX_TYPE_ICON_BUTTON,
"normal-state-pixbuf", pixbuf,
"prelight-state-pixbuf", pixbuf_hover,
NULL);
gtk_widget_set_name (btn, "mux_icon_button_settings");
g_signal_connect_swapped (btn, "clicked",
G_CALLBACK (mux_window_settings_clicked), window);
gtk_box_pack_end (GTK_BOX (box), btn, FALSE, FALSE, 0);
gtk_widget_show (btn);
window->settings_button = g_object_new (MUX_TYPE_ICON_BUTTON,
"normal-state-pixbuf", pixbuf,
"prelight-state-pixbuf", pixbuf_hover,
"active-state-pixbuf", pixbuf_hover,
"toggleable", TRUE,
NULL);
gtk_widget_set_name (window->settings_button, "mux_icon_button_settings");
g_signal_connect (window->settings_button, "clicked",
G_CALLBACK (mux_window_settings_clicked), window);
gtk_box_pack_end (GTK_BOX (box), window->settings_button, FALSE, FALSE, 0);
gtk_widget_show (window->settings_button);
}
mux_window_update_style (window);
@ -445,7 +520,7 @@ mux_window_title_changed (MuxWindow *window,
GParamSpec *pspec,
gpointer user_data)
{
if (window->title_label) {
if (window->title_label && !window->settings_visible) {
gtk_label_set_text (GTK_LABEL (window->title_label),
gtk_window_get_title (GTK_WINDOW (window)));
}
@ -505,3 +580,66 @@ mux_window_get_decorations (MuxWindow *window)
return window->decorations;
}
void
mux_window_set_settings_widget (MuxWindow *window, GtkWidget *widget)
{
if (widget != window->settings) {
if (window->settings) {
gtk_widget_unparent (window->settings);
}
window->settings = widget;
if (widget) {
gtk_widget_set_parent (widget, GTK_WIDGET (window));
}
}
}
GtkWidget*
mux_window_get_settings_widget (MuxWindow *window)
{
return window->settings;
}
void
mux_window_set_settings_visible (MuxWindow *window, gboolean visible)
{
if (window->settings_visible != visible) {
window->settings_visible = visible;
update_show_settings (window);
if (window->settings_button)
mux_icon_button_set_active (MUX_ICON_BUTTON (window->settings_button),
visible);
}
}
gboolean
mux_window_get_settings_visible (MuxWindow *window)
{
return window->settings_visible;
}
void
mux_window_set_settings_title (MuxWindow *window, const char *title)
{
if (window->settings_title) {
g_free (window->settings_title);
}
window->settings_title = g_strdup (title);
if (window->settings_visible) {
gtk_label_set_text (GTK_LABEL (window->title_label),
window->settings_title);
}
}
const char*
mux_window_get_settings_title (MuxWindow *window)
{
return window->settings_title;
}

View file

@ -52,18 +52,24 @@ typedef struct {
GtkWidget *title_bar;
GtkWidget *title_label;
GtkWidget *title_alignment;
GtkWidget *settings;
GtkWidget *settings_button;
GtkAllocation child_allocation;
MuxDecorations decorations;
GdkColor title_bar_color;
guint title_bar_height;
gboolean settings_visible;
char *settings_title;
} MuxWindow;
typedef struct {
GtkWindowClass parent_class;
void (*settings_clicked) (MuxWindow *window);
void (*settings_visibility_changed) (MuxWindow *window);
} MuxWindowClass;
GType mux_window_get_type (void);
@ -72,6 +78,17 @@ GtkWidget* mux_window_new (void);
void mux_window_set_decorations (MuxWindow *window, MuxDecorations decorations);
MuxDecorations mux_window_get_decorations (MuxWindow *window);
void mux_window_set_settings_widget (MuxWindow *window, GtkWidget *widget);
GtkWidget *mux_window_get_settings_widget (MuxWindow *window);
void mux_window_set_settings_title (MuxWindow *window, const char *title);
const char *mux_window_get_settings_title (MuxWindow *window);
void mux_window_set_settings_visible (MuxWindow *window, gboolean visible);
gboolean mux_window_get_settings_visible (MuxWindow *window);
G_END_DECLS
#endif

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,99 @@
#ifndef _SYNC_CONFIG_WIDGET
#define _SYNC_CONFIG_WIDGET
#include <glib-object.h>
#include <gtk/gtk.h>
#include "syncevo-server.h"
#include "sync-ui-config.h"
G_BEGIN_DECLS
#define SYNC_TYPE_CONFIG_WIDGET sync_config_widget_get_type()
#define SYNC_CONFIG_WIDGET(obj) \
(G_TYPE_CHECK_INSTANCE_CAST ((obj), SYNC_TYPE_CONFIG_WIDGET, SyncConfigWidget))
#define SYNC_CONFIG_WIDGET_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST ((klass), SYNC_TYPE_CONFIG_WIDGET, SyncConfigWidgetClass))
#define SYNC_IS_CONFIG_WIDGET(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE ((obj), SYNC_TYPE_CONFIG_WIDGET))
#define SYNC_IS_CONFIG_WIDGET_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE ((klass), SYNC_TYPE_CONFIG_WIDGET))
#define SYNC_CONFIG_WIDGET_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS ((obj), SYNC_TYPE_CONFIG_WIDGET, SyncConfigWidgetClass))
typedef struct {
GtkContainer parent;
GtkWidget *expando_box;
GtkWidget *label_box;
gboolean current; /* is this currently used config */
gboolean unset; /* is there a current config at all */
gboolean configured; /* actual service configuration exists on server */
gboolean has_template; /* this service configuration has a matching template */
gboolean showing;
gboolean expanded;
SyncevoServer *server;
server_config *config;
char *running_session;
/* label */
GtkWidget *image;
GtkWidget *label;
GtkWidget *entry;
GtkWidget *link;
GtkWidget *button;
/* content */
GtkWidget *description_label;
GtkWidget *name_label;
GtkWidget *name_entry;
GtkWidget *username_entry;
GtkWidget *password_entry;
GtkWidget *baseurl_entry;
GtkWidget *expander;
GtkWidget *server_settings_table;
GtkWidget *reset_delete_button;
GtkWidget *stop_button;
GtkWidget *use_button;
GHashTable *uri_entries;
} SyncConfigWidget;
typedef struct {
GtkContainerClass parent_class;
void (*changed) (SyncConfigWidget *widget);
} SyncConfigWidgetClass;
GType sync_config_widget_get_type (void);
GtkWidget *sync_config_widget_new (SyncevoServer *server,
const char *name,
gboolean current,
gboolean unset,
gboolean configured,
gboolean has_template);
void sync_config_widget_set_expanded (SyncConfigWidget *widget, gboolean expanded);
gboolean sync_config_widget_get_expanded (SyncConfigWidget *widget);
gboolean sync_config_widget_get_current (SyncConfigWidget *widget);
void sync_config_widget_set_current (SyncConfigWidget *self, gboolean current);
void sync_config_widget_set_has_template (SyncConfigWidget *self, gboolean has_template);
gboolean sync_config_widget_get_has_template (SyncConfigWidget *self);
void sync_config_widget_set_configured (SyncConfigWidget *self, gboolean configured);
gboolean sync_config_widget_get_configured (SyncConfigWidget *self);
const char *sync_config_widget_get_name (SyncConfigWidget *widget);
G_END_DECLS
#endif

View file

@ -17,20 +17,11 @@
* 02110-1301 USA
*/
#include <glib/gi18n.h>
#include <string.h>
#include "sync-ui-config.h"
void
source_config_free (source_config *source)
{
if (!source)
return;
g_free (source->name);
g_free (source->uri);
g_slice_free (source_config, source);
}
void
server_config_free (server_config *server)
{
@ -38,11 +29,8 @@ server_config_free (server_config *server)
return;
g_free (server->name);
g_free (server->base_url);
g_free (server->username);
g_free (server->password);
g_list_foreach (server->source_configs, (GFunc)source_config_free, NULL);
g_list_free (server->source_configs);
syncevo_config_free (server->config);
g_slice_free (server_config, server);
}
@ -62,6 +50,7 @@ server_config_update_from_entry (server_config *server, GtkEntry *entry)
server->changed = TRUE;
/*
if (*str == server->password) {
server->auth_changed = TRUE;
server->password_changed = TRUE;
@ -69,12 +58,13 @@ server_config_update_from_entry (server_config *server, GtkEntry *entry)
*str == server->base_url) {
server->auth_changed = TRUE;
}
*/
g_free (*str);
*str = g_strdup (new_str);
}
}
/*
void
server_config_update_from_option (server_config *server, SyncevoOption *option)
{
@ -88,7 +78,13 @@ server_config_update_from_option (server_config *server, SyncevoOption *option)
server->base_url = g_strdup (value);
} else if (strcmp (key, "username") == 0) {
g_free (server->username);
server->username = g_strdup (value);
//skip the informative username
if (value &&
strcmp (value, "your SyncML server account name") == 0) {
server->username = g_strdup ("");
} else {
server->username = g_strdup (value);
}
} else if (strcmp (key, "webURL") == 0) {
if (server->web_url)
g_free (server->web_url);
@ -110,7 +106,7 @@ server_config_update_from_option (server_config *server, SyncevoOption *option)
} else if (strcmp (key, "sync") == 0) {
if (strcmp (value, "disabled") == 0 ||
strcmp (value, "none") == 0) {
/* consider this source not available at all */
// consider this source not available at all
source->enabled = FALSE;
} else {
source->enabled = TRUE;
@ -120,7 +116,9 @@ server_config_update_from_option (server_config *server, SyncevoOption *option)
}
}
}
*/
/*
GPtrArray*
server_config_get_option_array (server_config *server)
{
@ -140,8 +138,8 @@ server_config_get_option_array (server_config *server)
option = syncevo_option_new (NULL, g_strdup ("iconURI"), g_strdup (server->icon_uri));
g_ptr_array_add (options, option);
/* if gnome-keyring password was set, set password option to "-"
* (meaning 'use AskPassword()'). Otherwise don't touch the password */
// if gnome-keyring password was set, set password option to "-"
//(meaning 'use AskPassword()'). Otherwise don't touch the password
if (server->password_changed) {
option = syncevo_option_new (NULL, g_strdup ("password"), g_strdup ("-"));
g_ptr_array_add (options, option);
@ -150,10 +148,6 @@ server_config_get_option_array (server_config *server)
for (l = server->source_configs; l; l = l->next) {
source_config *source = (source_config*)l->data;
/* sources may have been added as place holders */
if (!source->uri)
continue;
option = syncevo_option_new (source->name, g_strdup ("uri"), g_strdup (source->uri));
g_ptr_array_add (options, option);
@ -164,7 +158,9 @@ server_config_get_option_array (server_config *server)
return options;
}
*/
/*
GPtrArray*
server_config_get_source_array (server_config *server, SyncMode mode)
{
@ -184,54 +180,146 @@ server_config_get_source_array (server_config *server, SyncMode mode)
return sources;
}
*/
static void
add_source_config (char *name,
GHashTable *syncevo_source_config,
GHashTable *source_configs)
{
source_config *new_conf;
new_conf = g_slice_new (source_config);
new_conf->name = name;
new_conf->supported_locally = TRUE;
new_conf->config = syncevo_source_config;
g_hash_table_insert (source_configs, name, new_conf);
}
void
server_config_disable_unsupported_sources (server_config *server)
server_config_init (server_config *server, SyncevoConfig *config)
{
GList *l;
server->config = config;
for (l = server->source_configs; l; l = l->next) {
source_config* config = (source_config*)l->data;
/* build source_configs */
server->source_configs = g_hash_table_new (g_str_hash, g_str_equal);
syncevo_config_foreach_source (config,
(ConfigFunc)add_source_config,
server->source_configs);
if (!config->supported_locally) {
config->enabled = FALSE;
}
}
}
static int
source_config_compare (source_config *a, source_config *b)
static char*
get_report_summary (int local_changes, int remote_changes, int local_rejects, int remote_rejects)
{
g_assert (a && a->name);
g_assert (b && b->name);
char *rejects, *changes, *msg;
return strcmp (a->name, b->name);
}
source_config*
server_config_get_source_config (server_config *server, const char *name)
{
GList *l;
source_config *source = NULL;
g_assert (name);
/* return existing source config if found */
for (l = server->source_configs; l; l = l->next) {
source = (source_config*)l->data;
if (strcmp (source->name, name) == 0) {
return source;
}
if (local_rejects + remote_rejects == 0) {
rejects = NULL;
} else if (local_rejects == 0) {
rejects = g_strdup_printf (ngettext ("There was one remote rejection.",
"There were %d remote rejections.",
remote_rejects),
remote_rejects);
} else if (remote_rejects == 0) {
rejects = g_strdup_printf (ngettext ("There was one local rejection.",
"There were %d local rejections.",
local_rejects),
local_rejects);
} else {
rejects = g_strdup_printf (_ ("There were %d local rejections and %d remote rejections."),
local_rejects, remote_rejects);
}
/* create new source config */
source = g_slice_new0 (source_config);
source->name = g_strdup (name);
server->source_configs = g_list_insert_sorted (server->source_configs,
source,
(GCompareFunc)source_config_compare);
if (local_changes + remote_changes == 0) {
changes = g_strdup_printf (_("Last time: No changes."));
} else if (local_changes == 0) {
changes = g_strdup_printf (ngettext ("Last time: Sent one change.",
"Last time: Sent %d changes.",
remote_changes),
remote_changes);
} else if (remote_changes == 0) {
// This is about changes made to the local data. Not all of these
// changes were requested by the remote server, so "applied"
// is a better word than "received" (bug #5185).
changes = g_strdup_printf (ngettext ("Last time: Applied one change.",
"Last time: Applied %d changes.",
local_changes),
local_changes);
} else {
changes = g_strdup_printf (_("Last time: Applied %d changes and sent %d changes."),
local_changes, remote_changes);
}
return source;
if (rejects)
msg = g_strdup_printf ("%s\n%s", changes, rejects);
else
msg = g_strdup (changes);
g_free (rejects);
g_free (changes);
return msg;
}
void
source_config_update_label (source_config *source)
{
char *msg;
if (!source->label) {
return;
}
msg = get_report_summary (source->local_changes,
source->remote_changes,
source->local_rejections,
source->remote_rejections);
gtk_label_set_text (GTK_LABEL (source->label), msg);
g_free (msg);
}
gboolean
source_config_is_enabled (source_config *source)
{
char *mode;
mode = g_hash_table_lookup (source->config, "sync");
if (mode &&
(strcmp (mode, "none") == 0 ||
strcmp (mode, "disabled") == 0)) {
return FALSE;
}
return TRUE;
}
server_data*
server_data_new (const char *name, gpointer *data)
{
server_data *serv_data;
serv_data = g_slice_new0 (server_data);
serv_data->data = data;
serv_data->config = g_slice_new0 (server_config);
serv_data->config->name = g_strdup (name);
return serv_data;
}
void
server_data_free (server_data *data, gboolean free_config)
{
if (!data)
return;
if (free_config && data->config) {
server_config_free (data->config);
}
if (data->options_override) {
/*
g_ptr_array_foreach (data->options_override, (GFunc)syncevo_option_free, NULL);
*/
g_ptr_array_free (data->options_override, TRUE);
}
g_slice_free (server_data, data);
}

View file

@ -21,38 +21,29 @@
#define SYNC_UI_CONFIG_H
#include <gtk/gtk.h>
#include "syncevo-dbus.h"
typedef enum {
SYNC_NONE,
SYNC_TWO_WAY,
SYNC_SLOW,
SYNC_ONE_WAY_FROM_CLIENT,
SYNC_REFRESH_FROM_CLIENT,
SYNC_ONE_WAY_FROM_SERVER,
SYNC_REFRESH_FROM_SERVER,
SYNC_MODE_MAX
}SyncMode;
#include "syncevo-session.h"
#include "syncevo-server.h"
/* need a separate struct for sources because we need to know local support ... */
typedef struct source_config {
char *name;
gboolean enabled;
gboolean supported_locally;
char *uri;
long local_changes;
long remote_changes;
long local_rejections;
long remote_rejections;
GtkWidget *label; /* source report label, after ui has been constructed */
GtkWidget *box; /* source box, after ui has been constructed */
GHashTable *config; /* link to a "sub-hashtable" inside server_config->config */
} source_config;
typedef struct server_config {
char *name;
char *base_url;
char *web_url;
char *icon_uri;
char *username;
char *password;
GList *source_configs;
/* any field in struct has changed */
/* any field in config has changed */
gboolean changed;
/* a authentication detail (base_url/username/password) has changed */
@ -60,16 +51,35 @@ typedef struct server_config {
gboolean password_changed;
gboolean from_template;
GHashTable *source_configs; /* source_config's*/
SyncevoConfig *config;
} server_config;
gboolean source_config_is_enabled (source_config *source);
void source_config_update_label (source_config *source);
void source_config_free (source_config *source);
void server_config_init (server_config *server, SyncevoConfig *config);
void server_config_free (server_config *server);
void server_config_update_from_option (server_config *server, SyncevoOption *option);
void server_config_update_from_entry (server_config *server, GtkEntry *entry);
GPtrArray* server_config_get_option_array (server_config *server);
GPtrArray* server_config_get_source_array (server_config *server, SyncMode mode);
void server_config_disable_unsupported_sources (server_config *server);
source_config* server_config_get_source_config (server_config *server, const char *name);
void server_config_ensure_default_sources_exist (server_config *server);
/* data structure for syncevo_service_get_template_config_async and
* syncevo_service_get_server_config_async. server is the server that
* the method was called for. options_override are options that should
* be overridden on the config we get.
*/
typedef struct server_data {
server_config *config;
GPtrArray *options_override;
gpointer *data;
} server_data;
server_data* server_data_new (const char *name, gpointer *data);
void server_data_free (server_data *data, gboolean free_config);
#endif

View file

@ -1 +0,0 @@
VOID:STRING,BOXED

File diff suppressed because it is too large Load diff

View file

@ -21,6 +21,17 @@
#define SYNC_UI_H
#include <gtk/gtk.h>
#include "config.h"
#include "sync-ui-config.h"
#include "sync-ui.h"
#define SYNC_UI_LIST_ICON_SIZE 32
#define SYNC_UI_LIST_BTN_WIDTH 150
char* get_pretty_source_name (const char *source_name);
void show_error_dialog (GtkWidget *widget, const char* message);
GtkWidget* sync_ui_create_main_window ();

View file

@ -737,7 +737,7 @@ service</property>
</widget>
<widget class="GtkWindow" id="services_win">
<property name="border_width">5</property>
<property name="title" translatable="yes">Sync</property>
<property name="title" translatable="yes">Sync settings</property>
<property name="modal">True</property>
<property name="default_width">800</property>
<property name="default_height">550</property>
@ -797,8 +797,7 @@ We support the following services: </property>
</packing>
</child>
<child>
<widget class="GtkScrolledWindow" id="scrolledwindow1">
<property name="height_request">165</property>
<widget class="GtkScrolledWindow" id="scrolledwindow">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">never</property>
@ -808,57 +807,11 @@ We support the following services: </property>
<property name="visible">True</property>
<property name="resize_mode">queue</property>
<child>
<widget class="GtkVBox" id="vbox1">
<widget class="GtkVBox" id="services_box">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<child>
<widget class="GtkTable" id="services_table">
<property name="visible">True</property>
<property name="n_rows">4</property>
<property name="n_columns">3</property>
<property name="row_spacing">2</property>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="padding">4</property>
<property name="position">0</property>
</packing>
<placeholder/>
</child>
<child>
<placeholder/>
@ -869,14 +822,12 @@ We support the following services: </property>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="position">2</property>
</packing>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="padding">10</property>
<property name="padding">8</property>
<property name="position">0</property>
</packing>
</child>
@ -931,83 +882,10 @@ you can setup a service manually.</property>
<property name="position">1</property>
</packing>
</child>
<child>
<widget class="GtkScrolledWindow" id="manual_services_scrolled">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">never</property>
<property name="vscrollbar_policy">automatic</property>
<child>
<widget class="GtkViewport" id="viewport2">
<property name="visible">True</property>
<property name="resize_mode">queue</property>
<child>
<widget class="GtkVBox" id="vbox11">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<child>
<widget class="GtkTable" id="manual_services_table">
<property name="visible">True</property>
<property name="n_rows">4</property>
<property name="n_columns">3</property>
<property name="row_spacing">2</property>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="padding">4</property>
<property name="position">0</property>
</packing>
</child>
<child>
<placeholder/>
</child>
</widget>
</child>
</widget>
</child>
</widget>
<packing>
<property name="position">2</property>
</packing>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="padding">8</property>
<property name="position">1</property>
</packing>
</child>
@ -1029,7 +907,7 @@ you can setup a service manually.</property>
</widget>
<packing>
<property name="expand">False</property>
<property name="padding">10</property>
<property name="padding">16</property>
<property name="pack_type">end</property>
<property name="position">2</property>
</packing>
@ -1059,364 +937,4 @@ you can setup a service manually.</property>
</widget>
</child>
</widget>
<widget class="GtkWindow" id="service_settings_win">
<property name="border_width">5</property>
<property name="title" translatable="yes">Sync</property>
<property name="modal">True</property>
<property name="default_width">800</property>
<property name="default_height">550</property>
<child>
<widget class="GtkVBox" id="vbox21">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<child>
<widget class="GtkFrame" id="service_settings_frame">
<property name="visible">True</property>
<property name="label_xalign">0</property>
<property name="shadow_type">none</property>
<child>
<widget class="GtkAlignment" id="alignment4">
<property name="visible">True</property>
<property name="left_padding">45</property>
<property name="right_padding">45</property>
<child>
<widget class="GtkVBox" id="vbox14">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<child>
<placeholder/>
</child>
<child>
<widget class="GtkHBox" id="hbox19">
<property name="visible">True</property>
<child>
<widget class="GtkVBox" id="service_description_vbox">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<child>
<widget class="GtkLabel" id="service_description_label">
<property name="width_request">700</property>
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="wrap">True</property>
</widget>
<packing>
<property name="padding">5</property>
<property name="position">0</property>
</packing>
</child>
<child>
<widget class="GtkHBox" id="service_link_hbox">
<property name="visible">True</property>
<child>
<widget class="GtkLinkButton" id="service_link">
<property name="label" translatable="yes">Launch website</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="relief">none</property>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="padding">5</property>
<property name="position">1</property>
</packing>
</child>
<child>
<widget class="GtkHBox" id="basic_settings_box">
<property name="visible">True</property>
<property name="spacing">10</property>
<child>
<widget class="GtkTable" id="table1">
<property name="visible">True</property>
<property name="n_rows">3</property>
<property name="n_columns">2</property>
<property name="column_spacing">5</property>
<property name="row_spacing">4</property>
<child>
<widget class="GtkEntry" id="service_name_entry">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="max_length">99</property>
<property name="width_chars">40</property>
</widget>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="service_name_label">
<property name="visible">True</property>
<property name="xalign">1</property>
<property name="label" translatable="yes">Service name</property>
</widget>
<packing>
<property name="x_options">GTK_SHRINK | GTK_FILL</property>
</packing>
</child>
<child>
<widget class="GtkEntry" id="username_entry">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="max_length">99</property>
<property name="width_chars">40</property>
</widget>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
</packing>
</child>
<child>
<widget class="GtkEntry" id="password_entry">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="max_length">99</property>
<property name="visibility">False</property>
<property name="width_chars">40</property>
</widget>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="label9">
<property name="visible">True</property>
<property name="xalign">1</property>
<property name="label" translatable="yes">Username</property>
</widget>
<packing>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="x_options">GTK_SHRINK | GTK_FILL</property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="label10">
<property name="visible">True</property>
<property name="xalign">1</property>
<property name="label" translatable="yes">Password</property>
</widget>
<packing>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
<property name="x_options">GTK_SHRINK | GTK_FILL</property>
</packing>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="padding">5</property>
<property name="position">0</property>
</packing>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="padding">15</property>
<property name="position">3</property>
</packing>
</child>
<child>
<widget class="GtkExpander" id="server_settings_expander">
<property name="visible">True</property>
<property name="can_focus">True</property>
<child>
<widget class="GtkVBox" id="vbox4">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<child>
<widget class="GtkHBox" id="hbox5">
<property name="visible">True</property>
<child>
<widget class="GtkTable" id="server_settings_table">
<property name="visible">True</property>
<property name="n_rows">5</property>
<property name="n_columns">2</property>
<property name="column_spacing">5</property>
<property name="row_spacing">4</property>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="padding">5</property>
<property name="position">0</property>
</packing>
</child>
</widget>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<widget class="GtkHBox" id="hbox12">
<property name="visible">True</property>
<child>
<widget class="GtkButton" id="reset_server_btn">
<property name="label" translatable="yes">Reset original server settings</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</widget>
<packing>
<property name="expand">False</property>
<property name="padding">10</property>
<property name="pack_type">end</property>
<property name="position">0</property>
</packing>
</child>
</widget>
<packing>
<property name="padding">10</property>
<property name="position">1</property>
</packing>
</child>
</widget>
</child>
<child>
<widget class="GtkLabel" id="label4">
<property name="visible">True</property>
<property name="label" translatable="yes">Server settings</property>
</widget>
<packing>
<property name="type">label_item</property>
</packing>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="position">4</property>
</packing>
</child>
<child>
<widget class="GtkHBox" id="button_box">
<property name="visible">True</property>
<property name="spacing">10</property>
<child>
<widget class="GtkButton" id="delete_service_btn">
<property name="label" translatable="yes">Delete this service</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="pack_type">end</property>
<property name="position">2</property>
</packing>
</child>
<child>
<widget class="GtkButton" id="stop_using_service_btn">
<property name="label" translatable="yes">Stop using this service</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="pack_type">end</property>
<property name="position">1</property>
</packing>
</child>
<child>
<widget class="GtkButton" id="service_save_btn">
<property name="label" translatable="yes">Save and use this service</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</widget>
<packing>
<property name="expand">False</property>
<property name="pack_type">end</property>
<property name="position">1</property>
</packing>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="padding">10</property>
<property name="pack_type">end</property>
<property name="position">2</property>
</packing>
</child>
</widget>
</child>
</widget>
</child>
<child>
<widget class="GtkLabel" id="label14">
<property name="visible">True</property>
<property name="use_markup">True</property>
</widget>
<packing>
<property name="type">label_item</property>
</packing>
</child>
</widget>
<packing>
<property name="position">0</property>
</packing>
</child>
</widget>
</child>
</widget>
</glade-interface>

View file

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

View file

@ -132,6 +132,20 @@ class InvalidCall : public DBusSyncException
virtual std::string getName() const { return "org.syncevolution.InvalidCall";}
};
/**
* org.syncevolution.SourceUnusable
* CheckSource will use this when the source cannot be used for whatever reason
*/
class SourceUnusable : public DBusSyncException
{
public:
SourceUnusable(const std::string &file,
int line,
const std::string &error): DBusSyncException(file, line, error)
{}
virtual std::string getName() const { return "org.syncevolution.SourceUnusable";}
};
/**
* implement syncevolution exception handler
* to cover its default implementation
@ -1292,7 +1306,7 @@ void ReadOperations::checkSource(const std::string &sourceName)
syncSource->open();
}
} catch (...) {
throw std::runtime_error("The source '" + sourceName + "' configuration is not correct");
SE_THROW_EXCEPTION(SourceUnusable, "The source '" + sourceName + "' is not usable");
}
}
void ReadOperations::getDatabases(const string &sourceName, SourceDatabases_t &databases)