Merge branch 'origin/jku' (early part)
Conflicts: src/dbus/interfaces/syncevo-server-full.xml Conflict due to whitespace changes.
This commit is contained in:
commit
03351afe03
34 changed files with 5643 additions and 3800 deletions
|
@ -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",
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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 = \
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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) \
|
||||
|
|
|
@ -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>
|
|
@ -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
|
||||
|
|
|
@ -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/<source name>" 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/<source name>" 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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
gboolean
|
||||
syncevo_config_set_value (SyncevoConfig *config,
|
||||
const char *source,
|
||||
const char *key,
|
||||
const char *value)
|
||||
{
|
||||
gboolean changed;
|
||||
char *name;
|
||||
char *old_value;
|
||||
GHashTable *source_config;
|
||||
|
||||
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_config_foreach_source (SyncevoConfig *config,
|
||||
ConfigFunc func,
|
||||
gpointer userdata)
|
||||
{
|
||||
GHashTableIter iter;
|
||||
char *key;
|
||||
GHashTable *value;
|
||||
|
||||
g_hash_table_iter_init (&iter, config);
|
||||
while (g_hash_table_iter_next (&iter, (gpointer*)&key, (gpointer*)&value)) {
|
||||
|
||||
if (key && g_str_has_prefix (key, "source/")) {
|
||||
char *name;
|
||||
|
||||
name = key+7;
|
||||
func (name, value, userdata);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
syncevo_source_get (SyncevoSource *source, const char **name, int *mode)
|
||||
syncevo_config_free (SyncevoConfig *config)
|
||||
{
|
||||
g_return_if_fail (source);
|
||||
|
||||
if (name) {
|
||||
*name = g_value_get_string (g_value_array_get_nth (source, 0));
|
||||
}
|
||||
if (mode) {
|
||||
*mode = g_value_get_int (g_value_array_get_nth (source, 1));
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
syncevo_source_free (SyncevoSource *source)
|
||||
{
|
||||
if (source) {
|
||||
g_boxed_free (SYNCEVO_SOURCE_TYPE, source);
|
||||
}
|
||||
}
|
||||
|
||||
SyncevoOption*
|
||||
syncevo_option_new (char *ns, char *key, char *value)
|
||||
{
|
||||
GValue val = {0, };
|
||||
|
||||
g_value_init (&val, SYNCEVO_OPTION_TYPE);
|
||||
g_value_take_boxed (&val, dbus_g_type_specialized_construct (SYNCEVO_OPTION_TYPE));
|
||||
dbus_g_type_struct_set (&val, 0, ns, 1, key, 2, value, G_MAXUINT);
|
||||
|
||||
return (SyncevoOption*) g_value_get_boxed (&val);
|
||||
}
|
||||
|
||||
void
|
||||
syncevo_option_get (SyncevoOption *option, const char **ns, const char **key, const char **value)
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
syncevo_report_set_local (SyncevoReport *report,
|
||||
int adds, int updates, int removes, int rejects)
|
||||
{
|
||||
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;
|
||||
|
||||
char *name;
|
||||
|
||||
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));
|
||||
}
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
|
@ -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
792
src/dbus/syncevo-server.c
Normal 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
150
src/dbus/syncevo-server.h
Normal 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
688
src/dbus/syncevo-session.c
Normal 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
133
src/dbus/syncevo-session.h
Normal 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
|
255
src/dbus/test.c
255
src/dbus/test.c
|
@ -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;
|
||||
|
|
|
@ -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 >> $@
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
1402
src/gtk-ui/sync-config-widget.c
Normal file
1402
src/gtk-ui/sync-config-widget.c
Normal file
File diff suppressed because it is too large
Load diff
99
src/gtk-ui/sync-config-widget.h
Normal file
99
src/gtk-ui/sync-config-widget.h
Normal 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
|
|
@ -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 char*
|
||||
get_report_summary (int local_changes, int remote_changes, int local_rejects, int remote_rejects)
|
||||
{
|
||||
char *rejects, *changes, *msg;
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int
|
||||
source_config_compare (source_config *a, source_config *b)
|
||||
{
|
||||
g_assert (a && a->name);
|
||||
g_assert (b && b->name);
|
||||
|
||||
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_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);
|
||||
}
|
||||
|
||||
/* 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);
|
||||
|
||||
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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
VOID:STRING,BOXED
|
2603
src/gtk-ui/sync-ui.c
2603
src/gtk-ui/sync-ui.c
File diff suppressed because it is too large
Load diff
|
@ -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 ();
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
[D-BUS Service]
|
||||
Name=org.Moblin.SyncEvolution
|
||||
Name=org.syncevolution
|
||||
Exec=@libexecdir@/syncevo-dbus-server
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue