Imported Upstream version 1.4.1 upstream/1.4.1
authorPatrick Ohly <patrick.ohly@intel.com>
Fri, 23 May 2014 15:02:52 +0000 (15:02 +0000)
committerPatrick Ohly <patrick.ohly@intel.com>
Fri, 23 May 2014 15:02:52 +0000 (15:02 +0000)
37 files changed:
ChangeLog
Makefile.am
Makefile.in
NEWS
README
config.h.in
configure
configure.ac
src/backends/akonadi/AkonadiSyncSourceRegister.cpp
src/backends/akonadi/akonadisyncsource.cpp
src/backends/akonadi/akonadisyncsource.h
src/backends/akonadi/configure-sub.in
src/gdbusxx/gdbus-cxx-bridge.h
src/src.am
src/syncevo/GLibSupport.cpp
src/syncevo/GLibSupport.h
src/syncevo/SyncContext.cpp
src/syncevo/SyncSource.cpp
src/syncevo/configs/scripting/11calendar.xml
src/syncevo/eds_abi_wrapper.cpp
src/syncevo/eds_abi_wrapper.h
src/syncevo/icaltz-util.c [new file with mode: 0644]
src/syncevo/icaltz-util.h [new file with mode: 0644]
src/syncevo/syncevo.am
src/syncevo/util.h
src/testcases/eds_event.ics
src/testcases/eds_event.ics.apple.tem
src/testcases/eds_event.ics.funambol.tem
src/testcases/eds_event.ics.memotoo.tem
src/testcases/eds_event.ics.mobical.tem
src/testcases/eds_event.ics.oracle.tem
src/testcases/eds_event.ics.radicale.tem
test/ClientTest.cpp
test/IcalTest.cpp [new file with mode: 0644]
test/synccompare.pl
test/syncevo-http-server.py
test/testcases/eds_event.ics

index 52fef48..bce1780 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,312 @@
 # Generated by configure.  Do not edit.
 
+2014-03-31  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * NEWS:
+       * configure.ac:
+
+       autotools, NEWS: SyncEvolution 1.4.1
+
+2014-03-31  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/SyncSource.cpp:
+
+       EDS: only load one backend plugin of each kind
+
+2014-03-27  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * test/test-dbus.py:
+
+       D-Bus testing: fix testAutoSyncNoNetworkManager
+
+2014-03-27  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * test/test-dbus.py:
+
+       D-Bus testing: extra sanity checks before starting daemon
+
+2014-03-27  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * test/sys.supp:
+
+       testing: updated valgrind supressions for Debian Testing and
+       Ubuntu Saucy
+
+2014-03-27  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * test/runtests.py:
+
+       testing: enable dbug mode when running syncevo-http-server
+
+2014-03-27  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * test/syncevo-http-server.py:
+
+       http server: include time stamps in debug mode
+
+2014-03-26  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * test/runtests.py:
+
+       testing: fix akonadi.db creation problem
+
+2014-03-26  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * test/resultchecker.py:
+       * test/runtests.py:
+
+       testing: split up local testing
+
+2014-03-21  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * test/dbus-session.sh:
+
+       testing: create XDG_RUNTIME_DIR in dbus-session.sh
+
+2014-03-21  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * test/dbus-session.sh:
+
+       testing: fix empty DBUS_SESSION_BUS_PID in dbus-session.sh
+
+2014-03-21  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * test/dbus-session.sh:
+
+       testing: remove debug logging from dbus-session.sh
+
+2014-03-31  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * test/valgrindcheck.sh:
+
+       testing: use absolute path for valgrind log file
+
+2014-03-19  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/SyncContext.cpp:
+
+       syncing: remember original path to session dir
+
+2014-03-20  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * test/test-dbus.py:
+
+       D-Bus testing: fix testNoParent
+
+2014-03-19  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * test/test-dbus.py:
+
+       D-Bus testing: increase timeouts
+
+2014-03-19  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * test/testcases/eds_event.ics:
+       * test/testcases/eds_event.ics.Ovi.tem.patch:
+       * test/testcases/eds_event.ics.apple.tem.patch:
+       * test/testcases/eds_event.ics.exchange.tem.patch:
+       * test/testcases/eds_event.ics.googleactivesync.tem.patch:
+       * test/testcases/eds_event.ics.googlecalendar.tem.patch:
+       * test/testcases/eds_event.ics.nokia_7210c.tem.patch:
+       * test/testcases/eds_event.ics.radicale.tem.patch:
+
+       testing: remove LANGUAGE from ATTENDEE
+
+2014-03-19  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * test/synccompare.pl:
+
+       testing: ignore harmless data changes in Akonadi
+
+2014-03-20  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * test/runtests.py:
+
+       testing: ignore one more Akonadi 404 failure
+
+2014-03-19  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * test/runtests.py:
+
+       testing: ignore filekde::file_contact::testItems test failures
+
+2014-03-19  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/backends/akonadi/akonadisyncsource.cpp:
+       * src/backends/akonadi/akonadisyncsource.h:
+
+       Akonadi: support KDE Notes, enhanced "database" check
+
+2014-03-19  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/configs/scripting/11calendar.xml:
+
+       Akonadi: ensure that UID is set (FDO #74342)
+
+2014-03-19  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * test/ClientTest.cpp:
+
+       testing: disable "NoID" tests when source does not support
+       iCalendar 2.0 semantic
+
+2014-03-19  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/backends/akonadi/AkonadiSyncSourceRegister.cpp:
+
+       Akonadi: disable testing of iCalendar 2.0 semantic
+
+2014-03-19  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * test/dbus-session.sh:
+
+       testing: simplify Akonadi server startup
+
+2014-03-19  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * test/syncevo-http-server.py:
+
+       syncevo-http-server: remove D-Bus timeouts
+
+2014-03-13  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * test/wrappercheck.sh:
+
+       testing: optimize sleep 60 in wrapperchecks.h
+
+2014-03-13  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * test/runtests.py:
+
+       testing: more SyncEvolution client/server combinations
+
+2014-03-20  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * test/runtests.py:
+
+       testing: improved parallel testing of Akonadi
+
+2014-03-13  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * test/runtests.py:
+
+       testing: support parallel testing of Akonadi
+
+2014-03-13  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/backends/akonadi/akonadisyncsource.cpp:
+
+       Akonadi: avoid threading problem in HTTP server mode (FDO #75672)
+
+2014-03-13  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/GLibSupport.cpp:
+       * src/syncevo/GLibSupport.h:
+       * src/syncevo/util.h:
+
+       glib: adding GRunInMain() and GRunIsMain()
+
+2014-03-21  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/src.am:
+       * test/IcalTest.cpp:
+
+       testing: check that we get the right VTIMEZONE
+
+2014-03-19  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * configure.ac:
+       * src/src.am:
+       * src/syncevo/icaltz-util.c:
+       * src/syncevo/icaltz-util.h:
+       * src/syncevo/syncevo.am:
+
+       ical: workaround for libical 1.0 builtin timezone change
+
+2014-03-26  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/eds_abi_wrapper.cpp:
+
+       ical: support overriding icaltimezone_get_component() in compat
+       layer
+
+2014-03-19  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/eds_abi_wrapper.cpp:
+       * src/syncevo/eds_abi_wrapper.h:
+
+       ical compatibility: cover more symbols
+
+2014-03-20  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/icaltz-util.c:
+
+       ical: fix gcc 4.4 warning
+
+2014-03-19  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/icaltz-util.c:
+
+       ical: fix memory leak in case of read error
+
+2014-03-19  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/icaltz-util.c:
+       * src/syncevo/icaltz-util.h:
+
+       ical: enable icaltz-util executable
+
+2014-03-19  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/icaltz-util.c:
+
+       ical: unistd.h is needed for access()
+
+2014-03-19  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/icaltz-util.c:
+       * src/syncevo/icaltz-util.h:
+
+       ical: import icaltz-util
+
+2014-03-26  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/eds_abi_wrapper.cpp:
+
+       EDS: allow compat init before main()
+
+2014-03-13  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * test/evo.supp:
+       * test/sys.supp:
+
+       testing: ignore some more leaks
+
+2014-03-13  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/src.am:
+       * test/runtests.py:
+
+       testing: link client-test with original LDFLAGS
+
+2014-03-19  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * Makefile.am:
+
+       autotools: fix dist checking
+
+2014-03-02  Niels Ole Salscheider  <niels_ole@salscheider-online.de>
+
+       * src/backends/akonadi/configure-sub.in:
+
+       autotools: Add QtCore include path to KDEPIM_CFLAGS (FDO #75670)
+
+2014-02-24  Tino Mettler  <tino+debian@tikei.de>
+
+       * src/gdbusxx/gdbus-cxx-bridge.h:
+
+       GDBus GIO: include missing stdint.h
+
 2014-02-14  Patrick Ohly  <patrick.ohly@intel.com>
 
        * NEWS:
index 3e4ab3f..9ade4e2 100644 (file)
@@ -301,12 +301,12 @@ if ENABLE_EVOLUTION_COMPATIBILITY
 # (relevant in that case and for static builds) for dependencies on
 # problematic libraries and symbols
 #
-# Exclude *-2.so, these are EXTRA_BACKENDS for which other rules apply.
+# Exclude *-[0-9].so, these are EXTRA_BACKENDS for which other rules apply.
 #
 # ical_strdup is an exception because it is in SyncEvolution.
 all_local_installchecks += toplevel_so_check
 toplevel_so_check:
-       for i in `find $(DESTDIR)/$(libdir)/syncevolution $(DESTDIR)/$(libdir)/libsyncevo* $(DESTDIR)/$(libdir)/libsynthesis* -name *.so | grep -v -2.so` $(DESTDIR)/$(bindir)/syncevolution; \
+       for i in `find $(DESTDIR)/$(libdir)/syncevolution $(DESTDIR)/$(libdir)/libsyncevo* $(DESTDIR)/$(libdir)/libsynthesis* -name *.so | grep -v -e -[0-9].so` $(DESTDIR)/$(bindir)/syncevolution; \
        do \
          if objdump -T -C $$i | grep -v :: | grep '\*UND\*' | sort | grep -v -w ical_strdup | grep -e ical -e " e_"; then \
            echo "$$i should not depend on EDS, libical or libbluetooth"; \
index 355aa56..927b00f 100644 (file)
@@ -171,7 +171,7 @@ DIST_COMMON = README $(am__configure_deps) \
        INSTALL NEWS compile config.guess config.sub depcomp \
        install-sh ltmain.sh missing mkinstalldirs
 test_PROGRAMS = $(am__EXEEXT_10)
-bin_PROGRAMS = $(am__EXEEXT_4) $(am__append_79) $(am__append_83)
+bin_PROGRAMS = $(am__EXEEXT_4) $(am__append_81) $(am__append_85)
 libexec_PROGRAMS = src/syncevo-local-sync$(EXEEXT) $(am__EXEEXT_5)
 noinst_PROGRAMS = $(am__EXEEXT_6) $(am__EXEEXT_7) $(am__EXEEXT_8) \
        $(am__EXEEXT_9)
@@ -232,39 +232,44 @@ TESTS =
 @COND_CORE_TRUE@@ENABLE_ICAL_TRUE@  src/syncevo/icalstrdup.c \
 @COND_CORE_TRUE@@ENABLE_ICAL_TRUE@  src/syncevo/icalstrdup.h
 
-@COND_CORE_TRUE@@ENABLE_OBEX_TRUE@am__append_19 = \
+@COND_CORE_TRUE@@ENABLE_ICALTZ_UTIL_TRUE@am__append_19 = \
+@COND_CORE_TRUE@@ENABLE_ICALTZ_UTIL_TRUE@  src/syncevo/icaltz-util.c \
+@COND_CORE_TRUE@@ENABLE_ICALTZ_UTIL_TRUE@  src/syncevo/icaltz-util.h
+
+@COND_CORE_TRUE@@ENABLE_EVOLUTION_COMPATIBILITY_FALSE@@ENABLE_ICALTZ_UTIL_TRUE@am__append_20 = $(LIBICAL_LIBS)
+@COND_CORE_TRUE@@ENABLE_OBEX_TRUE@am__append_21 = \
 @COND_CORE_TRUE@@ENABLE_OBEX_TRUE@  src/syncevo/ObexTransportAgent.h \
 @COND_CORE_TRUE@@ENABLE_OBEX_TRUE@  src/syncevo/ObexTransportAgent.cpp
 
-@COND_CORE_TRUE@@ENABLE_OBEX_TRUE@am__append_20 = $(LIBOPENOBEX_LIBS)
-@COND_CORE_TRUE@@ENABLE_OBEX_TRUE@am__append_21 = $(LIBOPENOBEX_CFLAGS)
-@COND_CORE_TRUE@@ENABLE_BLUETOOTH_TRUE@@ENABLE_OBEX_TRUE@am__append_22 = $(BLUEZ_LIBS)
-@COND_CORE_TRUE@@ENABLE_BLUETOOTH_TRUE@@ENABLE_OBEX_TRUE@am__append_23 = $(BLUEZ_CFLAGS)
+@COND_CORE_TRUE@@ENABLE_OBEX_TRUE@am__append_22 = $(LIBOPENOBEX_LIBS)
+@COND_CORE_TRUE@@ENABLE_OBEX_TRUE@am__append_23 = $(LIBOPENOBEX_CFLAGS)
+@COND_CORE_TRUE@@ENABLE_BLUETOOTH_TRUE@@ENABLE_OBEX_TRUE@am__append_24 = $(BLUEZ_LIBS)
+@COND_CORE_TRUE@@ENABLE_BLUETOOTH_TRUE@@ENABLE_OBEX_TRUE@am__append_25 = $(BLUEZ_CFLAGS)
 
 #pkgconfigdir is defined in $(top_srcdir)/setup-variables.am
-@COND_CORE_TRUE@am__append_24 = src/syncevo/syncevolution.pc
-@COND_CORE_TRUE@am__append_25 = src/syncevo/syncevolution.pc
+@COND_CORE_TRUE@am__append_26 = src/syncevo/syncevolution.pc
+@COND_CORE_TRUE@am__append_27 = src/syncevo/syncevolution.pc
 
 # turn README.rst into a file with plain text strings for
 # "Synopsis" and "Usage"
-@COND_CORE_TRUE@am__append_26 = src/syncevo/SyncEvolutionXML.c \
+@COND_CORE_TRUE@am__append_28 = src/syncevo/SyncEvolutionXML.c \
 @COND_CORE_TRUE@       src/syncevo/CmdlineHelp.c \
 @COND_CORE_TRUE@       src/backends/webdav/syncevo-webdav-lookup
-@COND_CORE_TRUE@@ENABLE_MODULES_TRUE@am__append_27 = -ldl
-@COND_CORE_TRUE@am__append_28 = src/syncevo/GenSyncEvolutionXML
-@COND_CORE_TRUE@am__append_29 = src/syncevo/CmdlineHelp.c
-@COND_CORE_TRUE@am__append_30 = src/syncevo/readme2c.pl \
+@COND_CORE_TRUE@@ENABLE_MODULES_TRUE@am__append_29 = -ldl
+@COND_CORE_TRUE@am__append_30 = src/syncevo/GenSyncEvolutionXML
+@COND_CORE_TRUE@am__append_31 = src/syncevo/CmdlineHelp.c
+@COND_CORE_TRUE@am__append_32 = src/syncevo/readme2c.pl \
 @COND_CORE_TRUE@       src/syncevo/installcheck-local.sh \
 @COND_CORE_TRUE@       test/Algorithm/Diff.pm \
 @COND_CORE_TRUE@       test/syncevo-http-server.py \
 @COND_CORE_TRUE@       test/syncevo-phone-config.py \
 @COND_CORE_TRUE@       test/synccompare.pl test/log2html.py \
 @COND_CORE_TRUE@       test/run_src_client_test.sh
-@COND_CORE_TRUE@am__append_31 = src_syncevo_install_check_local
-@COND_CORE_TRUE@am__append_32 = -I$(top_srcdir)/src/syncevo \
+@COND_CORE_TRUE@am__append_33 = src_syncevo_install_check_local
+@COND_CORE_TRUE@am__append_34 = -I$(top_srcdir)/src/syncevo \
 @COND_CORE_TRUE@       $(addprefix -I$(top_srcdir)/,$(BACKENDS)) \
 @COND_CORE_TRUE@       -I$(SYNTHESIS_SUBDIR)
-@COND_CORE_TRUE@am__append_33 = $(src_backends_activesync_lib) \
+@COND_CORE_TRUE@am__append_35 = $(src_backends_activesync_lib) \
 @COND_CORE_TRUE@       $(src_backends_addressbook_lib) \
 @COND_CORE_TRUE@       $(src_backends_akonadi_lib) \
 @COND_CORE_TRUE@       $(src_backends_evolution_lib) \
@@ -280,7 +285,7 @@ TESTS =
 @COND_CORE_TRUE@       $(src_backends_sqlite_lib) \
 @COND_CORE_TRUE@       $(src_backends_webdav_lib) \
 @COND_CORE_TRUE@       $(src_backends_xmlrpc_lib)
-@COND_CORE_TRUE@@ENABLE_MODULES_FALSE@am__append_34 = $(src_backends_activesync_lib) \
+@COND_CORE_TRUE@@ENABLE_MODULES_FALSE@am__append_36 = $(src_backends_activesync_lib) \
 @COND_CORE_TRUE@@ENABLE_MODULES_FALSE@ $(src_backends_addressbook_lib) \
 @COND_CORE_TRUE@@ENABLE_MODULES_FALSE@ $(src_backends_akonadi_lib) \
 @COND_CORE_TRUE@@ENABLE_MODULES_FALSE@ $(src_backends_evolution_lib) \
@@ -296,67 +301,67 @@ TESTS =
 @COND_CORE_TRUE@@ENABLE_MODULES_FALSE@ $(src_backends_sqlite_lib) \
 @COND_CORE_TRUE@@ENABLE_MODULES_FALSE@ $(src_backends_webdav_lib) \
 @COND_CORE_TRUE@@ENABLE_MODULES_FALSE@ $(src_backends_xmlrpc_lib)
-@COND_CORE_TRUE@@ENABLE_ECAL_TRUE@am__append_35 = \
+@COND_CORE_TRUE@@ENABLE_ECAL_TRUE@am__append_37 = \
 @COND_CORE_TRUE@@ENABLE_ECAL_TRUE@  src/backends/evolution/e-cal-check-timezones.c \
 @COND_CORE_TRUE@@ENABLE_ECAL_TRUE@  src/backends/evolution/e-cal-check-timezones.h
 
-@COND_CORE_TRUE@@ENABLE_MODULES_TRUE@am__append_36 = \
+@COND_CORE_TRUE@@ENABLE_MODULES_TRUE@am__append_38 = \
 @COND_CORE_TRUE@@ENABLE_MODULES_TRUE@  src/backends/gnome/GNOMEPlatformRegister.cpp
 
-@COND_CORE_TRUE@@ENABLE_MODULES_TRUE@am__append_37 = \
+@COND_CORE_TRUE@@ENABLE_MODULES_TRUE@am__append_39 = \
 @COND_CORE_TRUE@@ENABLE_MODULES_TRUE@  src/backends/goa/GOARegister.cpp
 
-@COND_CORE_TRUE@@ENABLE_MODULES_TRUE@am__append_38 = \
+@COND_CORE_TRUE@@ENABLE_MODULES_TRUE@am__append_40 = \
 @COND_CORE_TRUE@@ENABLE_MODULES_TRUE@  src/backends/kde/KDEPlatformRegister.cpp
 
-@COND_CORE_TRUE@@USE_GSSO_TRUE@am__append_39 = src/backends/signon/providergsso.la
-@COND_CORE_TRUE@@USE_UOA_TRUE@am__append_40 = src/backends/signon/provideruoa.la
-@COND_CORE_TRUE@@ENABLE_MODULES_TRUE@am__append_41 = \
+@COND_CORE_TRUE@@USE_GSSO_TRUE@am__append_41 = src/backends/signon/providergsso.la
+@COND_CORE_TRUE@@USE_UOA_TRUE@am__append_42 = src/backends/signon/provideruoa.la
+@COND_CORE_TRUE@@ENABLE_MODULES_TRUE@am__append_43 = \
 @COND_CORE_TRUE@@ENABLE_MODULES_TRUE@  src/backends/signon/signonRegister.cpp
 
-@COND_CORE_TRUE@am__append_42 =  \
+@COND_CORE_TRUE@am__append_44 =  \
 @COND_CORE_TRUE@       src/backends/webdav/syncevo-webdav-lookup \
 @COND_CORE_TRUE@       src/synccompare
-@COND_CORE_TRUE@@NEON_COMPATIBILITY_TRUE@am__append_43 = webdav_so_check
-@COND_CORE_TRUE@@ENABLE_MODULES_TRUE@am__append_44 = $(DESTDIR)/$(src_backends_webdav_backenddir)/syncdav.so
-@COND_CORE_TRUE@am__append_45 = src/syncevolution
-@COND_CORE_FALSE@am__append_46 = -I$(top_srcdir)/$(SYNTHESIS_SUBDIR_INCLUDES)
-@COND_DOC_TRUE@am__append_47 = src/dbus/interfaces/syncevo-dbus-api-doc.html
-@COND_GUI_TRUE@am__append_48 = $(src_dbus_glib_lib)
-@COND_GUI_TRUE@am__append_49 = src/dbus/glib/syncevo-dbus.pc
-@COND_GUI_TRUE@am__append_50 = \
+@COND_CORE_TRUE@@NEON_COMPATIBILITY_TRUE@am__append_45 = webdav_so_check
+@COND_CORE_TRUE@@ENABLE_MODULES_TRUE@am__append_46 = $(DESTDIR)/$(src_backends_webdav_backenddir)/syncdav.so
+@COND_CORE_TRUE@am__append_47 = src/syncevolution
+@COND_CORE_FALSE@am__append_48 = -I$(top_srcdir)/$(SYNTHESIS_SUBDIR_INCLUDES)
+@COND_DOC_TRUE@am__append_49 = src/dbus/interfaces/syncevo-dbus-api-doc.html
+@COND_GUI_TRUE@am__append_50 = $(src_dbus_glib_lib)
+@COND_GUI_TRUE@am__append_51 = src/dbus/glib/syncevo-dbus.pc
+@COND_GUI_TRUE@am__append_52 = \
 @COND_GUI_TRUE@  src/dbus/glib/syncevo-dbus.pc.in \
 @COND_GUI_TRUE@  src/dbus/glib/syncevo-marshal.list \
 @COND_GUI_TRUE@  src/dbus/glib/README
 
 
 #pkgconfigdir is defined in $(top_srcdir)/setup-variables.am
-@COND_GUI_TRUE@am__append_51 = src/dbus/glib/syncevo-dbus.pc
-@COND_GUI_TRUE@am__append_52 = src/dbus/glib/test-syncevo-dbus
-@COND_GUI_TRUE@am__append_53 = $(src_dbus_glib_built_sources)
-@COND_GUI_TRUE@am__append_54 = $(src_dbus_glib_built_sources)
-@ENABLE_QT_DBUS_TRUE@am__append_55 = $(src_dbus_qt_libsyncevolution_qt_dbus_libraries)
-@ENABLE_QT_DBUS_TRUE@am__append_56 = $(src_dbus_qt_built_sources)
+@COND_GUI_TRUE@am__append_53 = src/dbus/glib/syncevo-dbus.pc
+@COND_GUI_TRUE@am__append_54 = src/dbus/glib/test-syncevo-dbus
+@COND_GUI_TRUE@am__append_55 = $(src_dbus_glib_built_sources)
+@COND_GUI_TRUE@am__append_56 = $(src_dbus_glib_built_sources)
 @ENABLE_QT_DBUS_TRUE@am__append_57 = $(src_dbus_qt_libsyncevolution_qt_dbus_libraries)
-@ENABLE_QT_DBUS_TRUE@am__append_58 = src/dbus/qt/Makefile.in
-@ENABLE_QT_DBUS_TRUE@am__append_59 = $(src_dbus_qt_built_sources) \
+@ENABLE_QT_DBUS_TRUE@am__append_58 = $(src_dbus_qt_built_sources)
+@ENABLE_QT_DBUS_TRUE@am__append_59 = $(src_dbus_qt_libsyncevolution_qt_dbus_libraries)
+@ENABLE_QT_DBUS_TRUE@am__append_60 = src/dbus/qt/Makefile.in
+@ENABLE_QT_DBUS_TRUE@am__append_61 = $(src_dbus_qt_built_sources) \
 @ENABLE_QT_DBUS_TRUE@  src/dbus/qt/stamp-server \
 @ENABLE_QT_DBUS_TRUE@  src/dbus/qt/stamp-session \
 @ENABLE_QT_DBUS_TRUE@  src/dbus/qt/stamp-connection
 
-@ENABLE_QT_DBUS_TRUE@am__append_60 = src/dbus/qt/syncevolution-qt-dbus.pc
-@ENABLE_QT_DBUS_TRUE@am__append_61 = \
+@ENABLE_QT_DBUS_TRUE@am__append_62 = src/dbus/qt/syncevolution-qt-dbus.pc
+@ENABLE_QT_DBUS_TRUE@am__append_63 = \
 @ENABLE_QT_DBUS_TRUE@  src/dbus/qt/syncevolution-qt-dbus.pc.in
 
 #pkgconfigdir is defined in $(top_srcdir)/setup-variables.am
-@ENABLE_QT_DBUS_TRUE@am__append_62 = src/dbus/qt/syncevolution-qt-dbus.pc
+@ENABLE_QT_DBUS_TRUE@am__append_64 = src/dbus/qt/syncevolution-qt-dbus.pc
 
 # Session helper: syncevo-dbus-helper 
-@COND_DBUS_TRUE@am__append_63 =  \
+@COND_DBUS_TRUE@am__append_65 =  \
 @COND_DBUS_TRUE@       src/dbus/server/libsyncevodbusserver.la \
 @COND_DBUS_TRUE@       src/dbus/server/libsyncevodbushelper.la
-@COND_DBUS_TRUE@am__append_64 = src/dbus/server/bluetooth_products.ini
-@COND_DBUS_PIM_TRUE@@COND_DBUS_TRUE@am__append_65 = \
+@COND_DBUS_TRUE@am__append_66 = src/dbus/server/bluetooth_products.ini
+@COND_DBUS_PIM_TRUE@@COND_DBUS_TRUE@am__append_67 = \
 @COND_DBUS_PIM_TRUE@@COND_DBUS_TRUE@  src/dbus/server/pim/view.cpp \
 @COND_DBUS_PIM_TRUE@@COND_DBUS_TRUE@  src/dbus/server/pim/full-view.cpp \
 @COND_DBUS_PIM_TRUE@@COND_DBUS_TRUE@  src/dbus/server/pim/filtered-view.cpp \
@@ -367,42 +372,42 @@ TESTS =
 @COND_DBUS_PIM_TRUE@@COND_DBUS_TRUE@  src/dbus/server/pim/folks.cpp \
 @COND_DBUS_PIM_TRUE@@COND_DBUS_TRUE@  src/dbus/server/pim/manager.cpp
 
-@COND_DBUS_PIM_TRUE@@COND_DBUS_TRUE@am__append_66 = \
+@COND_DBUS_PIM_TRUE@@COND_DBUS_TRUE@am__append_68 = \
 @COND_DBUS_PIM_TRUE@@COND_DBUS_TRUE@  src/dbus/server/pim/persona-details.h
 
-@COND_DBUS_PIM_TRUE@@COND_DBUS_TRUE@am__append_67 = \
+@COND_DBUS_PIM_TRUE@@COND_DBUS_TRUE@am__append_69 = \
 @COND_DBUS_PIM_TRUE@@COND_DBUS_TRUE@  src/dbus/server/pim/locale-factory-@DBUS_PIM_PLUGIN@.cpp
 
-@COND_DBUS_PIM_TRUE@@COND_DBUS_TRUE@am__append_68 = $(DBUS_PIM_PLUGIN_LDFLAGS)
-@COND_DBUS_PIM_TRUE@@COND_DBUS_TRUE@am__append_69 = $(FOLKS_LIBS) $(DBUS_PIM_PLUGIN_LIBS) $(PHONENUMBERS_LIBS)
-@COND_DBUS_PIM_TRUE@@COND_DBUS_TRUE@am__append_70 = $(FOLKS_CFLAGS) $(DBUS_PIM_PLUGIN_CFLAGS) $(PHONENUMBERS_CFLAGS) $(DLT_CFLAGS)
+@COND_DBUS_PIM_TRUE@@COND_DBUS_TRUE@am__append_70 = $(DBUS_PIM_PLUGIN_LDFLAGS)
+@COND_DBUS_PIM_TRUE@@COND_DBUS_TRUE@am__append_71 = $(FOLKS_LIBS) $(DBUS_PIM_PLUGIN_LIBS) $(PHONENUMBERS_LIBS)
+@COND_DBUS_PIM_TRUE@@COND_DBUS_TRUE@am__append_72 = $(FOLKS_CFLAGS) $(DBUS_PIM_PLUGIN_CFLAGS) $(PHONENUMBERS_CFLAGS) $(DLT_CFLAGS)
 
 # Need to list all plugins here and not include the active one in the regular
 # source list above, because "make dist" would only include the configured one.
-@COND_DBUS_TRUE@am__append_71 = \
+@COND_DBUS_TRUE@am__append_73 = \
 @COND_DBUS_TRUE@  src/dbus/server/pim/locale-factory-boost.cpp
 
 
 # Deal with .service, .desktop and startup script files.
-@COND_DBUS_TRUE@am__append_72 = \
+@COND_DBUS_TRUE@am__append_74 = \
 @COND_DBUS_TRUE@  $(src_dbus_server_service_files) \
 @COND_DBUS_TRUE@  $(src_dbus_server_desktop) \
 @COND_DBUS_TRUE@  $(src_dbus_server_script)
 
-@COND_DBUS_TRUE@am__append_73 = $(src_dbus_server_script)
-@COND_DBUS_PIM_TRUE@@COND_DBUS_TRUE@am__append_74 = \
+@COND_DBUS_TRUE@am__append_75 = $(src_dbus_server_script)
+@COND_DBUS_PIM_TRUE@@COND_DBUS_TRUE@am__append_76 = \
 @COND_DBUS_PIM_TRUE@@COND_DBUS_TRUE@  src/dbus/server/pim/org._01.pim.contacts.service.in
 
-@COND_DBUS_PIM_TRUE@@COND_DBUS_TRUE@@ENABLE_TESTING_TRUE@am__append_75 = \
+@COND_DBUS_PIM_TRUE@@COND_DBUS_TRUE@@ENABLE_TESTING_TRUE@am__append_77 = \
 @COND_DBUS_PIM_TRUE@@COND_DBUS_TRUE@@ENABLE_TESTING_TRUE@      src/dbus/server/pim/testpim.py \
 @COND_DBUS_PIM_TRUE@@COND_DBUS_TRUE@@ENABLE_TESTING_TRUE@      $(NOP)
 
-@COND_DBUS_TRUE@am__append_76 = \
+@COND_DBUS_TRUE@am__append_78 = \
 @COND_DBUS_TRUE@  $(src_dbus_server_service_files_in) \
 @COND_DBUS_TRUE@  $(src_dbus_server_script_in) \
 @COND_DBUS_TRUE@  $(src_dbus_server_desktop_in)
 
-@COND_GTK2_TRUE@@COND_GUI_TRUE@am__append_77 = src/gtk-ui/README \
+@COND_GTK2_TRUE@@COND_GUI_TRUE@am__append_79 = src/gtk-ui/README \
 @COND_GTK2_TRUE@@COND_GUI_TRUE@        $(src_gtk_ui_applications_in_files)
 
 # sync-ui: default GUI, could be plain GTK or Moblin UX
@@ -410,17 +415,17 @@ TESTS =
 # sync-ui-moblin: Moblin UX
 #
 # The later two are built when --enable-gui=all was used.
-@COND_GTK2_TRUE@@COND_GUI_TRUE@am__append_78 = \
+@COND_GTK2_TRUE@@COND_GUI_TRUE@am__append_80 = \
 @COND_GTK2_TRUE@@COND_GUI_TRUE@  src/gtk-ui/sync-ui \
 @COND_GTK2_TRUE@@COND_GUI_TRUE@  src/gtk-ui/sync-ui-gtk \
 @COND_GTK2_TRUE@@COND_GUI_TRUE@  src/gtk-ui/sync-ui-moblin
 
-@COND_GTK2_TRUE@@COND_GUI_TRUE@am__append_79 = @GUI_PROGRAMS@
-@COND_GTK2_TRUE@@COND_GUI_TRUE@am__append_80 = \
+@COND_GTK2_TRUE@@COND_GUI_TRUE@am__append_81 = @GUI_PROGRAMS@
+@COND_GTK2_TRUE@@COND_GUI_TRUE@am__append_82 = \
 @COND_GTK2_TRUE@@COND_GUI_TRUE@  src/gtk-ui/sync-moblin.desktop \
 @COND_GTK2_TRUE@@COND_GUI_TRUE@  $(src_gtk_ui_applications_generated)
 
-@COND_GTK2_FALSE@@COND_GUI_TRUE@am__append_81 = src/gtk3-ui/README \
+@COND_GTK2_FALSE@@COND_GUI_TRUE@am__append_83 = src/gtk3-ui/README \
 @COND_GTK2_FALSE@@COND_GUI_TRUE@       $(src_gtk3_ui_applications_in_files)
 
 # sync-ui: default GUI, could be plain GTK or Moblin UX
@@ -428,20 +433,20 @@ TESTS =
 # sync-ui-moblin: Moblin UX
 #
 # The later two are built when --enable-gui=all was used.
-@COND_GTK2_FALSE@@COND_GUI_TRUE@am__append_82 = \
+@COND_GTK2_FALSE@@COND_GUI_TRUE@am__append_84 = \
 @COND_GTK2_FALSE@@COND_GUI_TRUE@  src/gtk3-ui/sync-ui \
 @COND_GTK2_FALSE@@COND_GUI_TRUE@  src/gtk3-ui/sync-ui-gtk \
 @COND_GTK2_FALSE@@COND_GUI_TRUE@  src/gtk3-ui/sync-ui-moblin
 
-@COND_GTK2_FALSE@@COND_GUI_TRUE@am__append_83 = @GUI_PROGRAMS@
-@COND_GTK2_FALSE@@COND_GUI_TRUE@am__append_84 = \
+@COND_GTK2_FALSE@@COND_GUI_TRUE@am__append_85 = @GUI_PROGRAMS@
+@COND_GTK2_FALSE@@COND_GUI_TRUE@am__append_86 = \
 @COND_GTK2_FALSE@@COND_GUI_TRUE@  src/gtk3-ui/sync-moblin.desktop \
 @COND_GTK2_FALSE@@COND_GUI_TRUE@  $(src_gtk3_ui_applications_generated)
 
-@COND_DBUS_TRUE@am__append_85 = src/syncevo-http-server
+@COND_DBUS_TRUE@am__append_87 = src/syncevo-http-server
 # SYNCEVOLUTION_LDADD is defined in configure script.
-@ENABLE_MODULES_FALSE@am__append_86 = @SYNCSOURCES@
-@ENABLE_MODULES_FALSE@am__append_87 = @SYNCSOURCES@
+@ENABLE_MODULES_FALSE@am__append_88 = @SYNCSOURCES@
+@ENABLE_MODULES_FALSE@am__append_89 = @SYNCSOURCES@
 
 # The files which register backends have to be compiled into
 # "client-test" and "syncevolution" in order to pull in the
@@ -452,30 +457,36 @@ TESTS =
 # When using modules the registration is done inside the
 # module and the register file is unnecessary. However, they
 # still need to be included in "make dist".
-@ENABLE_MODULES_TRUE@am__append_88 = $(BACKEND_REGISTRIES)
-@ENABLE_MODULES_FALSE@am__append_89 = $(BACKEND_REGISTRIES)
-@COND_DBUS_TRUE@am__append_90 = $(gdbus_build_dir)/libgdbussyncevo.la
-@COND_DBUS_TRUE@am__append_91 = $(gdbus_build_dir)/libgdbussyncevo.la
+@ENABLE_MODULES_TRUE@am__append_90 = $(BACKEND_REGISTRIES)
+@ENABLE_MODULES_FALSE@am__append_91 = $(BACKEND_REGISTRIES)
+
+# Force inclusion of our own icaltz-util.o into binaries even though
+# we do not call the icaltzutil_fetch_timezone directly ourself.
+# That way it is there if or when libical needs it.
+@ENABLE_ICALTZ_UTIL_TRUE@am__append_92 = -Wl,-usyncevo_fetch_timezone
+@COND_DBUS_TRUE@am__append_93 = $(gdbus_build_dir)/libgdbussyncevo.la
+@COND_DBUS_TRUE@am__append_94 = $(gdbus_build_dir)/libgdbussyncevo.la
 
 # Do the linking here, as with all SyncEvolution executables.
 # Sources are compiled in dbus/server.
 # DBus Server
 
 # syncevo-dbus-server's helper binary
-@COND_DBUS_TRUE@am__append_92 = src/syncevo-dbus-server \
+@COND_DBUS_TRUE@am__append_95 = src/syncevo-dbus-server \
 @COND_DBUS_TRUE@       src/syncevo-dbus-helper
-@COND_DBUS_TRUE@am__append_93 = src/dbus/server/libsyncevodbushelper.la src/dbus/server/libsyncevodbusserver.la
+@COND_DBUS_TRUE@am__append_96 = src/dbus/server/libsyncevodbushelper.la src/dbus/server/libsyncevodbusserver.la
+@ENABLE_EVOLUTION_COMPATIBILITY_FALSE@am__append_97 = $(LIBICAL_LIBS)
 
 # distribute test system?
 # yes: install client-test and test files in testdir
-@ENABLE_TESTING_TRUE@am__append_94 = src/client-test
+@ENABLE_TESTING_TRUE@am__append_98 = src/client-test
 # The "all" dependency causes a rebuild even if the actual input files
 # haven't changed. If client-test is part of the regular targets built
 # by "all", then it must not depend on all!
-@ENABLE_TESTING_FALSE@am__append_95 = src/client-test
-@ENABLE_TESTING_FALSE@am__append_96 = $(CLIENT_LIB_TEST_FILES)
-@ENABLE_TESTING_FALSE@am__append_97 = all
-@COND_CORE_TRUE@am__append_98 = test/abort-redirect.cpp \
+@ENABLE_TESTING_FALSE@am__append_99 = src/client-test
+@ENABLE_TESTING_FALSE@am__append_100 = $(CLIENT_LIB_TEST_FILES)
+@ENABLE_TESTING_FALSE@am__append_101 = all
+@COND_CORE_TRUE@am__append_102 = test/abort-redirect.cpp \
 @COND_CORE_TRUE@       test/ClientTest.h test/ClientTestAssert.h \
 @COND_CORE_TRUE@       test/ClientTest.cpp test/client-test-main.cpp \
 @COND_CORE_TRUE@       test/test.h test/test.cpp test/COPYING \
@@ -499,9 +510,9 @@ TESTS =
 @COND_CORE_TRUE@       $(wildcard test/testcases/*.patch)
 
 # generic D-Bus client/server tests
-@COND_CORE_TRUE@@COND_DBUS_TRUE@am__append_99 = test/dbus-client-server
-@COND_CORE_TRUE@@COND_DBUS_TRUE@@ENABLE_UNIT_TESTS_TRUE@am__append_100 = test/test.cpp
-@COND_CORE_TRUE@@ENABLE_TESTING_TRUE@am__append_101 = \
+@COND_CORE_TRUE@@COND_DBUS_TRUE@am__append_103 = test/dbus-client-server
+@COND_CORE_TRUE@@COND_DBUS_TRUE@@ENABLE_UNIT_TESTS_TRUE@am__append_104 = test/test.cpp
+@COND_CORE_TRUE@@ENABLE_TESTING_TRUE@am__append_105 = \
 @COND_CORE_TRUE@@ENABLE_TESTING_TRUE@  test/__init__.py \
 @COND_CORE_TRUE@@ENABLE_TESTING_TRUE@  test/test-dbus.py \
 @COND_CORE_TRUE@@ENABLE_TESTING_TRUE@  test/testdbus.py \
@@ -512,13 +523,13 @@ TESTS =
 # uses the right SyncEvolution without depending on the PATH.
 # client-test should have been installed in testdir already as
 # normal executable, see src.am.
-@COND_CORE_TRUE@@ENABLE_TESTING_TRUE@am__append_102 = install-test-files
-@COND_CORE_TRUE@@ENABLE_TESTING_TRUE@am__append_103 = uninstall-test-files
-@COND_CORE_TRUE@@ENABLE_TESTING_TRUE@am__append_104 = \
+@COND_CORE_TRUE@@ENABLE_TESTING_TRUE@am__append_106 = install-test-files
+@COND_CORE_TRUE@@ENABLE_TESTING_TRUE@am__append_107 = uninstall-test-files
+@COND_CORE_TRUE@@ENABLE_TESTING_TRUE@am__append_108 = \
 @COND_CORE_TRUE@@ENABLE_TESTING_TRUE@  test/Makefile \
 @COND_CORE_TRUE@@ENABLE_TESTING_TRUE@  $(NOP)
 
-@COND_CORE_TRUE@@ENABLE_TESTING_TRUE@am__append_105 = \
+@COND_CORE_TRUE@@ENABLE_TESTING_TRUE@am__append_109 = \
 @COND_CORE_TRUE@@ENABLE_TESTING_TRUE@  test/test-dbus/templates/templates/clients/phone/nokia/S40/7210c.ini \
 @COND_CORE_TRUE@@ENABLE_TESTING_TRUE@  test/test-dbus/templates/templates/clients/SyncEvolution.ini \
 @COND_CORE_TRUE@@ENABLE_TESTING_TRUE@  test/test-dbus/auto-sync/config/syncevolution/.internal.ini \
@@ -564,29 +575,29 @@ TESTS =
 @COND_CORE_TRUE@@ENABLE_TESTING_TRUE@  test/test-dbus/reports/cache/syncevolution/dummy__test-2009-11-18-12-56/status.ini \
 @COND_CORE_TRUE@@ENABLE_TESTING_TRUE@  $(NOP)
 
-@COND_CORE_TRUE@am__append_106 = po
-@COND_CORE_TRUE@am__append_107 = README NEWS COPYING $(TEST_README_FILES) test/syncevo-http-server-logging.conf
-@COND_CORE_TRUE@am__append_108 = $(disted_docs)
-@COND_CORE_TRUE@am__append_109 = $(disted_docs)
-@COND_CORE_TRUE@@COND_HTML_README_TRUE@am__append_110 = README.html
+@COND_CORE_TRUE@am__append_110 = po
+@COND_CORE_TRUE@am__append_111 = README NEWS COPYING $(TEST_README_FILES) test/syncevo-http-server-logging.conf
+@COND_CORE_TRUE@am__append_112 = $(disted_docs)
+@COND_CORE_TRUE@am__append_113 = $(disted_docs)
+@COND_CORE_TRUE@@COND_HTML_README_TRUE@am__append_114 = README.html
 # do not distribute in tarball.
-@COND_CORE_TRUE@@COND_HTML_README_TRUE@am__append_111 = README.html
-@COND_CORE_TRUE@@COND_MAN_PAGES_TRUE@am__append_112 = syncevolution.1
+@COND_CORE_TRUE@@COND_HTML_README_TRUE@am__append_115 = README.html
+@COND_CORE_TRUE@@COND_MAN_PAGES_TRUE@am__append_116 = syncevolution.1
 
 # check .so (relevant for modular builds) and main syncevolution binary
 # (relevant in that case and for static builds) for dependencies on
 # problematic libraries and symbols
 #
-# Exclude *-2.so, these are EXTRA_BACKENDS for which other rules apply.
+# Exclude *-[0-9].so, these are EXTRA_BACKENDS for which other rules apply.
 #
 # ical_strdup is an exception because it is in SyncEvolution.
-@ENABLE_EVOLUTION_COMPATIBILITY_TRUE@am__append_113 = toplevel_so_check
+@ENABLE_EVOLUTION_COMPATIBILITY_TRUE@am__append_117 = toplevel_so_check
 # libneon is intentionally not linked against, to choose between
 # GNUTLS and OpenSSL at runtime.
 # Allow undefined references to libstdcxx. This happens when
 # adding backends compiled on more recent Linux distros into
 # the release archive.
-@NEON_COMPATIBILITY_TRUE@am__append_114 = -e 'symbol ne_.*syncdav.so' \
+@NEON_COMPATIBILITY_TRUE@am__append_118 = -e 'symbol ne_.*syncdav.so' \
 @NEON_COMPATIBILITY_TRUE@      -e '@GLIBCXX_[^ ]* used by'
 subdir = .
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
@@ -1314,13 +1325,14 @@ src_gnome_bluetooth_libgbtsyncevolution_la_LINK = $(LIBTOOL) \
 @ENABLE_GNOME_BLUETOOTH_PANEL_TRUE@    $(src_gnome_bluetoothdir)
 @COND_CORE_TRUE@@ENABLE_UNIT_TESTS_TRUE@am__DEPENDENCIES_4 =  \
 @COND_CORE_TRUE@@ENABLE_UNIT_TESTS_TRUE@       $(am__DEPENDENCIES_1)
-@COND_CORE_TRUE@@ENABLE_OBEX_TRUE@am__DEPENDENCIES_5 =  \
+@COND_CORE_TRUE@@ENABLE_EVOLUTION_COMPATIBILITY_FALSE@@ENABLE_ICALTZ_UTIL_TRUE@am__DEPENDENCIES_5 = $(am__DEPENDENCIES_1)
+@COND_CORE_TRUE@@ENABLE_OBEX_TRUE@am__DEPENDENCIES_6 =  \
 @COND_CORE_TRUE@@ENABLE_OBEX_TRUE@     $(am__DEPENDENCIES_1)
-@COND_CORE_TRUE@@ENABLE_BLUETOOTH_TRUE@@ENABLE_OBEX_TRUE@am__DEPENDENCIES_6 = $(am__DEPENDENCIES_1)
-@COND_CORE_TRUE@am__DEPENDENCIES_7 =  \
+@COND_CORE_TRUE@@ENABLE_BLUETOOTH_TRUE@@ENABLE_OBEX_TRUE@am__DEPENDENCIES_7 = $(am__DEPENDENCIES_1)
+@COND_CORE_TRUE@am__DEPENDENCIES_8 =  \
 @COND_CORE_TRUE@       $(gdbus_build_dir)/libgdbussyncevo.la \
 @COND_CORE_TRUE@       $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_5) \
-@COND_CORE_TRUE@       $(am__DEPENDENCIES_6)
+@COND_CORE_TRUE@       $(am__DEPENDENCIES_6) $(am__DEPENDENCIES_7)
 am__src_syncevo_libsyncevolution_la_SOURCES_DIST =  \
        src/syncevo/GeeSupport.h src/syncevo/GValueSupport.h \
        src/syncevo/EDSClient.h src/syncevo/EDSClient.cpp \
@@ -1377,11 +1389,13 @@ am__src_syncevo_libsyncevolution_la_SOURCES_DIST =  \
        src/syncevo/MapSyncSource.h src/syncevo/MapSyncSource.cpp \
        src/syncevo/TrackingSyncSource.h \
        src/syncevo/TrackingSyncSource.cpp src/syncevo/icalstrdup.c \
-       src/syncevo/icalstrdup.h src/syncevo/ObexTransportAgent.h \
+       src/syncevo/icalstrdup.h src/syncevo/icaltz-util.c \
+       src/syncevo/icaltz-util.h src/syncevo/ObexTransportAgent.h \
        src/syncevo/ObexTransportAgent.cpp
 @COND_CORE_TRUE@@ENABLE_ICAL_TRUE@am__objects_28 = src/syncevo/src_syncevo_libsyncevolution_la-icalstrdup.lo
-@COND_CORE_TRUE@@ENABLE_OBEX_TRUE@am__objects_29 = src/syncevo/src_syncevo_libsyncevolution_la-ObexTransportAgent.lo
-@COND_CORE_TRUE@am__objects_30 = src/syncevo/src_syncevo_libsyncevolution_la-EDSClient.lo \
+@COND_CORE_TRUE@@ENABLE_ICALTZ_UTIL_TRUE@am__objects_29 = src/syncevo/src_syncevo_libsyncevolution_la-icaltz-util.lo
+@COND_CORE_TRUE@@ENABLE_OBEX_TRUE@am__objects_30 = src/syncevo/src_syncevo_libsyncevolution_la-ObexTransportAgent.lo
+@COND_CORE_TRUE@am__objects_31 = src/syncevo/src_syncevo_libsyncevolution_la-EDSClient.lo \
 @COND_CORE_TRUE@       src/syncevo/src_syncevo_libsyncevolution_la-IdentityProvider.lo \
 @COND_CORE_TRUE@       src/syncevo/src_syncevo_libsyncevolution_la-ConfigFilter.lo \
 @COND_CORE_TRUE@       src/syncevo/src_syncevo_libsyncevolution_la-ConfigNode.lo \
@@ -1422,9 +1436,10 @@ am__src_syncevo_libsyncevolution_la_SOURCES_DIST =  \
 @COND_CORE_TRUE@       src/syncevo/src_syncevo_libsyncevolution_la-FileConfigTree.lo \
 @COND_CORE_TRUE@       src/syncevo/src_syncevo_libsyncevolution_la-MapSyncSource.lo \
 @COND_CORE_TRUE@       src/syncevo/src_syncevo_libsyncevolution_la-TrackingSyncSource.lo \
-@COND_CORE_TRUE@       $(am__objects_28) $(am__objects_29)
-@COND_CORE_TRUE@am_src_syncevo_libsyncevolution_la_OBJECTS =  \
+@COND_CORE_TRUE@       $(am__objects_28) $(am__objects_29) \
 @COND_CORE_TRUE@       $(am__objects_30)
+@COND_CORE_TRUE@am_src_syncevo_libsyncevolution_la_OBJECTS =  \
+@COND_CORE_TRUE@       $(am__objects_31)
 @COND_CORE_TRUE@nodist_src_syncevo_libsyncevolution_la_OBJECTS = src/syncevo/src_syncevo_libsyncevolution_la-SyncEvolutionXML.lo
 src_syncevo_libsyncevolution_la_OBJECTS =  \
        $(am_src_syncevo_libsyncevolution_la_OBJECTS) \
@@ -1458,8 +1473,8 @@ PROGRAMS = $(bin_PROGRAMS) $(libexec_PROGRAMS) $(noinst_PROGRAMS) \
 am_src_abort_redirect_OBJECTS =  \
        test/src_abort_redirect-abort-redirect.$(OBJEXT)
 src_abort_redirect_OBJECTS = $(am_src_abort_redirect_OBJECTS)
-am__DEPENDENCIES_8 = $(am__DEPENDENCIES_1)
-am__DEPENDENCIES_9 = $(am__DEPENDENCIES_8) \
+am__DEPENDENCIES_9 = $(am__DEPENDENCIES_1)
+am__DEPENDENCIES_10 = $(am__DEPENDENCIES_9) \
        src/syncevo/libsyncevolution.la $(am__DEPENDENCIES_1) \
        $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
        $(am__DEPENDENCIES_1)
@@ -1468,8 +1483,8 @@ src_abort_redirect_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
        $(src_abort_redirect_CXXFLAGS) $(CXXFLAGS) \
        $(src_abort_redirect_LDFLAGS) $(LDFLAGS) -o $@
 am__src_client_test_SOURCES_DIST = src/client-test-app.cpp \
-       test/ClientTest.cpp test/ClientTest.h test/ClientTestAssert.h \
-       test/client-test-main.cpp \
+       test/ClientTest.cpp test/IcalTest.cpp test/ClientTest.h \
+       test/ClientTestAssert.h test/client-test-main.cpp \
        src/backends/activesync/ActiveSyncSourceRegister.cpp \
        src/backends/addressbook/AddressBookSourceRegister.cpp \
        src/backends/akonadi/AkonadiSyncSourceRegister.cpp \
@@ -1487,7 +1502,7 @@ am__src_client_test_SOURCES_DIST = src/client-test-app.cpp \
        src/backends/sqlite/SQLiteContactSourceRegister.cpp \
        src/backends/webdav/WebDAVSourceRegister.cpp \
        src/backends/xmlrpc/XMLRPCSyncSourceRegister.cpp
-@COND_CORE_TRUE@am__objects_31 = src/backends/activesync/src_client_test-ActiveSyncSourceRegister.$(OBJEXT) \
+@COND_CORE_TRUE@am__objects_32 = src/backends/activesync/src_client_test-ActiveSyncSourceRegister.$(OBJEXT) \
 @COND_CORE_TRUE@       src/backends/addressbook/src_client_test-AddressBookSourceRegister.$(OBJEXT) \
 @COND_CORE_TRUE@       src/backends/akonadi/src_client_test-AkonadiSyncSourceRegister.$(OBJEXT) \
 @COND_CORE_TRUE@       src/backends/evolution/src_client_test-EvolutionCalendarSourceRegister.$(OBJEXT) \
@@ -1504,19 +1519,22 @@ am__src_client_test_SOURCES_DIST = src/client-test-app.cpp \
 @COND_CORE_TRUE@       src/backends/sqlite/src_client_test-SQLiteContactSourceRegister.$(OBJEXT) \
 @COND_CORE_TRUE@       src/backends/webdav/src_client_test-WebDAVSourceRegister.$(OBJEXT) \
 @COND_CORE_TRUE@       src/backends/xmlrpc/src_client_test-XMLRPCSyncSourceRegister.$(OBJEXT)
-@ENABLE_MODULES_FALSE@am__objects_32 = $(am__objects_31)
-am__objects_33 = $(am__objects_32)
+@ENABLE_MODULES_FALSE@am__objects_33 = $(am__objects_32)
+am__objects_34 = $(am__objects_33)
 am_src_client_test_OBJECTS =  \
        src/src_client_test-client-test-app.$(OBJEXT) \
        test/src_client_test-ClientTest.$(OBJEXT) \
+       test/src_client_test-IcalTest.$(OBJEXT) \
        test/src_client_test-client-test-main.$(OBJEXT) \
-       $(am__objects_33)
-am__objects_34 = $(am__objects_19)
-@ENABLE_TESTING_FALSE@am__objects_35 = $(am__objects_34)
+       $(am__objects_34)
+am__objects_35 = $(am__objects_19)
+@ENABLE_TESTING_FALSE@am__objects_36 = $(am__objects_35)
 nodist_src_client_test_OBJECTS = test/src_client_test-test.$(OBJEXT) \
-       $(am__objects_35)
+       $(am__objects_36)
 src_client_test_OBJECTS = $(am_src_client_test_OBJECTS) \
        $(nodist_src_client_test_OBJECTS)
+@ENABLE_EVOLUTION_COMPATIBILITY_FALSE@am__DEPENDENCIES_11 =  \
+@ENABLE_EVOLUTION_COMPATIBILITY_FALSE@ $(am__DEPENDENCIES_1)
 src_client_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
        $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
        $(src_client_test_CXXFLAGS) $(CXXFLAGS) \
@@ -1581,21 +1599,21 @@ am__src_gtk_ui_sync_ui_gtk_SOURCES_DIST = src/gtk-ui/main.c \
        src/gtk-ui/sync-config-widget.c \
        src/gtk-ui/sync-config-widget.h src/gtk-ui/gtkinfobar.c \
        src/gtk-ui/gtkinfobar.h
-@COND_GTK2_TRUE@@COND_GUI_TRUE@am__objects_36 = src/gtk-ui/src_gtk_ui_sync_ui_gtk-main.$(OBJEXT) \
+@COND_GTK2_TRUE@@COND_GUI_TRUE@am__objects_37 = src/gtk-ui/src_gtk_ui_sync_ui_gtk-main.$(OBJEXT) \
 @COND_GTK2_TRUE@@COND_GUI_TRUE@        src/gtk-ui/src_gtk_ui_sync_ui_gtk-sync-ui.$(OBJEXT) \
 @COND_GTK2_TRUE@@COND_GUI_TRUE@        src/gtk-ui/src_gtk_ui_sync_ui_gtk-sync-ui-config.$(OBJEXT) \
 @COND_GTK2_TRUE@@COND_GUI_TRUE@        src/gtk-ui/src_gtk_ui_sync_ui_gtk-mux-frame.$(OBJEXT) \
 @COND_GTK2_TRUE@@COND_GUI_TRUE@        src/gtk-ui/src_gtk_ui_sync_ui_gtk-sync-config-widget.$(OBJEXT) \
 @COND_GTK2_TRUE@@COND_GUI_TRUE@        src/gtk-ui/src_gtk_ui_sync_ui_gtk-gtkinfobar.$(OBJEXT)
 @COND_GTK2_TRUE@@COND_GUI_TRUE@am_src_gtk_ui_sync_ui_gtk_OBJECTS =  \
-@COND_GTK2_TRUE@@COND_GUI_TRUE@        $(am__objects_36)
+@COND_GTK2_TRUE@@COND_GUI_TRUE@        $(am__objects_37)
 src_gtk_ui_sync_ui_gtk_OBJECTS = $(am_src_gtk_ui_sync_ui_gtk_OBJECTS)
-@COND_GTK2_TRUE@@COND_GUI_TRUE@am__DEPENDENCIES_10 =  \
+@COND_GTK2_TRUE@@COND_GUI_TRUE@am__DEPENDENCIES_12 =  \
 @COND_GTK2_TRUE@@COND_GUI_TRUE@        $(am__DEPENDENCIES_1) \
 @COND_GTK2_TRUE@@COND_GUI_TRUE@        $(am__DEPENDENCIES_1) \
 @COND_GTK2_TRUE@@COND_GUI_TRUE@        $(top_builddir)/src/dbus/glib/libsyncevo-dbus.la
 @COND_GTK2_TRUE@@COND_GUI_TRUE@src_gtk_ui_sync_ui_gtk_DEPENDENCIES =  \
-@COND_GTK2_TRUE@@COND_GUI_TRUE@        $(am__DEPENDENCIES_10)
+@COND_GTK2_TRUE@@COND_GUI_TRUE@        $(am__DEPENDENCIES_12)
 src_gtk_ui_sync_ui_gtk_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
        $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
        $(src_gtk_ui_sync_ui_gtk_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
@@ -1607,18 +1625,18 @@ am__src_gtk_ui_sync_ui_moblin_SOURCES_DIST = src/gtk-ui/main.c \
        src/gtk-ui/sync-config-widget.c \
        src/gtk-ui/sync-config-widget.h src/gtk-ui/gtkinfobar.c \
        src/gtk-ui/gtkinfobar.h
-@COND_GTK2_TRUE@@COND_GUI_TRUE@am__objects_37 = src/gtk-ui/src_gtk_ui_sync_ui_moblin-main.$(OBJEXT) \
+@COND_GTK2_TRUE@@COND_GUI_TRUE@am__objects_38 = src/gtk-ui/src_gtk_ui_sync_ui_moblin-main.$(OBJEXT) \
 @COND_GTK2_TRUE@@COND_GUI_TRUE@        src/gtk-ui/src_gtk_ui_sync_ui_moblin-sync-ui.$(OBJEXT) \
 @COND_GTK2_TRUE@@COND_GUI_TRUE@        src/gtk-ui/src_gtk_ui_sync_ui_moblin-sync-ui-config.$(OBJEXT) \
 @COND_GTK2_TRUE@@COND_GUI_TRUE@        src/gtk-ui/src_gtk_ui_sync_ui_moblin-mux-frame.$(OBJEXT) \
 @COND_GTK2_TRUE@@COND_GUI_TRUE@        src/gtk-ui/src_gtk_ui_sync_ui_moblin-sync-config-widget.$(OBJEXT) \
 @COND_GTK2_TRUE@@COND_GUI_TRUE@        src/gtk-ui/src_gtk_ui_sync_ui_moblin-gtkinfobar.$(OBJEXT)
 @COND_GTK2_TRUE@@COND_GUI_TRUE@am_src_gtk_ui_sync_ui_moblin_OBJECTS =  \
-@COND_GTK2_TRUE@@COND_GUI_TRUE@        $(am__objects_37)
+@COND_GTK2_TRUE@@COND_GUI_TRUE@        $(am__objects_38)
 src_gtk_ui_sync_ui_moblin_OBJECTS =  \
        $(am_src_gtk_ui_sync_ui_moblin_OBJECTS)
 @COND_GTK2_TRUE@@COND_GUI_TRUE@src_gtk_ui_sync_ui_moblin_DEPENDENCIES =  \
-@COND_GTK2_TRUE@@COND_GUI_TRUE@        $(am__DEPENDENCIES_10)
+@COND_GTK2_TRUE@@COND_GUI_TRUE@        $(am__DEPENDENCIES_12)
 src_gtk_ui_sync_ui_moblin_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
        $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
        $(src_gtk_ui_sync_ui_moblin_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
@@ -1649,21 +1667,21 @@ am__src_gtk3_ui_sync_ui_gtk_SOURCES_DIST = src/gtk3-ui/main.c \
        src/gtk3-ui/mux-frame.c src/gtk3-ui/mux-frame.h \
        src/gtk3-ui/sync-config-widget.c \
        src/gtk3-ui/sync-config-widget.h
-@COND_GTK2_FALSE@@COND_GUI_TRUE@am__objects_38 = src/gtk3-ui/src_gtk3_ui_sync_ui_gtk-main.$(OBJEXT) \
+@COND_GTK2_FALSE@@COND_GUI_TRUE@am__objects_39 = src/gtk3-ui/src_gtk3_ui_sync_ui_gtk-main.$(OBJEXT) \
 @COND_GTK2_FALSE@@COND_GUI_TRUE@       src/gtk3-ui/src_gtk3_ui_sync_ui_gtk-sync-ui.$(OBJEXT) \
 @COND_GTK2_FALSE@@COND_GUI_TRUE@       src/gtk3-ui/src_gtk3_ui_sync_ui_gtk-sync-ui-config.$(OBJEXT) \
 @COND_GTK2_FALSE@@COND_GUI_TRUE@       src/gtk3-ui/src_gtk3_ui_sync_ui_gtk-mux-frame.$(OBJEXT) \
 @COND_GTK2_FALSE@@COND_GUI_TRUE@       src/gtk3-ui/src_gtk3_ui_sync_ui_gtk-sync-config-widget.$(OBJEXT)
 @COND_GTK2_FALSE@@COND_GUI_TRUE@am_src_gtk3_ui_sync_ui_gtk_OBJECTS =  \
-@COND_GTK2_FALSE@@COND_GUI_TRUE@       $(am__objects_38)
+@COND_GTK2_FALSE@@COND_GUI_TRUE@       $(am__objects_39)
 src_gtk3_ui_sync_ui_gtk_OBJECTS =  \
        $(am_src_gtk3_ui_sync_ui_gtk_OBJECTS)
-@COND_GTK2_FALSE@@COND_GUI_TRUE@am__DEPENDENCIES_11 =  \
+@COND_GTK2_FALSE@@COND_GUI_TRUE@am__DEPENDENCIES_13 =  \
 @COND_GTK2_FALSE@@COND_GUI_TRUE@       $(am__DEPENDENCIES_1) \
 @COND_GTK2_FALSE@@COND_GUI_TRUE@       $(am__DEPENDENCIES_1) \
 @COND_GTK2_FALSE@@COND_GUI_TRUE@       $(top_builddir)/src/dbus/glib/libsyncevo-dbus.la
 @COND_GTK2_FALSE@@COND_GUI_TRUE@src_gtk3_ui_sync_ui_gtk_DEPENDENCIES =  \
-@COND_GTK2_FALSE@@COND_GUI_TRUE@       $(am__DEPENDENCIES_11)
+@COND_GTK2_FALSE@@COND_GUI_TRUE@       $(am__DEPENDENCIES_13)
 src_gtk3_ui_sync_ui_gtk_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
        $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
        $(src_gtk3_ui_sync_ui_gtk_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
@@ -1674,17 +1692,17 @@ am__src_gtk3_ui_sync_ui_moblin_SOURCES_DIST = src/gtk3-ui/main.c \
        src/gtk3-ui/mux-frame.c src/gtk3-ui/mux-frame.h \
        src/gtk3-ui/sync-config-widget.c \
        src/gtk3-ui/sync-config-widget.h
-@COND_GTK2_FALSE@@COND_GUI_TRUE@am__objects_39 = src/gtk3-ui/src_gtk3_ui_sync_ui_moblin-main.$(OBJEXT) \
+@COND_GTK2_FALSE@@COND_GUI_TRUE@am__objects_40 = src/gtk3-ui/src_gtk3_ui_sync_ui_moblin-main.$(OBJEXT) \
 @COND_GTK2_FALSE@@COND_GUI_TRUE@       src/gtk3-ui/src_gtk3_ui_sync_ui_moblin-sync-ui.$(OBJEXT) \
 @COND_GTK2_FALSE@@COND_GUI_TRUE@       src/gtk3-ui/src_gtk3_ui_sync_ui_moblin-sync-ui-config.$(OBJEXT) \
 @COND_GTK2_FALSE@@COND_GUI_TRUE@       src/gtk3-ui/src_gtk3_ui_sync_ui_moblin-mux-frame.$(OBJEXT) \
 @COND_GTK2_FALSE@@COND_GUI_TRUE@       src/gtk3-ui/src_gtk3_ui_sync_ui_moblin-sync-config-widget.$(OBJEXT)
 @COND_GTK2_FALSE@@COND_GUI_TRUE@am_src_gtk3_ui_sync_ui_moblin_OBJECTS =  \
-@COND_GTK2_FALSE@@COND_GUI_TRUE@       $(am__objects_39)
+@COND_GTK2_FALSE@@COND_GUI_TRUE@       $(am__objects_40)
 src_gtk3_ui_sync_ui_moblin_OBJECTS =  \
        $(am_src_gtk3_ui_sync_ui_moblin_OBJECTS)
 @COND_GTK2_FALSE@@COND_GUI_TRUE@src_gtk3_ui_sync_ui_moblin_DEPENDENCIES =  \
-@COND_GTK2_FALSE@@COND_GUI_TRUE@       $(am__DEPENDENCIES_11)
+@COND_GTK2_FALSE@@COND_GUI_TRUE@       $(am__DEPENDENCIES_13)
 src_gtk3_ui_sync_ui_moblin_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
        $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
        $(src_gtk3_ui_sync_ui_moblin_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
@@ -1707,7 +1725,7 @@ am__src_syncevo_dbus_helper_SOURCES_DIST =  \
        src/backends/sqlite/SQLiteContactSourceRegister.cpp \
        src/backends/webdav/WebDAVSourceRegister.cpp \
        src/backends/xmlrpc/XMLRPCSyncSourceRegister.cpp
-@COND_CORE_TRUE@am__objects_40 = src/backends/activesync/src_syncevo_dbus_helper-ActiveSyncSourceRegister.$(OBJEXT) \
+@COND_CORE_TRUE@am__objects_41 = src/backends/activesync/src_syncevo_dbus_helper-ActiveSyncSourceRegister.$(OBJEXT) \
 @COND_CORE_TRUE@       src/backends/addressbook/src_syncevo_dbus_helper-AddressBookSourceRegister.$(OBJEXT) \
 @COND_CORE_TRUE@       src/backends/akonadi/src_syncevo_dbus_helper-AkonadiSyncSourceRegister.$(OBJEXT) \
 @COND_CORE_TRUE@       src/backends/evolution/src_syncevo_dbus_helper-EvolutionCalendarSourceRegister.$(OBJEXT) \
@@ -1724,10 +1742,10 @@ am__src_syncevo_dbus_helper_SOURCES_DIST =  \
 @COND_CORE_TRUE@       src/backends/sqlite/src_syncevo_dbus_helper-SQLiteContactSourceRegister.$(OBJEXT) \
 @COND_CORE_TRUE@       src/backends/webdav/src_syncevo_dbus_helper-WebDAVSourceRegister.$(OBJEXT) \
 @COND_CORE_TRUE@       src/backends/xmlrpc/src_syncevo_dbus_helper-XMLRPCSyncSourceRegister.$(OBJEXT)
-@ENABLE_MODULES_FALSE@am__objects_41 = $(am__objects_40)
-am__objects_42 = $(am__objects_41)
+@ENABLE_MODULES_FALSE@am__objects_42 = $(am__objects_41)
+am__objects_43 = $(am__objects_42)
 @COND_DBUS_TRUE@am_src_syncevo_dbus_helper_OBJECTS =  \
-@COND_DBUS_TRUE@       $(am__objects_42)
+@COND_DBUS_TRUE@       $(am__objects_43)
 @COND_DBUS_TRUE@@ENABLE_UNIT_TESTS_TRUE@nodist_src_syncevo_dbus_helper_OBJECTS = test/src_syncevo_dbus_helper-test.$(OBJEXT)
 src_syncevo_dbus_helper_OBJECTS =  \
        $(am_src_syncevo_dbus_helper_OBJECTS) \
@@ -1754,7 +1772,7 @@ am__src_syncevo_dbus_server_SOURCES_DIST =  \
        src/backends/sqlite/SQLiteContactSourceRegister.cpp \
        src/backends/webdav/WebDAVSourceRegister.cpp \
        src/backends/xmlrpc/XMLRPCSyncSourceRegister.cpp
-@COND_CORE_TRUE@am__objects_43 = src/backends/activesync/src_syncevo_dbus_server-ActiveSyncSourceRegister.$(OBJEXT) \
+@COND_CORE_TRUE@am__objects_44 = src/backends/activesync/src_syncevo_dbus_server-ActiveSyncSourceRegister.$(OBJEXT) \
 @COND_CORE_TRUE@       src/backends/addressbook/src_syncevo_dbus_server-AddressBookSourceRegister.$(OBJEXT) \
 @COND_CORE_TRUE@       src/backends/akonadi/src_syncevo_dbus_server-AkonadiSyncSourceRegister.$(OBJEXT) \
 @COND_CORE_TRUE@       src/backends/evolution/src_syncevo_dbus_server-EvolutionCalendarSourceRegister.$(OBJEXT) \
@@ -1771,10 +1789,10 @@ am__src_syncevo_dbus_server_SOURCES_DIST =  \
 @COND_CORE_TRUE@       src/backends/sqlite/src_syncevo_dbus_server-SQLiteContactSourceRegister.$(OBJEXT) \
 @COND_CORE_TRUE@       src/backends/webdav/src_syncevo_dbus_server-WebDAVSourceRegister.$(OBJEXT) \
 @COND_CORE_TRUE@       src/backends/xmlrpc/src_syncevo_dbus_server-XMLRPCSyncSourceRegister.$(OBJEXT)
-@ENABLE_MODULES_FALSE@am__objects_44 = $(am__objects_43)
-am__objects_45 = $(am__objects_44)
+@ENABLE_MODULES_FALSE@am__objects_45 = $(am__objects_44)
+am__objects_46 = $(am__objects_45)
 @COND_DBUS_TRUE@am_src_syncevo_dbus_server_OBJECTS =  \
-@COND_DBUS_TRUE@       $(am__objects_45)
+@COND_DBUS_TRUE@       $(am__objects_46)
 @COND_DBUS_TRUE@@ENABLE_UNIT_TESTS_TRUE@nodist_src_syncevo_dbus_server_OBJECTS = test/src_syncevo_dbus_server-test.$(OBJEXT)
 src_syncevo_dbus_server_OBJECTS =  \
        $(am_src_syncevo_dbus_server_OBJECTS) \
@@ -1801,7 +1819,7 @@ am__src_syncevo_local_sync_SOURCES_DIST = src/syncevo-local-sync.cpp \
        src/backends/sqlite/SQLiteContactSourceRegister.cpp \
        src/backends/webdav/WebDAVSourceRegister.cpp \
        src/backends/xmlrpc/XMLRPCSyncSourceRegister.cpp
-@COND_CORE_TRUE@am__objects_46 = src/backends/activesync/src_syncevo_local_sync-ActiveSyncSourceRegister.$(OBJEXT) \
+@COND_CORE_TRUE@am__objects_47 = src/backends/activesync/src_syncevo_local_sync-ActiveSyncSourceRegister.$(OBJEXT) \
 @COND_CORE_TRUE@       src/backends/addressbook/src_syncevo_local_sync-AddressBookSourceRegister.$(OBJEXT) \
 @COND_CORE_TRUE@       src/backends/akonadi/src_syncevo_local_sync-AkonadiSyncSourceRegister.$(OBJEXT) \
 @COND_CORE_TRUE@       src/backends/evolution/src_syncevo_local_sync-EvolutionCalendarSourceRegister.$(OBJEXT) \
@@ -1818,11 +1836,11 @@ am__src_syncevo_local_sync_SOURCES_DIST = src/syncevo-local-sync.cpp \
 @COND_CORE_TRUE@       src/backends/sqlite/src_syncevo_local_sync-SQLiteContactSourceRegister.$(OBJEXT) \
 @COND_CORE_TRUE@       src/backends/webdav/src_syncevo_local_sync-WebDAVSourceRegister.$(OBJEXT) \
 @COND_CORE_TRUE@       src/backends/xmlrpc/src_syncevo_local_sync-XMLRPCSyncSourceRegister.$(OBJEXT)
-@ENABLE_MODULES_FALSE@am__objects_47 = $(am__objects_46)
-am__objects_48 = $(am__objects_47)
+@ENABLE_MODULES_FALSE@am__objects_48 = $(am__objects_47)
+am__objects_49 = $(am__objects_48)
 am_src_syncevo_local_sync_OBJECTS =  \
        src/src_syncevo_local_sync-syncevo-local-sync.$(OBJEXT) \
-       $(am__objects_48)
+       $(am__objects_49)
 @ENABLE_UNIT_TESTS_TRUE@nodist_src_syncevo_local_sync_OBJECTS = test/src_syncevo_local_sync-test.$(OBJEXT)
 src_syncevo_local_sync_OBJECTS = $(am_src_syncevo_local_sync_OBJECTS) \
        $(nodist_src_syncevo_local_sync_OBJECTS)
@@ -1848,7 +1866,7 @@ am__src_syncevolution_SOURCES_DIST = src/syncevolution.cpp \
        src/backends/sqlite/SQLiteContactSourceRegister.cpp \
        src/backends/webdav/WebDAVSourceRegister.cpp \
        src/backends/xmlrpc/XMLRPCSyncSourceRegister.cpp
-@COND_CORE_TRUE@am__objects_49 = src/backends/activesync/src_syncevolution-ActiveSyncSourceRegister.$(OBJEXT) \
+@COND_CORE_TRUE@am__objects_50 = src/backends/activesync/src_syncevolution-ActiveSyncSourceRegister.$(OBJEXT) \
 @COND_CORE_TRUE@       src/backends/addressbook/src_syncevolution-AddressBookSourceRegister.$(OBJEXT) \
 @COND_CORE_TRUE@       src/backends/akonadi/src_syncevolution-AkonadiSyncSourceRegister.$(OBJEXT) \
 @COND_CORE_TRUE@       src/backends/evolution/src_syncevolution-EvolutionCalendarSourceRegister.$(OBJEXT) \
@@ -1865,11 +1883,11 @@ am__src_syncevolution_SOURCES_DIST = src/syncevolution.cpp \
 @COND_CORE_TRUE@       src/backends/sqlite/src_syncevolution-SQLiteContactSourceRegister.$(OBJEXT) \
 @COND_CORE_TRUE@       src/backends/webdav/src_syncevolution-WebDAVSourceRegister.$(OBJEXT) \
 @COND_CORE_TRUE@       src/backends/xmlrpc/src_syncevolution-XMLRPCSyncSourceRegister.$(OBJEXT)
-@ENABLE_MODULES_FALSE@am__objects_50 = $(am__objects_49)
-am__objects_51 = $(am__objects_50)
+@ENABLE_MODULES_FALSE@am__objects_51 = $(am__objects_50)
+am__objects_52 = $(am__objects_51)
 am_src_syncevolution_OBJECTS =  \
        src/src_syncevolution-syncevolution.$(OBJEXT) \
-       $(am__objects_51)
+       $(am__objects_52)
 @ENABLE_UNIT_TESTS_TRUE@nodist_src_syncevolution_OBJECTS =  \
 @ENABLE_UNIT_TESTS_TRUE@       test/src_syncevolution-test.$(OBJEXT)
 src_syncevolution_OBJECTS = $(am_src_syncevolution_OBJECTS) \
@@ -1880,9 +1898,9 @@ src_syncevolution_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
        $(src_syncevolution_LDFLAGS) $(LDFLAGS) -o $@
 am__test_dbus_client_server_SOURCES_DIST =  \
        test/dbus-client-server.cpp test/test.cpp
-@COND_CORE_TRUE@@COND_DBUS_TRUE@@ENABLE_UNIT_TESTS_TRUE@am__objects_52 = test/test_dbus_client_server-test.$(OBJEXT)
+@COND_CORE_TRUE@@COND_DBUS_TRUE@@ENABLE_UNIT_TESTS_TRUE@am__objects_53 = test/test_dbus_client_server-test.$(OBJEXT)
 @COND_CORE_TRUE@@COND_DBUS_TRUE@am_test_dbus_client_server_OBJECTS = test/test_dbus_client_server-dbus-client-server.$(OBJEXT) \
-@COND_CORE_TRUE@@COND_DBUS_TRUE@       $(am__objects_52)
+@COND_CORE_TRUE@@COND_DBUS_TRUE@       $(am__objects_53)
 test_dbus_client_server_OBJECTS =  \
        $(am_test_dbus_client_server_OBJECTS)
 test_dbus_client_server_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
@@ -2523,7 +2541,7 @@ STABLE_VERSION = @STABLE_VERSION@
 STRIP = @STRIP@
 SYNCEVOLUTION_CFLAGS = @SYNCEVOLUTION_CFLAGS@
 SYNCEVOLUTION_CXXFLAGS = @SYNCEVOLUTION_CXXFLAGS@
-SYNCEVOLUTION_LDADD = @SYNCEVOLUTION_LDADD@ $(am__append_86)
+SYNCEVOLUTION_LDADD = @SYNCEVOLUTION_LDADD@ $(am__append_88)
 SYNCEVOLUTION_LIBS = @SYNCEVOLUTION_LIBS@
 SYNCEVOLUTION_LOCALEDIR = @SYNCEVOLUTION_LOCALEDIR@
 SYNCEVO_DBUS_SERVER_ARGS = @SYNCEVO_DBUS_SERVER_ARGS@
@@ -2613,65 +2631,65 @@ top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 
 # clean variables
-CLEANFILES = $(am__append_26) $(src_dbus_interfaces_built_sources) \
-       src/dbus/interfaces/.stamp $(NONE) $(am__append_54) \
-       $(am__append_59) $(am__append_72) $(am__append_80) \
-       $(am__append_84) src/libstdc++.a src/client-test \
+CLEANFILES = $(am__append_28) $(src_dbus_interfaces_built_sources) \
+       src/dbus/interfaces/.stamp $(NONE) $(am__append_56) \
+       $(am__append_61) $(am__append_74) $(am__append_82) \
+       $(am__append_86) src/libstdc++.a src/client-test \
        $(CLIENT_LIB_TEST_FILES) src/syncevo-http-server \
        src/syncevo-phone-config src/synclog2html \
        src/ClientTest.cpp.html src/abort-redirect.log \
        README.patched.rst syncevolution.1 README README.html
-DISTCLEANFILES = $(am__append_25) $(am__append_49) $(am__append_60) \
+DISTCLEANFILES = $(am__append_27) $(am__append_51) $(am__append_62) \
        src/synccompare src/synthesis-includes/Makefile
-MAINTAINERCLEANFILES = $(am__append_6) $(am__append_58) Makefile.in \
+MAINTAINERCLEANFILES = $(am__append_6) $(am__append_60) Makefile.in \
        config.h.in config.guess config.sub configure depcomp \
        install-sh ltmain.sh missing mkinstalldirs
-MOSTLYCLEANFILES = $(am__append_33) $(am__append_57)
+MOSTLYCLEANFILES = $(am__append_35) $(am__append_59)
 
 # standard arch dependent pkg-config dir
 pkgconfigdir = $(libdir)/pkgconfig
-pkgconfig_DATA = $(am__append_24) $(am__append_51) $(am__append_62)
+pkgconfig_DATA = $(am__append_26) $(am__append_53) $(am__append_64)
 
 # Install test suite (client-test, test-dbus.py, testpim.py, etc.).
 testparentdir = $(libdir)/syncevolution
 # Must end in "/test" so that we can use nobase_testparent_DATA=test/...
 testdir = $(testparentdir)/test
-test_DATA = $(am__append_104)
+test_DATA = $(am__append_108)
 nobase_test_DATA = 
-test_SCRIPTS = $(am__append_75) $(am__append_101)
-nobase_testparent_DATA = $(am__append_105)
+test_SCRIPTS = $(am__append_77) $(am__append_105)
+nobase_testparent_DATA = $(am__append_109)
 
 # standard variables with standard prefixes
-dist_doc_DATA = $(am__append_109)
+dist_doc_DATA = $(am__append_113)
 dist_noinst_DATA = $(am__append_9) $(am__append_14) \
        src/dbus/interfaces/spec-strip-docs.xsl \
        src/dbus/interfaces/spec-to-docbook.xsl \
        src/dbus/interfaces/syncevo-connection-full.xml \
        src/dbus/interfaces/syncevo-server-full.xml \
        src/dbus/interfaces/syncevo-session-full.xml \
-       src/dbus/interfaces/README $(am__append_50) $(am__append_61) \
-       $(am__append_76) $(am__append_77) $(am__append_81) \
+       src/dbus/interfaces/README $(am__append_52) $(am__append_63) \
+       $(am__append_78) $(am__append_79) $(am__append_83) \
        src/shlibs.local src/synthesis-includes/Makefile.am \
-       src/synthesis-includes/Makefile.in $(am__append_88) \
-       $(am__append_98) HACKING LICENSE.txt LICENSE.LGPL-21 \
+       src/synthesis-includes/Makefile.in $(am__append_90) \
+       $(am__append_102) HACKING LICENSE.txt LICENSE.LGPL-21 \
        README.rst description autogen.sh Doxyfile po/LINGUAS.README
-dist_pkgdata_DATA = $(am__append_64)
-doc_DATA = $(am__append_47) $(am__append_111)
+dist_pkgdata_DATA = $(am__append_66)
+doc_DATA = $(am__append_49) $(am__append_115)
 
 # generate syntax-highlighted version of ClientTest.cpp for HTML
 # version of .log test results
 nodist_noinst_DATA = src/ClientTest.cpp.html
 lib_LTLIBRARIES = $(am__append_4) $(am__append_10) $(am__append_17) \
-       $(am__append_48) $(am__append_55)
-noinst_LTLIBRARIES = $(am__append_5) $(am__append_11) $(am__append_34) \
-       $(am__append_63)
+       $(am__append_50) $(am__append_57)
+noinst_LTLIBRARIES = $(am__append_5) $(am__append_11) $(am__append_36) \
+       $(am__append_65)
 
 # helper script for testing
-bin_SCRIPTS = $(am__append_42) src/synclog2html
+bin_SCRIPTS = $(am__append_44) src/synclog2html
 dist_noinst_SCRIPTS = build/gen-git-version.sh build/source2html.py \
-       $(am__append_30)
-libexec_SCRIPTS = $(am__append_73)
-nodist_bin_SCRIPTS = $(am__append_85) src/syncevo-phone-config
+       $(am__append_32)
+libexec_SCRIPTS = $(am__append_75)
+nodist_bin_SCRIPTS = $(am__append_87) src/syncevo-phone-config
 
 # other
 
@@ -2684,16 +2702,17 @@ nodist_bin_SCRIPTS = $(am__append_85) src/syncevo-phone-config
 # found in a parent directory. However, these files are needed
 # later on during the recursive libsynthesis configure+make.
 all_dist_hooks = src_dist_hook dot_dist_hook
-all_install_exec_hooks = $(am__append_102)
-all_uninstall_hooks = $(am__append_103)
+all_install_exec_hooks = $(am__append_106)
+all_uninstall_hooks = $(am__append_107)
 
 # Check that no executable or shared object depends on symbols in
 # libraries that it does not link against. Unnecessarily linking
 # against libs is okay, that can be caught and fixed by
 # -Wl,--as-needed. Depends on dpkg-shlibdeps, skipped if that is
 # not available.
-all_local_installchecks = $(am__append_31) $(am__append_43) \
-       $(am__append_113) toplevel_link_check
+all_local_installchecks = $(am__append_33) $(am__append_45) \
+       $(am__append_117) toplevel_link_check
+
 # These dependencies are intentionally a bit too broad:
 # they ensure that all files are in place to *run* client-test.
 
@@ -2732,11 +2751,11 @@ all_local_installchecks = $(am__append_31) $(am__append_43) \
 # Build "html" inside the build dir, using source files
 # from the SyncEvolution source directory and (if built)
 # the installed client-api.build directory.
-all_phonies = $(am__append_28) $(TEST_FILES_GENERATED) testcase2patch \
+all_phonies = $(am__append_30) $(TEST_FILES_GENERATED) testcase2patch \
        src/templates test valgrind checkinstall/dist/$(distdir) \
        clean_dist doc clean-html
-BUILT_SOURCES = $(am__append_29) $(src_dbus_interfaces_built_sources) \
-       $(am__append_53) $(am__append_56)
+BUILT_SOURCES = $(am__append_31) $(src_dbus_interfaces_built_sources) \
+       $(am__append_55) $(am__append_58)
 DIST_SUBDIRS = po
 EXTRA_DIST = build/export-foreign-git.sh build/export-gdbus.sh \
        build/export-synthesis-xml.sh build/gen-backends-am.sh \
@@ -2751,8 +2770,8 @@ EXTRA_DIST = build/export-foreign-git.sh build/export-gdbus.sh \
        src/dbus/server/pim/test-dbus/db-active/config/syncevolution/pim-manager.ini \
        src/dbus/server/pim/test-dbus/simple-sort/config/syncevolution/pim-manager.ini \
        src/dbus/server/pim/test-dbus/first-last-sort/config/syncevolution/pim-manager.ini \
-       $(am__append_71) src/gtk-ui/ui.xml src/gtk3-ui/ui.xml
-SUBDIRS = $(am__append_1) $(am__append_2) . $(am__append_106)
+       $(am__append_73) src/gtk-ui/ui.xml src/gtk3-ui/ui.xml
+SUBDIRS = $(am__append_1) $(am__append_2) . $(am__append_110)
 AUTOMAKE_OPTIONS = subdir-objects
 ACLOCAL_AMFLAGS = -I m4 -I m4-repo ${ACLOCAL_FLAGS}
 @COND_GIO_GDBUS_FALSE@gdbus_dir = $(top_srcdir)/src/gdbus
@@ -2761,11 +2780,11 @@ ACLOCAL_AMFLAGS = -I m4 -I m4-repo ${ACLOCAL_FLAGS}
 @COND_GIO_GDBUS_TRUE@gdbus_dir = $(top_srcdir)/src/gdbusxx
 @COND_GIO_GDBUS_FALSE@gdbus_build_dir = src/gdbus
 @COND_GIO_GDBUS_TRUE@gdbus_build_dir = src/gdbusxx
-disted_docs = $(am__append_107)
-distbin_docs = $(am__append_108) $(am__append_110)
-man_MANS = $(am__append_112)
+disted_docs = $(am__append_111)
+distbin_docs = $(am__append_112) $(am__append_114)
+man_MANS = $(am__append_116)
 src_cppflags = -I$(top_srcdir)/src $(am__append_3) $(am__append_8) \
-       $(am__append_13) $(am__append_32) $(am__append_46) \
+       $(am__append_13) $(am__append_34) $(am__append_48) \
        -I$(top_srcdir)/src/dbus -I$(top_srcdir)/test -I$(top_srcdir) \
        $(BACKEND_CPPFLAGS)
 @ENABLE_GNOME_BLUETOOTH_PANEL_TRUE@src_gnome_bluetoothdir = $(GNOMEBLUETOOTH_DIR)/plugins/
@@ -2851,15 +2870,15 @@ src_cppflags = -I$(top_srcdir)/src $(am__append_3) $(am__append_8) \
 # applies to sources in SyncEvolution repository, but not
 # the Funambol C++ client library
 @COND_CORE_TRUE@src_syncevo_cxxflags = @SYNCEVOLUTION_CXXFLAGS@ \
-@COND_CORE_TRUE@       $(am__append_15) $(am__append_21) \
-@COND_CORE_TRUE@       $(am__append_23)
+@COND_CORE_TRUE@       $(am__append_15) $(am__append_23) \
+@COND_CORE_TRUE@       $(am__append_25)
 @COND_CORE_TRUE@src_syncevo_cppflags = @BACKEND_CPPFLAGS@ @GLIB_CFLAGS@ -I$(top_srcdir)/test -I$(gdbus_dir) $(DBUS_CFLAGS) -I$(top_builddir)/src/syncevo -I$(top_srcdir)/src -DSYNCEVO_LIBEXEC=\"$(libexecdir)\" -DSYNCEVO_BACKEND=\"$(BACKENDS_SEARCH_DIRECTORY)\"
 
 # needed in all cases
 @COND_CORE_TRUE@src_syncevo_ldadd = @SYNCEVOLUTION_LDADD@ \
 @COND_CORE_TRUE@       $(gdbus_build_dir)/libgdbussyncevo.la \
 @COND_CORE_TRUE@       $(am__append_16) $(am__append_20) \
-@COND_CORE_TRUE@       $(am__append_22)
+@COND_CORE_TRUE@       $(am__append_22) $(am__append_24)
 @COND_CORE_TRUE@src_syncevo_sources = src/syncevo/GeeSupport.h \
 @COND_CORE_TRUE@       src/syncevo/GValueSupport.h \
 @COND_CORE_TRUE@       src/syncevo/EDSClient.h \
@@ -2946,7 +2965,8 @@ src_cppflags = -I$(top_srcdir)/src $(am__append_3) $(am__append_8) \
 @COND_CORE_TRUE@       src/syncevo/MapSyncSource.cpp \
 @COND_CORE_TRUE@       src/syncevo/TrackingSyncSource.h \
 @COND_CORE_TRUE@       src/syncevo/TrackingSyncSource.cpp \
-@COND_CORE_TRUE@       $(am__append_18) $(am__append_19)
+@COND_CORE_TRUE@       $(am__append_18) $(am__append_19) \
+@COND_CORE_TRUE@       $(am__append_21)
 @COND_CORE_TRUE@src_syncevo_libsyncevolution_includedir = $(includedir)/syncevo
 @COND_CORE_TRUE@src_syncevo_libsyncevolution_include_HEADERS = \
 @COND_CORE_TRUE@  src/syncevo/declarations.h \
@@ -2986,7 +3006,7 @@ src_cppflags = -I$(top_srcdir)/src $(am__append_3) $(am__append_8) \
 @COND_CORE_TRUE@       @GTHREAD_LIBS@ @GLIB_LIBS@ $(SYNTHESIS_LIBS) \
 @COND_CORE_TRUE@       $(PCRECPP_LIBS) $(TRANSPORT_LIBS) @LIBS@ \
 @COND_CORE_TRUE@       $(src_syncevo_ldadd) $(DLT_LIBS) $(DBUS_LIBS) \
-@COND_CORE_TRUE@       $(NSS_LIBS) $(am__append_27)
+@COND_CORE_TRUE@       $(NSS_LIBS) $(am__append_29)
 @COND_CORE_TRUE@src_syncevo_libsyncevolution_la_CXXFLAGS = \
 @COND_CORE_TRUE@  $(PCRECPP_CFLAGS) \
 @COND_CORE_TRUE@  $(TRANSPORT_CFLAGS) \
@@ -3066,7 +3086,7 @@ src_cppflags = -I$(top_srcdir)/src $(am__append_3) $(am__append_8) \
 @COND_CORE_TRUE@       src/backends/evolution/EvolutionMemoSource.h \
 @COND_CORE_TRUE@       src/backends/evolution/EvolutionCalendarSource.cpp \
 @COND_CORE_TRUE@       src/backends/evolution/EvolutionMemoSource.cpp \
-@COND_CORE_TRUE@       $(am__append_35)
+@COND_CORE_TRUE@       $(am__append_37)
 @COND_CORE_TRUE@src_backends_evolution_syncebook_src = \
 @COND_CORE_TRUE@  src/backends/evolution/EvolutionSyncSource.h \
 @COND_CORE_TRUE@  src/backends/evolution/EvolutionSyncSource.cpp \
@@ -3117,7 +3137,7 @@ src_cppflags = -I$(top_srcdir)/src $(am__append_3) $(am__append_8) \
 @COND_CORE_TRUE@src_backends_gnome_platformgnome_la_SOURCES =  \
 @COND_CORE_TRUE@       src/backends/gnome/GNOMEPlatform.h \
 @COND_CORE_TRUE@       src/backends/gnome/GNOMEPlatform.cpp \
-@COND_CORE_TRUE@       $(am__append_36)
+@COND_CORE_TRUE@       $(am__append_38)
 @COND_CORE_TRUE@@ENABLE_MODULES_TRUE@src_backends_gnome_backenddir = $(BACKENDS_DIRECTORY)
 @COND_CORE_TRUE@@ENABLE_MODULES_TRUE@src_backends_gnome_backend_LTLIBRARIES = $(src_backends_gnome_lib)
 @COND_CORE_TRUE@src_backends_gnome_platformgnome_la_LIBADD = $(KEYRING_LIBS) $(SYNCEVOLUTION_LIBS) 
@@ -3129,7 +3149,7 @@ src_cppflags = -I$(top_srcdir)/src $(am__append_3) $(am__append_8) \
 @COND_CORE_TRUE@src_backends_goa_providergoa_la_SOURCES =  \
 @COND_CORE_TRUE@       src/backends/goa/goa.h \
 @COND_CORE_TRUE@       src/backends/goa/goa.cpp $(NONE) \
-@COND_CORE_TRUE@       $(am__append_37)
+@COND_CORE_TRUE@       $(am__append_39)
 @COND_CORE_TRUE@@ENABLE_MODULES_TRUE@src_backends_goa_backenddir = $(BACKENDS_DIRECTORY)
 @COND_CORE_TRUE@@ENABLE_MODULES_TRUE@src_backends_goa_backend_LTLIBRARIES = $(src_backends_goa_lib)
 @COND_CORE_TRUE@src_backends_goa_providergoa_la_LIBADD = $(SYNCEVOLUTION_LIBS) $(gdbus_build_dir)/libgdbussyncevo.la $(DBUS_LIBS)
@@ -3153,7 +3173,7 @@ src_cppflags = -I$(top_srcdir)/src $(am__append_3) $(am__append_8) \
 @COND_CORE_TRUE@src_backends_kde_platformkde_la_SOURCES =  \
 @COND_CORE_TRUE@       src/backends/kde/KDEPlatform.h \
 @COND_CORE_TRUE@       src/backends/kde/KDEPlatform.cpp \
-@COND_CORE_TRUE@       $(am__append_38)
+@COND_CORE_TRUE@       $(am__append_40)
 @COND_CORE_TRUE@@ENABLE_MODULES_TRUE@src_backends_kde_backenddir = $(BACKENDS_DIRECTORY)
 @COND_CORE_TRUE@@ENABLE_MODULES_TRUE@src_backends_kde_backend_LTLIBRARIES = $(src_backends_kde_lib)
 @COND_CORE_TRUE@src_backends_kde_platformkde_la_LIBADD = $(KDE_KWALLET_LIBS) $(SYNCEVOLUTION_LIBS) 
@@ -3225,12 +3245,12 @@ src_cppflags = -I$(top_srcdir)/src $(am__append_3) $(am__append_8) \
 @COND_CORE_TRUE@  src/backends/signon/accounts/carddav.service-type \
 @COND_CORE_TRUE@  $(NONE)
 
-@COND_CORE_TRUE@src_backends_signon_libs = $(am__append_39) \
-@COND_CORE_TRUE@       $(am__append_40)
+@COND_CORE_TRUE@src_backends_signon_libs = $(am__append_41) \
+@COND_CORE_TRUE@       $(am__append_42)
 @COND_CORE_TRUE@src_backends_signon_common_sources =  \
 @COND_CORE_TRUE@       src/backends/signon/signon.h \
 @COND_CORE_TRUE@       src/backends/signon/signon.cpp $(NONE) \
-@COND_CORE_TRUE@       $(am__append_41)
+@COND_CORE_TRUE@       $(am__append_43)
 @COND_CORE_TRUE@@ENABLE_MODULES_TRUE@src_backends_signon_backenddir = $(BACKENDS_DIRECTORY)
 @COND_CORE_TRUE@@ENABLE_MODULES_TRUE@src_backends_signon_backend_LTLIBRARIES = $(src_backends_signon_libs)
 @COND_CORE_TRUE@src_backends_signon_common_libadd = $(SYNCEVOLUTION_LIBS) 
@@ -3288,7 +3308,7 @@ src_cppflags = -I$(top_srcdir)/src $(am__append_3) $(am__append_8) \
 @COND_CORE_TRUE@src_backends_webdav_syncdav_la_DEPENDENCIES = src/syncevo/libsyncevolution.la
 @COND_CORE_TRUE@WEBDAV_SO_CHECK_FILES =  \
 @COND_CORE_TRUE@       $(DESTDIR)/$(bindir)/syncevolution \
-@COND_CORE_TRUE@       $(am__append_44)
+@COND_CORE_TRUE@       $(am__append_46)
 @COND_CORE_TRUE@src_backends_xmlrpc_lib = src/backends/xmlrpc/syncxmlrpc.la
 @COND_CORE_TRUE@@ENABLE_MODULES_TRUE@src_backends_xmlrpc_backenddir = $(BACKENDS_DIRECTORY)
 @COND_CORE_TRUE@@ENABLE_MODULES_TRUE@src_backends_xmlrpc_backend_LTLIBRARIES = $(src_backends_xmlrpc_lib)
@@ -3442,7 +3462,7 @@ src_cppflags = -I$(top_srcdir)/src $(am__append_3) $(am__append_8) \
 @COND_DBUS_TRUE@       src/dbus/server/progress-data.cpp \
 @COND_DBUS_TRUE@       src/dbus/server/read-operations.cpp \
 @COND_DBUS_TRUE@       src/dbus/server/server.cpp \
-@COND_DBUS_TRUE@       src/dbus/server/session.cpp $(am__append_65)
+@COND_DBUS_TRUE@       src/dbus/server/session.cpp $(am__append_67)
 @COND_DBUS_TRUE@src_dbus_server_server_h_files =  \
 @COND_DBUS_TRUE@       $(src_dbus_server_server_cpp_files:.cpp=.h) \
 @COND_DBUS_TRUE@       src/dbus/server/notification-backend-base.h \
@@ -3456,26 +3476,26 @@ src_cppflags = -I$(top_srcdir)/src $(am__append_3) $(am__append_8) \
 @COND_DBUS_TRUE@       src/dbus/server/source-progress.h \
 @COND_DBUS_TRUE@       src/dbus/server/source-status.h \
 @COND_DBUS_TRUE@       src/dbus/server/timeout.h \
-@COND_DBUS_TRUE@       src/dbus/server/timer.h $(am__append_66)
+@COND_DBUS_TRUE@       src/dbus/server/timer.h $(am__append_68)
 @COND_DBUS_TRUE@src_dbus_server_libsyncevodbusserver_la_SOURCES = \
 @COND_DBUS_TRUE@  $(src_dbus_server_server_h_files) \
 @COND_DBUS_TRUE@  $(src_dbus_server_server_cpp_files) \
 @COND_DBUS_TRUE@  src/dbus/server/main.cpp
 
 @COND_DBUS_TRUE@nodist_src_dbus_server_libsyncevodbusserver_la_SOURCES =  \
-@COND_DBUS_TRUE@       $(am__append_67)
+@COND_DBUS_TRUE@       $(am__append_69)
 @COND_DBUS_TRUE@src_dbus_server_libsyncevodbusserver_la_LDFLAGS =  \
-@COND_DBUS_TRUE@       $(am__append_68)
+@COND_DBUS_TRUE@       $(am__append_70)
 @COND_DBUS_TRUE@src_dbus_server_libsyncevodbusserver_la_LIBADD =  \
 @COND_DBUS_TRUE@       $(LIBNOTIFY_LIBS) $(MLITE_LIBS) $(DBUS_LIBS) \
-@COND_DBUS_TRUE@       $(PCRECPP_LIBS) $(ICU_LIBS) $(am__append_69)
+@COND_DBUS_TRUE@       $(PCRECPP_LIBS) $(ICU_LIBS) $(am__append_71)
 @COND_DBUS_TRUE@src_dbus_server_libsyncevodbusserver_la_CPPFLAGS = -DHAVE_CONFIG_H -DSYNCEVOLUTION_LOCALEDIR=\"${SYNCEVOLUTION_LOCALEDIR}\" -I$(top_srcdir)/src -I$(top_srcdir)/test -I$(top_srcdir) -I$(gdbus_dir) $(BACKEND_CPPFLAGS)
 @COND_DBUS_TRUE@src_dbus_server_libsyncevodbusserver_la_CXXFLAGS =  \
 @COND_DBUS_TRUE@       $(SYNCEVOLUTION_CXXFLAGS) $(CORE_CXXFLAGS) \
 @COND_DBUS_TRUE@       $(SYNTHESIS_CFLAGS) $(GLIB_CFLAGS) \
 @COND_DBUS_TRUE@       $(DBUS_CFLAGS) $(LIBNOTIFY_CFLAGS) \
 @COND_DBUS_TRUE@       $(MLITE_CFLAGS) $(SYNCEVO_WFLAGS) \
-@COND_DBUS_TRUE@       $(ICU_CFLAGS) $(am__append_70)
+@COND_DBUS_TRUE@       $(ICU_CFLAGS) $(am__append_72)
 @COND_DBUS_TRUE@src_dbus_server_dbus_helper_cpp_files = \
 @COND_DBUS_TRUE@  src/dbus/server/dbus-callbacks.cpp \
 @COND_DBUS_TRUE@  src/dbus/server/dbus-sync.cpp \
@@ -3503,7 +3523,7 @@ src_cppflags = -I$(top_srcdir)/src $(am__append_3) $(am__append_8) \
 @COND_DBUS_TRUE@src_dbus_server_autostart_DATA = $(src_dbus_server_desktop)
 @COND_DBUS_TRUE@src_dbus_server_service_files_in =  \
 @COND_DBUS_TRUE@       src/dbus/server/org.syncevolution.service.in \
-@COND_DBUS_TRUE@       $(am__append_74)
+@COND_DBUS_TRUE@       $(am__append_76)
 @COND_DBUS_TRUE@src_dbus_server_service_files = $(src_dbus_server_service_files_in:.service.in=.service)
 @COND_DBUS_TRUE@src_dbus_server_servicedir = $(DBUS_SERVICES_DIR)
 @COND_DBUS_TRUE@src_dbus_server_service_DATA = $(src_dbus_server_service_files)
@@ -3640,12 +3660,14 @@ src_cppflags = -I$(top_srcdir)/src $(am__append_3) $(am__append_8) \
 @COND_GTK2_FALSE@@COND_GUI_TRUE@src_gtk3_ui_sync_ui_moblin_LDADD = $(src_gtk3_ui_sync_ui_LDADD)
 @COND_GTK2_FALSE@@COND_GUI_TRUE@src_gtk3_ui_sync_ui_moblin_CFLAGS = $(src_gtk3_ui_sync_ui_CFLAGS)
 @COND_GTK2_FALSE@@COND_GUI_TRUE@src_gtk3_ui_sync_ui_moblin_CPPFLAGS = $(src_gtk3_ui_sync_ui_CPPFLAGS) -DUSE_MOBLIN_UX
-SYNCEVOLUTION_DEP = $(am__append_87)
-CORE_SOURCES = $(am__append_89)
+SYNCEVOLUTION_DEP = $(am__append_89)
+CORE_SOURCES = $(am__append_91)
 CORE_CXXFLAGS = $(SYNTHESIS_CFLAGS) $(CPPUNIT_CXXFLAGS)
 CORE_LDADD = $(SYNCEVOLUTION_LDADD) src/syncevo/libsyncevolution.la $(GLIB_LIBS) $(GTHREAD_LIBS) $(GOBJECT_LIBS) $(LIBS)
 CORE_DEP = $(SYNCEVOLUTION_DEP) src/syncevo/libsyncevolution.la $(SYNTHESIS_DEP)
-CORE_LD_FLAGS = -Wl,-uSyncEvolution_Module_Version -Wl,--export-dynamic $(CPPUNIT_LDFLAGS)
+CORE_LD_FLAGS = -Wl,-uSyncEvolution_Module_Version \
+       -Wl,--export-dynamic $(CPPUNIT_LDFLAGS) $(ADDITIONAL_LDFLAGS) \
+       $(am__append_92)
 src_syncevolution_SOURCES = \
   src/syncevolution.cpp \
   $(CORE_SOURCES)
@@ -3655,9 +3677,9 @@ src_syncevolution_SOURCES = \
 # SYNCEVOLUTION_LDADD will be replaced with libsyncebook.la/libsyncecal.la/libsyncsqlite.la
 # if linking statically against them, empty otherwise;
 # either way this does not lead to a dependency on those libs - done explicitly
-src_syncevolution_LDADD = $(CORE_LDADD) $(am__append_90)
+src_syncevolution_LDADD = $(CORE_LDADD) $(am__append_93)
 src_syncevolution_DEPENDENCIES = $(EXTRA_LTLIBRARIES) $(CORE_DEP) \
-       $(am__append_91)
+       $(am__append_94)
 src_syncevolution_LDFLAGS = $(PCRECPP_LIBS) $(CORE_LD_FLAGS) $(DBUS_LIBS)
 src_syncevolution_CXXFLAGS = $(PCRECPP_CFLAGS) $(SYNCEVOLUTION_CXXFLAGS) $(CORE_CXXFLAGS) $(DBUS_CFLAGS) $(SYNCEVO_WFLAGS)
 src_syncevolution_CPPFLAGS = $(src_cppflags) -I$(gdbus_dir)
@@ -3697,12 +3719,13 @@ src_syncevo_local_sync_DEPENDENCIES = $(top_builddir)/$(gdbus_build_dir)/libgdbu
 src_client_test_SOURCES = \
   src/client-test-app.cpp \
   test/ClientTest.cpp \
+  test/IcalTest.cpp \
   test/ClientTest.h \
   test/ClientTestAssert.h \
   test/client-test-main.cpp \
   $(CORE_SOURCES)
 
-nodist_src_client_test_SOURCES = test/test.cpp $(am__append_96)
+nodist_src_client_test_SOURCES = test/test.cpp $(am__append_100)
 
 # list of test file base files
 #
@@ -3735,14 +3758,16 @@ TEST_FILES_PATCHED = $(wildcard src/testcases/*.tem)
 # To pull in those object files, LDFLAGS must contain undef statements
 # for the C symbols exported by the macro.
 src_client_test_libs = src/syncevo/libsyncevolution.la \
-       $(am__append_93)
+       $(am__append_96)
 
 # src/syncevo/libsyncevolution.la -> src/syncevo/.libs/libsyncevolution.a -> -Wl,-u...
 src_client_test_undef = $(shell nm $(patsubst %.la,%.a,$(subst /lib,/.libs/lib,$(src_client_test_libs))) | grep funambolAutoRegisterRegistry | sed -e 's/.* /-Wl,-u/' )
 src_client_test_CPPFLAGS = -DHAVE_CONFIG_H -DENABLE_INTEGRATION_TESTS -DENABLE_UNIT_TESTS $(src_cppflags) $(QT_CPPFLAGS)
 src_client_test_CXXFLAGS = $(filter-out -O2, @CPPUNIT_CXXFLAGS@ $(PCRECPP_CFLAGS) $(SYNCEVOLUTION_CXXFLAGS) $(CORE_CXXFLAGS) $(filter-out -O2 -g -W -Wall, $(QT_CXXFLAGS)) $(SYNCEVO_WFLAGS))
 src_client_test_LDFLAGS = @CPPUNIT_LDFLAGS@  $(src_client_test_undef) $(CORE_LD_FLAGS) $(QT_LDFLAGS)
-src_client_test_LDADD = $(src_client_test_libs) $(CORE_LDADD) $(PCRECPP_LIBS) $(SYNTHESIS_ENGINE) $(QT_LIBS)
+src_client_test_LDADD = $(src_client_test_libs) $(CORE_LDADD) \
+       $(PCRECPP_LIBS) $(SYNTHESIS_ENGINE) $(QT_LIBS) \
+       $(am__append_97)
 
 # The binary does not really depend on the test cases, only running it does.
 # Listing the dependencies here is done to ensure that one doesn't accidentally
@@ -3750,7 +3775,7 @@ src_client_test_LDADD = $(src_client_test_libs) $(CORE_LDADD) $(PCRECPP_LIBS) $(
 src_client_test_DEPENDENCIES = $(EXTRA_LTLIBRARIES) \
        $(src_client_test_libs) $(CORE_DEP) $(CLIENT_LIB_TEST_FILES) \
        testcase2patch src/synccompare src/synclog2html src/templates \
-       $(am__append_97)
+       $(am__append_101)
 @ENABLE_TESTING_TRUE@src_testcasesdir = $(testdir)/testcases
 @ENABLE_TESTING_TRUE@dist_src_testcases_DATA = \
 @ENABLE_TESTING_TRUE@  src/testcases/local.png \
@@ -3784,7 +3809,7 @@ src_abort_redirect_LDADD = $(CORE_LDADD)
 src_abort_redirect_DEPENDENCIES = all
 @COND_CORE_TRUE@@COND_DBUS_TRUE@test_dbus_client_server_SOURCES =  \
 @COND_CORE_TRUE@@COND_DBUS_TRUE@       test/dbus-client-server.cpp \
-@COND_CORE_TRUE@@COND_DBUS_TRUE@       $(am__append_100)
+@COND_CORE_TRUE@@COND_DBUS_TRUE@       $(am__append_104)
 @COND_CORE_TRUE@@COND_DBUS_TRUE@test_dbus_client_server_CPPFLAGS = -I$(gdbus_dir) -I$(top_srcdir)/src
 @COND_CORE_TRUE@@COND_DBUS_TRUE@test_dbus_client_server_CXXFLAGS = $(CPPUNIT_CXXFLAGS) $(SYNCEVOLUTION_CXXFLAGS) $(BACKEND_CPPFLAGS) $(DBUS_CFLAGS) $(GLIB_CFLAGS) $(GOBJECT_CFLAGS)
 @COND_CORE_TRUE@@COND_DBUS_TRUE@test_dbus_client_server_LDFLAGS = $(CPPUNIT_LDFLAGS)
@@ -3865,7 +3890,7 @@ SYNCEVOLUTION_evolution_DEB_REQUIRES = \
 # Some exceptions for the link check above (= symbol may be used without linking).
 # SySync_ConsolePrintf is expected by libsmltk and has to be provided by caller.
 LINK_CHECK_ALLOWED = -e xxxxxxxx -e \
-       'SySync_ConsolePrintf.*libsmltk.so' $(am__append_114)
+       'SySync_ConsolePrintf.*libsmltk.so' $(am__append_118)
 @COND_CROSS_COMPILING_FALSE@RUN_SYNCEVOLUTION_CHECK = die if $$?; return $$buffer;
 
 # Be strict about running 'syncevolution' only when not doing
@@ -5105,6 +5130,9 @@ src/syncevo/src_syncevo_libsyncevolution_la-TrackingSyncSource.lo:  \
 src/syncevo/src_syncevo_libsyncevolution_la-icalstrdup.lo:  \
        src/syncevo/$(am__dirstamp) \
        src/syncevo/$(DEPDIR)/$(am__dirstamp)
+src/syncevo/src_syncevo_libsyncevolution_la-icaltz-util.lo:  \
+       src/syncevo/$(am__dirstamp) \
+       src/syncevo/$(DEPDIR)/$(am__dirstamp)
 src/syncevo/src_syncevo_libsyncevolution_la-ObexTransportAgent.lo:  \
        src/syncevo/$(am__dirstamp) \
        src/syncevo/$(DEPDIR)/$(am__dirstamp)
@@ -5281,6 +5309,8 @@ src/src_client_test-client-test-app.$(OBJEXT): src/$(am__dirstamp) \
        src/$(DEPDIR)/$(am__dirstamp)
 test/src_client_test-ClientTest.$(OBJEXT): test/$(am__dirstamp) \
        test/$(DEPDIR)/$(am__dirstamp)
+test/src_client_test-IcalTest.$(OBJEXT): test/$(am__dirstamp) \
+       test/$(DEPDIR)/$(am__dirstamp)
 test/src_client_test-client-test-main.$(OBJEXT): test/$(am__dirstamp) \
        test/$(DEPDIR)/$(am__dirstamp)
 src/backends/activesync/src_client_test-ActiveSyncSourceRegister.$(OBJEXT):  \
@@ -6295,12 +6325,15 @@ mostlyclean-compile:
        -rm -f src/syncevo/src_syncevo_libsyncevolution_la-eds_abi_wrapper.lo
        -rm -f src/syncevo/src_syncevo_libsyncevolution_la-icalstrdup.$(OBJEXT)
        -rm -f src/syncevo/src_syncevo_libsyncevolution_la-icalstrdup.lo
+       -rm -f src/syncevo/src_syncevo_libsyncevolution_la-icaltz-util.$(OBJEXT)
+       -rm -f src/syncevo/src_syncevo_libsyncevolution_la-icaltz-util.lo
        -rm -f src/syncevo/src_syncevo_libsyncevolution_la-lcs.$(OBJEXT)
        -rm -f src/syncevo/src_syncevo_libsyncevolution_la-lcs.lo
        -rm -f src/syncevo/src_syncevo_libsyncevolution_la-util.$(OBJEXT)
        -rm -f src/syncevo/src_syncevo_libsyncevolution_la-util.lo
        -rm -f test/src_abort_redirect-abort-redirect.$(OBJEXT)
        -rm -f test/src_client_test-ClientTest.$(OBJEXT)
+       -rm -f test/src_client_test-IcalTest.$(OBJEXT)
        -rm -f test/src_client_test-client-test-main.$(OBJEXT)
        -rm -f test/src_client_test-test.$(OBJEXT)
        -rm -f test/src_syncevo_dbus_helper-test.$(OBJEXT)
@@ -6567,10 +6600,12 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@src/syncevo/$(DEPDIR)/src_syncevo_libsyncevolution_la-UserInterface.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/syncevo/$(DEPDIR)/src_syncevo_libsyncevolution_la-eds_abi_wrapper.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/syncevo/$(DEPDIR)/src_syncevo_libsyncevolution_la-icalstrdup.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/syncevo/$(DEPDIR)/src_syncevo_libsyncevolution_la-icaltz-util.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/syncevo/$(DEPDIR)/src_syncevo_libsyncevolution_la-lcs.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/syncevo/$(DEPDIR)/src_syncevo_libsyncevolution_la-util.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@test/$(DEPDIR)/src_abort_redirect-abort-redirect.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@test/$(DEPDIR)/src_client_test-ClientTest.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@test/$(DEPDIR)/src_client_test-IcalTest.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@test/$(DEPDIR)/src_client_test-client-test-main.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@test/$(DEPDIR)/src_client_test-test.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@test/$(DEPDIR)/src_syncevo_dbus_helper-test.Po@am__quote@
@@ -6681,6 +6716,13 @@ src/syncevo/src_syncevo_libsyncevolution_la-icalstrdup.lo: src/syncevo/icalstrdu
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_syncevo_libsyncevolution_la_CPPFLAGS) $(CPPFLAGS) $(src_syncevo_libsyncevolution_la_CFLAGS) $(CFLAGS) -c -o src/syncevo/src_syncevo_libsyncevolution_la-icalstrdup.lo `test -f 'src/syncevo/icalstrdup.c' || echo '$(srcdir)/'`src/syncevo/icalstrdup.c
 
+src/syncevo/src_syncevo_libsyncevolution_la-icaltz-util.lo: src/syncevo/icaltz-util.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_syncevo_libsyncevolution_la_CPPFLAGS) $(CPPFLAGS) $(src_syncevo_libsyncevolution_la_CFLAGS) $(CFLAGS) -MT src/syncevo/src_syncevo_libsyncevolution_la-icaltz-util.lo -MD -MP -MF src/syncevo/$(DEPDIR)/src_syncevo_libsyncevolution_la-icaltz-util.Tpo -c -o src/syncevo/src_syncevo_libsyncevolution_la-icaltz-util.lo `test -f 'src/syncevo/icaltz-util.c' || echo '$(srcdir)/'`src/syncevo/icaltz-util.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/syncevo/$(DEPDIR)/src_syncevo_libsyncevolution_la-icaltz-util.Tpo src/syncevo/$(DEPDIR)/src_syncevo_libsyncevolution_la-icaltz-util.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/syncevo/icaltz-util.c' object='src/syncevo/src_syncevo_libsyncevolution_la-icaltz-util.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_syncevo_libsyncevolution_la_CPPFLAGS) $(CPPFLAGS) $(src_syncevo_libsyncevolution_la_CFLAGS) $(CFLAGS) -c -o src/syncevo/src_syncevo_libsyncevolution_la-icaltz-util.lo `test -f 'src/syncevo/icaltz-util.c' || echo '$(srcdir)/'`src/syncevo/icaltz-util.c
+
 src/syncevo/src_syncevo_libsyncevolution_la-SyncEvolutionXML.lo: src/syncevo/SyncEvolutionXML.c
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_syncevo_libsyncevolution_la_CPPFLAGS) $(CPPFLAGS) $(src_syncevo_libsyncevolution_la_CFLAGS) $(CFLAGS) -MT src/syncevo/src_syncevo_libsyncevolution_la-SyncEvolutionXML.lo -MD -MP -MF src/syncevo/$(DEPDIR)/src_syncevo_libsyncevolution_la-SyncEvolutionXML.Tpo -c -o src/syncevo/src_syncevo_libsyncevolution_la-SyncEvolutionXML.lo `test -f 'src/syncevo/SyncEvolutionXML.c' || echo '$(srcdir)/'`src/syncevo/SyncEvolutionXML.c
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/syncevo/$(DEPDIR)/src_syncevo_libsyncevolution_la-SyncEvolutionXML.Tpo src/syncevo/$(DEPDIR)/src_syncevo_libsyncevolution_la-SyncEvolutionXML.Plo
@@ -8070,6 +8112,20 @@ test/src_client_test-ClientTest.obj: test/ClientTest.cpp
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_test_CPPFLAGS) $(CPPFLAGS) $(src_client_test_CXXFLAGS) $(CXXFLAGS) -c -o test/src_client_test-ClientTest.obj `if test -f 'test/ClientTest.cpp'; then $(CYGPATH_W) 'test/ClientTest.cpp'; else $(CYGPATH_W) '$(srcdir)/test/ClientTest.cpp'; fi`
 
+test/src_client_test-IcalTest.o: test/IcalTest.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_test_CPPFLAGS) $(CPPFLAGS) $(src_client_test_CXXFLAGS) $(CXXFLAGS) -MT test/src_client_test-IcalTest.o -MD -MP -MF test/$(DEPDIR)/src_client_test-IcalTest.Tpo -c -o test/src_client_test-IcalTest.o `test -f 'test/IcalTest.cpp' || echo '$(srcdir)/'`test/IcalTest.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) test/$(DEPDIR)/src_client_test-IcalTest.Tpo test/$(DEPDIR)/src_client_test-IcalTest.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='test/IcalTest.cpp' object='test/src_client_test-IcalTest.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_test_CPPFLAGS) $(CPPFLAGS) $(src_client_test_CXXFLAGS) $(CXXFLAGS) -c -o test/src_client_test-IcalTest.o `test -f 'test/IcalTest.cpp' || echo '$(srcdir)/'`test/IcalTest.cpp
+
+test/src_client_test-IcalTest.obj: test/IcalTest.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_test_CPPFLAGS) $(CPPFLAGS) $(src_client_test_CXXFLAGS) $(CXXFLAGS) -MT test/src_client_test-IcalTest.obj -MD -MP -MF test/$(DEPDIR)/src_client_test-IcalTest.Tpo -c -o test/src_client_test-IcalTest.obj `if test -f 'test/IcalTest.cpp'; then $(CYGPATH_W) 'test/IcalTest.cpp'; else $(CYGPATH_W) '$(srcdir)/test/IcalTest.cpp'; fi`
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) test/$(DEPDIR)/src_client_test-IcalTest.Tpo test/$(DEPDIR)/src_client_test-IcalTest.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='test/IcalTest.cpp' object='test/src_client_test-IcalTest.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_test_CPPFLAGS) $(CPPFLAGS) $(src_client_test_CXXFLAGS) $(CXXFLAGS) -c -o test/src_client_test-IcalTest.obj `if test -f 'test/IcalTest.cpp'; then $(CYGPATH_W) 'test/IcalTest.cpp'; else $(CYGPATH_W) '$(srcdir)/test/IcalTest.cpp'; fi`
+
 test/src_client_test-client-test-main.o: test/client-test-main.cpp
 @am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_test_CPPFLAGS) $(CPPFLAGS) $(src_client_test_CXXFLAGS) $(CXXFLAGS) -MT test/src_client_test-client-test-main.o -MD -MP -MF test/$(DEPDIR)/src_client_test-client-test-main.Tpo -c -o test/src_client_test-client-test-main.o `test -f 'test/client-test-main.cpp' || echo '$(srcdir)/'`test/client-test-main.cpp
 @am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) test/$(DEPDIR)/src_client_test-client-test-main.Tpo test/$(DEPDIR)/src_client_test-client-test-main.Po
@@ -11961,7 +12017,7 @@ dot_dist_hook:
          echo 'A git checkout is required to generate a ChangeLog.' >&2; \
        fi
 @ENABLE_EVOLUTION_COMPATIBILITY_TRUE@toplevel_so_check:
-@ENABLE_EVOLUTION_COMPATIBILITY_TRUE@  for i in `find $(DESTDIR)/$(libdir)/syncevolution $(DESTDIR)/$(libdir)/libsyncevo* $(DESTDIR)/$(libdir)/libsynthesis* -name *.so | grep -v -2.so` $(DESTDIR)/$(bindir)/syncevolution; \
+@ENABLE_EVOLUTION_COMPATIBILITY_TRUE@  for i in `find $(DESTDIR)/$(libdir)/syncevolution $(DESTDIR)/$(libdir)/libsyncevo* $(DESTDIR)/$(libdir)/libsynthesis* -name *.so | grep -v -e -[0-9].so` $(DESTDIR)/$(bindir)/syncevolution; \
 @ENABLE_EVOLUTION_COMPATIBILITY_TRUE@  do \
 @ENABLE_EVOLUTION_COMPATIBILITY_TRUE@    if objdump -T -C $$i | grep -v :: | grep '\*UND\*' | sort | grep -v -w ical_strdup | grep -e ical -e " e_"; then \
 @ENABLE_EVOLUTION_COMPATIBILITY_TRUE@      echo "$$i should not depend on EDS, libical or libbluetooth"; \
diff --git a/NEWS b/NEWS
index ccbbc38..ac26dbf 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,93 @@
+SyncEvolution 1.4 -> 1.4.1, 31.03.2014
+======================================
+
+The first bug fix release in the 1.4 series addresses some issues which
+occurred on some systems.
+
+Details:
+
+* EDS: only load one backend plugin of each kind
+
+  SyncEvolution was meant to load the syncecal or syncebook shared object
+  which uses the most recent libraries (libical, libecal/libebook) on
+  the system and then stop loooking for alternatives. Due to a string
+  handling bug the check for already backends always found nothing,
+  leading to multiple conflicting backends loaded on some systems (for
+  example, those with libical0 and libical1 installed).
+
+  If that happened, the backend became unusable.
+
+* ical: workaround for libical 1.0 builtin timezone change
+
+  libical 1.0 started to return VTIMEZONE definitions with multiple
+  absolute transition times instead of RRULEs. This causes problems when
+  exchanging data with peers (see
+  https://sourceforge.net/p/freeassociation/bugs/95/).
+
+  In SyncEvolution, this affected sending an event using New Zealand
+  time in vCalendar 1.0 format to a phone, because the internal,
+  out-dated definition of the time zone in libsynthesis was used as
+  fallback when loading RRULE-based timezone definitions from libical
+  failed (see "[SyncEvolution] Some events showing wrong time on
+  phone"). It might also affect exchanging data with CalDAV peers (not
+  tested).
+
+  The workaround is to include the original code from libical.
+
+* dbus-session.sh: create XDG_RUNTIME_DIR
+
+  More recent distros (for example, Ubuntu Saucy) rely on
+  XDG_RUNTIME_DIR. Each time dbus-session.sh runs, it must
+  ensure that the runtime dir exists and is empty.
+
+  This was a problem when trying to run activesyncd + SyncEvolution
+  on a headless Ubuntu Saucy server (see FDO #76273).
+
+* Akonadi: support KDE Notes, enhanced "database" check
+
+  The KDE Notes resources store items under a different MIME type than the one
+  used in AKonadi (see "[Kde-pim] note format"). SyncEvolution use the same type
+  as Akonadi and thus did not find existing KDE Notes resources.
+
+  To support both while KDE and Akonadi transition to the same type,
+  SyncEvolution now looks for notes resources using both MIME types and accepts
+  both kinds of items when reading. When writing, SyncEvolution picks the MIME
+  type that is supported by the resource, which hopefully avoids confusing the
+  KDE app using the resource (untested).
+
+  As a positive side effect, the "database" value used for opening a resource is
+  now checked more thoroughly. Non-existent resources and the type mismatches
+  like pointing a "kde-contacts" backend to a calendar resource are now detected
+  early.
+
+* Akonadi: ensure that UID is set (FDO #74342)
+
+  Akonadi resources do not enforce iCalendar 2.0 semantic like
+  "each VEVENT must have a UID" (see "[Kde-pim] iCalendar semantic").
+  When receiving an event from a peer which itself does not enforce
+  that semantic (Funambol, vCalendar 1.0 based phones), then we
+  need to generate a UID, otherwise KOrganizer will ignore the
+  imported event.
+
+* Akonadi: avoid threading problem in HTTP server mode (FDO #75672)
+
+  When used as storage in a server, Akonadi got called in a background thread
+  that gets created to handle slow initialization of sources and preventing
+  ensuing timeouts in HTTP clients (probably not needed for Akonadi itself,
+  but may still be useful when combining it with other sources).
+
+  Akonadi cannot be used like that, leading to false "Akonadi not running"
+  errors or (if one got past that check) failing item operations.
+
+* autotools: Add QtCore include path to KDEPIM_CFLAGS (FDO #75670)
+
+  This fixes an issue where configure fails to find Akonadi when
+  test programs do not compile because QString is not found.
+
+* Enhanced testing again: faster execution, less false negatives
+  under load. Re-enabled testing of Akonadi.
+
+
 SyncEvolution 1.3.2 -> 1.4, 16.02.2014
 ======================================
 
diff --git a/README b/README
index ceff8f4..dfa70a1 100644 (file)
--- a/README
+++ b/README
@@ -7,8 +7,8 @@ synchronize personal information management data
 ------------------------------------------------
 
 :Manual section: 1
-:Version: 1.4
-:Date: 2014-02-16
+:Version: 1.4.1
+:Date: 2014-03-31
 
 
 SYNOPSIS
index 0da5194..6ebf6ce 100644 (file)
@@ -9,6 +9,9 @@
 /* "SyncML DevInf DevType" */
 #undef DEVICE_TYPE
 
+/* use libical's icaltzutil_get_zone_directory() */
+#undef DISABLE_ICALTZUTIL_GET_ZONE_DIRECTORY
+
 /* "DLT app ID for syncevo-dbus-helper" */
 #undef DLT_SYNCEVO_DBUS_HELPER_ID
 
@@ -52,6 +55,9 @@
 /* libical in use */
 #undef ENABLE_ICAL
 
+/* use internal icaltz-util.c */
+#undef ENABLE_ICALTZ_UTIL
+
 /* enable integration tests inside the final library */
 #undef ENABLE_INTEGRATION_TESTS
 
 /* define if the Boost::Locale library is available */
 #undef HAVE_BOOST_LOCALE
 
+/* Define to 1 if you have the <byteswap.h> header file. */
+#undef HAVE_BYTESWAP_H
+
 /* Define to 1 if you have the `dcgettext' function. */
 #undef HAVE_DCGETTEXT
 
 /* evolution-dataserver available */
 #undef HAVE_EDS
 
+/* Define to 1 if you have the <endian.h> header file. */
+#undef HAVE_ENDIAN_H
+
 /* Define to 1 if you have the <execinfo.h> header file. */
 #undef HAVE_EXECINFO_H
 
 /* Define to 1 if you have the <string.h> header file. */
 #undef HAVE_STRING_H
 
+/* Define to 1 if you have the <sys/endian.h> header file. */
+#undef HAVE_SYS_ENDIAN_H
+
 /* Define to 1 if you have the <sys/stat.h> header file. */
 #undef HAVE_SYS_STAT_H
 
index eddd80e..40a02de 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for syncevolution 1.4.
+# Generated by GNU Autoconf 2.69 for syncevolution 1.4.1.
 #
 #
 # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
@@ -587,8 +587,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='syncevolution'
 PACKAGE_TARNAME='syncevolution'
-PACKAGE_VERSION='1.4'
-PACKAGE_STRING='syncevolution 1.4'
+PACKAGE_VERSION='1.4.1'
+PACKAGE_STRING='syncevolution 1.4.1'
 PACKAGE_BUGREPORT=''
 PACKAGE_URL=''
 
@@ -902,6 +902,8 @@ CPPUNIT_LDFLAGS
 CPPUNIT_CXXFLAGS
 CPPUNIT_CONFIG
 MODIFY_SYNCCOMPARE
+ENABLE_ICALTZ_UTIL_FALSE
+ENABLE_ICALTZ_UTIL_TRUE
 SYNCEVO_WFLAGS
 BOOST_LDFLAGS
 BOOST_CPPFLAGS
@@ -1053,6 +1055,7 @@ enable_unit_tests
 enable_integration_tests
 enable_static_cxx
 enable_evolution_compatibility
+enable_internal_icaltz
 enable_developer_mode
 enable_maemo
 with_ca_certificates
@@ -1746,7 +1749,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures syncevolution 1.4 to adapt to many kinds of systems.
+\`configure' configures syncevolution 1.4.1 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1816,7 +1819,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of syncevolution 1.4:";;
+     short | recursive ) echo "Configuration of syncevolution 1.4.1:";;
    esac
   cat <<\_ACEOF
 
@@ -1862,6 +1865,11 @@ Optional Features:
                           libical.so.0/1 enum differences are worked around
                           (allows patching resulting executables to use either
                           of these two)
+  --disable-internal-icaltz
+                          libical 1.0 updated its system zone data parsing
+                          code so that it produces VTIMEZONEs which are
+                          unsuitable for syncing. SyncEvolution ships with a
+                          copy of the older code and uses it by default.
   --enable-developer-mode The dynamic loadble backend libraries is loaded from
                           current build directory instead of the standard
                           library path
@@ -2270,7 +2278,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-syncevolution configure 1.4
+syncevolution configure 1.4.1
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2910,7 +2918,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by syncevolution $as_me 1.4, which was
+It was created by syncevolution $as_me 1.4.1, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -3297,7 +3305,6 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
 
-
 # Minimum version of libsynthesis as defined in its
 # configure script and thus .pc files:
 
@@ -3825,7 +3832,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='syncevolution'
- VERSION='1.4'
+ VERSION='1.4.1'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -16732,6 +16739,31 @@ else
 fi
 
 
+# Check whether --enable-internal-icaltz was given.
+if test "${enable_internal_icaltz+set}" = set; then :
+  enableval=$enable_internal_icaltz; enable_icaltz_util="$enableval"
+               test "$enable_icaltz_util" = "yes" || test "$enable_icaltz_util" = "no" || as_fn_error $? "invalid value of --disable-internal-icaltz: $enableval" "$LINENO" 5
+else
+  enable_icaltz_util="yes"
+fi
+
+if test "$enable_icaltz_util" = "yes"; then
+
+$as_echo "#define ENABLE_ICALTZ_UTIL 1" >>confdefs.h
+
+
+$as_echo "#define DISABLE_ICALTZUTIL_GET_ZONE_DIRECTORY 1" >>confdefs.h
+
+fi
+ if test "$enable_icaltz_util" = "yes"; then
+  ENABLE_ICALTZ_UTIL_TRUE=
+  ENABLE_ICALTZ_UTIL_FALSE='#'
+else
+  ENABLE_ICALTZ_UTIL_TRUE='#'
+  ENABLE_ICALTZ_UTIL_FALSE=
+fi
+
+
 # Check whether --enable-developer-mode was given.
 if test "${enable_developer_mode+set}" = set; then :
   enableval=$enable_developer_mode; enable_developer_mode="$enableval"
 done
 
 
+# For icaltz-util.c
+for ac_header in byteswap.h endian.h sys/endian.h unistd.h stdint.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
 # cppunit-config is used even when both unit tests and integration tests are disabled.
 # Extract the first word of "cppunit-config", so it can be a program name with args.
 set dummy cppunit-config; ac_word=$2
@@ -21807,7 +21854,7 @@ AKONADIFOUND=yes
 if ! test "$KDEPIM_CFLAGS"; then
    KDEPIM_CFLAGS="-I`kde4-config --path include` -I`kde4-config --path include`/KDE"
    if test "$QMAKE"; then
-      KDEPIM_CFLAGS="$KDEPIM_CFLAGS -I`$QMAKE -query QT_INSTALL_HEADERS`"
+      KDEPIM_CFLAGS="$KDEPIM_CFLAGS -I`$QMAKE -query QT_INSTALL_HEADERS` -I`$QMAKE -query QT_INSTALL_HEADERS`/QtCore"
    fi
 fi
 if ! test "$KDEPIM_LIBS"; then
@@ -24272,7 +24319,7 @@ $as_echo "#define HAVE_GLIB 1" >>confdefs.h
         BACKEND_CPPFLAGS="$BACKEND_CPPFLAGS $GLIB_CFLAGS $GTHREAD_CFLAGS $GOBJECT_CFLAGS"
 fi
 
-if test "$need_ical" = "yes"; then
+if test "$need_ical" = "yes" || test "$enable_icaltz_util" = "yes"; then
 
 pkg_failed=no
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBICAL" >&5
@@ -24524,6 +24571,9 @@ else
 $as_echo "yes" >&6; }
        true
 fi
+fi
+
+if test "$need_ical" = "yes"; then
 
 $as_echo "#define ENABLE_ICAL 1" >>confdefs.h
 
@@ -24537,7 +24587,6 @@ else
 fi
 
 
-
 # Check for Qt if some backend needs it.
 if test "$need_qt_modules"; then
    echo "$as_me: this is autotroll.m4 serial 5" >&5
@@ -25695,6 +25744,10 @@ if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
   as_fn_error $? "conditional \"am__fastdepCXX\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${ENABLE_ICALTZ_UTIL_TRUE}" && test -z "${ENABLE_ICALTZ_UTIL_FALSE}"; then
+  as_fn_error $? "conditional \"ENABLE_ICALTZ_UTIL\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${ENABLE_UNIT_TESTS_TRUE}" && test -z "${ENABLE_UNIT_TESTS_FALSE}"; then
   as_fn_error $? "conditional \"ENABLE_UNIT_TESTS\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -26208,7 +26261,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by syncevolution $as_me 1.4, which was
+This file was extended by syncevolution $as_me 1.4.1, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -26274,7 +26327,7 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-syncevolution config.status 1.4
+syncevolution config.status 1.4.1
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
index 8c34d51..4d4166e 100644 (file)
@@ -8,7 +8,7 @@ dnl Invoke autogen.sh to produce a configure script.
 #
 # Starting with the 1.1 release cycle, the rpm-style
 # .99 pseudo-version number is used to mark a pre-release.
-AC_INIT([syncevolution], [m4_esyscmd([build/gen-git-version.sh 1.4])])
+AC_INIT([syncevolution], [m4_esyscmd([build/gen-git-version.sh 1.4.1])])
 # STABLE_VERSION=1.0.1+
 AC_SUBST(STABLE_VERSION)
 
@@ -145,6 +145,18 @@ AC_ARG_ENABLE(evolution-compatibility,
                              [build executables which only call Evolution via dlopen/dlsym: this avoids all hard dependencies on EDS shared objects, but might lead to crashes when their ABI changes; use --enable-evolution-compatibility=ical to enable a weaker mode where linking is done normally and only libical.so.0/1 enum differences are worked around (allows patching resulting executables to use either of these two)]),
               enable_evolution_compatibility="$enableval", enable_evolution_compatibility="no")
 
+AC_ARG_ENABLE(internal-icaltz,
+              AS_HELP_STRING([--disable-internal-icaltz],
+                             [libical 1.0 updated its system zone data parsing code so that it produces VTIMEZONEs which are unsuitable for syncing. SyncEvolution ships with a copy of the older code and uses it by default.]),
+              [enable_icaltz_util="$enableval"
+               test "$enable_icaltz_util" = "yes" || test "$enable_icaltz_util" = "no" || AC_ERROR([invalid value of --disable-internal-icaltz: $enableval])],
+              enable_icaltz_util="yes")
+if test "$enable_icaltz_util" = "yes"; then
+   AC_DEFINE(ENABLE_ICALTZ_UTIL, [1], [use internal icaltz-util.c])
+   AC_DEFINE(DISABLE_ICALTZUTIL_GET_ZONE_DIRECTORY, [1], [use libical's icaltzutil_get_zone_directory()])
+fi
+AM_CONDITIONAL([ENABLE_ICALTZ_UTIL], [test "$enable_icaltz_util" = "yes"])
+
 AC_ARG_ENABLE(developer-mode,
               AS_HELP_STRING([--enable-developer-mode],
                              [The dynamic loadble backend libraries is loaded from current build directory instead of the standard library path]),
@@ -163,6 +175,9 @@ AC_SUBST(MODIFY_SYNCCOMPARE)
 
 AC_CHECK_HEADERS(signal.h dlfcn.h)
 
+# For icaltz-util.c
+AC_CHECK_HEADERS(byteswap.h endian.h sys/endian.h unistd.h stdint.h)
+
 # cppunit-config is used even when both unit tests and integration tests are disabled.
 AC_PATH_PROG([CPPUNIT_CONFIG], [cppunit-config], [no])
 
@@ -984,16 +999,19 @@ if test "$need_glib" = "yes"; then
         BACKEND_CPPFLAGS="$BACKEND_CPPFLAGS $GLIB_CFLAGS $GTHREAD_CFLAGS $GOBJECT_CFLAGS"
 fi
 
-dnl use libical if and only if required by some backend
-if test "$need_ical" = "yes"; then
+dnl check for libical if needed by backend or icaltz-util.
+if test "$need_ical" = "yes" || test "$enable_icaltz_util" = "yes"; then
    PKG_CHECK_MODULES(LIBICAL, libical,
                      [true],
                      [PKG_CHECK_MODULES(LIBICAL, libecal-1.2)])
+fi
+
+dnl Use libical in eds_abi_wrapper if and only if required by some backend.
+if test "$need_ical" = "yes"; then
    AC_DEFINE(ENABLE_ICAL, 1, [libical in use])
 fi
 AM_CONDITIONAL([ENABLE_ICAL], [test "$need_ical" = "yes"])
 
-
 # Check for Qt if some backend needs it.
 if test "$need_qt_modules"; then
    AT_WITH_QT([-gui $need_qt_modules],
index e970c95..0ad8dcf 100644 (file)
@@ -365,6 +365,13 @@ public:
     virtual void updateConfig(ClientTestConfig &config) const
     {
         config.m_type = "kde-calendar";
+        // Looks like iCalendar file resource in Akonadi 1.11.0 does
+        // not actually enforce iCalendar 2.0 semantic. It allows
+        // updating of events with no UID
+        // (testLinkedItemsInsertBothUpdateChildNoIDs)
+        // and fails to detect double-adds (testInsertTwice).
+        // TODO: this should better be fixed.
+        config.m_sourceKnowsItemSemantic = false;
     }
 } iCal20Test;
 
@@ -375,6 +382,8 @@ public:
     virtual void updateConfig(ClientTestConfig &config) const
     {
         config.m_type = "kde-tasks";
+        // See above.
+        config.m_sourceKnowsItemSemantic = false;
     }
 } iTodo20Test;
 
index 6a676a3..88512a5 100644 (file)
 #include <Akonadi/Control>
 #include <kurl.h>
 
+#include <syncevo/util.h>
+
+#include <boost/lambda/lambda.hpp>
+#include <boost/lambda/bind.hpp>
+#include <boost/bind.hpp>
+
 #include <QtCore/QDebug>
 
 SE_BEGIN_CXX
@@ -57,8 +63,8 @@ template<class J> J *DisableAutoDelete(J *job) { job->setAutoDelete(false); retu
 AkonadiSyncSource::AkonadiSyncSource(const char *submime,
                                      const SyncSourceParams &params)
     : TrackingSyncSource(params)
-    , m_subMime(submime)
 {
+    m_mimeTypes = QString(submime).split(",", QString::SkipEmptyParts);
 }
 
 AkonadiSyncSource::~AkonadiSyncSource()
@@ -67,6 +73,12 @@ AkonadiSyncSource::~AkonadiSyncSource()
 
 bool AkonadiSyncSource::isEmpty()
 {
+    if (!GRunIsMain()) {
+        bool result;
+        GRunInMain(boost::lambda::var(result) = boost::lambda::bind(&AkonadiSyncSource::isEmpty, this));
+        return result;
+    }
+
     //To Check if the respective collection is Empty, without actually loading the collections
     std::auto_ptr<CollectionStatisticsJob> statisticsJob(DisableAutoDelete(new CollectionStatisticsJob(m_collection)));
     if (!statisticsJob->exec()) {
@@ -77,7 +89,12 @@ bool AkonadiSyncSource::isEmpty()
 
 void AkonadiSyncSource::start()
 {
-    // Start The Akonadi Server if not already Running.
+    if (!GRunIsMain()) {
+        GRunInMain(boost::bind(&AkonadiSyncSource::start, this));
+        return;
+    }
+
+    // Check for Akonadi server.
     if (!Akonadi::ServerManager::isRunning()) {
         // Don't try to start it. A normal KDE user should have it already
         // running. Users of other desktop systems probably don't want it
@@ -98,11 +115,15 @@ void AkonadiSyncSource::start()
 
 SyncSource::Databases AkonadiSyncSource::getDatabases()
 {
+    if (!GRunIsMain()) {
+        Databases result;
+        GRunInMain(boost::lambda::var(result) = boost::lambda::bind(&AkonadiSyncSource::getDatabases, this));
+        return result;
+    }
+
     start();
 
     Databases res;
-    QStringList mimeTypes;
-    mimeTypes << m_subMime.c_str();
     // Insert databases which match the "type" of the source, including a user-visible
     // description and a database IDs. Exactly one of the databases  should be marked
     // as the default one used by the source.
@@ -111,7 +132,7 @@ SyncSource::Databases AkonadiSyncSource::getDatabases()
     std::auto_ptr<CollectionFetchJob> fetchJob(DisableAutoDelete(new CollectionFetchJob(Collection::root(),
                                                                                         CollectionFetchJob::Recursive)));
 
-    fetchJob->fetchScope().setContentMimeTypes(mimeTypes);
+    fetchJob->fetchScope().setContentMimeTypes(m_mimeTypes);
 
     if (!fetchJob->exec()) {
         throwError("cannot list collections");
@@ -133,6 +154,11 @@ SyncSource::Databases AkonadiSyncSource::getDatabases()
 
 void AkonadiSyncSource::open()
 {
+    if (!GRunIsMain()) {
+        GRunInMain(boost::bind(&AkonadiSyncSource::open, this));
+        return;
+    }
+
     start();
 
     // the "evolutionsource" property, empty for default,
@@ -163,20 +189,53 @@ void AkonadiSyncSource::open()
     }
 
     m_collection = Collection::fromUrl(KUrl(id.c_str()));
+
+    // Verify that the collection exists and ensure that
+    // m_collection.contentMimeTypes() returns valid information. The
+    // collection constructed so far only contains the collection ID.
+    std::auto_ptr<CollectionFetchJob> fetchJob(DisableAutoDelete(new CollectionFetchJob(m_collection,
+                                                                                        CollectionFetchJob::Base)));
+    if (!fetchJob->exec()) {
+        throwError(StringPrintf("cannot fetch collection %s", id.c_str()));
+    }
+    Collection::List collections = fetchJob->collections();
+    if (collections.isEmpty()) {
+        throwError(StringPrintf("collection %s not found", id.c_str()));
+    }
+    m_collection = collections.front();
+
+    m_contentMimeType = "";
+    QStringList collectionMimeTypes = m_collection.contentMimeTypes();
+    foreach (const QString &mimeType, m_mimeTypes) {
+        if (collectionMimeTypes.contains(mimeType)) {
+            m_contentMimeType = mimeType;
+            break;
+        }
+    }
+    if (m_contentMimeType.isEmpty()) {
+        throwError(StringPrintf("Resource %s cannot store items of type(s) %s. It can only store %s.",
+                                id.c_str(),
+                                m_mimeTypes.join(",").toUtf8().constData(),
+                                collectionMimeTypes.join(",").toUtf8().constData()));
+    }
 }
 
 void AkonadiSyncSource::listAllItems(SyncSourceRevisions::RevisionMap_t &revisions)
 {
+    if (!GRunIsMain()) {
+        GRunInMain(boost::bind(&AkonadiSyncSource::listAllItems, this, boost::ref(revisions)));
+        return;
+    }
+
     // copy all local IDs and the corresponding revision
     std::auto_ptr<ItemFetchJob> fetchJob(DisableAutoDelete(new ItemFetchJob(m_collection)));
-
     if (!fetchJob->exec()) {
         throwError("listing items");
     }
     BOOST_FOREACH (const Item &item, fetchJob->items()) {
         // Filter out items which don't have the right type (for example, VTODO when
         // syncing events)
-        if (item.mimeType() == m_subMime.c_str()) {
+        if (m_mimeTypes.contains(item.mimeType())) {
             revisions[QByteArray::number(item.id()).constData()] =
                       QByteArray::number(item.revision()).constData();
         }
@@ -190,10 +249,16 @@ void AkonadiSyncSource::close()
 
 TrackingSyncSource::InsertItemResult AkonadiSyncSource::insertItem(const std::string &luid, const std::string &data, bool raw)
 {
+    if (!GRunIsMain()) {
+        InsertItemResult result;
+        GRunInMain(boost::lambda::var(result) = boost::lambda::bind(&AkonadiSyncSource::insertItem, this, boost::cref(luid), boost::cref(data), raw));
+        return result;
+    }
+
     Item item;
 
     if (luid.empty()) {
-        item.setMimeType(m_subMime.c_str());
+        item.setMimeType(m_mimeTypes.front());
         item.setPayloadFromData(QByteArray(data.c_str()));
         std::auto_ptr<ItemCreateJob> createJob(DisableAutoDelete(new ItemCreateJob(item, m_collection)));
         if (!createJob->exec()) {
@@ -230,6 +295,11 @@ TrackingSyncSource::InsertItemResult AkonadiSyncSource::insertItem(const std::st
 
 void AkonadiSyncSource::removeItem(const string &luid)
 {
+    if (!GRunIsMain()) {
+        GRunInMain(boost::bind(&AkonadiSyncSource::removeItem, this, boost::cref(luid)));
+        return;
+    }
+
     Entity::Id syncItemId = QByteArray(luid.c_str()).toLongLong();
 
     // Delete the item from our collection
@@ -242,6 +312,11 @@ void AkonadiSyncSource::removeItem(const string &luid)
 
 void AkonadiSyncSource::readItem(const std::string &luid, std::string &data, bool raw)
 {
+    if (!GRunIsMain()) {
+        GRunInMain(boost::bind(&AkonadiSyncSource::readItem, this, boost::cref(luid), boost::ref(data), raw));
+        return;
+    }
+
     Entity::Id syncItemId = QByteArray(luid.c_str()).toLongLong();
 
     std::auto_ptr<ItemFetchJob> fetchJob(DisableAutoDelete(new ItemFetchJob(Item(syncItemId))));
index 6e88188..7532b18 100644 (file)
@@ -72,7 +72,19 @@ private:
     void start();
 protected:
     Akonadi::Collection m_collection;
-    const std::string m_subMime;
+
+    /**
+     * MIME types(s) of items, from submime constructor parameter.
+     * Only one format is supported, but it may have different aliases (for example,
+     * application/x-vnd.kde.notes == application/x-vnd.akonadi.note).
+     */
+    QStringList m_mimeTypes;
+
+    /**
+     * The actual type to be used inside the collection. Set after opening
+     * the collection.
+     */
+    QString m_contentMimeType;
 };
 
 class AkonadiContactSource : public AkonadiSyncSource
@@ -143,8 +155,8 @@ private:
     QString toSynthesis(QString data);
 
 public:
-    AkonadiMemoSource(const SyncSourceParams &params)
-        : AkonadiSyncSource("text/x-vnd.akonadi.note", params)
+    AkonadiMemoSource(const SyncSourceParams &params) :
+        AkonadiSyncSource("text/x-vnd.akonadi.note,application/x-vnd.kde.notes", params)
     {
     }
 
index 064c2ed..ed05f1b 100644 (file)
@@ -10,7 +10,7 @@ AKONADIFOUND=yes
 if ! test "$KDEPIM_CFLAGS"; then
    KDEPIM_CFLAGS="-I`kde4-config --path include` -I`kde4-config --path include`/KDE"
    if test "$QMAKE"; then
-      KDEPIM_CFLAGS="$KDEPIM_CFLAGS -I`$QMAKE -query QT_INSTALL_HEADERS`"
+      KDEPIM_CFLAGS="$KDEPIM_CFLAGS -I`$QMAKE -query QT_INSTALL_HEADERS` -I`$QMAKE -query QT_INSTALL_HEADERS`/QtCore"
    fi
 fi
 if ! test "$KDEPIM_LIBS"; then
index fc4aa4e..65656c4 100644 (file)
@@ -58,6 +58,7 @@
 #define INCL_GDBUS_CXX_BRIDGE
 #include "gdbus-cxx.h"
 
+#include <stdint.h>
 #include <gio/gio.h>
 
 #include <map>
index 5d30bf0..34a40e3 100644 (file)
@@ -93,7 +93,14 @@ endif
 CORE_CXXFLAGS = $(SYNTHESIS_CFLAGS) $(CPPUNIT_CXXFLAGS)
 CORE_LDADD = $(SYNCEVOLUTION_LDADD) src/syncevo/libsyncevolution.la $(GLIB_LIBS) $(GTHREAD_LIBS) $(GOBJECT_LIBS) $(LIBS)
 CORE_DEP = $(SYNCEVOLUTION_DEP) src/syncevo/libsyncevolution.la $(SYNTHESIS_DEP)
-CORE_LD_FLAGS = -Wl,-uSyncEvolution_Module_Version -Wl,--export-dynamic $(CPPUNIT_LDFLAGS)
+CORE_LD_FLAGS = -Wl,-uSyncEvolution_Module_Version -Wl,--export-dynamic $(CPPUNIT_LDFLAGS) $(ADDITIONAL_LDFLAGS)
+
+if ENABLE_ICALTZ_UTIL
+# Force inclusion of our own icaltz-util.o into binaries even though
+# we do not call the icaltzutil_fetch_timezone directly ourself.
+# That way it is there if or when libical needs it.
+CORE_LD_FLAGS += -Wl,-usyncevo_fetch_timezone
+endif
 
 # put link to static c++ library into current directory, needed if compiling with --enable-static-c++
 src/libstdc++.a :
@@ -227,6 +234,7 @@ endif # COND_DBUS
 src_client_test_SOURCES = \
   src/client-test-app.cpp \
   test/ClientTest.cpp \
+  test/IcalTest.cpp \
   test/ClientTest.h \
   test/ClientTestAssert.h \
   test/client-test-main.cpp \
@@ -299,6 +307,10 @@ src_client_test_CPPFLAGS = -DHAVE_CONFIG_H -DENABLE_INTEGRATION_TESTS -DENABLE_U
 src_client_test_CXXFLAGS = $(filter-out -O2, @CPPUNIT_CXXFLAGS@ $(PCRECPP_CFLAGS) $(SYNCEVOLUTION_CXXFLAGS) $(CORE_CXXFLAGS) $(filter-out -O2 -g -W -Wall, $(QT_CXXFLAGS)) $(SYNCEVO_WFLAGS))
 src_client_test_LDFLAGS = @CPPUNIT_LDFLAGS@  $(src_client_test_undef) $(CORE_LD_FLAGS) $(QT_LDFLAGS)
 src_client_test_LDADD = $(src_client_test_libs) $(CORE_LDADD) $(PCRECPP_LIBS) $(SYNTHESIS_ENGINE) $(QT_LIBS)
+if !ENABLE_EVOLUTION_COMPATIBILITY
+src_client_test_LDADD += $(LIBICAL_LIBS)
+endif
+
 # These dependencies are intentionally a bit too broad:
 # they ensure that all files are in place to *run* client-test.
 
index 645a555..6b3fede 100644 (file)
@@ -25,6 +25,7 @@
 #endif
 
 #include <boost/bind.hpp>
+#include <boost/lambda/bind.hpp>
 #include <set>
 
 #include <string.h>
@@ -224,7 +225,7 @@ public:
      * Called by additional threads. Returns when check()
      * returned false.
      */
-    void blockOnCheck(const boost::function<bool ()> &check);
+    void blockOnCheck(const boost::function<bool ()> &check, bool checkFirst);
 };
 
 void PendingChecks::runChecks()
@@ -259,22 +260,26 @@ void PendingChecks::runChecks()
     }
 }
 
-void PendingChecks::blockOnCheck(const boost::function<bool ()> &check)
+void PendingChecks::blockOnCheck(const boost::function<bool ()> &check, bool checkFirst)
 {
     DynMutex::Guard guard = m_mutex.lock();
     // When we get here, the conditions for returning may already have
     // been met.  Check before sleeping. If we need to continue, then
     // holding the mutex ensures that the main thread will run the
     // check on the next iteration.
-    if (check()) {
+    if (!checkFirst || check()) {
         m_checks.insert(&check);
+        if (!checkFirst) {
+            // Must wake up the main thread from its g_main_context_iteration.
+            g_main_context_wakeup(g_main_context_default());
+        }
         do {
              m_cond.wait(m_mutex);
         } while (m_checks.find(&check) != m_checks.end());
     }
 }
 
-void GRunWhile(const boost::function<bool ()> &check)
+void GRunWhile(const boost::function<bool ()> &check, bool checkFirst)
 {
     static PendingChecks checks;
     if (g_main_context_is_owner(g_main_context_default())) {
@@ -288,10 +293,41 @@ void GRunWhile(const boost::function<bool ()> &check)
         }
     } else {
         // Transfer check into main thread.
-        checks.blockOnCheck(check);
+        checks.blockOnCheck(check, checkFirst);
     }
 }
 
+static std::string NoThrow(const boost::function<void ()> &action) throw ()
+{
+    try {
+        action();
+    } catch (...) {
+        // 
+        std::string explanation;
+        Exception::handle(explanation, HANDLE_EXCEPTION_NO_ERROR);
+        return explanation;
+    }
+    return "";
+}
+
+void GRunInMain(const boost::function<void ()> &action)
+{
+    std::string explanation;
+
+    // Wrap in NoThrow, then rethrow exception in current thread if there was a problem.
+    GRunWhile((boost::lambda::var(explanation) = boost::lambda::bind(NoThrow, action), false), false);
+    if (!explanation.empty()) {
+        Exception::tryRethrow(explanation, true);
+    }
+}
+
+bool GRunIsMain()
+{
+    // This works because SyncContext::initMain() permanently acquires
+    // the main context in the main thread.
+    return g_main_context_is_owner(g_main_context_default());
+}
+
 #ifdef ENABLE_UNIT_TESTS
 
 class GLibTest : public CppUnit::TestFixture {
index 11d0fb8..7801ced 100644 (file)
@@ -1042,24 +1042,6 @@ template<> class GAsyncReadyDoneCXX<void>
         GRunWhile(! boost::lambda::var(done)); \
     } while (false); \
 
-
-/**
- * Process events in the default context while the callback returns
- * true.
- *
- * This must be used instead of g_main_context_iterate() by code which
- * may get called in other threads. In that case the check is
- * transferred to the main thread which does the actual event
- * processing. g_main_context_iterate() would just block because we
- * register the main thread as permanent owner of the default context,
- * or would suffer from race conditions if we didn't.
- *
- * The main thread must also be running GRunWhile().
- *
- * Exceptions in the check code are fatal and should be avoided.
- */
-void GRunWhile(const boost::function<bool ()> &check);
-
 #endif // HAVE_GLIB
 
 SE_END_CXX
index c58f088..46fa721 100644 (file)
@@ -86,6 +86,20 @@ SyncContext *SyncContext::m_activeContext;
 
 static const char *LogfileBasename = "syncevolution-log";
 
+static std::string RealPath(const std::string &path)
+{
+    std::string buffer;
+    char *newPath = realpath(path.c_str(), NULL);
+    if (newPath) {
+        buffer = newPath;
+        free(newPath);
+        return buffer;
+    } else {
+        return path;
+    }
+}
+
+
 SyncContext::SyncContext()
 {
     init();
@@ -398,6 +412,15 @@ public:
             return;
         }
 
+        // Resolve symbolic links in path now, in case that they change later
+        // while the session runs. Relies on being allowed to pass NULL. If that's
+        // not allowed, we ignore the error and continue to use the known path.
+        errno = 0;
+        m_logdir = RealPath(m_logdir);
+        SE_LOG_DEBUG(NULL, "log path -> %s, %s",
+                     m_logdir.c_str(),
+                     errno ? strerror(errno) : "<okay>");
+
         // the config name has been normalized
         string peer = m_client.getConfigName();
 
@@ -484,6 +507,7 @@ public:
             m_path = "";
         } else {
             setLogdir(path);
+            SE_LOG_DEBUG(NULL, "checking log dir %s", m_logdir.c_str());
             if (mode == SESSION_CREATE) {
                 // create unique directory name in the given directory
                 time_t ts = time(NULL);
@@ -551,6 +575,7 @@ public:
                 }
             }
             m_logfile = m_path + "/" + LogfileBasename + ".html";
+            SE_LOG_DEBUG(NULL, "logfile: %s", m_logfile.c_str());
         }
 
         // update log level of default logger and our own replacement
@@ -605,7 +630,7 @@ public:
     }
 
     /** sets a fixed directory for database files without redirecting logging */
-    void setPath(const string &path) { m_path = path; }
+    void setPath(const string &path) { m_path = RealPath(path); SE_LOG_DEBUG(NULL, "setPath(%s) -> %s", path.c_str(), m_path.c_str()); }
 
     // return log directory, empty if not enabled
     const string &getLogdir() {
@@ -4796,7 +4821,7 @@ private:
         string logdir = getLogDir();
         ReadDir dirs(logdir);
         BOOST_FOREACH(const string &dir, dirs) {
-            sessions.push_back(logdir + "/" + dir);
+            sessions.push_back(RealPath(logdir + "/" + dir));
         }
         sort(sessions.begin(), sessions.end());
         return sessions;
index a31cac6..c12e6e4 100644 (file)
@@ -343,7 +343,7 @@ public:
             std::string modname;
             size_t offset = basename.rfind('-');
             if (offset != basename.npos) {
-                modname = basename.substr(offset);
+                modname = basename.substr(0, offset);
             } else {
                 modname = basename;
             }
index db4720f..003d06f 100644 (file)
     ]]></macro>
 
     <macro name="CALENDAR_BEFOREWRITE_SCRIPT"><![CDATA[
+      if (UID == EMPTY) { UID = newuid(); }
+
       // set UTC time of generation for iCalendar 2.0 DTSTAMP
       DGENERATED = NOW();
       // ensure that there is a DMODIFIED = LAST-MODIFIED property,
index f612279..f0eef23 100644 (file)
@@ -20,6 +20,7 @@
 #define EDS_ABI_WRAPPER_NO_REDEFINE 1
 #include <syncevo/eds_abi_wrapper.h>
 #include <syncevo/SyncContext.h>
+#include <syncevo/util.h>
 
 #include <string>
 #include <sstream>
@@ -30,7 +31,8 @@
 using namespace std;
 namespace {
 
-std::string lookupDebug, lookupInfo;
+static std::string &getLookupDebug() { static std::string lookupDebug; return lookupDebug; }
+static std::string &getLookupInfo() { static std::string lookupInfo; return lookupInfo; }
 
 }
 
@@ -114,10 +116,15 @@ void *findSymbols(const char *libname, int minver, int maxver,
         const char *symname = NULL;
         while (funcptr) {
             symname = va_arg(ap, const char *);
-            *funcptr = dlsym(dlhandle, symname);
+            // Don't overwrite address already found earlier. Needed
+            // for icaltimezone_get_component(), which may be
+            // overridden by ourselves.
             if (!*funcptr) {
-                debug << symname << " not found" << std::endl;
-                allfound = false;
+                *funcptr = dlsym(dlhandle, symname);
+                if (!*funcptr) {
+                    debug << symname << " not found" << std::endl;
+                    allfound = false;
+                }
             }
             funcptr = va_arg(ap, void **);
         }
@@ -140,9 +147,9 @@ void *findSymbols(const char *libname, int minver, int maxver,
         }
     }
 
-    lookupInfo += info.str();
-    lookupDebug += info.str();
-    lookupDebug += debug.str();
+    getLookupInfo() += info.str();
+    getLookupDebug() += info.str();
+    getLookupDebug() += debug.str();
     return dlhandle;
 }
 
@@ -178,6 +185,14 @@ extern "C" void EDSAbiWrapperInit()
         initialized = true;
     }
 
+    // Bind icaltimezone_get_component() to the version found (or not found,
+    // if internal-icaltz not configured) in our own executable.
+    void *get = dlsym(RTLD_DEFAULT, "icaltimezone_get_component");
+    getLookupDebug() += SyncEvo::StringPrintf("icaltimezone_get_component = %p", get);
+#if defined(ENABLE_ECAL) || defined(ENABLE_ICAL)
+    EDSAbiWrapperSingleton.icaltimezone_get_component = (icalcomponent *(*)(icaltimezone *))get;
+#endif
+
 # ifdef HAVE_EDS
     edshandle =
     findSymbols("libedataserver-1.2.so", 7, 16,
@@ -248,6 +263,7 @@ extern "C" void EDSAbiWrapperInit()
                 &EDSAbiWrapperSingleton.icalcomponent_get_summary, "icalcomponent_get_summary", \
                 &EDSAbiWrapperSingleton.icalcomponent_get_uid, "icalcomponent_get_uid", \
                 &EDSAbiWrapperSingleton.icalcomponent_get_dtstart, "icalcomponent_get_dtstart", \
+                &EDSAbiWrapperSingleton.icalcomponent_set_dtstart, "icalcomponent_set_dtstart", \
                 &EDSAbiWrapperSingleton.icalcomponent_isa, "icalcomponent_isa", \
                 &EDSAbiWrapperSingleton.icalcomponent_new_clone, "icalcomponent_new_clone", \
                 &EDSAbiWrapperSingleton.icalcomponent_new_from_string, "icalcomponent_new_from_string", \
@@ -306,7 +322,26 @@ extern "C" void EDSAbiWrapperInit()
                 &EDSAbiWrapperSingleton.icaltimezone_get_component, "icaltimezone_get_component", \
                 &EDSAbiWrapperSingleton.icaltimezone_get_tzid, "icaltimezone_get_tzid", \
                 &EDSAbiWrapperSingleton.icaltimezone_new, "icaltimezone_new", \
-                &EDSAbiWrapperSingleton.icaltimezone_set_component, "icaltimezone_set_component",
+                &EDSAbiWrapperSingleton.icaltimezone_set_component, "icaltimezone_set_component", \
+                &EDSAbiWrapperSingleton.icaltimezone_get_location, "icaltimezone_get_location", \
+                &EDSAbiWrapperSingleton.ical_tzid_prefix, "ical_tzid_prefix", \
+                &EDSAbiWrapperSingleton.icalerror_set_errno, "icalerror_set_errno", \
+                &EDSAbiWrapperSingleton.icalproperty_new_dtstart, "icalproperty_new_dtstart", \
+                &EDSAbiWrapperSingleton.icalproperty_new_rrule, "icalproperty_new_rrule", \
+                &EDSAbiWrapperSingleton.icalproperty_new_tzid, "icalproperty_new_tzid", \
+                &EDSAbiWrapperSingleton.icalproperty_new_tzname, "icalproperty_new_tzname", \
+                &EDSAbiWrapperSingleton.icalproperty_new_tzoffsetfrom, "icalproperty_new_tzoffsetfrom", \
+                &EDSAbiWrapperSingleton.icalproperty_new_tzoffsetto, "icalproperty_new_tzoffsetto", \
+                &EDSAbiWrapperSingleton.icalproperty_new_x, "icalproperty_new_x", \
+                &EDSAbiWrapperSingleton.icalproperty_set_x_name, "icalproperty_set_x_name", \
+                &EDSAbiWrapperSingleton.icalrecur_iterator_free, "icalrecur_iterator_free", \
+                &EDSAbiWrapperSingleton.icalrecur_iterator_new, "icalrecur_iterator_new", \
+                &EDSAbiWrapperSingleton.icalrecur_iterator_next, "icalrecur_iterator_next", \
+                &EDSAbiWrapperSingleton.icalrecurrencetype_clear, "icalrecurrencetype_clear", \
+                &EDSAbiWrapperSingleton.icaltime_day_of_week, "icaltime_day_of_week", \
+                &EDSAbiWrapperSingleton.icaltime_days_in_month, "icaltime_days_in_month", \
+                &EDSAbiWrapperSingleton.icaltzutil_get_zone_directory, "icaltzutil_get_zone_directory", \
+
 
     // icalparameter_new_scheduleagent was added in libical.so.1. We
     // use it only to detect the libical 1.0 ABI. This works because
@@ -433,20 +468,30 @@ void EDSAbiWrapperInit()
         initialized = true;
     }
 
+    // Bind icaltimezone_get_component() and
+    // icaltzutil_fetch_timezone() to the version found (or not found,
+    // if not enabled) in our own executable. Without this, the
+    // dynamic linker on Ubuntu Saucy and Trusty prefers the versions
+    // from libical once it is loaded.
+    void *fetch = dlsym(RTLD_DEFAULT, "icaltzutil_fetch_timezone");
+    void *get = dlsym(RTLD_DEFAULT, "icaltimezone_get_component");
+    getLookupDebug() += SyncEvo::StringPrintf("icaltzutil_fetch_timezone = %p\n", fetch);
+    getLookupDebug() += SyncEvo::StringPrintf("icaltimezone_get_component = %p", get);
+
     static const char *soname = "libical.so.1";
     void *dlhandle = dlopen(soname, RTLD_GLOBAL|RTLD_LAZY);
     if (dlhandle) {
-        lookupInfo += "using ";
-        lookupInfo += soname;
-        lookupInfo += "\n";
+        getLookupInfo() += "using ";
+        getLookupInfo() += soname;
+        getLookupInfo() += "\n";
         EDSAbiHaveIcal1 = 1;
         dlclose(dlhandle);
     }
 }
 #endif // EVOLUTION_COMPATIBILITY
 
-extern "C" const char *EDSAbiWrapperInfo() { EDSAbiWrapperInit(); return lookupInfo.c_str(); }
-extern "C" const char *EDSAbiWrapperDebug() { EDSAbiWrapperInit(); return lookupDebug.c_str(); }
+extern "C" const char *EDSAbiWrapperInfo() { EDSAbiWrapperInit(); return getLookupInfo().c_str(); }
+extern "C" const char *EDSAbiWrapperDebug() { EDSAbiWrapperInit(); return getLookupDebug().c_str(); }
 
 #ifdef ENABLE_DBUS_TIMEOUT_HACK
 /**
index 1902981..6d98c39 100644 (file)
@@ -194,6 +194,7 @@ struct EDSAbiWrapper {
     const char* (*icalcomponent_get_summary) (icalcomponent* comp);
     const char* (*icalcomponent_get_uid) (icalcomponent* comp);
     struct icaltimetype (*icalcomponent_get_dtstart)(icalcomponent* comp);
+    void (*icalcomponent_set_dtstart)(icalcomponent* comp, struct icaltimetype v);
     icalcomponent_kind (*icalcomponent_isa) (const icalcomponent* component);
     icalcomponent* (*icalcomponent_new_clone) (icalcomponent* component);
     icalcomponent* (*icalcomponent_new_from_string) (char* str);
@@ -237,6 +238,22 @@ struct EDSAbiWrapper {
     const char* (*icalproperty_get_value_as_string)(const icalproperty* prop);
     const char* (*icalproperty_get_x_name)(icalproperty* prop);
     icalproperty* (*icalproperty_new_from_string)(const char* str);
+    icalproperty* (*icalproperty_new_dtstart)(struct icaltimetype v);
+    icalproperty* (*icalproperty_new_rrule)(struct icalrecurrencetype v);
+    icalproperty* (*icalproperty_new_tzid)(const char* v);
+    icalproperty* (*icalproperty_new_tzname)(const char* v);
+    icalproperty* (*icalproperty_new_tzoffsetfrom)(int v);
+    icalproperty* (*icalproperty_new_tzoffsetto)(int v);
+    icalproperty* (*icalproperty_new_x)(const char* v);
+    void (*icalproperty_set_x_name)(icalproperty* prop, const char* name);
+
+    void (*icalrecur_iterator_free)(icalrecur_iterator*);
+    icalrecur_iterator* (*icalrecur_iterator_new)(struct icalrecurrencetype rule, struct icaltimetype dtstart);
+    struct icaltimetype (*icalrecur_iterator_next)(icalrecur_iterator*);
+
+    void (*icalrecurrencetype_clear)(struct icalrecurrencetype *r);
+    int (*icaltime_day_of_week)(const struct icaltimetype t);
+    int (*icaltime_days_in_month)(const int month, const int year);
 
     int (*icaltime_is_null_time)(const struct icaltimetype t);
     int (*icaltime_is_utc)(const struct icaltimetype t);
@@ -256,6 +273,11 @@ struct EDSAbiWrapper {
     char* (*icaltimezone_get_tzid) (icaltimezone *zone);
     icaltimezone *(*icaltimezone_new) (void);
     int (*icaltimezone_set_component) (icaltimezone *zone, icalcomponent *comp);
+    const char* (*icaltimezone_get_location) (icaltimezone *zone);
+
+    void (*icalerror_set_errno)(icalerrorenum x);
+    const char *(*icaltzutil_get_zone_directory)(void);
+    const char **ical_tzid_prefix;
 
     // Optional, added in libical.so.1. Can't be called be like this,
     // we merely check for the method to detect the ABI.
@@ -374,6 +396,7 @@ extern struct EDSAbiWrapper EDSAbiWrapperSingleton;
 #   define icalcomponent_get_summary EDSAbiWrapperSingleton.icalcomponent_get_summary
 #   define icalcomponent_get_uid EDSAbiWrapperSingleton.icalcomponent_get_uid
 #   define icalcomponent_get_dtstart EDSAbiWrapperSingleton.icalcomponent_get_dtstart
+#   define icalcomponent_set_dtstart EDSAbiWrapperSingleton.icalcomponent_set_dtstart
 #   define icalcomponent_isa EDSAbiWrapperSingleton.icalcomponent_isa
 #   define icalcomponent_new_clone EDSAbiWrapperSingleton.icalcomponent_new_clone
 #   define icalcomponent_new_from_string EDSAbiWrapperSingleton.icalcomponent_new_from_string
@@ -433,6 +456,26 @@ extern struct EDSAbiWrapper EDSAbiWrapperSingleton;
 #   define icaltimezone_get_tzid EDSAbiWrapperSingleton.icaltimezone_get_tzid
 #   define icaltimezone_new EDSAbiWrapperSingleton.icaltimezone_new
 #   define icaltimezone_set_component EDSAbiWrapperSingleton.icaltimezone_set_component
+#   define icaltimezone_get_location EDSAbiWrapperSingleton.icaltimezone_get_location
+
+#   define ical_tzid_prefix (*EDSAbiWrapperSingleton.ical_tzid_prefix)
+#   define icalerror_set_errno EDSAbiWrapperSingleton.icalerror_set_errno
+#   define icalproperty_new_dtstart EDSAbiWrapperSingleton.icalproperty_new_dtstart
+#   define icalproperty_new_rrule EDSAbiWrapperSingleton.icalproperty_new_rrule
+#   define icalproperty_new_tzid EDSAbiWrapperSingleton.icalproperty_new_tzid
+#   define icalproperty_new_tzname EDSAbiWrapperSingleton.icalproperty_new_tzname
+#   define icalproperty_new_tzoffsetfrom EDSAbiWrapperSingleton.icalproperty_new_tzoffsetfrom
+#   define icalproperty_new_tzoffsetto EDSAbiWrapperSingleton.icalproperty_new_tzoffsetto
+#   define icalproperty_new_x EDSAbiWrapperSingleton.icalproperty_new_x
+#   define icalproperty_set_x_name EDSAbiWrapperSingleton.icalproperty_set_x_name
+#   define icalrecur_iterator_free EDSAbiWrapperSingleton.icalrecur_iterator_free
+#   define icalrecur_iterator_new EDSAbiWrapperSingleton.icalrecur_iterator_new
+#   define icalrecur_iterator_next EDSAbiWrapperSingleton.icalrecur_iterator_next
+#   define icalrecurrencetype_clear EDSAbiWrapperSingleton.icalrecurrencetype_clear
+#   define icaltime_day_of_week EDSAbiWrapperSingleton.icaltime_day_of_week
+#   define icaltime_days_in_month EDSAbiWrapperSingleton.icaltime_days_in_month
+#   define icaltzutil_get_zone_directory EDSAbiWrapperSingleton.icaltzutil_get_zone_directory
+
 #  endif /* ENABLE_ICAL */
 #  ifdef ENABLE_BLUETOOTH
 #   define sdp_close EDSAbiWrapperSingleton.sdp_close
diff --git a/src/syncevo/icaltz-util.c b/src/syncevo/icaltz-util.c
new file mode 100644 (file)
index 0000000..31140b7
--- /dev/null
@@ -0,0 +1,671 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/* 
+ * Authors : 
+ *  Chenthill Palanisamy <pchenthill@novell.com>
+ *
+ * Copyright 2007, Novell, Inc.
+ *
+ * This program is free software; you can redistribute it and/or 
+ * modify it under the terms of version 2 of the GNU Lesser General Public 
+ * License as published by the Free Software Foundation.
+ *
+ * This program 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 St, Fifth Floor, 
+ * Boston, MA 02110-1301, USA.
+ */
+
+/*
+ * Compile with
+ * gcc -c -Wall -DDISABLE_ICALTZUTIL_GET_ZONE_DIRECTORY  -DICALTZ_UTIL_MAIN -DHAVE_UNISTD_H  -DHAVE_ENDIAN_H -DHAVE_BYTESWAP_H $(pkg-config --cflags --libs libical) -o icaltz-util icaltz-util.c
+ * to get an utility which will print the VTIMEZONE definition of
+ * a certain location, for example "Europe/Berlin".
+ *
+ * With -DDISABLE_ICALTZUTIL_GET_ZONE_DIRECTORY the
+ * icaltzutil_get_zone_directory() from libical will be used.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include <string.h>
+
+#ifdef ICALTZ_UTIL_MAIN
+#include <stdio.h>
+#endif
+
+#ifdef EVOLUTION_ICAL_COMPATIBILITY
+# include "eds_abi_wrapper.h"
+# else
+# include <libical/icaltimezone.h>
+#endif
+
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#if defined(sun) && defined(__SVR4)
+#include <sys/types.h>
+#include <sys/byteorder.h>
+#else
+# ifdef HAVE_BYTESWAP_H
+#  include <byteswap.h>
+# endif
+# ifdef HAVE_ENDIAN_H
+#  include <endian.h>
+# else
+# ifdef HAVE_SYS_ENDIAN_H
+#  include <sys/endian.h>
+#  ifdef bswap32
+#   define bswap_32 bswap32
+#  else
+#   define bswap_32 swap32
+#  endif
+# endif
+# endif
+#endif
+
+#ifdef _MSC_VER
+#if !defined(HAVE_BYTESWAP_H) && !defined(HAVE_SYS_ENDIAN_H) && !defined(HAVE_ENDIAN_H)
+#define bswap_16(x) (((x) << 8) & 0xff00) | (((x) >> 8 ) & 0xff)
+#define bswap_32(x) (((x) << 24) & 0xff000000)  \
+                    | (((x) << 8) & 0xff0000)   \
+                    | (((x) >> 8) & 0xff00)     \
+                    | (((x) >> 24) & 0xff )
+#define bswap_64(x) ((((x) & 0xff00000000000000ull) >> 56) \
+                    | (((x) & 0x00ff000000000000ull) >> 40) \
+                    | (((x) & 0x0000ff0000000000ull) >> 24) \
+                    | (((x) & 0x000000ff00000000ull) >> 8) \
+                    | (((x) & 0x00000000ff000000ull) << 8) \
+                    | (((x) & 0x0000000000ff0000ull) << 24) \
+                    | (((x) & 0x000000000000ff00ull) << 40) \
+                    | (((x) & 0x00000000000000ffull) << 56))
+#endif
+#include <io.h>
+#endif
+
+#if defined(__APPLE__)
+#define bswap_16(x) (((x) << 8) & 0xff00) | (((x) >> 8 ) & 0xff)
+#define bswap_32 __builtin_bswap32
+#define bswap_64 __builtin_bswap64
+#endif
+
+#ifndef PATH_MAX
+#define PATH_MAX 512
+#endif
+
+#ifndef F_OK
+#define F_OK 0
+#endif
+
+#ifndef R_OK
+#define R_OK 4
+#endif
+
+#include <limits.h>
+#include <time.h>
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <libical/icalerror.h>
+#include "icaltz-util.h"
+
+typedef struct 
+{
+       char    ttisgmtcnt [4]; 
+       char    ttisstdcnt[4];  
+       char    leapcnt[4];             
+       char    timecnt[4];     
+       char    typecnt[4];
+       char    charcnt[4];                     
+} tzinfo; 
+
+static int r_pos [] = {1, 2, 3, -2, -1};
+
+#ifndef DISABLE_ICALTZUTIL_GET_ZONE_DIRECTORY
+static char *search_paths [] = {"/usr/share/zoneinfo","/usr/lib/zoneinfo","/etc/zoneinfo","/usr/share/lib/zoneinfo"};
+static char *zdir = NULL;
+#endif
+
+#define NUM_SEARCH_PATHS (sizeof (search_paths)/ sizeof (search_paths [0]))
+#define EFREAD(buf,size,num,fs) \
+       if (fread (buf, size, num, fs) == 0  && ferror (fs)) {\
+               icalerror_set_errno (ICAL_FILE_ERROR);          \
+               goto error;                                     \
+       }                                                       \
+
+typedef struct
+{
+       long int gmtoff;
+       unsigned char isdst;
+       unsigned int abbr;      
+       unsigned char isstd;
+       unsigned char isgmt;
+       char *zname;
+
+} ttinfo;
+
+typedef struct
+{
+       time_t transition;
+       long int change;
+} leap;
+
+#ifndef EVOLUTION_ICAL_COMPATIBILITY
+extern const char *ical_tzid_prefix;
+#endif
+
+static int
+decode (const void *ptr)
+{
+#if defined(sun) && defined(__SVR4)
+    if (sizeof (int) == 4)
+#ifdef _BIG_ENDIAN
+        return *(const int *) ptr;
+#else
+        return BSWAP_32 (*(const int *) ptr);
+#endif
+#else
+    if ((BYTE_ORDER == BIG_ENDIAN) && sizeof (int) == 4)
+        return *(const int *) ptr;
+    else if (BYTE_ORDER == LITTLE_ENDIAN && sizeof (int) == 4)
+        return bswap_32 (*(const int *) ptr);
+#endif
+       else
+       {
+               const unsigned char *p = ptr;
+               int result = *p & (1 << (CHAR_BIT - 1)) ? ~0 : 0;
+
+               result = (result << 8) | *p++;
+               result = (result << 8) | *p++;
+               result = (result << 8) | *p++;
+               result = (result << 8) | *p++;
+
+               return result;
+       }
+}
+
+static char *
+zname_from_stridx (char *str, long int idx) 
+{
+       int i = 0;
+       char *ret;
+       size_t size;
+
+       i = idx;
+
+       while (str [i] != '\0') 
+               i++;
+
+       size = i - idx;
+       str += idx;
+       ret = (char *) malloc (size + 1);
+       ret = strncpy (ret, str, size);
+       ret [size] = '\0';
+
+       return ret;
+}
+
+static void 
+find_transidx (time_t *transitions, ttinfo *types, int *trans_idx, long int num_trans, int *stdidx, int *dstidx) 
+{
+       time_t now, year_start;
+       int i, found = 0;
+       struct icaltimetype itime;
+
+       now = time (NULL);
+       itime = icaltime_from_timet (now, 0);
+       itime.month = itime.day = 1;
+       itime.hour = itime.minute = itime.second = 0;
+       year_start = icaltime_as_timet(itime);
+
+       /* Set this by default */
+       *stdidx = (num_trans - 1);
+
+       for (i = (num_trans - 1); i >= 0; --i)
+               if (year_start < transitions [i]) {
+                       int idx;
+                       found = 1;
+                       idx = trans_idx [i];
+                       (types [idx].isdst) ? (*dstidx = i) : (*stdidx = i);
+               }
+
+       /* If the transition found is the last among the list, prepare to use the last two transtions. 
+        * Using this will most likely throw the DTSTART of the resulting component off by 1 or 2 days
+        * but it would set right by the adjustment made. 
+        * NOTE: We need to use the last two transitions only because there is no data for the future 
+        * transitions. 
+        */
+       if (found && (*dstidx == -1)) {
+               *dstidx = ((*stdidx) - 1);
+       }
+
+       return;
+}
+
+#ifndef DISABLE_ICALTZUTIL_GET_ZONE_DIRECTORY
+static void
+set_zonedir (void)
+{
+       char file_path[PATH_MAX];
+       const char *fname = ZONES_TAB_SYSTEM_FILENAME;
+       int i;  
+
+       for (i = 0;i < NUM_SEARCH_PATHS; i++) {
+               sprintf (file_path, "%s/%s", search_paths [i], fname);
+               if (!access (file_path, F_OK|R_OK)) {
+                       zdir = search_paths [i];
+                       break;
+               }
+       }
+}
+
+
+const char *
+icaltzutil_get_zone_directory (void)
+{
+       if (!zdir)
+               set_zonedir ();
+
+       return zdir;
+}
+#endif
+
+/* Calculate the relative position of the week in a month from a date */
+static int
+calculate_pos (icaltimetype icaltime)
+{
+       int pos;
+
+       pos = (icaltime.day -1) / 7;
+
+       /* Check if pos 3 is the last occurence of the week day in the month */ 
+       if (pos == 3 && ((icaltime.day + 7) > icaltime_days_in_month (icaltime.month, icaltime.year))) 
+               pos = 4;
+
+       return r_pos [pos];
+}
+
+static void
+adjust_dtstart_day_to_rrule (icalcomponent *comp, struct icalrecurrencetype rule)
+{
+       time_t now, year_start;
+       struct icaltimetype start, comp_start, iter_start, itime;
+       icalrecur_iterator *iter;
+
+       now = time (NULL);
+       itime = icaltime_from_timet (now, 0);
+       itime.month = itime.day = 1;
+       itime.hour = itime.minute = itime.second = 0;
+       year_start = icaltime_as_timet(itime);
+
+       comp_start = icalcomponent_get_dtstart (comp);
+       start = icaltime_from_timet (year_start, 0);
+
+       iter = icalrecur_iterator_new (rule, start);
+       iter_start = icalrecur_iterator_next (iter);
+       icalrecur_iterator_free (iter);
+
+       if (iter_start.day != comp_start.day) {
+               comp_start.day = iter_start.day;
+               icalcomponent_set_dtstart (comp, comp_start);
+       }
+}
+
+icalcomponent*
+icaltzutil_fetch_timezone (const char *location)
+{
+       int ret = 0;
+       FILE *f;
+       tzinfo type_cnts;
+       unsigned int i, num_trans, num_types = 0, num_chars, num_leaps, num_isstd, num_isgmt;
+       time_t *transitions = NULL;
+       time_t trans;
+       int *trans_idx = NULL, dstidx = -1, stdidx = -1, pos, sign, zidx, zp_idx;
+       ttinfo *types = NULL;
+       char *znames = NULL, *full_path, *tzid, *r_trans, *temp = NULL;
+       leap *leaps = NULL;
+       icalcomponent *tz_comp = NULL, *dst_comp = NULL, *std_comp = NULL;
+       icalproperty *icalprop;
+       icaltimetype dtstart, icaltime;
+       struct icalrecurrencetype ical_recur;
+       const char *basedir;
+
+       /* if (!location) return NULL; */
+
+       basedir = icaltzutil_get_zone_directory();
+       if (!basedir) {
+               icalerror_set_errno (ICAL_FILE_ERROR);
+               return NULL;
+       }
+
+       full_path = (char *) malloc (strlen (basedir) + strlen (location) + 2);
+       sprintf (full_path,"%s/%s",basedir, location);
+
+       if ((f = fopen (full_path, "rb")) == 0) {
+               icalerror_set_errno (ICAL_FILE_ERROR);
+               free (full_path);
+               return NULL;
+       }
+
+       if ((ret = fseek (f, 20, SEEK_SET)) != 0) {
+               icalerror_set_errno (ICAL_FILE_ERROR);
+               goto error;     
+       }
+
+       EFREAD(&type_cnts, 24, 1, f);
+
+       num_isgmt = decode (type_cnts.ttisgmtcnt);
+       num_leaps = decode (type_cnts.leapcnt);
+       num_chars = decode (type_cnts.charcnt);
+       num_trans = decode (type_cnts.timecnt);
+       num_isstd = decode (type_cnts.ttisstdcnt);
+       num_types = decode (type_cnts.typecnt);
+
+       transitions = calloc (num_trans, sizeof (time_t));
+       temp = calloc (num_trans, 4);
+       r_trans = temp;
+       EFREAD(r_trans, 4, num_trans, f);
+
+       if (num_trans) {
+               trans_idx = calloc (num_trans, sizeof (int));
+               for (i = 0; i < num_trans; i++) {
+                       trans_idx [i] = fgetc (f);
+                       transitions [i] = decode (r_trans);
+                       r_trans += 4;
+               }
+       }
+       
+       free (temp);
+       temp = NULL;
+
+       types = calloc (num_types, sizeof (ttinfo));
+       for (i = 0; i < num_types; i++) {
+               unsigned char a [4];
+               int c;
+
+               EFREAD(a, 4, 1, f);
+               c = fgetc (f);
+               types [i].isdst = c;
+               if((c = fgetc (f)) < 0) {
+                  c = 0;
+                  break;
+               }
+               types [i].abbr = c;
+               types [i].gmtoff = decode (a);
+       }
+
+       znames = (char *) malloc (num_chars);
+       EFREAD(znames, num_chars, 1, f);
+
+       /* We got all the information which we need */
+
+       leaps = calloc (num_leaps, sizeof (leap));
+       for (i = 0; i < num_leaps; i++) {
+               char c [4];
+
+               EFREAD (c, 4, 1, f);
+               leaps [i].transition = decode (c);
+
+               EFREAD (c, 4, 1, f);
+               leaps [i].change = decode (c);
+       }
+
+       for (i = 0; i < num_isstd; ++i) {
+               int c = getc (f);
+               types [i].isstd = c != 0;
+       }
+
+       while (i < num_types)
+               types [i++].isstd = 0;
+
+       for (i = 0; i <  num_isgmt; ++i) {
+               int c = getc (f);
+               types [i].isgmt = c != 0;
+       }
+
+       while (i < num_types)
+               types [i++].isgmt = 0;
+
+       /* Read all the contents now */
+
+       for (i = 0; i < num_types; i++) 
+               types [i].zname = zname_from_stridx (znames, types [i].abbr);
+
+       if (num_trans != 0)
+               find_transidx (transitions, types, trans_idx, num_trans, &stdidx, &dstidx);
+       else
+               stdidx = 0;
+
+       tz_comp = icalcomponent_new (ICAL_VTIMEZONE_COMPONENT);
+
+       /* Add tzid property */
+       tzid = (char *) malloc (strlen (ical_tzid_prefix) + strlen (location) + 8);
+       sprintf (tzid, "%sTzfile/%s", ical_tzid_prefix, location);
+       icalprop = icalproperty_new_tzid (tzid);
+       icalcomponent_add_property (tz_comp, icalprop);
+       free (tzid);
+
+       icalprop = icalproperty_new_x (location);
+       icalproperty_set_x_name (icalprop, "X-LIC-LOCATION");
+       icalcomponent_add_property (tz_comp, icalprop);
+       
+       if (stdidx != -1) {
+               if (num_trans != 0)
+                       zidx = trans_idx [stdidx];
+               else 
+                       zidx = 0;
+
+               std_comp = icalcomponent_new (ICAL_XSTANDARD_COMPONENT);
+               icalprop = icalproperty_new_tzname (types [zidx].zname);
+               icalcomponent_add_property (std_comp, icalprop);
+
+               if (dstidx != -1)
+                       zp_idx = trans_idx [stdidx-1]; 
+               else
+                       zp_idx = zidx;
+               /* DTSTART localtime uses TZOFFSETFROM UTC offset */
+               if (num_trans != 0)
+                       trans = transitions [stdidx] + types [zp_idx].gmtoff;
+               else
+                       trans = types [zp_idx].gmtoff;
+               icaltime = icaltime_from_timet (trans, 0);
+               dtstart = icaltime;
+               dtstart.year = 1970;
+               dtstart.minute = dtstart.second = 0;
+               icalprop = icalproperty_new_dtstart (dtstart);
+               icalcomponent_add_property (std_comp, icalprop);
+
+               /* If DST changes are present use RRULE */
+               if (dstidx != -1) {
+                       icalrecurrencetype_clear (&ical_recur);
+                       ical_recur.freq = ICAL_YEARLY_RECURRENCE;
+                       ical_recur.by_month [0] = icaltime.month;
+                       pos = calculate_pos (icaltime);
+                       pos < 0 ? (sign = -1): (sign = 1);
+                       ical_recur.by_day [0] = sign * ((abs (pos) * 8) + icaltime_day_of_week (icaltime));
+                       icalprop = icalproperty_new_rrule (ical_recur);
+                       icalcomponent_add_property (std_comp, icalprop);
+
+                       adjust_dtstart_day_to_rrule (std_comp, ical_recur);
+               }
+        icalprop = icalproperty_new_tzoffsetfrom (types [zp_idx].gmtoff);
+        icalcomponent_add_property (std_comp, icalprop);
+
+               icalprop = icalproperty_new_tzoffsetto (types [zidx].gmtoff);
+               icalcomponent_add_property (std_comp, icalprop);
+
+               icalcomponent_add_component (tz_comp, std_comp);
+       } else 
+               icalerror_set_errno (ICAL_MALFORMEDDATA_ERROR);
+       
+       if (dstidx != -1) {
+               zidx = trans_idx [dstidx];
+               zp_idx = trans_idx [dstidx-1];
+               dst_comp = icalcomponent_new (ICAL_XDAYLIGHT_COMPONENT);
+               icalprop = icalproperty_new_tzname (types [zidx].zname);
+               icalcomponent_add_property (dst_comp, icalprop);
+
+               /* DTSTART localtime uses TZOFFSETFROM UTC offset */
+               if (num_trans != 0)
+                       trans = transitions [dstidx] + types [zp_idx].gmtoff;
+               else
+                       trans = types [zp_idx].gmtoff;
+               icaltime = icaltime_from_timet (trans, 0);
+               dtstart = icaltime;
+               dtstart.year = 1970;
+               dtstart.minute = dtstart.second = 0;
+               icalprop = icalproperty_new_dtstart (dtstart);
+               icalcomponent_add_property (dst_comp, icalprop);
+
+               icalrecurrencetype_clear (&ical_recur);
+               ical_recur.freq = ICAL_YEARLY_RECURRENCE;
+               ical_recur.by_month [0] = icaltime.month;
+               pos = calculate_pos (icaltime);
+               pos < 0 ? (sign = -1): (sign = 1);
+               ical_recur.by_day [0] = sign * ((abs (pos) * 8) + icaltime_day_of_week (icaltime));
+               icalprop = icalproperty_new_rrule (ical_recur);
+               icalcomponent_add_property (dst_comp, icalprop);
+
+               adjust_dtstart_day_to_rrule (dst_comp, ical_recur);
+
+               icalprop = icalproperty_new_tzoffsetfrom (types [zp_idx].gmtoff);
+               icalcomponent_add_property (dst_comp, icalprop);
+
+               icalprop = icalproperty_new_tzoffsetto (types [zidx].gmtoff);
+               icalcomponent_add_property (dst_comp, icalprop);
+
+               icalcomponent_add_component (tz_comp, dst_comp);
+       }
+
+error:
+       if (f)
+               fclose  (f);
+
+       if (transitions)
+               free (transitions);
+       if (trans_idx)
+               free (trans_idx);
+       if (types) {
+               for (i = 0; i < num_types; i++) 
+                       if (types [i].zname)
+                               free (types [i].zname);
+               free (types);
+       }
+       if (znames)
+               free (znames);
+       free (full_path);
+       if (leaps)
+               free (leaps);
+       if (temp)
+               free (temp);
+
+       return tz_comp;
+}
+
+/*
+ * What follows is copied and slightly simplified (not thread-safe!)
+ * code from icaltimezone.c.
+ *
+ * This is necessary because otherwise, when libsynthesis.so calls
+ * icaltimezone_get_component(), libical.1.so uses its own builtin
+ * icaltzutil_fetch_timezone().  Apparently it exports that without
+ * looking it up via the dynamic linker itself. Therefore we have to
+ * redirect the original icaltimezone_get_component() call.
+ */
+
+static void
+icaltimezone_load_builtin_timezone     (icaltimezone *zone)
+{
+    icalcomponent *subcomp;
+    const char *location;
+
+    /* If the location isn't set, it isn't a builtin timezone. */
+    location = icaltimezone_get_location(zone);
+    if (!location || !location[0])
+       return;
+
+    subcomp = icaltzutil_fetch_timezone (location);
+
+    if (!subcomp) {
+       icalerror_set_errno(ICAL_PARSE_ERROR);
+       return;
+    }
+
+    icaltimezone_set_component(zone, subcomp);
+}
+
+#undef icaltimezone_get_component
+icalcomponent *icaltimezone_get_component(icaltimezone *zone)
+{
+       icalcomponent *comp;
+       /* If this is a floating time, without a timezone, return NULL. */
+       if (!zone)
+               return NULL;
+
+       /*
+        * Without this check, icaltimezone_set_component() in
+        * icaltimezone_load_builtin_timezone() will discard the
+        * already loaded component of builtin timezones and replace
+        * it with the new one, so there is no leak. It's just
+        * inefficient.
+        *
+        * However, this method also gets called for non-internal
+        * timezones which were created from a VTIMEZONE and in
+        * that case not using the existing component is wrong.
+        *
+        * Hack: duplicate the internal _icaltimezone struct (from
+        * icaltimezoneimpl.h).
+        */
+       struct _my_icaltimezone {
+               char *tzid;
+               char *location;
+               char *tznames;
+               double latitude;
+               double longitude;
+               icalcomponent *component;
+       };
+       comp = ((struct _my_icaltimezone *)zone)->component;
+       if (!comp) {
+               icaltimezone_load_builtin_timezone (zone);
+               comp = ((struct _my_icaltimezone *)zone)->component;
+       }
+
+       return comp;
+}
+
+/*
+ * For including the .o file in binaries via -Wl,-usyncevo_fetch_timezone.
+ * We cannot use -Wl,-uicaltzutil_fetch_timezone because that gets satisfied by
+ * libical itself.
+ */
+int syncevo_fetch_timezone;
+
+/*
+ * Avoid lazy resolution of the methods that we export. client-test otherwise
+ * ends up calling the libical version of the methods despite having its own
+ * copy compiled into the executable, at least on Ubuntu Saucy and Trusty.
+ */
+/* void *syncevo_fetch_timezone_p = &icaltzutil_fetch_timezone; */
+/* void *syncevo_get_component_p = &icaltimezone_get_component; */
+
+#ifdef ICALTZ_UTIL_MAIN
+int 
+main (int argc, char *argv [])
+{
+       icalcomponent *comp = icaltzutil_fetch_timezone (argv [1]);
+       const char *str = comp ? icalcomponent_as_ical_string(comp) : "no such zone";
+       puts(str);
+       return 0;
+}
+#endif
diff --git a/src/syncevo/icaltz-util.h b/src/syncevo/icaltz-util.h
new file mode 100644 (file)
index 0000000..1900ceb
--- /dev/null
@@ -0,0 +1,48 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/* 
+ * Authors : 
+ *  Chenthill Palanisamy <pchenthill@novell.com>
+ *
+ * Copyright 2007, Novell, Inc.
+ *
+ * This program is free software; you can redistribute it and/or 
+ * modify it under the terms of version 2 of the GNU Lesser General Public 
+ * License as published by the Free Software Foundation.
+ *
+ * This program 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 St, Fifth Floor, 
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef ICALTZUTIL_H
+#define ICALTZUTIL_H
+
+#include <libical/ical.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if defined(sun) && defined(__SVR4)
+#define ZONES_TAB_SYSTEM_FILENAME "tab/zone_sun.tab"
+#else
+#define ZONES_TAB_SYSTEM_FILENAME "zone.tab"
+#endif
+
+#if !defined(EVOLUTION_COMPATIBILITY) || !defined(ENABLE_ICAL)
+const char *icaltzutil_get_zone_directory (void);
+extern const char *ical_tzid_prefix;
+#endif
+icalcomponent *icaltzutil_fetch_timezone (const char *location);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif 
index 9e2b388..cd99809 100644 (file)
@@ -148,6 +148,14 @@ src_syncevo_sources += \
   src/syncevo/icalstrdup.h
 endif
 
+if ENABLE_ICALTZ_UTIL
+src_syncevo_sources += \
+  src/syncevo/icaltz-util.c \
+  src/syncevo/icaltz-util.h
+if !ENABLE_EVOLUTION_COMPATIBILITY
+src_syncevo_ldadd += $(LIBICAL_LIBS)
+endif
+endif
 
 src_syncevo_libsyncevolution_includedir= $(includedir)/syncevo
 src_syncevo_libsyncevolution_include_HEADERS = \
index f224d8c..46da407 100644 (file)
@@ -677,5 +677,46 @@ std::string getCurrentTime();
 #define SE_THROW_EXCEPTION_STATUS(_class,  _what, _status) \
     throw _class(__FILE__, __LINE__, _what, _status)
 
+
+// GRunWhile(), GRunInMain(), GRunIsMain() depend on glib support,
+// which pretty much is a hard requirement of SyncEvolution these days.
+// Different implementations would be possible and the APIs do not depend
+// on glib types, therefore they are defined here. The glib implemention
+// is in GLibSupport.cpp.
+
+/**
+ * Process events in the default context while the callback returns
+ * true.
+ *
+ * This must be used instead of g_main_context_iterate() by code which
+ * may get called in other threads. In that case the check is
+ * transferred to the main thread which does the actual event
+ * processing. g_main_context_iterate() would just block because we
+ * register the main thread as permanent owner of the default context,
+ * or would suffer from race conditions if we didn't.
+ *
+ * The main thread must also be running GRunWhile().
+ *
+ * Exceptions in the check code are fatal and should be avoided.
+ *
+ * The check code will be called in the current thread once if checkFirst
+ * is true, otherwise it will only be invoked in the main thread. Use that
+ * latter mode for code which must run in the main thread.
+ */
+void GRunWhile(const boost::function<bool ()> &check, bool checkFirst = true);
+
+/**
+ * Runs the action in the main thread once, then returns.  Any
+ * exception thrown by the action will be caught and rethrown in the
+ * calling thread.
+ */
+void GRunInMain(const boost::function<void ()> &action);
+
+/**
+ * True iff the calling thread is handling the main event loop.  Can
+ * be used to avoid GRunInMain().
+ */
+bool GRunIsMain();
+
 SE_END_CXX
 #endif // INCL_SYNCEVOLUTION_UTIL
index fbb7e2d..78e88b4 100644 (file)
@@ -239,9 +239,9 @@ SUMMARY:meeting invitation
 CLASS:PUBLIC\r
 ORGANIZER;CN=Patrick Ohly:MAILTO:Patrick.Ohly@gmx.de\r
 ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=ACCEPTED;\r
- RSVP=TRUE;CN=Patrick Ohly;LANGUAGE=en:MAILTO:Patrick.Ohly@gmx.de\r
+ RSVP=TRUE;CN=Patrick Ohly:MAILTO:Patrick.Ohly@gmx.de\r
 ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;\r
- RSVP=TRUE;LANGUAGE=en:MAILTO:john@bar.com\r
+ RSVP=TRUE:MAILTO:john@bar.com\r
 CREATED:20060416T205003Z\r
 LAST-MODIFIED:20060416T205003Z\r
 END:VEVENT\r
index cb2ad25..84786ef 100644 (file)
@@ -240,9 +240,9 @@ CATEGORIES:BUSINESS,MEETING
 SUMMARY:meeting invitation\r
 CLASS:PUBLIC\r
 ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=ACCEPTED;\r
- RSVP=TRUE;CN=Patrick Ohly;LANGUAGE=en:MAILTO:Patrick.Ohly@gmx.de\r
+ RSVP=TRUE;CN=Patrick Ohly:MAILTO:Patrick.Ohly@gmx.de\r
 ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;\r
- RSVP=TRUE;LANGUAGE=en:MAILTO:john@bar.com\r
+ RSVP=TRUE:MAILTO:john@bar.com\r
 CREATED:20060416T205003Z\r
 LAST-MODIFIED:20060416T205003Z\r
 END:VEVENT\r
index 9da1186..6197a59 100644 (file)
@@ -238,9 +238,9 @@ SUMMARY:meeting invitation
 CLASS:PUBLIC\r
 ORGANIZER;CN=Patrick Ohly:MAILTO:Patrick.Ohly@gmx.de\r
 ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=ACCEPTED;\r
- RSVP=TRUE;CN=Patrick Ohly;LANGUAGE=en:MAILTO:Patrick.Ohly@gmx.de\r
+ RSVP=TRUE;CN=Patrick Ohly:MAILTO:Patrick.Ohly@gmx.de\r
 ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;\r
- RSVP=TRUE;LANGUAGE=en:MAILTO:john@bar.com\r
+ RSVP=TRUE:MAILTO:john@bar.com\r
 CREATED:20060416T205003Z\r
 LAST-MODIFIED:20060416T205003Z\r
 END:VEVENT\r
index 888277c..2f09eda 100644 (file)
@@ -219,9 +219,9 @@ SUMMARY:meeting invitation
 CLASS:PUBLIC\r
 ORGANIZER;CN=Patrick Ohly:MAILTO:Patrick.Ohly@gmx.de\r
 ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=ACCEPTED;\r
- RSVP=TRUE;CN=Patrick Ohly;LANGUAGE=en:MAILTO:Patrick.Ohly@gmx.de\r
+ RSVP=TRUE;CN=Patrick Ohly:MAILTO:Patrick.Ohly@gmx.de\r
 ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;\r
- RSVP=TRUE;LANGUAGE=en:MAILTO:john@bar.com\r
+ RSVP=TRUE:MAILTO:john@bar.com\r
 CREATED:20060416T205003Z\r
 LAST-MODIFIED:20060416T205003Z\r
 END:VEVENT\r
index d2138e2..7aa68ca 100644 (file)
@@ -161,9 +161,9 @@ SUMMARY:meeting invitation
 CLASS:PUBLIC\r
 ORGANIZER;CN=Patrick Ohly:MAILTO:Patrick.Ohly@gmx.de\r
 ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=ACCEPTED;\r
- RSVP=TRUE;CN=Patrick Ohly;LANGUAGE=en:MAILTO:Patrick.Ohly@gmx.de\r
+ RSVP=TRUE;CN=Patrick Ohly:MAILTO:Patrick.Ohly@gmx.de\r
 ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;\r
- RSVP=TRUE;LANGUAGE=en:MAILTO:john@bar.com\r
+ RSVP=TRUE:MAILTO:john@bar.com\r
 CREATED:20060416T205003Z\r
 LAST-MODIFIED:20060416T205003Z\r
 END:VEVENT\r
index 25c61cf..94e2eb9 100644 (file)
@@ -239,9 +239,9 @@ SUMMARY:meeting invitation
 CLASS:PUBLIC\r
 ORGANIZER;CN=Patrick Ohly:MAILTO:Patrick.Ohly@gmx.de\r
 ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=ACCEPTED;\r
- RSVP=TRUE;CN=Patrick Ohly;LANGUAGE=en:MAILTO:Patrick.Ohly@gmx.de\r
+ RSVP=TRUE;CN=Patrick Ohly:MAILTO:Patrick.Ohly@gmx.de\r
 ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;\r
- RSVP=TRUE;LANGUAGE=en:MAILTO:john@bar.com\r
+ RSVP=TRUE:MAILTO:john@bar.com\r
 CREATED:20060416T205003Z\r
 LAST-MODIFIED:20060416T205003Z\r
 END:VEVENT\r
index 6bf9064..5657138 100644 (file)
@@ -239,9 +239,9 @@ SUMMARY:meeting invitation
 CLASS:PUBLIC\r
 ORGANIZER;CN=Patrick Ohly:MAILTO:Patrick.Ohly@gmx.de\r
 ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=ACCEPTED;\r
- RSVP=TRUE;CN=Patrick Ohly;LANGUAGE=en:MAILTO:Patrick.Ohly@gmx.de\r
+ RSVP=TRUE;CN=Patrick Ohly:MAILTO:Patrick.Ohly@gmx.de\r
 ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;\r
- RSVP=TRUE;LANGUAGE=en:MAILTO:john@bar.com\r
+ RSVP=TRUE:MAILTO:john@bar.com\r
 CREATED:20060416T205003Z\r
 LAST-MODIFIED:20060416T205003Z\r
 END:VEVENT\r
index ae4b3cf..b066662 100644 (file)
@@ -481,7 +481,8 @@ void LocalTests::addTests() {
                     ADD_TEST_TO_SUITE(linked, LocalTests, testLinkedItemsChild);
                 }
                 ADD_TEST_TO_SUITE(linked, LocalTests, testLinkedItemsParentChild);
-                if (items[1].find("RECURRENCE-ID") != items[1].npos) {
+                if (items[1].find("RECURRENCE-ID") != items[1].npos &&
+                    config.m_sourceKnowsItemSemantic) {
                     ADD_TEST_TO_SUITE(linked, LocalTests, testLinkedItemsInsertBothUpdateChildNoIDs);
                 }
                 if (config.m_linkedItemsRelaxedSemantic) {
@@ -503,7 +504,8 @@ void LocalTests::addTests() {
                 ADD_TEST_TO_SUITE(linked, LocalTests, testLinkedItemsParentUpdate);
                 if (config.m_linkedItemsRelaxedSemantic) {
                     ADD_TEST_TO_SUITE(linked, LocalTests, testLinkedItemsUpdateChild);
-                    if (items[1].find("RECURRENCE-ID") != items[1].npos) {
+                    if (items[1].find("RECURRENCE-ID") != items[1].npos &&
+                        config.m_sourceKnowsItemSemantic) {
                         ADD_TEST_TO_SUITE(linked, LocalTests, testLinkedItemsUpdateChildNoIDs);
                     }
                 }
diff --git a/test/IcalTest.cpp b/test/IcalTest.cpp
new file mode 100644 (file)
index 0000000..035e11c
--- /dev/null
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2005-2009 Patrick Ohly <patrick.ohly@gmx.de>
+ * 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 "config.h"
+
+#ifdef ENABLE_ICAL
+#include "test.h"
+#include <syncevo/eds_abi_wrapper.h>
+#include <syncevo/icalstrdup.h>
+#include <syncevo/SmartPtr.h>
+
+SE_BEGIN_CXX
+
+class IcalTest : public CppUnit::TestFixture {
+    CPPUNIT_TEST_SUITE(IcalTest);
+    CPPUNIT_TEST(testTimezone);
+    CPPUNIT_TEST_SUITE_END();
+
+protected:
+    /**
+     * Ensures that we get VTIMEZONE with RRULE from libical.
+     *
+     * This only works with libical 1.0 if we successfully
+     * pick up our icaltimezone_get_component() or
+     * libical uses our icaltzutil_fetch_timezone().
+     *
+     * This test uses the function lookup via eds_abi_wrapper.h if that
+     * was enabled, otherwise goes via the static or dynamic linker.
+     *
+     * It only passes if the given timezone has not been loaded by
+     * libical internally yet, because we cannot influence that. Only
+     * direct calls to icaltimezone_get_component() as done by
+     * libsynthesis are caught. This means that "Europe/Paris" must
+     * not be used by, for example, test data used in
+     * Client::Source::eds_event.
+     */
+    void testTimezone()
+    {
+        icaltimezone *zone = icaltimezone_get_builtin_timezone("Europe/Paris");
+        CPPUNIT_ASSERT(zone);
+        icalcomponent *comp = icaltimezone_get_component(zone);
+        CPPUNIT_ASSERT(comp);
+        SyncEvo::eptr<char> str(ical_strdup(icalcomponent_as_ical_string(comp)));
+        CPPUNIT_ASSERT(str);
+        // We are very specific here. This'll work until we change our
+        // code or the zone data from Europe/Paris changes (not likely).
+        CPPUNIT_ASSERT_EQUAL(std::string(str), std::string(
+            "BEGIN:VTIMEZONE\r\n"
+            "TZID:/freeassociation.sourceforge.net/Tzfile/Europe/Paris\r\n"
+            "X-LIC-LOCATION:Europe/Paris\r\n"
+            "BEGIN:STANDARD\r\n"
+            "TZNAME:CET\r\n"
+            "DTSTART:19701026T030000\r\n"
+            "RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10\r\n"
+            "TZOFFSETFROM:+0200\r\n"
+            "TZOFFSETTO:+0100\r\n"
+            "END:STANDARD\r\n"
+            "BEGIN:DAYLIGHT\r\n"
+            "TZNAME:CEST\r\n"
+            "DTSTART:19700330T020000\r\n"
+            "RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3\r\n"
+            "TZOFFSETFROM:+0100\r\n"
+            "TZOFFSETTO:+0200\r\n"
+            "END:DAYLIGHT\r\n"
+            "END:VTIMEZONE\r\n"
+            ));
+    }
+};
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(IcalTest, "SyncEvolution" );
+
+SE_END_CXX
+
+#endif // ENABLE_ICAL
index 2be164f..fc7d960 100644 (file)
@@ -172,6 +172,9 @@ sub NormalizeItem {
     # changed.
     s/\\N/\\n/g;
 
+    # Ignore blank lines. Akonadi inserts them.
+    s/\n{2,}/\n/s;
+
     # undo line continuation
     s/\n\s//gs;
     # ignore charset specifications, assume UTF-8
@@ -281,8 +284,9 @@ sub NormalizeItem {
 
     # remove fields which may differ
     s/^(PRODID|CREATED|DTSTAMP|LAST-MODIFIED|REV)(;X-VOBJ-FLOATINGTIME-ALLOWED=(TRUE|FALSE))?:.*\r?\n?//gm;
-    # remove optional fields
-    s/^(METHOD|X-WSS-[A-Z]*|X-WR-[A-Z]*|CALSCALE):.*\r?\n?//gm;
+    # remove optional properties and parameters
+    s/^(METHOD|X-WSS-[A-Z]*|X-WR-[A-Z]*|CALSCALE|X-KDE-ICAL-IMPLEMENTATION-VERSION|X-KDE-KCALCORE-ENABLED):.*\r?\n?//gm;
+    s/^(ATTENDEE[^:]*);X-UID=[^;:]*/$1/mg;
 
     # trailing line break(s) in a DESCRIPTION may or may not be
     # removed or added by servers
@@ -364,6 +368,10 @@ sub NormalizeItem {
         # VALUE=DURATION is the default behavior
         s/^TRIGGER([^\n:]*);VALUE=DURATION/TRIGGER$1/mg;
         s/^(TRIGGER.*):(\S*)/$1 . ":" . NormalizeTrigger($2)/mge;
+        # INDIVIDUAL is default for CUTYPE.
+        s/;CUTYPE=INDIVIDUAL([;:])/$1/mg;
+        # Print without quotation marks (probably not save in general, but okay for our test data).
+        s/;CN="([^;]*)"/;CN=$1/g;
     }
 
     # Added by EDS >= 2.32, presumably to cache some internal computation.
index b91196b..57210ae 100755 (executable)
@@ -32,6 +32,12 @@ from OpenSSL import SSL
 # for output from this script itself
 logger = logging.getLogger("syncevo-http")
 
+# Timeout for D-Bus method calls. Both synchronous and asynchronous
+# calls have a low (?) default timeout of 60 seconds. We increase that
+# to something which is essentially infinite, to allow more time for
+# processing or interactive debugging.
+timeout=100000
+
 class ChainedOpenSSLContextFactory(ssl.DefaultOpenSSLContextFactory):
     def __init__(self, privateKeyFileName, certificateChainFileName,
                  sslmethod = SSL.SSLv3_METHOD):
@@ -131,7 +137,7 @@ class SyncMLSession:
             self.request = None
         if self.connection:
             try:
-                self.connection.Close(False, message)
+                self.connection.Close(False, message, timeout=timeout)
             except dbus.exceptions.DBusException, ex:
                 if ex.get_dbus_name() == "org.freedesktop.DBus.Error.UnknownMethod":
                     # triggered if connection instance is already gone, hide from user
@@ -186,7 +192,7 @@ class SyncMLSession:
         if final:
             logger.debug("closing connection for connection %s session %s", self.conpath, session)
             if self.connection:
-                self.connection.Close(True, "")
+                self.connection.Close(True, "", timeout=timeout)
                 self.connection = None
             self.destruct(http.GONE, "D-Bus server done")
 
@@ -219,7 +225,8 @@ class SyncMLSession:
                                             'config': config,
                                             'URL': url},
                                            True,
-                                           '')
+                                           '',
+                                           timeout=timeout)
         logger.debug("started new connection %s" % self.conpath)
         self.connection = dbus.Interface(Context.bus.get_object('org.syncevolution',
                                                                 self.conpath),
@@ -251,7 +258,7 @@ class SyncMLSession:
 
         # feed new data into SyncEvolution and wait for reply
         request.content.seek(0, 0)
-        self.connection.Process(data, type)
+        self.connection.Process(data, type, timeout=timeout)
         SyncMLSession.sessions.append(self)
         logger.debug("added new SyncML session %s", self)
 
@@ -287,7 +294,7 @@ class SyncMLSession:
         request.processingdata = data
         request.processingtype = type
         if mustprocess:
-            self.connection.Process(data, type)
+            self.connection.Process(data, type, timeout=timeout)
 
     def logMessage(self, direction, request, data, type):
         if 'plain' in type or "+xml" in type:
@@ -465,7 +472,9 @@ syncevo-http-server itself is installed""")
     else:
         root = logging.getLogger()
         ch = logging.StreamHandler()
-        formatter = logging.Formatter("[%(levelname)s] %(name)s: %(message)s")
+        formatter = logging.Formatter("[%(levelname)s" +
+                                      (level == logging.DEBUG and " %(asctime)s" or "") +
+                                      "] %(name)s: %(message)s")
         ch.setFormatter(formatter)
         root.addHandler(ch)
         if level == None:
index fbb7e2d..78e88b4 100644 (file)
@@ -239,9 +239,9 @@ SUMMARY:meeting invitation
 CLASS:PUBLIC\r
 ORGANIZER;CN=Patrick Ohly:MAILTO:Patrick.Ohly@gmx.de\r
 ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=ACCEPTED;\r
- RSVP=TRUE;CN=Patrick Ohly;LANGUAGE=en:MAILTO:Patrick.Ohly@gmx.de\r
+ RSVP=TRUE;CN=Patrick Ohly:MAILTO:Patrick.Ohly@gmx.de\r
 ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;\r
- RSVP=TRUE;LANGUAGE=en:MAILTO:john@bar.com\r
+ RSVP=TRUE:MAILTO:john@bar.com\r
 CREATED:20060416T205003Z\r
 LAST-MODIFIED:20060416T205003Z\r
 END:VEVENT\r