Imported Upstream version 1.0beta3 upstream/1.0beta3
authorPatrick Ohly <patrick.ohly@intel.com>
Fri, 28 Jun 2013 11:40:31 +0000 (11:40 +0000)
committerPatrick Ohly <patrick.ohly@intel.com>
Fri, 28 Jun 2013 11:40:31 +0000 (11:40 +0000)
201 files changed:
ChangeLog
Makefile-gen.am
Makefile.am
Makefile.in
NEWS
config.h.in
configure
configure-post.in
configure-pre.in
configure.in
gen-autotools.sh
po/LINGUAS
po/POTFILES.in
po/de.po
po/es.po
po/fi.po
po/fr.po
po/it.po
po/ja.po
po/ko.po
po/nl.po
po/pl.po
po/pt_BR.po
po/ru.po [new file with mode: 0644]
po/sv.po
po/zh_CN.po
po/zh_TW.po
src/Makefile-gen.am
src/Makefile.am
src/Makefile.in
src/backends/addressbook/Makefile.in
src/backends/evolution/EvolutionCalendarSource.cpp
src/backends/evolution/EvolutionCalendarSourceRegister.cpp
src/backends/evolution/EvolutionContactSource.cpp
src/backends/evolution/Makefile.in
src/backends/evolution/e-cal-check-timezones.c
src/backends/file/FileSyncSource.cpp
src/backends/file/FileSyncSourceRegister.cpp
src/backends/file/Makefile.in
src/backends/maemo/Makefile.in
src/backends/sqlite/Makefile.in
src/backends/sqlite/SQLiteContactSource.cpp
src/backends/sqlite/SQLiteContactSource.h
src/backends/xmlrpc/Makefile.in
src/client-test-app.cpp
src/dbus/Makefile.in
src/dbus/interfaces/Makefile.in
src/dbus/interfaces/syncevo-server-full.xml
src/dbus/interfaces/syncevo-session-full.xml
src/dbus/syncevo-dbus-types.h
src/dbus/syncevo-server.c
src/dbus/test.c
src/gdbus/Makefile.in
src/gdbus/gdbus-cxx-bridge.h
src/gdbus/mainloop.c
src/gnome-bluetooth/Makefile.in
src/gtk-ui/Makefile.am
src/gtk-ui/Makefile.in
src/gtk-ui/close.png [deleted file]
src/gtk-ui/close_hover.png [deleted file]
src/gtk-ui/mux-icon-button.c [deleted file]
src/gtk-ui/mux-icon-button.h [deleted file]
src/gtk-ui/mux-window.c [deleted file]
src/gtk-ui/mux-window.h [deleted file]
src/gtk-ui/settings.png [deleted file]
src/gtk-ui/settings_hover.png [deleted file]
src/gtk-ui/sync-config-widget.c
src/gtk-ui/sync-config-widget.h
src/gtk-ui/sync-ui.c
src/gtk-ui/sync-ui.rc
src/gtk-ui/ui.glade
src/syncevo-dbus-server-startup.sh.in [new file with mode: 0755]
src/syncevo-dbus-server.cpp
src/syncevo-dbus-server.desktop.in [new file with mode: 0644]
src/syncevo/Cmdline.cpp
src/syncevo/Cmdline.h
src/syncevo/LogRedirect.cpp
src/syncevo/LogRedirect.h
src/syncevo/LogStdout.cpp
src/syncevo/Logging.cpp
src/syncevo/Logging.h
src/syncevo/Makefile.in
src/syncevo/MultiplexConfigNode.cpp
src/syncevo/MultiplexConfigNode.h
src/syncevo/ObexTransportAgent.cpp
src/syncevo/ObexTransportAgent.h
src/syncevo/SyncConfig.cpp
src/syncevo/SyncConfig.h
src/syncevo/SyncContext.cpp
src/syncevo/SyncContext.h
src/syncevo/SyncML.cpp
src/syncevo/SyncML.h
src/syncevo/SyncSource.cpp
src/syncevo/SyncSource.h
src/syncevo/SynthesisDBPlugin.cpp
src/syncevo/SynthesisEngine.cpp
src/syncevo/SynthesisEngine.h
src/syncevo/TrackingSyncSource.cpp
src/syncevo/TrackingSyncSource.h
src/syncevo/configs/Makefile.in
src/syncevo/configs/datatypes/01vcard-profile.xml
src/syncevo/configs/datatypes/11calendar-profile.xml
src/syncevo/configs/remoterules/00_need_tz_in_event.xml [new file with mode: 0644]
src/syncevo/configs/remoterules/client/01mobical.xml [new file with mode: 0644]
src/syncevo/configs/remoterules/server/45_N7210c.xml [new file with mode: 0644]
src/syncevo/configs/scripting/11calendar.xml
src/syncevo/declarations.h
src/syncevo/eds_abi_wrapper.cpp
src/syncevo/util.cpp
src/syncevo/util.h
src/syncevolution.cpp
src/synthesis-includes/Makefile.am [new file with mode: 0644]
src/synthesis-includes/Makefile.in [new file with mode: 0644]
src/synthesis/.gitignore
src/synthesis/ChangeLog
src/synthesis/config.h.in
src/synthesis/configure
src/synthesis/configure.in
src/synthesis/src/DB_interfaces/api_db/pluginapids.cpp
src/synthesis/src/DB_interfaces/odbc_db/odbcapiagent.cpp
src/synthesis/src/EXCLUDE_FILES
src/synthesis/src/Makefile.am
src/synthesis/src/Makefile.am.in
src/synthesis/src/Makefile.in
src/synthesis/src/SDK_EXCLUDE_FILES [new file with mode: 0644]
src/synthesis/src/SDK_FILES
src/synthesis/src/SERVER_FILES
src/synthesis/src/Targets/ReleasedProducts/SDK/define.h [new file with mode: 0644]
src/synthesis/src/Targets/ReleasedProducts/SDK/target_options.h
src/synthesis/src/Transport_interfaces/engine/enginesessiondispatch.cpp
src/synthesis/src/Transport_interfaces/engine/enginesessiondispatch.h
src/synthesis/src/gen-makefile-am.sh
src/synthesis/src/global_options.h
src/synthesis/src/syncml_tk/src/sml/xlt/all/xltdevinf.c
src/synthesis/src/sysync/configelement.cpp
src/synthesis/src/sysync/customimplds.cpp
src/synthesis/src/sysync/dataobjtype.cpp
src/synthesis/src/sysync/debuglogger.cpp
src/synthesis/src/sysync/localengineds.cpp
src/synthesis/src/sysync/mimedirprofile.cpp
src/synthesis/src/sysync/stdlogicds.cpp
src/synthesis/src/sysync/superdatastore.cpp
src/synthesis/src/sysync/syncagent.cpp
src/synthesis/src/sysync/synccommand.cpp
src/synthesis/src/sysync/syncitemtype.cpp
src/synthesis/src/sysync/syncsession.cpp
src/synthesis/src/sysync/syserial.h
src/synthesis/src/sysync/sysync.h
src/synthesis/src/sysync/sysync_globs.h
src/synthesis/src/sysync_SDK/Sources/SDK_util.c
src/synthesis/src/sysync_SDK/Sources/blobs.h
src/synthesis/src/sysync_SDK/Sources/cp936_tables_inc.cpp [moved from src/synthesis/src/sysync/cp936_tables_inc.cpp with 100% similarity]
src/synthesis/src/sysync_SDK/Sources/gb2312_tables_inc.cpp [moved from src/synthesis/src/sysync/gb2312_tables_inc.cpp with 100% similarity]
src/synthesis/src/sysync_SDK/Sources/lineartime.cpp [moved from src/synthesis/src/sysync/lineartime.cpp with 99% similarity]
src/synthesis/src/sysync_SDK/Sources/lineartime.h [moved from src/synthesis/src/sysync/lineartime.h with 100% similarity]
src/synthesis/src/sysync_SDK/Sources/san.cpp
src/synthesis/src/sysync_SDK/Sources/san.h
src/synthesis/src/sysync_SDK/Sources/stringutil.cpp
src/synthesis/src/sysync_SDK/Sources/stringutil.h
src/synthesis/src/sysync_SDK/Sources/syncexception.cpp [moved from src/synthesis/src/sysync/syncexception.cpp with 98% similarity]
src/synthesis/src/sysync_SDK/Sources/syncexception.h [moved from src/synthesis/src/sysync/syncexception.h with 100% similarity]
src/synthesis/src/sysync_SDK/Sources/sysync_b64.cpp
src/synthesis/src/sysync_SDK/Sources/sysync_b64.h
src/synthesis/src/sysync_SDK/Sources/sysync_utils.cpp [moved from src/synthesis/src/sysync/sysync_utils.cpp with 99% similarity]
src/synthesis/src/sysync_SDK/Sources/sysync_utils.h [moved from src/synthesis/src/sysync/sysync_utils.h with 99% similarity]
src/templates/clients/SyncEvolution/template.ini
src/templates/clients/default/template.ini [deleted file]
src/templates/clients/phone/nokia/S40/7210c/template.ini
src/templates/clients/phone/nokia/S60/N85/config.ini [new file with mode: 0644]
src/templates/clients/phone/nokia/S60/N85/sources/addressbook/config.ini [new file with mode: 0644]
src/templates/clients/phone/nokia/S60/N85/sources/calendar+todo/config.ini [new file with mode: 0644]
src/templates/clients/phone/nokia/S60/N85/sources/calendar/config.ini [new file with mode: 0644]
src/templates/clients/phone/nokia/S60/N85/sources/memo/config.ini [new file with mode: 0644]
src/templates/clients/phone/nokia/S60/N85/sources/todo/config.ini [new file with mode: 0644]
src/templates/clients/phone/nokia/S60/N85/template.ini [new file with mode: 0644]
src/templates/clients/phone/nokia/maemo/n900/config.ini [new file with mode: 0644]
src/templates/clients/phone/nokia/maemo/n900/sources/addressbook/config.ini [new file with mode: 0644]
src/templates/clients/phone/nokia/maemo/n900/sources/calendar+todo/config.ini [new file with mode: 0644]
src/templates/clients/phone/nokia/maemo/n900/sources/calendar/config.ini [new file with mode: 0644]
src/templates/clients/phone/nokia/maemo/n900/sources/memo/config.ini [new file with mode: 0644]
src/templates/clients/phone/nokia/maemo/n900/sources/todo/config.ini [new file with mode: 0644]
src/templates/clients/phone/nokia/maemo/n900/template.ini [new file with mode: 0644]
src/templates/servers/Funambol/config.ini
src/templates/servers/Funambol/template.ini
src/templates/servers/ScheduleWorld/template.ini
src/testcases/ical20.ics.Ovi.tem [new file with mode: 0644]
src/testcases/itodo20.ics.Ovi.tem [new file with mode: 0644]
src/testcases/templates/clients/SyncEvolution/template.ini
src/testcases/templates/clients/default/template.ini [deleted file]
src/testcases/templates/clients/phone/nokia/S40/7210c/template.ini
src/testcases/vcard30.vcf.Ovi.tem [new file with mode: 0644]
test/ClientTest.cpp
test/ClientTest.h
test/Makefile.am
test/Makefile.in
test/README.Ovi [new file with mode: 0644]
test/README.syncevolution-server [new file with mode: 0644]
test/client-test-main.cpp
test/synccompare.pl
test/syncevo-http-server.py [new file with mode: 0755]
test/syncevo-phone-config.py [new file with mode: 0755]

index 62b8db5..787dbd6 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
 # Generated by configure.  Do no edit.
 
+2010-04-20  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * NEWS:
+       * configure-pre.in:
+
+       NEWS, version: updated for final 1.0 beta 3
+
+2010-04-20  Jussi Kukkonen  <jku@linux.intel.com>
+
+       * src/gtk-ui/sync-ui.c:
+
+       gtk-ui: set "settings"-btn insensitive when syncing (MB #10482)
+
+2010-04-20  Chen Congwu  <congwu.chen@intel.com>
+
+       * test/syncevo-phone-config.py:
+
+       phone-config-tool: setting test data and test result temp dir
+       (MB#9862)
+
+2010-04-19  Chen Congwu  <congwu.chen@intel.com>
+
+       * src/syncevo/SyncConfig.cpp:
+
+       Ovi template: disable certificate checking
+
+2010-04-17  Chen Congwu  <congwu.chen@intel.com>
+
+       * test/resultchecker.py:
+
+       resultchecker: wrote 'calendar_todo' as tag name for
+       'calendar+todo'
+
+2010-04-19  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo-dbus-server.cpp:
+
+       auto sync notifications: avoid extra "Dismiss" button (MB #10487)
+
+2010-04-19  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/SyncConfig.cpp:
+
+       Ovi.com: fixed typos
+
+2010-04-19  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/client-test-app.cpp:
+       * src/syncevolution.cpp:
+
+       command line, client-test: avoid "g_set_application_name not set"
+       warning
+
+2010-04-19  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/Makefile-gen.am:
+       * src/client-test-app.cpp:
+
+       client-test: enable it to use keyring by default (MB #10479)
+
+2010-04-19  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * NEWS:
+       * src/syncevo/Cmdline.cpp:
+       * src/syncevo/SyncConfig.cpp:
+       * src/templates/servers/Funambol/config.ini:
+
+       RetryInterval: 0 for Funambol, 2M for everyone else (MB #10451)
+
+2010-04-16  Jussi Kukkonen  <jku@linux.intel.com>
+
+       * configure-pre.in:
+       * src/gtk-ui/sync-config-widget.c:
+       * src/gtk-ui/sync-ui.c:
+
+       gtk-ui: fix mx-gtk >= 0.99.1 header location (BME #892)
+
+2010-04-17  Chen Congwu  <congwu.chen@intel.com>
+
+       * test/syncevo-phone-config.py:
+
+       config-phone: interrupt handling
+
+2010-04-14  Chen Congwu  <congwu.chen@intel.com>
+
+       * src/Makefile-gen.am:
+       * test/Makefile.am:
+       * test/syncevo-phone-config.py:
+
+       Test tools: automatically detection working configuration for a
+       phone (MB#9862)
+
+2010-03-26  Chen Congwu  <congwu.chen@intel.com>
+
+       * src/syncevo/SyncContext.cpp:
+
+       noctcap: Do not send ctcap properties when set
+       SYNCEVOLUTION_NOCTCAP
+
+2010-03-26  Chen Congwu  <congwu.chen@intel.com>
+
+       * src/backends/evolution/EvolutionCalendarSourceRegister.cpp:
+       * src/backends/file/FileSyncSourceRegister.cpp:
+       * src/client-test-app.cpp:
+       * test/ClientTest.cpp:
+
+       Test: Also register file:calendar+todo test for file backend
+
+2010-04-19  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/dbus/interfaces/syncevo-server-full.xml:
+
+       D-Bus API: added templateName to documentation (MB #10406)
+
+2010-04-16  Zhu, Yongsheng  <yongsheng.zhu@intel.com>
+
+       * src/dbus/interfaces/syncevo-server-full.xml:
+
+       D-Bus doc: refine spec about Bluetooth device support for
+       GetConfigs
+
+2010-04-15  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/LogRedirect.cpp:
+
+       LogRedirect: redirecting STDOUT to log level SHOW broke the tests
+
+2010-04-15  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/SyncConfig.cpp:
+
+       SecondsConfigProperty: accept "+" sign in duration and interval
+       properties again
+
+2010-04-15  Zhu, Yongsheng  <yongsheng.zhu@intel.com>
+
+       * src/dbus/interfaces/syncevo-session-full.xml:
+       * src/syncevo-dbus-server.cpp:
+       * src/syncevolution.cpp:
+
+       command line + D-Bus: pass known environment variables (MB#10477)
+
+2010-04-15  Chen Congwu  <congwu.chen@intel.com>
+
+       * test/runtests.py:
+
+       Enable Ovi test
+
+2010-04-14  Chen Congwu  <congwu.chen@intel.com>
+
+       * test/README.Ovi:
+
+       Ovi README fixes.
+
+2010-04-14  Jussi Kukkonen  <jku@linux.intel.com>
+
+       * src/templates/clients/phone/nokia/S60/N85/config.ini:
+       * src/templates/clients/phone/nokia/S60/N85/sources/addressbook/config.ini:
+       * src/templates/clients/phone/nokia/S60/N85/sources/calendar+todo/config.ini:
+       * src/templates/clients/phone/nokia/S60/N85/sources/calendar/config.ini:
+       * src/templates/clients/phone/nokia/S60/N85/sources/memo/config.ini:
+       * src/templates/clients/phone/nokia/S60/N85/sources/todo/config.ini:
+       * src/templates/clients/phone/nokia/S60/N85/template.ini:
+
+       templates: add N85 (Nokia S60) template
+
+2010-04-12  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/configs/datatypes/01vcard-profile.xml:
+
+       vCard profile: hide X-EVOLUTION-UI-SLOT in DevInf for Nokia N85
+       (MB #8868)
+
+2010-04-13  Zhu, Yongsheng  <yongsheng.zhu@intel.com>
+
+       * src/dbus/syncevo-dbus-types.h:
+       * src/dbus/syncevo-server.c:
+
+       sync-ui: don't use built-in specialized types (MB #10471)
+
+2010-04-14  Zhu, Yongsheng  <yongsheng.zhu@intel.com>
+
+       * src/syncevo-dbus-server.cpp:
+       * src/syncevolution.cpp:
+
+       dbus server + command line: return error code (MB#10476)
+
+2010-04-13  Zhu, Yongsheng  <yongsheng.zhu@intel.com>
+
+       * src/syncevo-dbus-server.cpp:
+
+       DBus server: abort when user didn't provide password (MB#10475)
+
+2010-04-13  Jussi Kukkonen  <jku@linux.intel.com>
+
+       * src/gtk-ui/sync-ui.c:
+
+       gtk-ui: fix crasher and wrong UI state (MB #10473)
+
+2010-04-08  Zhu, Yongsheng  <yongsheng.zhu@intel.com>
+
+       * src/syncevo/SyncContext.cpp:
+       * src/syncevo/configs/remoterules/client/01mobical.xml:
+       * src/syncevo/configs/scripting/11calendar.xml:
+
+       Cal + Mobical: apply the workaround only for Mobical (MB#10458)
+
+2010-04-02  Zhu, Yongsheng  <yongsheng.zhu@intel.com>
+
+       * src/syncevo/configs/scripting/11calendar.xml:
+
+       Calendar: add workaround for 'alarm' in vCalendar1.0 (MB#10458)
+
+2010-04-09  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/configs/datatypes/01vcard-profile.xml:
+
+       vCard profile: disable Synthesis iPhone client TYPE extensions
+       (MB #10462)
+
+2010-04-09  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * test/ClientTest.cpp:
+
+       client-test: CLIENT_TEST_SIMPLE_UID
+
+2010-04-09  Jussi Kukkonen  <jku@linux.intel.com>
+
+       * src/templates/clients/phone/nokia/maemo/n900/config.ini:
+
+       templates: set N900 as consumerReady (MB #10336)
+
+2010-04-09  Jussi Kukkonen  <jku@linux.intel.com>
+
+       * src/gtk-ui/sync-ui.c:
+
+       gtk-ui: never show non-consumerReady templates (MB #10472)
+
+2010-04-09  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/gdbus/gdbus-cxx-bridge.h:
+
+       dbus C++ bridge: fix inconsistent CallbackData instantiation
+
+2010-04-09  zerng07  <pswo10680@gmail.com>
+
+       * po/zh_TW.po:
+
+       l10n: Updates to Chinese (Taiwan) (zh_TW) translation
+
+2010-04-09  GLS_ITA  <lorenzo.gennaro@ptiglobal.net>
+
+       * po/it.po:
+
+       l10n: Updates to Italian (it) translation
+
+2010-04-09  Zhu, Yongsheng  <yongsheng.zhu@intel.com>
+
+       * src/gdbus/gdbus-cxx-bridge.h:
+
+       gdbus c++: fix an issue of DBusClientCall exposed by valgrind
+       (MB#10468)
+
+2010-04-09  Jussi Kukkonen  <jku@linux.intel.com>
+
+       * src/gtk-ui/sync-config-widget.c:
+
+       gtk-ui: fix device template autoselection (MB #10469)
+
+2010-04-09  GLS_FRA3  <david.cicognani@ptiglobal.net>
+
+       * po/fr.po:
+
+       l10n: Updates to French (fr) translation
+
+2010-04-09  Zhu, Yongsheng  <yongsheng.zhu@intel.com>
+
+       * src/dbus/interfaces/syncevo-server-full.xml:
+
+       dbus api: change the signature of 'handler' of 'InfoRequest'
+
+2010-04-01  Zhu, Yongsheng  <yongsheng.zhu@intel.com>
+
+       * src/gdbus/gdbus-cxx-bridge.h:
+       * src/syncevo-dbus-server.cpp:
+       * src/syncevolution.cpp:
+
+       cmdline: fix password hang (MB#5043)
+
+2010-04-09  Zhu, Yongsheng  <yongsheng.zhu@intel.com>
+
+       * src/syncevo/Cmdline.cpp:
+
+       command line: fix a regression checked by nightly
+
+2010-04-08  kushylee  <>
+
+       * po/ko.po:
+
+       l10n: Updates to Korean (ko) translation
+
+2010-04-08  GLS_DEU1  <clarax.steiner-jay@intel.com>
+
+       * po/de.po:
+
+       l10n: Updates to German (de) translation
+
+2010-04-08  A Olsson  <AnnikaNbpt@gmail.com>
+
+       * po/sv.po:
+
+       l10n: Updates to Swedish (sv) translation
+
+2010-04-08  smilex2005  <eija@fascinatingwords.com>
+
+       * po/fi.po:
+
+       l10n: Updates to Finnish (fi) translation
+
+2010-04-07  tomasgalicia  <tomas.galicia@intel.com>
+
+       * po/es.po:
+
+       l10n: Updates to Spanish (Castilian) (es) translation
+
+2010-04-07  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/Cmdline.cpp:
+       * src/syncevo/Cmdline.h:
+
+       command line + D-Bus: fix for "some parameters are already
+       handled by parse()" (MB #5013)
+
+2010-04-07  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/Cmdline.cpp:
+
+       command line + D-Bus: fix for "pass absolute paths to dbus
+       server" (MB #10461)
+
+2010-04-06  Zhu, Yongsheng  <yongsheng.zhu@intel.com>
+
+       * src/syncevo/Cmdline.cpp:
+       * src/syncevo/Cmdline.h:
+       * src/syncevo/util.cpp:
+       * src/syncevo/util.h:
+       * src/syncevolution.cpp:
+
+       command line + D-Bus: pass absolute paths to dbus server
+       (MB#10461)
+
+2010-04-06  Zhu, Yongsheng  <yongsheng.zhu@intel.com>
+
+       * src/syncevo-dbus-server.cpp:
+       * src/syncevolution.cpp:
+
+       command line + D-Bus: throw exceptions once 'Execute' gets errors
+       (MB#10461)
+
+2010-04-06  Zhu, Yongsheng  <yongsheng.zhu@intel.com>
+
+       * src/dbus/interfaces/syncevo-session-full.xml:
+
+       D-Bus: add description for 'Session.Execute'
+
+2010-04-07  Zhu, Yongsheng  <yongsheng.zhu@intel.com>
+
+       * test/test-dbus.py:
+
+       test-dbus: change expected results of 'testSharedTypeOther'
+       (MB#10448)
+
+2010-04-01  Zhu, Yongsheng  <yongsheng.zhu@intel.com>
+
+       * src/syncevo-dbus-server.cpp:
+
+       Config: preserve type when getting config from a template
+       (MB#10448)
+
+2010-03-30  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo-dbus-server.cpp:
+       * test/test-dbus.py:
+
+       D-Bus API: allow reading template for non-existent context (MB
+       #10448)
+
+2010-04-07  Takashi  <takashi.kazami@novuscom.net>
+
+       * po/ja.po:
+
+       l10n: Updates to Japanese (ja) translation
+
+2010-04-07  GLS_CHS  <yunx.nie@intel.com>
+
+       * po/zh_CN.po:
+
+       l10n: Updates to Chinese (China) (zh_CN) translation
+
+2010-04-07  GLS_NLD  <albert.dijkstra@ptiglobal.net>
+
+       * po/nl.po:
+
+       l10n: Updates to Dutch (Flemish) (nl) translation
+
+2010-04-06  GLS_ESP  <gonzalox.e.velasquez@intel.com>
+
+       * po/es.po:
+
+       l10n: Updates to Spanish (Castilian) (es) translation
+
+2010-04-06  promuald  <info@transsoft.pl>
+
+       * po/pl.po:
+
+       l10n: Updates to Polish (pl) translation
+
+2010-04-06  GLS_PTB  <gaborx.k.becht@intel.com>
+
+       * po/pt_BR.po:
+
+       l10n: Updates to Brazilian Portuguese (pt_BR) translation
+
+2010-04-06  promuald  <info@transsoft.pl>
+
+       * po/pl.po:
+
+       l10n: Updates to Polish (pl) translation
+
+2010-04-06  Leila  <leilaa@abc-lang.com>
+
+       * po/ru.po:
+
+       l10n: Updates to Russian (ru) translation
+
+2010-04-05  zerng07  <pswo10680@gmail.com>
+
+       * po/zh_TW.po:
+
+       l10n: Updates to Chinese (Taiwan) (zh_TW) translation
+
+2010-04-01  zerng07  <pswo10680@gmail.com>
+
+       * po/zh_TW.po:
+
+       l10n: Updates to Chinese (Taiwan) (zh_TW) translation
+
+2010-04-01  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * NEWS:
+
+       NEWS: next update for 1.0 beta 3
+
+2010-04-01  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/Cmdline.h:
+       * src/syncevolution.cpp:
+
+       command line + D-Bus: some parameters are already handled by
+       parse() (MB #5043)
+
+2010-04-01  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/LogRedirect.cpp:
+       * src/syncevo/LogRedirect.h:
+       * src/syncevo/util.cpp:
+
+       LogRedirect with streams: better error handling (MB #5041)
+
+2010-04-01  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/LogRedirect.cpp:
+
+       LogRedirect + Execute(): use SOCK_STREAM to detect EOF (MB #5041)
+
+2010-03-31  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/LogRedirect.cpp:
+       * src/syncevo/LogRedirect.h:
+       * src/syncevo/SyncContext.cpp:
+       * src/syncevo/util.cpp:
+       * src/syncevo/util.h:
+
+       LogRedirect + system(): avoid loosing output (MB #5041)
+
+2010-03-31  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo-dbus-server.cpp:
+       * src/syncevo/LogRedirect.cpp:
+       * src/syncevo/LogRedirect.h:
+
+       syncevo-dbus-server stdout: split at lines (MB #5042)
+
+2010-03-31  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo-dbus-server.cpp:
+
+       syncevo-dbus-server: redirect stdout (MB #5042)
+
+2010-04-01  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo-dbus-server.cpp:
+       * src/syncevo/SyncContext.h:
+
+       fix for Transport Timeout: callback must also be set for D-Bus
+
+2010-04-01  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo-dbus-server.cpp:
+
+       Server.GetSessions(): return array of object paths (MB #10452)
+
+2010-04-01  Zhu, Yongsheng  <yongsheng.zhu@intel.com>
+
+       * src/gdbus/gdbus-cxx-bridge.h:
+       * src/syncevolution.cpp:
+
+       Cmdline: watch daemon if it has gone (MB #5043)
+
+2010-03-30  Zhu, Yongsheng  <yongsheng.zhu@intel.com>
+
+       * test/test-dbus.py:
+
+       test-dbus: fix 2 issues of test-dbus.py
+
+2010-04-01  Zhu, Yongsheng  <yongsheng.zhu@intel.com>
+
+       * src/syncevo/configs/scripting/11calendar.xml:
+
+       Calendar: add workaround for 'alarm' in vCalendar1.0 (MB#10458)
+
+2010-03-31  Chen Congwu  <congwu.chen@intel.com>
+
+       * src/syncevo/ObexTransportAgent.cpp:
+
+       ObexTransportAgent: set requestStart for connect
+
+2010-03-31  Chen Congwu  <congwu.chen@intel.com>
+
+       * src/syncevo/SyncContext.cpp:
+       * src/syncevo/SyncContext.h:
+
+       Transport Timeout: setting the timeout callback within
+       createTransportAgent
+
+2010-04-01  Chen Congwu  <congwu.chen@intel.com>
+
+       * src/syncevo-dbus-server.cpp:
+       * test/test-dbus.py:
+
+       Presence Detection: listen connman signals instead of polling
+       (mb#10438)
+
+2010-03-31  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/SyncConfig.cpp:
+
+       SecondsConfigProperty: don't accept units without number (MB
+       #10257)
+
+2010-03-31  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * README.packagers:
+       * configure-pre.in:
+
+       packaging: fail harder if libnotify is missing (MB #1000).
+
+2010-03-31  Jussi Kukkonen  <jku@linux.intel.com>
+
+       * src/gtk-ui/sync-ui.c:
+
+       gtk-ui: revert to old widgets names for Toolbar
+
+2010-03-25  Jussi Kukkonen  <jku@linux.intel.com>
+
+       * src/gtk-ui/Makefile.am:
+       * src/gtk-ui/close.png:
+       * src/gtk-ui/close_hover.png:
+       * src/gtk-ui/mux-icon-button.c:
+       * src/gtk-ui/mux-icon-button.h:
+       * src/gtk-ui/mux-window.c:
+       * src/gtk-ui/mux-window.h:
+       * src/gtk-ui/settings.png:
+       * src/gtk-ui/settings_hover.png:
+       * src/gtk-ui/sync-ui.c:
+       * src/gtk-ui/sync-ui.rc:
+       * src/gtk-ui/ui.glade:
+
+       gtk-ui: start using GtkToolbar for Meego window
+
+2010-03-31  Jussi Kukkonen  <jku@linux.intel.com>
+
+       * src/gtk-ui/sync-ui.c:
+
+       gtk-ui: fix source order in emergency view (MB #9714)
+
+2010-03-31  Jussi Kukkonen  <jku@linux.intel.com>
+
+       * src/gtk-ui/sync-config-widget.c:
+
+       gtk-ui: bug fix: show send/receive buttons in config
+
+2010-03-31  Jussi Kukkonen  <jku@linux.intel.com>
+
+       * src/gtk-ui/sync-config-widget.c:
+
+       gtk-ui: improve configuration layout
+
+2010-03-31  Jussi Kukkonen  <jku@linux.intel.com>
+
+       * src/gtk-ui/sync-config-widget.c:
+
+       gtk_ui: check source usability for templates (MB #9961)
+
+2010-03-30  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/Makefile-gen.am:
+
+       command line + D-Bus: fixed "make distcheck"
+
+2010-03-30  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/backends/evolution/e-cal-check-timezones.c:
+
+       e_cal_check_timezones(): broken in EDS 2.30 due to change of
+       error code (GNOME Bugzilla #611558, Moblin Bugzilla #9820)
+
+2010-03-30  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/backends/evolution/EvolutionCalendarSource.cpp:
+       * src/backends/evolution/EvolutionContactSource.cpp:
+
+       Evolution backends: don't delay in open() unnecessarily
+
+2010-03-29  Jussi Kukkonen  <jku@linux.intel.com>
+
+       * src/gtk-ui/sync-config-widget.c:
+
+       gtk-ui: really sort templates in device config (MB#10336)
+
+2010-03-24  Jussi Kukkonen  <jku@linux.intel.com>
+
+       * src/gtk-ui/sync-config-widget.c:
+
+       gtk-ui: Show an error message when saving config fails
+
+2010-03-29  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/Makefile-gen.am:
+       * src/syncevolution.cpp:
+
+       command line + D-Bus: fixed compile problems
+
+2010-03-26  Chen Congwu  <congwu.chen@intel.com>
+
+       * src/syncevo/ObexTransportAgent.cpp:
+
+       obex fix: set obex_ready flag when receving link_err in
+       disconnect
+
+2010-03-29  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/Cmdline.cpp:
+
+       command line + D-Bus: --status help and output (MB #5043)
+
+2010-03-26  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo-dbus-server.cpp:
+
+       command line + daemon: reporting exceptions inside Cmdline::run()
+       (MB #5043)
+
+2010-03-26  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/dbus/interfaces/syncevo-server-full.xml:
+       * src/gdbus/gdbus-cxx-bridge.h:
+       * src/syncevo-dbus-server.cpp:
+       * src/syncevo/Logging.cpp:
+       * src/syncevo/Logging.h:
+       * src/syncevolution.cpp:
+
+       command line + D-Bus signal cleanup (MB #5043)
+
+2010-03-26  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevolution.cpp:
+
+       command line + daemon: fix for "virtual function called" during
+       shutdown (fix for MB #5043)
+
+2010-03-26  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo-dbus-server.cpp:
+       * src/syncevo/Cmdline.cpp:
+       * src/syncevo/Cmdline.h:
+       * src/syncevolution.cpp:
+
+       command line + daemon: usability improvements (MB #5043)
+
+2010-03-26  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo-dbus-server-startup.sh.in:
+
+       syncevo-dbus-server-startup.sh.in: suppress output
+
+2010-03-26  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo-dbus-server.cpp:
+
+       syncevo-dbus-server: reduce output to INFO and more important
+
+2010-03-26  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevolution.cpp:
+
+       command line + daemon mode: don't run with DEBUG output enabled
+       (MB #5043)
+
+2010-03-26  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/LogRedirect.cpp:
+
+       LogRedirect::abortHandler: don't try to do logging
+
+2010-03-26  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/Logging.h:
+
+       Logging: changed importance of new SHOW level (fix for MB #5043)
+
+2010-03-26  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo-dbus-server.cpp:
+
+       DBusServer::messagev: make copy of va_list to avoid segfault (fix
+       for MB #5042)
+
+2010-03-26  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo-dbus-server.cpp:
+       * src/syncevolution.cpp:
+
+       command line: fixes for --monitor (MB #5043)
+
+2010-03-26  Zhu, Yongsheng  <yongsheng.zhu@intel.com>
+
+       * test/test-dbus.py:
+
+       Testing: fix errors due to changes of MB#5043
+
+2010-03-15  Zhu, Yongsheng  <yongsheng.zhu@intel.com>
+
+       * configure-pre.in:
+       * src/Makefile-gen.am:
+       * src/gdbus/gdbus-cxx-bridge.h:
+       * src/syncevo-dbus-server.cpp:
+       * src/syncevo/Cmdline.cpp:
+       * src/syncevo/Cmdline.h:
+       * src/syncevo/Logging.h:
+       * src/syncevo/SyncContext.h:
+       * src/syncevolution.cpp:
+
+       Cmdline: move cmdline to dbus server (MB#5043)
+
+2010-03-18  Zhu, Yongsheng  <yongsheng.zhu@intel.com>
+
+       * src/dbus/interfaces/syncevo-server-full.xml:
+       * src/syncevo-dbus-server.cpp:
+
+       DBusServer: send log output to clients (MB#5042)
+
+2010-03-19  Zhu, Yongsheng  <yongsheng.zhu@intel.com>
+
+       * src/syncevo-dbus-server.cpp:
+       * src/syncevo/LogStdout.cpp:
+       * src/syncevo/Logging.cpp:
+       * src/syncevo/Logging.h:
+
+       DBusServer: avoid stdout and routing them in logging
+       system(MB#5401)
+
+2010-03-26  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/Cmdline.cpp:
+
+       Cmdline::run(): context should use same output as command line
+       (MB #5041)
+
+2010-03-26  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/SyncContext.cpp:
+
+       LogDirTest: redirect output (MB #5041)
+
+2010-03-26  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/Cmdline.cpp:
+       * src/syncevo/SyncContext.cpp:
+       * src/syncevo/SyncContext.h:
+       * src/syncevo/declarations.h:
+       * src/syncevolution.cpp:
+       * test/client-test-main.cpp:
+
+       stdout: never write to std::cout directly (MB #5041)
+
+2010-03-28  GLS_DEU  <andreasx.machoy@intel.com>
+
+       * po/de.po:
+
+       l10n: Updates to German (de) translation
+
+2010-03-25  Jussi Kukkonen  <jku@linux.intel.com>
+
+       * src/gtk-ui/sync-ui.c:
+
+       gtk-ui: use templateName when available
+
+2010-03-25  Chen Congwu  <congwu.chen@intel.com>
+
+       * src/syncevo-dbus-server.cpp:
+       * src/syncevo/Cmdline.cpp:
+       * src/syncevo/SyncConfig.cpp:
+       * src/syncevo/SyncConfig.h:
+       * src/templates/clients/phone/nokia/S40/7210c/template.ini:
+
+       Config Templates: Add 'templateName' optional property (MB10406)
+
+2010-03-25  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo-dbus-server.cpp:
+
+       auto sync: user of autoSyncDelay/Interval must use seconds (fix
+       for MB #10257)
+
+2010-03-25  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/SyncConfig.cpp:
+
+       RetryInterval: default was 1 second instead of 1 minute (fix for
+       MB #10257)
+
+2010-03-26  zerng07  <pswo10680@gmail.com>
+
+       * po/zh_TW.po:
+
+       l10n: Updates to Chinese (Taiwan) (zh_TW) translation
+
+2010-03-25  GLS_ESP  <gonzalox.e.velasquez@intel.com>
+
+       * po/es.po:
+
+       l10n: Updates to Spanish (Castilian) (es) translation
+
+2010-03-25  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo-dbus-server.cpp:
+
+       syncevo-dbus-server AutoTerm: fix signedness compiler warning
+
+2010-03-24  auke  <auke-jan.h.kok@intel.com>
+
+       * po/nl.po:
+
+       l10n: Updates to Dutch (Flemish) (nl) translation
+
+2010-03-24  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * configure-post.in:
+
+       autotools: NSS is not an absolute requirement
+
+2010-03-24  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/Cmdline.cpp:
+       * src/templates/clients/phone/nokia/S40/7210c/template.ini:
+
+       templates: keep fingerPrint a list of models
+
+2010-03-19  Chen Congwu  <congwu.chen@intel.com>
+
+       * src/syncevo/Cmdline.cpp:
+       * src/templates/clients/SyncEvolution/template.ini:
+       * src/templates/clients/phone/nokia/S40/7210c/template.ini:
+       * src/templates/clients/phone/nokia/maemo/n900/template.ini:
+
+       Configuration template: fingerprint changes
+
+2010-03-23  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo-dbus-server.cpp:
+
+       syncevo-dbus-server: avoid regular wakeups (MB #10350)
+
+2010-03-23  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/Makefile-gen.am:
+       * test/Makefile.am:
+
+       autotools: final fix for distributing syncevo-http-server.py
+
+2010-03-23  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * Makefile-gen.am:
+       * configure-post.in:
+       * configure-pre.in:
+       * src/Makefile-gen.am:
+       * src/synthesis-includes/Makefile.am:
+
+       autotools: --disable-core --enable-gui => build only sync-ui and
+       its D-Bus lib
+
+2010-03-23  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/dbus/test.c:
+       * src/gtk-ui/sync-ui.c:
+
+       sync-UI + D-Bus lib: removed obsolete include for engine defs
+
+2010-03-23  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/Makefile-gen.am:
+
+       autotools: syncevo-http-server + dist problem
+
+2010-03-22  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/Cmdline.cpp:
+       * src/syncevo/SyncConfig.cpp:
+       * src/syncevo/SyncConfig.h:
+
+       autoSyncInterval/autoSyncDelay/RetryDuration/RetryInterval:
+       consistent value handling (MB #10257)
+
+2010-03-22  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/SyncConfig.cpp:
+
+       maxlogdirs/loglevel: don't accept negative values (MB #10257)
+
+2010-03-22  Jussi Kukkonen  <jku@linux.intel.com>
+
+       * src/gtk-ui/sync-ui.c:
+
+       add error message for 506 (Processing error)
+
+2010-03-22  tomasgalicia  <tomas.galicia@intel.com>
+
+       * po/es.po:
+
+       l10n: Updates to Spanish (Castilian) (es) translation
+
+2010-03-22  tomasgalicia  <tomas.galicia@intel.com>
+
+       * po/es.po:
+
+       l10n: Updates to Spanish (Castilian) (es) translation
+
+2010-03-22  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/SynthesisDBPlugin.cpp:
+
+       Synthesis DB Plugin + Blob support: fixed compiler warnings on
+       i386
+
+2010-03-22  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * test/README.syncevolution-server:
+
+       README.syncevolution-server: explains testing
+       SyncEvolution<->SyncEvolution
+
+2010-03-22  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/Makefile-gen.am:
+       * test/syncevo-http-server.py:
+
+       syncevo-http-server: include Python script in distribution
+
+2010-03-21  zerng07  <pswo10680@gmail.com>
+
+       * po/zh_TW.po:
+
+       l10n: Updates to Chinese (Taiwan) (zh_TW) translation
+
+2010-03-19  Zhu, Yongsheng  <yongsheng.zhu@intel.com>
+
+       * src/syncevo-dbus-server.cpp:
+
+       AutoSync: fix a crash issue for auto sync (MB#10269)
+
+2010-03-18  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * NEWS:
+
+       NEWS: preliminary summary of 1.0 beta 3 changes
+
+2010-03-18  Chen Congwu  <congwu.chen@intel.com>
+
+       * src/Makefile-gen.am:
+       * src/syncevo/Cmdline.cpp:
+       * src/syncevo/SyncConfig.cpp:
+       * src/syncevo/SyncConfig.h:
+       * src/templates/clients/SyncEvolution/template.ini:
+       * src/templates/clients/default/template.ini:
+       * src/templates/clients/phone/nokia/S40/7210c/template.ini:
+       * src/templates/clients/phone/nokia/maemo/n900/template.ini:
+       * src/templates/servers/Funambol/template.ini:
+       * src/templates/servers/ScheduleWorld/template.ini:
+
+       Configuration template: reuse 'peerIsClient' in config.ini
+       (mb#10224)
+
+2010-03-17  Chen Congwu  <congwu.chen@intel.com>
+
+       * src/templates/clients/phone/nokia/maemo/n900/config.ini:
+       * src/templates/clients/phone/nokia/maemo/n900/sources/addressbook/config.ini:
+       * src/templates/clients/phone/nokia/maemo/n900/sources/calendar+todo/config.ini:
+       * src/templates/clients/phone/nokia/maemo/n900/sources/calendar/config.ini:
+       * src/templates/clients/phone/nokia/maemo/n900/sources/memo/config.ini:
+       * src/templates/clients/phone/nokia/maemo/n900/sources/todo/config.ini:
+       * src/templates/clients/phone/nokia/maemo/n900/template.ini:
+
+       Configuration Template: Add Nokia N900 template (MB#10224)
+
+2010-03-18  Chen Congwu  <congwu.chen@intel.com>
+
+       * src/syncevo/SyncSource.h:
+
+       SyncSource: comments clarified for GetPeerMimeType()
+
+2010-03-18  Chen Congwu  <congwu.chen@intel.com>
+
+       * src/syncevo/SyncContext.cpp:
+
+       SyncContext: Virtual SyncSource type checking
+
+2010-03-17  Chen Congwu  <congwu.chen@intel.com>
+
+       * src/syncevo/Cmdline.cpp:
+       * src/syncevo/SyncSource.cpp:
+       * src/syncevo/SyncSource.h:
+
+       VirtualSyncSource: implement getDatabases()
+
+2010-03-17  Chen Congwu  <congwu.chen@intel.com>
+
+       * src/syncevo/SyncContext.cpp:
+
+       Do not send 'respURI' if over bluetooth (MB#10224)
+
+2010-03-18  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * test/ClientTest.cpp:
+       * test/ClientTest.h:
+
+       client-test: check that suspend tests really suspend
+
+2010-03-18  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * test/ClientTest.cpp:
+
+       client-test: suspend tests now also pass with last message
+
+2010-03-18  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * test/ClientTest.cpp:
+       * test/ClientTest.h:
+
+       client-test: added "big" variant also to suspend tests
+
+2010-03-18  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * configure-pre.in:
+
+       Revert "dummy beta 3"
+
+2010-03-16  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * test/ClientTest.cpp:
+
+       client-test: improved termination of Retry/Suspend/Resend tests
+
+2010-03-15  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * test/ClientTest.cpp:
+
+       client-test: increase item size for "big" items in suspend/resume
+       tests
+
+2010-03-15  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/SyncContext.cpp:
+       * test/ClientTest.cpp:
+
+       message resend after timeout + log messages
+
+2010-03-09  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/SyncSource.cpp:
+
+       SyncSourceAdmin::mapid2entry(): unescape after parsing key
+
+2010-03-08  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/SynthesisDBPlugin.cpp:
+
+       Synthesis DB Plugin: log admin data being read
+
+2010-03-06  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/backends/file/FileSyncSource.cpp:
+
+       file backend: ignore double remove
+
+2010-03-05  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * test/ClientTest.cpp:
+
+       client-test: testInterruptRetry + loss of final server reply
+
+2010-03-05  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/SyncSource.cpp:
+
+       SyncSourceAdmin: fixed storing of map item with no remote ID (MB
+       #2425)
+
+2010-03-05  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * test/syncevo-http-server.py:
+
+       syncevo-http-server.py: bug fix for resending
+
+2010-03-05  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/client-test-app.cpp:
+       * test/ClientTest.cpp:
+       * test/ClientTest.h:
+
+       client-test: speed up interrupt tests
+
+2010-03-04  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/backends/sqlite/SQLiteContactSource.cpp:
+       * src/backends/sqlite/SQLiteContactSource.h:
+       * src/syncevo/Cmdline.cpp:
+       * src/syncevo/SyncConfig.cpp:
+       * src/syncevo/SyncConfig.h:
+       * src/syncevo/SyncContext.cpp:
+       * src/syncevo/SyncSource.cpp:
+       * src/syncevo/SyncSource.h:
+       * src/syncevo/TrackingSyncSource.cpp:
+       * src/syncevo/TrackingSyncSource.h:
+
+       enable suspend and saving blobs (MB #2425)
+
+2010-03-04  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/SyncSource.h:
+       * src/syncevo/SynthesisDBPlugin.cpp:
+
+       SyncSource API: enable implementation of Synthesis Blobs (MB
+       #2425)
+
+2010-02-26  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/SyncContext.cpp:
+
+       SyncContext::doSync(): added debug output for session stepping
+
+2010-02-26  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * test/ClientTest.cpp:
+       * test/ClientTest.h:
+
+       client-test: added interrupted sync tests with split items
+
+2010-02-26  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * test/ClientTest.cpp:
+
+       client-test: nicer reporting if sync status is bad
+
+2010-02-26  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * test/ClientTest.cpp:
+
+       client-test: clarify and improve Resend/Resume tests
+
+2010-02-26  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * test/syncevo-http-server.py:
+
+       syncevo-http-server.py: support resending of last reply
+
+2010-03-18  Jussi Kukkonen  <jku@linux.intel.com>
+
+       * src/gtk-ui/sync-ui.c:
+
+       gtk-ui: add error message for GetConfig() failure
+
+2010-03-18  Jussi Kukkonen  <jku@linux.intel.com>
+
+       * src/gtk-ui/sync-ui.c:
+       * src/gtk-ui/ui.glade:
+
+       gtk-ui: add automatic sync toggle
+
+2010-03-18  Jussi Kukkonen  <jku@linux.intel.com>
+
+       * src/gtk-ui/sync-ui.c:
+
+       gtk-ui: fix minor bug in time label building
+
+2010-03-18  Jussi Kukkonen  <jku@linux.intel.com>
+
+       * src/gtk-ui/sync-config-widget.c:
+
+       gtk-ui: improve device config UI
+
+2010-03-17  Jussi Kukkonen  <jku@linux.intel.com>
+
+       * src/gtk-ui/sync-ui.c:
+
+       gtk-ui: handle InfoRequest timeout error
+
+2010-03-17  Jussi Kukkonen  <jku@linux.intel.com>
+
+       * src/gtk-ui/sync-config-widget.c:
+
+       gtk-ui: set 'insensitive' sources to sync=none (MB#9961)
+
+2010-03-17  Jussi Kukkonen  <jku@linux.intel.com>
+
+       * src/gtk-ui/sync-config-widget.c:
+
+       gtk-ui: do not confirm simple service changes (MB#10082)
+
+2010-03-17  Jussi Kukkonen  <jku@linux.intel.com>
+
+       * src/gtk-ui/sync-ui.c:
+
+       gtk-ui: fix error output (MB#9558)
+
+2010-03-18  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * .gitignore:
+
+       .gitignore: fixes for .gitignore and .patch
+
+2010-03-18  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * dbus-timeout.patch:
+
+       dbus-timeout.patch: removed
+
+2010-03-17  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/SyncML.cpp:
+
+       DBusServer STATUS_PASSWORD_TIMEOUT: changed explanation text
+
+2010-03-17  Zhu, Yongsheng  <yongsheng.zhu@intel.com>
+
+       * src/syncevo-dbus-server.cpp:
+       * src/syncevo/SyncML.cpp:
+       * src/syncevo/SyncML.h:
+       * src/syncevo/SynthesisEngine.cpp:
+       * src/syncevo/SynthesisEngine.h:
+       * src/syncevo/util.cpp:
+       * src/syncevo/util.h:
+
+       DBusServer: change status code for password timeout (MB#9636)
+
+2010-03-16  niala  <alainswb@free.fr>
+
+       * po/fr.po:
+
+       l10n: Updates to French (fr) translation
+
+2010-03-16  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * test/runtests.py:
+
+       runtest.py: check Synthesis source
+
+2010-03-15  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo-dbus-server.cpp:
+
+       Remove support for accepting SAN 1.0/1.1 (MB #6175, MB #9312)
+
+2010-03-16  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * configure-pre.in:
+
+       dummy beta 3
+
+2010-03-16  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * gen-autotools.sh:
+
+       removed dependency on --long and --exact
+
+2010-03-15  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * gen-autotools.sh:
+
+       gen-autotools.sh: set versions suffix when code is not cleanly
+       tagged
+
+2010-03-15  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo-dbus-server.cpp:
+
+       fixes for "Create configuration automatically" (MB#6175)
+
+2010-03-03  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/Cmdline.cpp:
+       * src/syncevo/Cmdline.h:
+
+       command line: check for invalid peer properties (MB #8048)
+
+2010-03-15  Chen Congwu  <congwu.chen@intel.com>
+
+       * src/syncevo/SyncContext.cpp:
+
+       Server: Disable credential checking if over bluetooth transport
+
+2010-03-12  Chen Congwu  <congwu.chen@intel.com>
+
+       * src/syncevo-dbus-server.cpp:
+       * src/syncevo/util.cpp:
+       * src/syncevo/util.h:
+
+       Create configuration automatically (MB#6175)
+
+2010-03-12  Chen Congwu  <congwu.chen@intel.com>
+
+       * src/syncevo-dbus-server.cpp:
+       * src/syncevo/SyncContext.cpp:
+       * src/syncevo/SyncContext.h:
+
+       Disable PreventSlowSync if the sync session is triggered by a
+       remote peer
+
+2010-03-15  Zhu, Yongsheng  <yongsheng.zhu@intel.com>
+
+       * src/Makefile-gen.am:
+
+       Install: change 'autostart' data install directory
+
+2010-03-14  zerng07  <pswo10680@gmail.com>
+
+       * po/zh_TW.po:
+
+       l10n: Updates to Chinese (Taiwan) (zh_TW) translation
+
+2010-03-12  tomasgalicia  <tomas.galicia@intel.com>
+
+       * po/es.po:
+
+       l10n: Updates to Spanish (Castilian) (es) translation
+
+2010-03-08  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * Makefile-gen.am:
+       * src/syncevo/eds_abi_wrapper.cpp:
+
+       libbluetooth3 compatibility (MB #9289)
+
+2010-03-11  Chen Congwu  <congwu.chen@intel.com>
+
+       * src/syncevo/ObexTransportAgent.cpp:
+       * src/syncevo/ObexTransportAgent.h:
+       * src/syncevo/SyncContext.cpp:
+       * src/valgrind.supp:
+
+       ObexTransportAgent: Fix valgrind warnings (MB#10091)
+
+2010-03-03  Chen Congwu  <congwu.chen@intel.com>
+
+       * src/syncevo/SyncContext.cpp:
+
+       Add forceslow for super datastore
+
+2010-03-10  promuald  <info@transsoft.pl>
+
+       * po/pl.po:
+
+       l10n: Updates to Polish (pl) translation
+
+2010-03-10  A Olsson  <AnnikaNbpt@gmail.com>
+
+       * po/sv.po:
+
+       l10n: Updates to Swedish (sv) translation
+
+2010-03-08  Chen Congwu  <congwu.chen@intel.com>
+
+       * test/ClientTest.cpp:
+       * test/README.Ovi:
+       * test/synccompare.pl:
+       * test/testcases/ical20.ics.Ovi.tem.patch:
+       * test/testcases/itodo20.ics.Ovi.tem.patch:
+       * test/testcases/vcard30.vcf.Ovi.tem.patch:
+
+       Ovi server test: synccompare and readme
+
+2010-02-21  Chen Congwu  <congwu.chen@intel.com>
+
+       * src/backends/evolution/EvolutionCalendarSourceRegister.cpp:
+       * src/client-test-app.cpp:
+       * test/ClientTest.cpp:
+
+       ClientTest: rename 'super' to 'calendar+todo'
+
+2010-02-12  Chen Congwu  <congwu.chen@intel.com>
+
+       * test/ClientTest.cpp:
+
+       ClientTest: fix a typo in testDeleteRefresh
+
+2010-02-09  Chen Congwu  <congwu.chen@intel.com>
+
+       * src/syncevo/Cmdline.cpp:
+       * src/syncevo/SyncConfig.cpp:
+       * test/test-dbus.py:
+
+       Add ovi template
+
+2010-03-06  Jussi Kukkonen  <jku@linux.intel.com>
+
+       * src/gtk-ui/sync-config-widget.c:
+       * src/gtk-ui/sync-config-widget.h:
+
+       gtk-ui: fix crasher in device template selection
+
+2010-03-06  Jussi Kukkonen  <jku@linux.intel.com>
+
+       * src/gtk-ui/sync-config-widget.c:
+       * src/gtk-ui/sync-config-widget.h:
+       * src/gtk-ui/sync-ui.c:
+
+       gtk-ui: string updates
+
+2010-03-06  Jussi Kukkonen  <jku@linux.intel.com>
+
+       * src/gtk-ui/mux-window.c:
+       * src/gtk-ui/sync-ui.c:
+
+       gtk-ui: fix settings icon mode bug
+
+2010-03-06  Jussi Kukkonen  <jku@linux.intel.com>
+
+       * src/gtk-ui/sync-config-widget.c:
+       * src/gtk-ui/sync-ui.c:
+
+       gtk-ui: don't update service list twice
+
+2010-03-04  Zhu, Yongsheng  <yongsheng.zhu@intel.com>
+
+       * configure-pre.in:
+       * po/POTFILES.in:
+       * src/Makefile-gen.am:
+       * src/syncevo-dbus-server.cpp:
+       * src/syncevo/SyncContext.cpp:
+       * src/syncevo/SyncContext.h:
+
+       DBusServer: improve notification for auto sync (MB#10000)
+
+2010-03-08  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo-dbus-server-startup.sh.in:
+
+       syncevo-dbus-server-startup.sh.in: make it a real shell script
+       (MB #1000)
+
+2010-03-03  Zhu, Yongsheng  <yongsheng.zhu@intel.com>
+
+       * src/Makefile-gen.am:
+       * src/syncevo-dbus-server-startup.sh.in:
+       * src/syncevo-dbus-server.desktop.in:
+
+       DBusServer: start syncevo-dbus-server when users log in
+
+2010-03-08  Chen Congwu  <congwu.chen@intel.com>
+
+       * src/syncevo/SyncContext.cpp:
+
+       San 1.1: Compiler warning fix
+
+2010-03-08  Leila  <leilaa@abc-lang.com>
+
+       * po/ru.po:
+
+       l10n: Updates to Russian (ru) translation
+
+2010-03-05  kushylee  <>
+
+       * po/ko.po:
+
+       l10n: Updates to Korean (ko) translation
+
+2010-03-05  smilex2005  <eija@fascinatingwords.com>
+
+       * po/fi.po:
+
+       l10n: Updates to Finnish (fi) translation
+
+2010-03-04  A Olsson  <AnnikaNbpt@gmail.com>
+
+       * po/sv.po:
+
+       l10n: Updates to Swedish (sv) translation
+
+2010-03-04  Chen Congwu  <congwu.chen@intel.com>
+
+       * src/syncevo/Cmdline.cpp:
+       * src/syncevo/SyncConfig.cpp:
+
+       Configuration templates: uncomment SyncURL  (MB#10015)
+
+2010-03-04  Chen Congwu  <congwu.chen@intel.com>
+
+       * src/syncevo/Cmdline.cpp:
+
+       MatchTemplate better output (MB#10004)
+
+2010-03-04  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/SyncConfig.cpp:
+       * src/syncevo/SyncContext.cpp:
+
+       SAN 1.2 -> 1.1 fallback: fix for SyncMLVersion empty
+
+2010-02-26  Chen Congwu  <congwu.chen@intel.com>
+
+       * src/syncevo/Cmdline.cpp:
+       * src/syncevo/SyncConfig.cpp:
+       * src/syncevo/SyncConfig.h:
+       * src/syncevo/SyncContext.cpp:
+       * src/syncevo/SyncContext.h:
+       * src/syncevo/SyncML.cpp:
+       * src/syncevo/SyncML.h:
+
+       SAN 1.0/1.1 generation support (MB#9312)
+
+2010-02-23  Chen Congwu  <congwu.chen@intel.com>
+
+       * src/syncevo-dbus-server.cpp:
+
+       syncevo-dbus-server: accept SAN 1.0/1.1 pacakge (MB#9312)
+
+2010-03-03  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/SyncContext.cpp:
+
+       config error handling: "uri" must be set for clients
+
+2010-03-03  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/configs/remoterules/00_need_tz_in_event.xml:
+
+       Nokia 7120C: fix for enabling TZ (MB #9907)
+
+2010-02-25  Chen Congwu  <congwu.chen@intel.com>
+
+       * src/syncevo/configs/datatypes/11calendar-profile.xml:
+       * src/syncevo/configs/remoterules/server/45_N7210c.xml:
+
+       Synthesis Configuration: Add remote rule for Nokia 7210c
+
+2010-03-03  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/gdbus/gdbus-cxx-bridge.h:
+       * src/syncevo-dbus-server.cpp:
+
+       syncevo-dbus-server: better error message when starting twice (MB
+       #9991)
+
+2010-03-03  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/gdbus/mainloop.c:
+
+       g_dbus_setup_bus(): call dbus_connection_close() when failing to
+       set up private connection
+
+2010-03-02  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/Cmdline.cpp:
+
+       username/password must be empty for clients (MB #9437)
+
+2010-03-02  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/Cmdline.cpp:
+       * src/syncevo/SyncConfig.cpp:
+       * src/syncevo/SyncConfig.h:
+
+       command line --template new config in non-standard context: wrong
+       properties written (MB #10007)
+
+2010-02-26  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/SyncContext.cpp:
+
+       unexpected slow sync: fix result when using a single source
+
+2010-03-02  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/Cmdline.cpp:
+       * src/syncevo/MultiplexConfigNode.cpp:
+       * src/syncevo/MultiplexConfigNode.h:
+       * src/syncevo/SyncConfig.cpp:
+       * src/syncevo/SyncConfig.h:
+       * test/test-dbus.py:
+
+       shared layout: fix for showing and setting "type" property (MB
+       #9939)
+
+2010-03-02  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/Cmdline.cpp:
+       * src/syncevo/Cmdline.h:
+
+       command line: --print-config of context should ignore per-peer
+       properties (MB #8048)
+
+2010-02-26  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * test/synccompare.pl:
+
+       synccompare: workaround for Perl "panic: memory wrap at..."
+
+2010-03-03  Chen Congwu  <congwu.chen@intel.com>
+
+       * src/syncevo/Cmdline.cpp:
+
+       Cmdline Test: testMatchTemplate fix (MB#10004)
+
+2010-03-02  GLSQA  <namfonx.yeates@intel.com>
+
+       * po/es.po:
+
+       l10n: Updates to Spanish (Castilian) (es) translation
+
+2010-03-02  GLS_ITA  <lorenzo.gennaro@ptiglobal.net>
+
+       * po/it.po:
+
+       l10n: Updates to Italian (it) translation
+
+2010-03-01  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/SyncContext.cpp:
+
+       restore + status: don't overwrite status.ini (status code and
+       time) (MB #9963)
+
+2010-03-01  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/SyncContext.cpp:
+
+       status.ini: wrong human-readable date format
+
+2010-03-02  Zhu, Yongsheng  <yongsheng.zhu@intel.com>
+
+       * src/syncevo-dbus-server.cpp:
+       * src/syncevo/Cmdline.cpp:
+       * src/syncevo/SyncConfig.cpp:
+
+       DBusServer: fix 4 issues for automatic sync
+
+2010-03-01  GLS_NLD  <albert.dijkstra@ptiglobal.net>
+
+       * po/nl.po:
+
+       l10n: Updates to Dutch (Flemish) (nl) translation
+
+2010-03-01  GLS_CHS  <yunx.nie@intel.com>
+
+       * po/zh_CN.po:
+
+       l10n: Updates to Chinese (China) (zh_CN) translation
+
+2010-02-26  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/SyncContext.cpp:
+
+       LogDir: use a-z instead of number to make session dirs unique (MB
+       #9759)
+
+2010-02-26  Zhu, Yongsheng  <yongsheng.zhu@intel.com>
+
+       * configure-pre.in:
+       * src/Makefile-gen.am:
+       * src/syncevo-dbus-server.cpp:
+
+       DBusServer: add notification for auto sync (MB#6378)
+
+2010-02-25  Zhu, Yongsheng  <yongsheng.zhu@intel.com>
+
+       * src/syncevo-dbus-server.cpp:
+
+       DBus Server: implement automatic sync (MB#6378)
+
+2010-02-23  Zhu, Yongsheng  <yongsheng.zhu@intel.com>
+
+       * src/syncevo/SyncConfig.cpp:
+       * src/syncevo/SyncConfig.h:
+
+       SyncConfig: add 3 properties for automatic sync
+
+2010-02-25  Chen Congwu  <congwu.chen@intel.com>
+
+       * src/templates/clients/SyncEvolution/template.ini:
+
+       SyncEvolutionClient template: do not match "SyncEvolution"
+
+2010-03-01  Takashi  <takashi.kazami@novuscom.net>
+
+       * po/ja.po:
+
+       l10n: Updates to Japanese (ja) translation
+
+2010-02-28  promuald  <info@transsoft.pl>
+
+       * po/pl.po:
+
+       l10n: Updates to Polish (pl) translation
+
+2010-02-27  GLS_FRA3  <david.cicognani@ptiglobal.net>
+
+       * po/fr.po:
+
+       l10n: Updates to French (fr) translation
+
+2010-02-26  GLS_PTB  <gaborx.k.becht@intel.com>
+
+       * po/pt_BR.po:
+
+       l10n: Updates to Brazilian Portuguese (pt_BR) translation
+
+2010-02-26  GLS_DEU1  <clarax.steiner-jay@intel.com>
+
+       * po/de.po:
+
+       l10n: Updates to German (de) translation
+
+2010-02-26  GLS_CHS  <yunx.nie@intel.com>
+
+       * po/zh_CN.po:
+
+       l10n: Updates to Chinese (China) (zh_CN) translation
+
+2010-02-26  GLS_ITA  <lorenzo.gennaro@ptiglobal.net>
+
+       * po/it.po:
+
+       l10n: Updates to Italian (it) translation
+
+2010-02-25  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/syncevo/Cmdline.cpp:
+
+       client-test Cmdline: adapted to recent config changes
+
+2010-02-26  zerng07  <pswo10680@gmail.com>
+
+       * po/zh_TW.po:
+
+       l10n: Updates to Chinese (Taiwan) (zh_TW) translation
+
+2010-02-25  Leila  <leilaa@abc-lang.com>
+
+       * po/ru.po:
+
+       l10n: This is a translated PO.
+
 2010-02-24  Patrick Ohly  <patrick.ohly@intel.com>
 
        * configure-pre.in:
index efeb78b..96e35e4 100644 (file)
@@ -2,7 +2,13 @@
 
 ACLOCAL_AMFLAGS = -I m4 -I m4-repo
 
-SUBDIRS = src po test
+dist_doc_DATA =
+SUBDIRS = src
+if COND_CORE
+SUBDIRS += po test
+dist_doc_DATA += README NEWS COPYING $(TEST_README_FILES)
+endif
+DIST_SUBDIRS = src po test
 
 EXTRA_DIST = \
        HACKING \
@@ -137,9 +143,6 @@ clean-local: clean_dist
 clean_dist:
        rm -rf dist description-pak
 
-# install doc files via normal autotools
-dist_doc_DATA = README NEWS COPYING $(TEST_README_FILES)
-
 # required by dpkg-shlibdeps
 dist/debian/control:
        mkdir -p ${@D}
@@ -202,8 +205,8 @@ dist-hook:
 if ENABLE_EVOLUTION_COMPATIBILITY
 installcheck-local:
        for i in `find . -name *.so`; do \
-               if ldd $$i | grep -e libecal -e libebook -e libedata -e libical; then \
-                       echo "$$i should not depend on EDS or libical"; \
+               if ldd $$i | grep -e libecal -e libebook -e libedata -e libical -e libbluetooth; then \
+                       echo "$$i should not depend on EDS, libical or libbluetooth"; \
                        objdump -T -C $$i | grep -v :: | grep -e ical -e " e_"; \
                        exit 1; \
                fi \
index 9312b4c..31c03cd 100644 (file)
@@ -2,7 +2,13 @@
 
 ACLOCAL_AMFLAGS = -I m4 -I m4-repo
 
-SUBDIRS = src po test
+dist_doc_DATA =
+SUBDIRS = src
+if COND_CORE
+SUBDIRS += po test
+dist_doc_DATA += README NEWS COPYING $(TEST_README_FILES)
+endif
+DIST_SUBDIRS = src po test
 
 EXTRA_DIST = \
        HACKING \
@@ -137,9 +143,6 @@ clean-local: clean_dist
 clean_dist:
        rm -rf dist description-pak
 
-# install doc files via normal autotools
-dist_doc_DATA = README NEWS COPYING $(TEST_README_FILES)
-
 # required by dpkg-shlibdeps
 dist/debian/control:
        mkdir -p ${@D}
@@ -202,8 +205,8 @@ dist-hook:
 if ENABLE_EVOLUTION_COMPATIBILITY
 installcheck-local:
        for i in `find . -name *.so`; do \
-               if ldd $$i | grep -e libecal -e libebook -e libedata -e libical; then \
-                       echo "$$i should not depend on EDS or libical"; \
+               if ldd $$i | grep -e libecal -e libebook -e libedata -e libical -e libbluetooth; then \
+                       echo "$$i should not depend on EDS, libical or libbluetooth"; \
                        objdump -T -C $$i | grep -v :: | grep -e ical -e " e_"; \
                        exit 1; \
                fi \
index 40bce63..0111540 100644 (file)
@@ -32,8 +32,10 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
+@COND_CORE_TRUE@am__append_1 = po test
+@COND_CORE_TRUE@am__append_2 = README NEWS COPYING $(TEST_README_FILES)
 subdir = .
-DIST_COMMON = README $(am__configure_deps) $(dist_doc_DATA) \
+DIST_COMMON = README $(am__configure_deps) $(am__dist_doc_DATA_DIST) \
        $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
        $(srcdir)/config.h.in $(top_srcdir)/configure AUTHORS COPYING \
        ChangeLog INSTALL NEWS config.guess config.sub depcomp \
@@ -57,6 +59,8 @@ RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
        install-pdf-recursive install-ps-recursive install-recursive \
        installcheck-recursive installdirs-recursive pdf-recursive \
        ps-recursive uninstall-recursive
+am__dist_doc_DATA_DIST = README NEWS COPYING $(wildcard \
+       $(srcdir)/test/README.*)
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
 am__vpath_adj = case $$p in \
     $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
@@ -70,7 +74,6 @@ RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive       \
   distclean-recursive maintainer-clean-recursive
 ETAGS = etags
 CTAGS = ctags
-DIST_SUBDIRS = $(SUBDIRS)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 distdir = $(PACKAGE)-$(VERSION)
 top_distdir = $(distdir)
@@ -181,6 +184,8 @@ LDFLAGS = @LDFLAGS@
 LIBEXECDIR = @LIBEXECDIR@
 LIBICAL_AVAILABLE_CFLAGS = @LIBICAL_AVAILABLE_CFLAGS@
 LIBICAL_AVAILABLE_LIBS = @LIBICAL_AVAILABLE_LIBS@
+LIBNOTIFY_CFLAGS = @LIBNOTIFY_CFLAGS@
+LIBNOTIFY_LIBS = @LIBNOTIFY_LIBS@
 LIBOBJS = @LIBOBJS@
 LIBOPENOBEX_CFLAGS = @LIBOPENOBEX_CFLAGS@
 LIBOPENOBEX_LIBS = @LIBOPENOBEX_LIBS@
@@ -199,6 +204,8 @@ MODIFY_SYNCCOMPARE = @MODIFY_SYNCCOMPARE@
 MSGFMT = @MSGFMT@
 MSGFMT_OPTS = @MSGFMT_OPTS@
 MSGMERGE = @MSGMERGE@
+MX_GTK_0_99_1_CFLAGS = @MX_GTK_0_99_1_CFLAGS@
+MX_GTK_0_99_1_LIBS = @MX_GTK_0_99_1_LIBS@
 NMEDIT = @NMEDIT@
 NSS_CFLAGS = @NSS_CFLAGS@
 NSS_LIBS = @NSS_LIBS@
@@ -236,6 +243,7 @@ SYNTHESIS_LIB = @SYNTHESIS_LIB@
 SYNTHESIS_LIBS = @SYNTHESIS_LIBS@
 SYNTHESIS_SRC = @SYNTHESIS_SRC@
 SYNTHESIS_SUBDIR = @SYNTHESIS_SUBDIR@
+SYNTHESIS_SUBDIR_INCLUDES = @SYNTHESIS_SUBDIR_INCLUDES@
 TRANSPORT_CFLAGS = @TRANSPORT_CFLAGS@
 TRANSPORT_LIBS = @TRANSPORT_LIBS@
 UNIQUE_CFLAGS = @UNIQUE_CFLAGS@
@@ -300,7 +308,9 @@ target_alias = @target_alias@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 ACLOCAL_AMFLAGS = -I m4 -I m4-repo
-SUBDIRS = src po test
+dist_doc_DATA = $(am__append_2)
+SUBDIRS = src $(am__append_1)
+DIST_SUBDIRS = src po test
 EXTRA_DIST = \
        HACKING \
        LICENSE.txt \
@@ -336,9 +346,6 @@ PKGNAME = syncevolution$(patsubst %,-%,$(BINSUFFIX))
 # The current package conflicts with any of them, but not itself.
 PKGS = $(addprefix syncevolution-evolution-, 2.6 2.8 2.12)
 
-# install doc files via normal autotools
-dist_doc_DATA = README NEWS COPYING $(TEST_README_FILES)
-
 # Because backend-related variables need to be substituted in
 # Makefile-gen.am and configure.in we need an explicit rule to redo that work
 # so that "make" rebuilds derived files correctly.
@@ -967,8 +974,8 @@ dist-hook:
 
 @ENABLE_EVOLUTION_COMPATIBILITY_TRUE@installcheck-local:
 @ENABLE_EVOLUTION_COMPATIBILITY_TRUE@  for i in `find . -name *.so`; do \
-@ENABLE_EVOLUTION_COMPATIBILITY_TRUE@          if ldd $$i | grep -e libecal -e libebook -e libedata -e libical; then \
-@ENABLE_EVOLUTION_COMPATIBILITY_TRUE@                  echo "$$i should not depend on EDS or libical"; \
+@ENABLE_EVOLUTION_COMPATIBILITY_TRUE@          if ldd $$i | grep -e libecal -e libebook -e libedata -e libical -e libbluetooth; then \
+@ENABLE_EVOLUTION_COMPATIBILITY_TRUE@                  echo "$$i should not depend on EDS, libical or libbluetooth"; \
 @ENABLE_EVOLUTION_COMPATIBILITY_TRUE@                  objdump -T -C $$i | grep -v :: | grep -e ical -e " e_"; \
 @ENABLE_EVOLUTION_COMPATIBILITY_TRUE@                  exit 1; \
 @ENABLE_EVOLUTION_COMPATIBILITY_TRUE@          fi \
diff --git a/NEWS b/NEWS
index 8052d7f..9960fc5 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,105 @@
+SyncEvolution 1.0 beta 2 -> beta 3, 20.04.2010
+==============================================
+
+One more step towards the long awaited 1.0. 0.1 was released over four
+years ago and the 1.0 cycle started some time last summer. Beta 3 is
+considered feature complete at this point.
+
+Automatic synchronization is supported by the syncevo-dbus-server (MB
+#6378). When that is installed, it will be started as part of a user
+session and keep running to trigger syncs in the
+background. Notifications are emitted when syncs start, end or fail
+(MB #10000).
+
+Automatic synchronization can be enabled separately for each peer
+("autoSync=0/1", off by default), will be done at regular intervals
+("autoSyncInterval=30" minutes) when online long enough
+("autoSyncDelay=5" minutes). That last option ensures that a) an
+automatic sync does not attempt to use a network connection unless it
+was already active and b) hopefully is also around long enough to
+complete the sync.
+
+Detecting online status depends on ConnMan. Without it, SyncEvolution
+assumes that the network is available. For Bluetooth it is enough to
+have a peer paired.
+
+When SyncEvolution is compiled with a backend sync daemon
+("syncevo-dbus-server"), then conceptually that daemon controls the
+configuration and coordinates manually and automatically started sync
+sessions. Previously, the command line tool bypassed the daemon by
+running operations itself. Now it can hand over the command line
+parameters to the daemon to be executed there ("--daemon=yes", the
+default if the daemon is available; MB #5043). Command line parameters
+and output of "syncevolution" are the same as before. Note that the
+daemon only runs one operation at a time, which delays the command
+line client when the daemon is busy. For testing purposes (like
+running a client which talks to a local server in the daemon) it is
+still possible to ignore the daemon (--daemon=no).
+
+Thanks to fixes and improvements in both Synthesis engine and
+SyncEvolution, suspend and resume are fully supported in client and
+server (MB #2425). Previously it failed in some cases, as mercilessly
+exposed by our automated testing. Now all of these tests pass. The
+HTTP server now also handles message resends by clients correctly.
+
+Direct synchronization with older phones (like Sony Ericsson K750i)
+can be started now by switching to an older version of the SyncML
+standard ("SyncMLVersion" property, MB #9312). No further
+interoperability testing with such phones has been done at this
+time. When acting as client, that same property allows talking to
+older SyncML servers, like desknow.com.
+
+A minor workaround and the right configuration make it possible to
+synchronize with Nokia N85 and probably also other S60
+devices. Added a template for "Nokia S60". Also made the template
+for "Nokia N900" accessible in the GTK GUI.
+
+Because determining which configuration works for a phone involves
+a lot of trial-and-error, the new "syncevo-phone-config" script
+automates that process.
+
+Other changes:
+
+* Mobical.net (and other, similar services): fix vCalendar 1.0 alarm
+  specifications before importing them (MB #10458)
+* Nokia N900: added a config template for it and disabled the redundant
+  RespURI when using Bluetooth. Preliminary testing shows that this solves
+  some of the issues seen before (MB #10224).
+* workaround for Evolution 2.30: "timezone cannot be retrieved because it
+  doesn't exist" is triggered incorrectly when importing non-standard
+  timezone definitions because libecal change an error code (MB #9820)
+* "syncevo-http-server" HTTP server script is included in normal install
+* syncevolution.org binaries: finally solved the libbluetooth3
+  incompatibility (MB #9289). Binaries of beta 2 crashed on more
+  recent distros because of that.
+* SyncML client and Bluetooth: a mobile device running SyncEvolution
+  creates a configuration automatically (MB #6175). The peer contacting
+  us has to use the standard SyncEvolution URIs (addressbook, calendar,
+  todo, memo).
+* command line: when dealing with the shared non-peer part of a config,
+  it checks for properties which are unsuitable only prints
+  those (MB #8048)
+* GTK GUI: improved setup of devices, automatic sync switch,
+  some fixes for crashes and other tweaks
+* Nokia 7210c: send time as UTC instead of relying on time zone
+  information (MB #9907).
+* command line: setting up a configuration for a "SyncEvolution"
+  server on a client was not possible because the "SyncEvolutionClient"
+  configuration was picked instead (MB #10004). The latter has to
+  be used when configuring a SyncEvolution server to talk to a
+  SyncEvolution client.
+* restore: no longer updates the time of the backup (MB #9963)
+* various minor improvements and fixes, see ChangeLog
+
+Upgrading:
+* The new "RetryInterval" property causes messages to be resent
+  after 2 minutes (increased from 1 minute in previous 1.0 betas).
+  At least the Funambol server is known to not handle this correctly
+  in all cases (http://funzilla.funambol.com/show_bug.cgi?id=7910).
+  So in the Funambol config template the interval is set to zero,
+  disabling the feature. Enabling or disabling the feature must
+  be done manually in existing configurations.
+
 SyncEvolution 1.0 beta 1 -> beta 2, 23.02.2010
 ==============================================
 
index 2f7a639..2029736 100644 (file)
@@ -1,5 +1,8 @@
 /* config.h.in.  Generated from configure.in by autoheader.  */
 
+/* define if dbus service is enabled */
+#undef DBUS_SERVICE
+
 /* Location of D-Bus services directory */
 #undef DBUS_SERVICES_DIR
 
@@ -81,6 +84,9 @@
 /* we have GTK+ 2.18 or better */
 #undef GTK_2_18
 
+/* define if libnotify could be used in dbus service */
+#undef HAS_NOTIFY
+
 /* Define to 1 if you have the `bind_textdomain_codeset' function. */
 #undef HAVE_BIND_TEXTDOMAIN_CODESET
 
 /* compiling for iPhone */
 #undef IPHONE
 
+/* we have Mx-Gtk 0.99.1 or better */
+#undef MX_GTK_0_99_1
+
 /* Define to 1 if you need the dbus_watch_get_unix_fd() function. */
 #undef NEED_DBUS_WATCH_GET_UNIX_FD
 
index 53a8188..5370ff4 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.61 for syncevolution 1.0beta2a.
+# Generated by GNU Autoconf 2.61 for syncevolution 1.0beta3.
 #
 # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
 # 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
@@ -726,8 +726,8 @@ SHELL=${CONFIG_SHELL-/bin/sh}
 # Identity of this package.
 PACKAGE_NAME='syncevolution'
 PACKAGE_TARNAME='syncevolution'
-PACKAGE_VERSION='1.0beta2a'
-PACKAGE_STRING='syncevolution 1.0beta2a'
+PACKAGE_VERSION='1.0beta3'
+PACKAGE_STRING='syncevolution 1.0beta3'
 PACKAGE_BUGREPORT=''
 
 # Factoring default headers for most tests.
@@ -869,27 +869,22 @@ TRANSPORT_CFLAGS
 XSLT
 COND_GUI_TRUE
 COND_GUI_FALSE
+COND_CORE_TRUE
+COND_CORE_FALSE
 COND_DBUS_TRUE
 COND_DBUS_FALSE
 KEYRING_CFLAGS
 KEYRING_LIBS
 KEYRING_2_20_CFLAGS
 KEYRING_2_20_LIBS
-DBUS_GLIB_CFLAGS
-DBUS_GLIB_LIBS
-DBUS_BINDING_TOOL
-GLIB_GENMARSHAL
 DBUS_CFLAGS
 DBUS_LIBS
+LIBNOTIFY_CFLAGS
+LIBNOTIFY_LIBS
+DBUS_GLIB_CFLAGS
+DBUS_GLIB_LIBS
 LIBEXECDIR
 DBUS_SERVICES_DIR
-UNIQUE_CFLAGS
-UNIQUE_LIBS
-GTK_2_18_CFLAGS
-GTK_2_18_LIBS
-GUI_CFLAGS
-GUI_LIBS
-GTK_BUILDER_CONV
 USE_NLS
 INTLTOOL_UPDATE
 INTLTOOL_MERGE
@@ -931,6 +926,17 @@ PO_IN_DATADIR_FALSE
 POFILES
 POSUB
 MKINSTALLDIRS
+DBUS_BINDING_TOOL
+GLIB_GENMARSHAL
+MX_GTK_0_99_1_CFLAGS
+MX_GTK_0_99_1_LIBS
+UNIQUE_CFLAGS
+UNIQUE_LIBS
+GTK_2_18_CFLAGS
+GTK_2_18_LIBS
+GUI_CFLAGS
+GUI_LIBS
+GTK_BUILDER_CONV
 SYNCEVOLUTION_LOCALEDIR
 GETTEXT_PACKAGE
 GUI_PROGRAMS
@@ -948,6 +954,7 @@ SYNTHESIS_CFLAGS
 SYNTHESIS_LIBS
 SYNTHESIS
 SYNTHESIS_SUBDIR
+SYNTHESIS_SUBDIR_INCLUDES
 SYNTHESIS_DEP
 SYNTHESIS_ENGINE
 SYNTHESIS_LIB
@@ -1041,10 +1048,14 @@ KEYRING_CFLAGS
 KEYRING_LIBS
 KEYRING_2_20_CFLAGS
 KEYRING_2_20_LIBS
-DBUS_GLIB_CFLAGS
-DBUS_GLIB_LIBS
 DBUS_CFLAGS
 DBUS_LIBS
+LIBNOTIFY_CFLAGS
+LIBNOTIFY_LIBS
+DBUS_GLIB_CFLAGS
+DBUS_GLIB_LIBS
+MX_GTK_0_99_1_CFLAGS
+MX_GTK_0_99_1_LIBS
 UNIQUE_CFLAGS
 UNIQUE_LIBS
 GTK_2_18_CFLAGS
@@ -1585,7 +1596,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.0beta2a to adapt to many kinds of systems.
+\`configure' configures syncevolution 1.0beta3 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1655,7 +1666,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of syncevolution 1.0beta2a:";;
+     short | recursive ) echo "Configuration of syncevolution 1.0beta3:";;
    esac
   cat <<\_ACEOF
 
@@ -1698,10 +1709,13 @@ Optional Features:
                           SyncEvolution DBus API. Options: gtk, moblin, all
                           (builds sync-ui-gtk and sync-ui-moblin) "gtk" is the
                           default for --enable-gui without type. No GUI is
-                          built when --enable-gui is not used. --enable-gui
-                          implies --enable-dbus.
-  --enable-dbus-service   enables building the dbus service executable and the
-                          wrapper library for it
+                          built when --enable-gui is not used.
+  --enable-core           enables building the core SyncEvolution (library,
+                          backends)
+  --enable-dbus-service   enables building the dbus service executable and all
+                          related features (the DBus wrapper library, command
+                          line usage of server, etc).
+  --enable-notify         send notifications for automatic sync events
   --disable-nls           do not use Native Language Support
   --enable-gnome-bluetooth-panel-plugin
                           GNOME Bluetooth panel plugin adding a "sync" button
@@ -1805,12 +1819,20 @@ Some influential environment variables:
               C compiler flags for KEYRING_2_20, overriding pkg-config
   KEYRING_2_20_LIBS
               linker flags for KEYRING_2_20, overriding pkg-config
+  DBUS_CFLAGS C compiler flags for DBUS, overriding pkg-config
+  DBUS_LIBS   linker flags for DBUS, overriding pkg-config
+  LIBNOTIFY_CFLAGS
+              C compiler flags for LIBNOTIFY, overriding pkg-config
+  LIBNOTIFY_LIBS
+              linker flags for LIBNOTIFY, overriding pkg-config
   DBUS_GLIB_CFLAGS
               C compiler flags for DBUS_GLIB, overriding pkg-config
   DBUS_GLIB_LIBS
               linker flags for DBUS_GLIB, overriding pkg-config
-  DBUS_CFLAGS C compiler flags for DBUS, overriding pkg-config
-  DBUS_LIBS   linker flags for DBUS, overriding pkg-config
+  MX_GTK_0_99_1_CFLAGS
+              C compiler flags for MX_GTK_0_99_1, overriding pkg-config
+  MX_GTK_0_99_1_LIBS
+              linker flags for MX_GTK_0_99_1, overriding pkg-config
   UNIQUE_CFLAGS
               C compiler flags for UNIQUE, overriding pkg-config
   UNIQUE_LIBS linker flags for UNIQUE, overriding pkg-config
@@ -1932,7 +1954,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-syncevolution configure 1.0beta2a
+syncevolution configure 1.0beta3
 generated by GNU Autoconf 2.61
 
 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
@@ -1946,7 +1968,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.0beta2a, which was
+It was created by syncevolution $as_me 1.0beta3, which was
 generated by GNU Autoconf 2.61.  Invocation command line was
 
   $ $0 $@
@@ -2639,7 +2661,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='syncevolution'
- VERSION='1.0beta2a'
+ VERSION='1.0beta3'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -5768,6 +5790,22 @@ else
 fi
 
 
+# Check whether --enable-core was given.
+if test "${enable_core+set}" = set; then
+  enableval=$enable_core; enable_core="$enableval"
+else
+  enable_core="yes"
+fi
+
+ if test "$enable_core" = "yes"; then
+  COND_CORE_TRUE=
+  COND_CORE_FALSE='#'
+else
+  COND_CORE_TRUE='#'
+  COND_CORE_FALSE=
+fi
+
+
 # Check whether --enable-dbus-service was given.
 if test "${enable_dbus_service+set}" = set; then
   enableval=$enable_dbus_service; enable_dbus_service="$enableval"
@@ -5788,12 +5826,6 @@ else
 fi
 
 
-if test $enable_gui != "no" && test $enable_dbus_service == "no"; then
-   { { echo "$as_me:$LINENO: error: cannot build GUI without building the D-Bus service" >&5
-echo "$as_me: error: cannot build GUI without building the D-Bus service" >&2;}
-   { (exit 1); exit 1; }; }
-fi
-
 
 pkg_failed=no
 { echo "$as_me:$LINENO: checking for KEYRING" >&5
@@ -5952,197 +5984,6 @@ _ACEOF
 fi
 
 if test $enable_dbus_service == "yes"; then
-
-pkg_failed=no
-{ echo "$as_me:$LINENO: checking for DBUS_GLIB" >&5
-echo $ECHO_N "checking for DBUS_GLIB... $ECHO_C" >&6; }
-
-if test -n "$PKG_CONFIG"; then
-    if test -n "$DBUS_GLIB_CFLAGS"; then
-        pkg_cv_DBUS_GLIB_CFLAGS="$DBUS_GLIB_CFLAGS"
-    else
-        if test -n "$PKG_CONFIG" && \
-    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"dbus-glib-1 glib-2.0\"") >&5
-  ($PKG_CONFIG --exists --print-errors "dbus-glib-1 glib-2.0") 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; then
-  pkg_cv_DBUS_GLIB_CFLAGS=`$PKG_CONFIG --cflags "dbus-glib-1 glib-2.0" 2>/dev/null`
-else
-  pkg_failed=yes
-fi
-    fi
-else
-       pkg_failed=untried
-fi
-if test -n "$PKG_CONFIG"; then
-    if test -n "$DBUS_GLIB_LIBS"; then
-        pkg_cv_DBUS_GLIB_LIBS="$DBUS_GLIB_LIBS"
-    else
-        if test -n "$PKG_CONFIG" && \
-    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"dbus-glib-1 glib-2.0\"") >&5
-  ($PKG_CONFIG --exists --print-errors "dbus-glib-1 glib-2.0") 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; then
-  pkg_cv_DBUS_GLIB_LIBS=`$PKG_CONFIG --libs "dbus-glib-1 glib-2.0" 2>/dev/null`
-else
-  pkg_failed=yes
-fi
-    fi
-else
-       pkg_failed=untried
-fi
-
-
-
-if test $pkg_failed = yes; then
-
-if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
-        _pkg_short_errors_supported=yes
-else
-        _pkg_short_errors_supported=no
-fi
-        if test $_pkg_short_errors_supported = yes; then
-               DBUS_GLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "dbus-glib-1 glib-2.0"`
-        else
-               DBUS_GLIB_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "dbus-glib-1 glib-2.0"`
-        fi
-       # Put the nasty error message in config.log where it belongs
-       echo "$DBUS_GLIB_PKG_ERRORS" >&5
-
-       { { echo "$as_me:$LINENO: error: Package requirements (dbus-glib-1 glib-2.0) were not met:
-
-$DBUS_GLIB_PKG_ERRORS
-
-Consider adjusting the PKG_CONFIG_PATH environment variable if you
-installed software in a non-standard prefix.
-
-Alternatively, you may set the environment variables DBUS_GLIB_CFLAGS
-and DBUS_GLIB_LIBS to avoid the need to call pkg-config.
-See the pkg-config man page for more details.
-" >&5
-echo "$as_me: error: Package requirements (dbus-glib-1 glib-2.0) were not met:
-
-$DBUS_GLIB_PKG_ERRORS
-
-Consider adjusting the PKG_CONFIG_PATH environment variable if you
-installed software in a non-standard prefix.
-
-Alternatively, you may set the environment variables DBUS_GLIB_CFLAGS
-and DBUS_GLIB_LIBS to avoid the need to call pkg-config.
-See the pkg-config man page for more details.
-" >&2;}
-   { (exit 1); exit 1; }; }
-elif test $pkg_failed = untried; then
-       { { echo "$as_me:$LINENO: error: The pkg-config script could not be found or is too old.  Make sure it
-is in your PATH or set the PKG_CONFIG environment variable to the full
-path to pkg-config.
-
-Alternatively, you may set the environment variables DBUS_GLIB_CFLAGS
-and DBUS_GLIB_LIBS to avoid the need to call pkg-config.
-See the pkg-config man page for more details.
-
-To get pkg-config, see <http://pkg-config.freedesktop.org/>.
-See \`config.log' for more details." >&5
-echo "$as_me: error: The pkg-config script could not be found or is too old.  Make sure it
-is in your PATH or set the PKG_CONFIG environment variable to the full
-path to pkg-config.
-
-Alternatively, you may set the environment variables DBUS_GLIB_CFLAGS
-and DBUS_GLIB_LIBS to avoid the need to call pkg-config.
-See the pkg-config man page for more details.
-
-To get pkg-config, see <http://pkg-config.freedesktop.org/>.
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-else
-       DBUS_GLIB_CFLAGS=$pkg_cv_DBUS_GLIB_CFLAGS
-       DBUS_GLIB_LIBS=$pkg_cv_DBUS_GLIB_LIBS
-        { echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6; }
-       :
-fi
-    # Extract the first word of "dbus-binding-tool", so it can be a program name with args.
-set dummy dbus-binding-tool; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
-if test "${ac_cv_path_DBUS_BINDING_TOOL+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  case $DBUS_BINDING_TOOL in
-  [\\/]* | ?:[\\/]*)
-  ac_cv_path_DBUS_BINDING_TOOL="$DBUS_BINDING_TOOL" # Let the user override the test with a path.
-  ;;
-  *)
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_path_DBUS_BINDING_TOOL="$as_dir/$ac_word$ac_exec_ext"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-IFS=$as_save_IFS
-
-  ;;
-esac
-fi
-DBUS_BINDING_TOOL=$ac_cv_path_DBUS_BINDING_TOOL
-if test -n "$DBUS_BINDING_TOOL"; then
-  { echo "$as_me:$LINENO: result: $DBUS_BINDING_TOOL" >&5
-echo "${ECHO_T}$DBUS_BINDING_TOOL" >&6; }
-else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
-fi
-
-
-    # Extract the first word of "glib-genmarshal", so it can be a program name with args.
-set dummy glib-genmarshal; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
-if test "${ac_cv_path_GLIB_GENMARSHAL+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  case $GLIB_GENMARSHAL in
-  [\\/]* | ?:[\\/]*)
-  ac_cv_path_GLIB_GENMARSHAL="$GLIB_GENMARSHAL" # Let the user override the test with a path.
-  ;;
-  *)
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_path_GLIB_GENMARSHAL="$as_dir/$ac_word$ac_exec_ext"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-IFS=$as_save_IFS
-
-  ;;
-esac
-fi
-GLIB_GENMARSHAL=$ac_cv_path_GLIB_GENMARSHAL
-if test -n "$GLIB_GENMARSHAL"; then
-  { echo "$as_me:$LINENO: result: $GLIB_GENMARSHAL" >&5
-echo "${ECHO_T}$GLIB_GENMARSHAL" >&6; }
-else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
-fi
-
-
     if test -z "$XSLT"; then
        { { echo "$as_me:$LINENO: error: xsltproc not found, is required for D-Bus service" >&5
 echo "$as_me: error: xsltproc not found, is required for D-Bus service" >&2;}
@@ -6295,63 +6136,22 @@ _ACEOF
 fi
 
     need_glib=yes
-fi
-
-
-
-
-
-
-
-
-DBUS_SERVICES_DIR="${datadir}/dbus-1/services"
-
-
-cat >>confdefs.h <<_ACEOF
-#define DBUS_SERVICES_DIR "$DBUS_SERVICES_DIR"
-_ACEOF
 
-
-# decide which sync-ui(s) we are building:
-# sync-ui (in either GTK or Moblin mode) or both (in separate binaries)
-case $enable_gui in
-     all) GUI_PROGRAMS='sync-ui-gtk${EXEEXT} sync-ui-moblin${EXEEXT}'; GUI_DESKTOP_FILES="sync-gtk.desktop sync-moblin.desktop";;
-     gtk|moblin) GUI_PROGRAMS='sync-ui${EXEEXT}'; GUI_DESKTOP_FILES="sync.desktop";;
-     no) GUI_PROGRAMS=; GUI_DESKTOP_FILES=;;
-     *) { { echo "$as_me:$LINENO: error: Unknown enable_gui type: '$enable_gui'" >&5
-echo "$as_me: error: Unknown enable_gui type: '$enable_gui'" >&2;}
-   { (exit 1); exit 1; }; }
-esac
-
-if test $enable_gui != "no"; then
-    gui_modules="glib-2.0 dbus-glib-1 >= 0.60 gtk+-2.0 libglade-2.0 gio-2.0"
-    if test $enable_gui == "moblin"; then
-
-cat >>confdefs.h <<\_ACEOF
-#define USE_MOBLIN_UX 1
-_ACEOF
-
-    fi
-    if test $enable_gui == "moblin" -o $enable_gui == "all"; then
-        gui_modules="$guimodules mx-gtk-1.0"
-    fi
-
-
-pkg_failed=no
-{ echo "$as_me:$LINENO: checking for UNIQUE" >&5
-echo $ECHO_N "checking for UNIQUE... $ECHO_C" >&6; }
+pkg_failed=no
+{ echo "$as_me:$LINENO: checking for LIBNOTIFY" >&5
+echo $ECHO_N "checking for LIBNOTIFY... $ECHO_C" >&6; }
 
 if test -n "$PKG_CONFIG"; then
-    if test -n "$UNIQUE_CFLAGS"; then
-        pkg_cv_UNIQUE_CFLAGS="$UNIQUE_CFLAGS"
+    if test -n "$LIBNOTIFY_CFLAGS"; then
+        pkg_cv_LIBNOTIFY_CFLAGS="$LIBNOTIFY_CFLAGS"
     else
         if test -n "$PKG_CONFIG" && \
-    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"unique-1.0\"") >&5
-  ($PKG_CONFIG --exists --print-errors "unique-1.0") 2>&5
+    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"libnotify\"") >&5
+  ($PKG_CONFIG --exists --print-errors "libnotify") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; then
-  pkg_cv_UNIQUE_CFLAGS=`$PKG_CONFIG --cflags "unique-1.0" 2>/dev/null`
+  pkg_cv_LIBNOTIFY_CFLAGS=`$PKG_CONFIG --cflags "libnotify" 2>/dev/null`
 else
   pkg_failed=yes
 fi
@@ -6360,16 +6160,16 @@ else
        pkg_failed=untried
 fi
 if test -n "$PKG_CONFIG"; then
-    if test -n "$UNIQUE_LIBS"; then
-        pkg_cv_UNIQUE_LIBS="$UNIQUE_LIBS"
+    if test -n "$LIBNOTIFY_LIBS"; then
+        pkg_cv_LIBNOTIFY_LIBS="$LIBNOTIFY_LIBS"
     else
         if test -n "$PKG_CONFIG" && \
-    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"unique-1.0\"") >&5
-  ($PKG_CONFIG --exists --print-errors "unique-1.0") 2>&5
+    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"libnotify\"") >&5
+  ($PKG_CONFIG --exists --print-errors "libnotify") 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; then
-  pkg_cv_UNIQUE_LIBS=`$PKG_CONFIG --libs "unique-1.0" 2>/dev/null`
+  pkg_cv_LIBNOTIFY_LIBS=`$PKG_CONFIG --libs "libnotify" 2>/dev/null`
 else
   pkg_failed=yes
 fi
@@ -6388,235 +6188,120 @@ else
         _pkg_short_errors_supported=no
 fi
         if test $_pkg_short_errors_supported = yes; then
-               UNIQUE_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "unique-1.0"`
+               LIBNOTIFY_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libnotify"`
         else
-               UNIQUE_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "unique-1.0"`
+               LIBNOTIFY_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libnotify"`
         fi
        # Put the nasty error message in config.log where it belongs
-       echo "$UNIQUE_PKG_ERRORS" >&5
+       echo "$LIBNOTIFY_PKG_ERRORS" >&5
 
        { echo "$as_me:$LINENO: result: no" >&5
 echo "${ECHO_T}no" >&6; }
-                have_unique="no"
+                HAVE_LIBNOTIFY=no
 elif test $pkg_failed = untried; then
-       have_unique="no"
+       HAVE_LIBNOTIFY=no
 else
-       UNIQUE_CFLAGS=$pkg_cv_UNIQUE_CFLAGS
-       UNIQUE_LIBS=$pkg_cv_UNIQUE_LIBS
+       LIBNOTIFY_CFLAGS=$pkg_cv_LIBNOTIFY_CFLAGS
+       LIBNOTIFY_LIBS=$pkg_cv_LIBNOTIFY_LIBS
         { echo "$as_me:$LINENO: result: yes" >&5
 echo "${ECHO_T}yes" >&6; }
-       have_unique="yes"
+       HAVE_LIBNOTIFY=yes
+fi
+    # Check whether --enable-notify was given.
+if test "${enable_notify+set}" = set; then
+  enableval=$enable_notify;  test "$enableval" = "no" || test $HAVE_LIBNOTIFY = "yes" || { { echo "$as_me:$LINENO: error: required libnotify package not found" >&5
+echo "$as_me: error: required libnotify package not found" >&2;}
+   { (exit 1); exit 1; }; }
+else
+   test $HAVE_LIBNOTIFY = "yes" || { { echo "$as_me:$LINENO: error: required libnotify package not found, use --disable-notify to compile without notifications" >&5
+echo "$as_me: error: required libnotify package not found, use --disable-notify to compile without notifications" >&2;}
+   { (exit 1); exit 1; }; }
 fi
-    if test $have_unique == "yes"; then
-        gui_modules="$gui_modules unique-1.0"
+
+    if test $HAVE_LIBNOTIFY == "yes"; then
 
 cat >>confdefs.h <<\_ACEOF
-#define ENABLE_UNIQUE 1
+#define HAS_NOTIFY 1
 _ACEOF
 
     fi
 
+cat >>confdefs.h <<\_ACEOF
+#define DBUS_SERVICE 1
+_ACEOF
 
-pkg_failed=no
-{ echo "$as_me:$LINENO: checking for GTK_2_18" >&5
-echo $ECHO_N "checking for GTK_2_18... $ECHO_C" >&6; }
-
-if test -n "$PKG_CONFIG"; then
-    if test -n "$GTK_2_18_CFLAGS"; then
-        pkg_cv_GTK_2_18_CFLAGS="$GTK_2_18_CFLAGS"
-    else
-        if test -n "$PKG_CONFIG" && \
-    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0 >= 2.18\"") >&5
-  ($PKG_CONFIG --exists --print-errors "gtk+-2.0 >= 2.18") 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; then
-  pkg_cv_GTK_2_18_CFLAGS=`$PKG_CONFIG --cflags "gtk+-2.0 >= 2.18" 2>/dev/null`
-else
-  pkg_failed=yes
-fi
-    fi
-else
-       pkg_failed=untried
-fi
-if test -n "$PKG_CONFIG"; then
-    if test -n "$GTK_2_18_LIBS"; then
-        pkg_cv_GTK_2_18_LIBS="$GTK_2_18_LIBS"
-    else
-        if test -n "$PKG_CONFIG" && \
-    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0 >= 2.18\"") >&5
-  ($PKG_CONFIG --exists --print-errors "gtk+-2.0 >= 2.18") 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; then
-  pkg_cv_GTK_2_18_LIBS=`$PKG_CONFIG --libs "gtk+-2.0 >= 2.18" 2>/dev/null`
-else
-  pkg_failed=yes
-fi
-    fi
-else
-       pkg_failed=untried
 fi
 
 
 
-if test $pkg_failed = yes; then
 
-if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
-        _pkg_short_errors_supported=yes
-else
-        _pkg_short_errors_supported=no
-fi
-        if test $_pkg_short_errors_supported = yes; then
-               GTK_2_18_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gtk+-2.0 >= 2.18"`
-        else
-               GTK_2_18_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gtk+-2.0 >= 2.18"`
-        fi
-       # Put the nasty error message in config.log where it belongs
-       echo "$GTK_2_18_PKG_ERRORS" >&5
 
-       { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
-                have_gtk_2_18="no"
-elif test $pkg_failed = untried; then
-       have_gtk_2_18="no"
-else
-       GTK_2_18_CFLAGS=$pkg_cv_GTK_2_18_CFLAGS
-       GTK_2_18_LIBS=$pkg_cv_GTK_2_18_LIBS
-        { echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6; }
-       have_gtk_2_18="yes"
-fi
-    if test $have_gtk_2_18 == "yes"; then
 
-cat >>confdefs.h <<\_ACEOF
-#define GTK_2_18 1
-_ACEOF
 
-    fi
 
 
-pkg_failed=no
-{ echo "$as_me:$LINENO: checking for GUI" >&5
-echo $ECHO_N "checking for GUI... $ECHO_C" >&6; }
 
-if test -n "$PKG_CONFIG"; then
-    if test -n "$GUI_CFLAGS"; then
-        pkg_cv_GUI_CFLAGS="$GUI_CFLAGS"
-    else
-        if test -n "$PKG_CONFIG" && \
-    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"\$gui_modules\"") >&5
-  ($PKG_CONFIG --exists --print-errors "$gui_modules") 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; then
-  pkg_cv_GUI_CFLAGS=`$PKG_CONFIG --cflags "$gui_modules" 2>/dev/null`
-else
-  pkg_failed=yes
-fi
-    fi
-else
-       pkg_failed=untried
-fi
-if test -n "$PKG_CONFIG"; then
-    if test -n "$GUI_LIBS"; then
-        pkg_cv_GUI_LIBS="$GUI_LIBS"
-    else
-        if test -n "$PKG_CONFIG" && \
-    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"\$gui_modules\"") >&5
-  ($PKG_CONFIG --exists --print-errors "$gui_modules") 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; then
-  pkg_cv_GUI_LIBS=`$PKG_CONFIG --libs "$gui_modules" 2>/dev/null`
-else
-  pkg_failed=yes
-fi
-    fi
-else
-       pkg_failed=untried
-fi
+DBUS_SERVICES_DIR="${datadir}/dbus-1/services"
+
 
+cat >>confdefs.h <<_ACEOF
+#define DBUS_SERVICES_DIR "$DBUS_SERVICES_DIR"
+_ACEOF
 
 
-if test $pkg_failed = yes; then
+if test $enable_gui != "no" || test $enable_dbus_service == "yes"; then
 
-if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
-        _pkg_short_errors_supported=yes
+  { echo "$as_me:$LINENO: checking whether NLS is requested" >&5
+echo $ECHO_N "checking whether NLS is requested... $ECHO_C" >&6; }
+    # Check whether --enable-nls was given.
+if test "${enable_nls+set}" = set; then
+  enableval=$enable_nls; USE_NLS=$enableval
 else
-        _pkg_short_errors_supported=no
+  USE_NLS=yes
 fi
-        if test $_pkg_short_errors_supported = yes; then
-               GUI_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$gui_modules"`
-        else
-               GUI_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$gui_modules"`
-        fi
-       # Put the nasty error message in config.log where it belongs
-       echo "$GUI_PKG_ERRORS" >&5
-
-       { { echo "$as_me:$LINENO: error: Package requirements ($gui_modules) were not met:
 
-$GUI_PKG_ERRORS
-
-Consider adjusting the PKG_CONFIG_PATH environment variable if you
-installed software in a non-standard prefix.
+  { echo "$as_me:$LINENO: result: $USE_NLS" >&5
+echo "${ECHO_T}$USE_NLS" >&6; }
 
-Alternatively, you may set the environment variables GUI_CFLAGS
-and GUI_LIBS to avoid the need to call pkg-config.
-See the pkg-config man page for more details.
-" >&5
-echo "$as_me: error: Package requirements ($gui_modules) were not met:
 
-$GUI_PKG_ERRORS
 
-Consider adjusting the PKG_CONFIG_PATH environment variable if you
-installed software in a non-standard prefix.
 
-Alternatively, you may set the environment variables GUI_CFLAGS
-and GUI_LIBS to avoid the need to call pkg-config.
-See the pkg-config man page for more details.
-" >&2;}
+case "$am__api_version" in
+    1.01234)
+       { { echo "$as_me:$LINENO: error: Automake 1.5 or newer is required to use intltool" >&5
+echo "$as_me: error: Automake 1.5 or newer is required to use intltool" >&2;}
    { (exit 1); exit 1; }; }
-elif test $pkg_failed = untried; then
-       { { echo "$as_me:$LINENO: error: The pkg-config script could not be found or is too old.  Make sure it
-is in your PATH or set the PKG_CONFIG environment variable to the full
-path to pkg-config.
-
-Alternatively, you may set the environment variables GUI_CFLAGS
-and GUI_LIBS to avoid the need to call pkg-config.
-See the pkg-config man page for more details.
+    ;;
+    *)
+    ;;
+esac
 
-To get pkg-config, see <http://pkg-config.freedesktop.org/>.
-See \`config.log' for more details." >&5
-echo "$as_me: error: The pkg-config script could not be found or is too old.  Make sure it
-is in your PATH or set the PKG_CONFIG environment variable to the full
-path to pkg-config.
+if test -n "0.37.1"; then
+    { echo "$as_me:$LINENO: checking for intltool >= 0.37.1" >&5
+echo $ECHO_N "checking for intltool >= 0.37.1... $ECHO_C" >&6; }
 
-Alternatively, you may set the environment variables GUI_CFLAGS
-and GUI_LIBS to avoid the need to call pkg-config.
-See the pkg-config man page for more details.
+    INTLTOOL_REQUIRED_VERSION_AS_INT=`echo 0.37.1 | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'`
+    INTLTOOL_APPLIED_VERSION=`intltool-update --version | head -1 | cut -d" " -f3`
+    INTLTOOL_APPLIED_VERSION_AS_INT=`echo $INTLTOOL_APPLIED_VERSION | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'`
 
-To get pkg-config, see <http://pkg-config.freedesktop.org/>.
-See \`config.log' for more details." >&2;}
+    { echo "$as_me:$LINENO: result: $INTLTOOL_APPLIED_VERSION found" >&5
+echo "${ECHO_T}$INTLTOOL_APPLIED_VERSION found" >&6; }
+    test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge "$INTLTOOL_REQUIRED_VERSION_AS_INT" ||
+       { { echo "$as_me:$LINENO: error: Your intltool is too old.  You need intltool 0.37.1 or later." >&5
+echo "$as_me: error: Your intltool is too old.  You need intltool 0.37.1 or later." >&2;}
    { (exit 1); exit 1; }; }
-else
-       GUI_CFLAGS=$pkg_cv_GUI_CFLAGS
-       GUI_LIBS=$pkg_cv_GUI_LIBS
-        { echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6; }
-       :
 fi
 
-    # Extract the first word of "gtk-builder-convert", so it can be a program name with args.
-set dummy gtk-builder-convert; ac_word=$2
+# Extract the first word of "intltool-update", so it can be a program name with args.
+set dummy intltool-update; ac_word=$2
 { echo "$as_me:$LINENO: checking for $ac_word" >&5
 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
-if test "${ac_cv_path_GTK_BUILDER_CONV+set}" = set; then
+if test "${ac_cv_path_INTLTOOL_UPDATE+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  case $GTK_BUILDER_CONV in
+  case $INTLTOOL_UPDATE in
   [\\/]* | ?:[\\/]*)
-  ac_cv_path_GTK_BUILDER_CONV="$GTK_BUILDER_CONV" # Let the user override the test with a path.
+  ac_cv_path_INTLTOOL_UPDATE="$INTLTOOL_UPDATE" # Let the user override the test with a path.
   ;;
   *)
   as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -6626,89 +6311,7 @@ do
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_path_GTK_BUILDER_CONV="$as_dir/$ac_word$ac_exec_ext"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-IFS=$as_save_IFS
-
-  ;;
-esac
-fi
-GTK_BUILDER_CONV=$ac_cv_path_GTK_BUILDER_CONV
-if test -n "$GTK_BUILDER_CONV"; then
-  { echo "$as_me:$LINENO: result: $GTK_BUILDER_CONV" >&5
-echo "${ECHO_T}$GTK_BUILDER_CONV" >&6; }
-else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
-fi
-
-
-
-  { echo "$as_me:$LINENO: checking whether NLS is requested" >&5
-echo $ECHO_N "checking whether NLS is requested... $ECHO_C" >&6; }
-    # Check whether --enable-nls was given.
-if test "${enable_nls+set}" = set; then
-  enableval=$enable_nls; USE_NLS=$enableval
-else
-  USE_NLS=yes
-fi
-
-  { echo "$as_me:$LINENO: result: $USE_NLS" >&5
-echo "${ECHO_T}$USE_NLS" >&6; }
-
-
-
-
-case "$am__api_version" in
-    1.01234)
-       { { echo "$as_me:$LINENO: error: Automake 1.5 or newer is required to use intltool" >&5
-echo "$as_me: error: Automake 1.5 or newer is required to use intltool" >&2;}
-   { (exit 1); exit 1; }; }
-    ;;
-    *)
-    ;;
-esac
-
-if test -n "0.37.1"; then
-    { echo "$as_me:$LINENO: checking for intltool >= 0.37.1" >&5
-echo $ECHO_N "checking for intltool >= 0.37.1... $ECHO_C" >&6; }
-
-    INTLTOOL_REQUIRED_VERSION_AS_INT=`echo 0.37.1 | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'`
-    INTLTOOL_APPLIED_VERSION=`intltool-update --version | head -1 | cut -d" " -f3`
-    INTLTOOL_APPLIED_VERSION_AS_INT=`echo $INTLTOOL_APPLIED_VERSION | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'`
-
-    { echo "$as_me:$LINENO: result: $INTLTOOL_APPLIED_VERSION found" >&5
-echo "${ECHO_T}$INTLTOOL_APPLIED_VERSION found" >&6; }
-    test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge "$INTLTOOL_REQUIRED_VERSION_AS_INT" ||
-       { { echo "$as_me:$LINENO: error: Your intltool is too old.  You need intltool 0.37.1 or later." >&5
-echo "$as_me: error: Your intltool is too old.  You need intltool 0.37.1 or later." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-
-# Extract the first word of "intltool-update", so it can be a program name with args.
-set dummy intltool-update; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
-if test "${ac_cv_path_INTLTOOL_UPDATE+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  case $INTLTOOL_UPDATE in
-  [\\/]* | ?:[\\/]*)
-  ac_cv_path_INTLTOOL_UPDATE="$INTLTOOL_UPDATE" # Let the user override the test with a path.
-  ;;
-  *)
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_path_INTLTOOL_UPDATE="$as_dir/$ac_word$ac_exec_ext"
+    ac_cv_path_INTLTOOL_UPDATE="$as_dir/$ac_word$ac_exec_ext"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
@@ -8764,91 +8367,702 @@ echo "${ECHO_T}found xgettext program is not GNU xgettext; ignore it" >&6; }
       fi
     fi
 
-    # We need to process the po/ directory.
-    POSUB=po
-
-    ac_config_commands="$ac_config_commands default-1"
-
-
-                for lang in $ALL_LINGUAS; do
-      GMOFILES="$GMOFILES $lang.gmo"
-      POFILES="$POFILES $lang.po"
-    done
+    # We need to process the po/ directory.
+    POSUB=po
+
+    ac_config_commands="$ac_config_commands default-1"
+
+
+                for lang in $ALL_LINGUAS; do
+      GMOFILES="$GMOFILES $lang.gmo"
+      POFILES="$POFILES $lang.po"
+    done
+
+
+
+
+
+
+
+
+
+
+
+
+
+   if test "$gt_cv_have_gettext" = "yes"; then
+     if test "x$ALL_LINGUAS" = "x"; then
+       LINGUAS=
+     else
+       { echo "$as_me:$LINENO: checking for catalogs to be installed" >&5
+echo $ECHO_N "checking for catalogs to be installed... $ECHO_C" >&6; }
+       NEW_LINGUAS=
+       for presentlang in $ALL_LINGUAS; do
+         useit=no
+         if test "%UNSET%" != "${LINGUAS-%UNSET%}"; then
+           desiredlanguages="$LINGUAS"
+         else
+           desiredlanguages="$ALL_LINGUAS"
+         fi
+         for desiredlang in $desiredlanguages; do
+          # Use the presentlang catalog if desiredlang is
+           #   a. equal to presentlang, or
+           #   b. a variant of presentlang (because in this case,
+           #      presentlang can be used as a fallback for messages
+           #      which are not translated in the desiredlang catalog).
+           case "$desiredlang" in
+             "$presentlang"*) useit=yes;;
+           esac
+         done
+         if test $useit = yes; then
+           NEW_LINGUAS="$NEW_LINGUAS $presentlang"
+         fi
+       done
+       LINGUAS=$NEW_LINGUAS
+       { echo "$as_me:$LINENO: result: $LINGUAS" >&5
+echo "${ECHO_T}$LINGUAS" >&6; }
+     fi
+
+          if test -n "$LINGUAS"; then
+       for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done
+     fi
+   fi
+
+            MKINSTALLDIRS=
+   if test -n "$ac_aux_dir"; then
+     MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs"
+   fi
+   if test -z "$MKINSTALLDIRS"; then
+     MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs"
+   fi
+
+
+         test -d po || mkdir po
+   if test "x$srcdir" != "x."; then
+     if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then
+       posrcprefix="$srcdir/"
+     else
+       posrcprefix="../$srcdir/"
+     fi
+   else
+     posrcprefix="../"
+   fi
+   rm -f po/POTFILES
+   sed -e "/^#/d" -e "/^\$/d" -e "s,.*,        $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \
+       < $srcdir/po/POTFILES.in > po/POTFILES
+
+    SYNCEVOLUTION_LOCALEDIR=${datadir}/locale
+fi
+
+# decide which sync-ui(s) we are building:
+# sync-ui (in either GTK or Moblin mode) or both (in separate binaries)
+case $enable_gui in
+     all) GUI_PROGRAMS='sync-ui-gtk${EXEEXT} sync-ui-moblin${EXEEXT}'; GUI_DESKTOP_FILES="sync-gtk.desktop sync-moblin.desktop";;
+     gtk|moblin) GUI_PROGRAMS='sync-ui${EXEEXT}'; GUI_DESKTOP_FILES="sync.desktop";;
+     no) GUI_PROGRAMS=; GUI_DESKTOP_FILES=;;
+     *) { { echo "$as_me:$LINENO: error: Unknown enable_gui type: '$enable_gui'" >&5
+echo "$as_me: error: Unknown enable_gui type: '$enable_gui'" >&2;}
+   { (exit 1); exit 1; }; }
+esac
+
+if test $enable_gui != "no"; then
+
+pkg_failed=no
+{ echo "$as_me:$LINENO: checking for DBUS_GLIB" >&5
+echo $ECHO_N "checking for DBUS_GLIB... $ECHO_C" >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$DBUS_GLIB_CFLAGS"; then
+        pkg_cv_DBUS_GLIB_CFLAGS="$DBUS_GLIB_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"dbus-glib-1 glib-2.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "dbus-glib-1 glib-2.0") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_DBUS_GLIB_CFLAGS=`$PKG_CONFIG --cflags "dbus-glib-1 glib-2.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+       pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$DBUS_GLIB_LIBS"; then
+        pkg_cv_DBUS_GLIB_LIBS="$DBUS_GLIB_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"dbus-glib-1 glib-2.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "dbus-glib-1 glib-2.0") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_DBUS_GLIB_LIBS=`$PKG_CONFIG --libs "dbus-glib-1 glib-2.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+       pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+               DBUS_GLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "dbus-glib-1 glib-2.0"`
+        else
+               DBUS_GLIB_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "dbus-glib-1 glib-2.0"`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$DBUS_GLIB_PKG_ERRORS" >&5
+
+       { { echo "$as_me:$LINENO: error: Package requirements (dbus-glib-1 glib-2.0) were not met:
+
+$DBUS_GLIB_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+Alternatively, you may set the environment variables DBUS_GLIB_CFLAGS
+and DBUS_GLIB_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+" >&5
+echo "$as_me: error: Package requirements (dbus-glib-1 glib-2.0) were not met:
+
+$DBUS_GLIB_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+Alternatively, you may set the environment variables DBUS_GLIB_CFLAGS
+and DBUS_GLIB_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+" >&2;}
+   { (exit 1); exit 1; }; }
+elif test $pkg_failed = untried; then
+       { { echo "$as_me:$LINENO: error: The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+Alternatively, you may set the environment variables DBUS_GLIB_CFLAGS
+and DBUS_GLIB_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.
+See \`config.log' for more details." >&5
+echo "$as_me: error: The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+Alternatively, you may set the environment variables DBUS_GLIB_CFLAGS
+and DBUS_GLIB_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+else
+       DBUS_GLIB_CFLAGS=$pkg_cv_DBUS_GLIB_CFLAGS
+       DBUS_GLIB_LIBS=$pkg_cv_DBUS_GLIB_LIBS
+        { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+       :
+fi
+    # Extract the first word of "dbus-binding-tool", so it can be a program name with args.
+set dummy dbus-binding-tool; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_DBUS_BINDING_TOOL+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $DBUS_BINDING_TOOL in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_DBUS_BINDING_TOOL="$DBUS_BINDING_TOOL" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_DBUS_BINDING_TOOL="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+DBUS_BINDING_TOOL=$ac_cv_path_DBUS_BINDING_TOOL
+if test -n "$DBUS_BINDING_TOOL"; then
+  { echo "$as_me:$LINENO: result: $DBUS_BINDING_TOOL" >&5
+echo "${ECHO_T}$DBUS_BINDING_TOOL" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+    # Extract the first word of "glib-genmarshal", so it can be a program name with args.
+set dummy glib-genmarshal; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_GLIB_GENMARSHAL+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $GLIB_GENMARSHAL in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_GLIB_GENMARSHAL="$GLIB_GENMARSHAL" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_GLIB_GENMARSHAL="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+GLIB_GENMARSHAL=$ac_cv_path_GLIB_GENMARSHAL
+if test -n "$GLIB_GENMARSHAL"; then
+  { echo "$as_me:$LINENO: result: $GLIB_GENMARSHAL" >&5
+echo "${ECHO_T}$GLIB_GENMARSHAL" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+
+    gui_modules="glib-2.0 dbus-glib-1 >= 0.60 gtk+-2.0 libglade-2.0 gio-2.0"
+    if test $enable_gui == "moblin"; then
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_MOBLIN_UX 1
+_ACEOF
+
+    fi
+    if test $enable_gui == "moblin" -o $enable_gui == "all"; then
+        gui_modules="$guimodules mx-gtk-1.0"
+
+
+pkg_failed=no
+{ echo "$as_me:$LINENO: checking for MX_GTK_0_99_1" >&5
+echo $ECHO_N "checking for MX_GTK_0_99_1... $ECHO_C" >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$MX_GTK_0_99_1_CFLAGS"; then
+        pkg_cv_MX_GTK_0_99_1_CFLAGS="$MX_GTK_0_99_1_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"mx-gtk-1.0 >= 0.99.1\"") >&5
+  ($PKG_CONFIG --exists --print-errors "mx-gtk-1.0 >= 0.99.1") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_MX_GTK_0_99_1_CFLAGS=`$PKG_CONFIG --cflags "mx-gtk-1.0 >= 0.99.1" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+       pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$MX_GTK_0_99_1_LIBS"; then
+        pkg_cv_MX_GTK_0_99_1_LIBS="$MX_GTK_0_99_1_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"mx-gtk-1.0 >= 0.99.1\"") >&5
+  ($PKG_CONFIG --exists --print-errors "mx-gtk-1.0 >= 0.99.1") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_MX_GTK_0_99_1_LIBS=`$PKG_CONFIG --libs "mx-gtk-1.0 >= 0.99.1" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+       pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+               MX_GTK_0_99_1_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "mx-gtk-1.0 >= 0.99.1"`
+        else
+               MX_GTK_0_99_1_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "mx-gtk-1.0 >= 0.99.1"`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$MX_GTK_0_99_1_PKG_ERRORS" >&5
+
+       { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+                have_mx_gtk_0_99_1="no"
+elif test $pkg_failed = untried; then
+       have_mx_gtk_0_99_1="no"
+else
+       MX_GTK_0_99_1_CFLAGS=$pkg_cv_MX_GTK_0_99_1_CFLAGS
+       MX_GTK_0_99_1_LIBS=$pkg_cv_MX_GTK_0_99_1_LIBS
+        { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+       have_mx_gtk_0_99_1="yes"
+fi
+        if test $have_mx_gtk_0_99_1 == "yes"; then
+
+cat >>confdefs.h <<\_ACEOF
+#define MX_GTK_0_99_1 1
+_ACEOF
+
+        fi
+    fi
+
+
+pkg_failed=no
+{ echo "$as_me:$LINENO: checking for UNIQUE" >&5
+echo $ECHO_N "checking for UNIQUE... $ECHO_C" >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$UNIQUE_CFLAGS"; then
+        pkg_cv_UNIQUE_CFLAGS="$UNIQUE_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"unique-1.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "unique-1.0") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_UNIQUE_CFLAGS=`$PKG_CONFIG --cflags "unique-1.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+       pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$UNIQUE_LIBS"; then
+        pkg_cv_UNIQUE_LIBS="$UNIQUE_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"unique-1.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "unique-1.0") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_UNIQUE_LIBS=`$PKG_CONFIG --libs "unique-1.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+       pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+               UNIQUE_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "unique-1.0"`
+        else
+               UNIQUE_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "unique-1.0"`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$UNIQUE_PKG_ERRORS" >&5
+
+       { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+                have_unique="no"
+elif test $pkg_failed = untried; then
+       have_unique="no"
+else
+       UNIQUE_CFLAGS=$pkg_cv_UNIQUE_CFLAGS
+       UNIQUE_LIBS=$pkg_cv_UNIQUE_LIBS
+        { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+       have_unique="yes"
+fi
+    if test $have_unique == "yes"; then
+        gui_modules="$gui_modules unique-1.0"
+
+cat >>confdefs.h <<\_ACEOF
+#define ENABLE_UNIQUE 1
+_ACEOF
+
+    fi
+
+
+pkg_failed=no
+{ echo "$as_me:$LINENO: checking for GTK_2_18" >&5
+echo $ECHO_N "checking for GTK_2_18... $ECHO_C" >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$GTK_2_18_CFLAGS"; then
+        pkg_cv_GTK_2_18_CFLAGS="$GTK_2_18_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0 >= 2.18\"") >&5
+  ($PKG_CONFIG --exists --print-errors "gtk+-2.0 >= 2.18") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_GTK_2_18_CFLAGS=`$PKG_CONFIG --cflags "gtk+-2.0 >= 2.18" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+       pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$GTK_2_18_LIBS"; then
+        pkg_cv_GTK_2_18_LIBS="$GTK_2_18_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0 >= 2.18\"") >&5
+  ($PKG_CONFIG --exists --print-errors "gtk+-2.0 >= 2.18") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_GTK_2_18_LIBS=`$PKG_CONFIG --libs "gtk+-2.0 >= 2.18" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+       pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+               GTK_2_18_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gtk+-2.0 >= 2.18"`
+        else
+               GTK_2_18_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gtk+-2.0 >= 2.18"`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$GTK_2_18_PKG_ERRORS" >&5
+
+       { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+                have_gtk_2_18="no"
+elif test $pkg_failed = untried; then
+       have_gtk_2_18="no"
+else
+       GTK_2_18_CFLAGS=$pkg_cv_GTK_2_18_CFLAGS
+       GTK_2_18_LIBS=$pkg_cv_GTK_2_18_LIBS
+        { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+       have_gtk_2_18="yes"
+fi
+    if test $have_gtk_2_18 == "yes"; then
+
+cat >>confdefs.h <<\_ACEOF
+#define GTK_2_18 1
+_ACEOF
+
+    fi
+
+
+pkg_failed=no
+{ echo "$as_me:$LINENO: checking for GUI" >&5
+echo $ECHO_N "checking for GUI... $ECHO_C" >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$GUI_CFLAGS"; then
+        pkg_cv_GUI_CFLAGS="$GUI_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"\$gui_modules\"") >&5
+  ($PKG_CONFIG --exists --print-errors "$gui_modules") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_GUI_CFLAGS=`$PKG_CONFIG --cflags "$gui_modules" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+       pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$GUI_LIBS"; then
+        pkg_cv_GUI_LIBS="$GUI_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"\$gui_modules\"") >&5
+  ($PKG_CONFIG --exists --print-errors "$gui_modules") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_GUI_LIBS=`$PKG_CONFIG --libs "$gui_modules" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+       pkg_failed=untried
+fi
+
 
 
+if test $pkg_failed = yes; then
 
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+               GUI_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$gui_modules"`
+        else
+               GUI_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$gui_modules"`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$GUI_PKG_ERRORS" >&5
 
+       { { echo "$as_me:$LINENO: error: Package requirements ($gui_modules) were not met:
 
+$GUI_PKG_ERRORS
 
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
 
+Alternatively, you may set the environment variables GUI_CFLAGS
+and GUI_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+" >&5
+echo "$as_me: error: Package requirements ($gui_modules) were not met:
 
+$GUI_PKG_ERRORS
 
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
 
+Alternatively, you may set the environment variables GUI_CFLAGS
+and GUI_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+" >&2;}
+   { (exit 1); exit 1; }; }
+elif test $pkg_failed = untried; then
+       { { echo "$as_me:$LINENO: error: The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
 
+Alternatively, you may set the environment variables GUI_CFLAGS
+and GUI_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
 
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.
+See \`config.log' for more details." >&5
+echo "$as_me: error: The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
 
-   if test "$gt_cv_have_gettext" = "yes"; then
-     if test "x$ALL_LINGUAS" = "x"; then
-       LINGUAS=
-     else
-       { echo "$as_me:$LINENO: checking for catalogs to be installed" >&5
-echo $ECHO_N "checking for catalogs to be installed... $ECHO_C" >&6; }
-       NEW_LINGUAS=
-       for presentlang in $ALL_LINGUAS; do
-         useit=no
-         if test "%UNSET%" != "${LINGUAS-%UNSET%}"; then
-           desiredlanguages="$LINGUAS"
-         else
-           desiredlanguages="$ALL_LINGUAS"
-         fi
-         for desiredlang in $desiredlanguages; do
-          # Use the presentlang catalog if desiredlang is
-           #   a. equal to presentlang, or
-           #   b. a variant of presentlang (because in this case,
-           #      presentlang can be used as a fallback for messages
-           #      which are not translated in the desiredlang catalog).
-           case "$desiredlang" in
-             "$presentlang"*) useit=yes;;
-           esac
-         done
-         if test $useit = yes; then
-           NEW_LINGUAS="$NEW_LINGUAS $presentlang"
-         fi
-       done
-       LINGUAS=$NEW_LINGUAS
-       { echo "$as_me:$LINENO: result: $LINGUAS" >&5
-echo "${ECHO_T}$LINGUAS" >&6; }
-     fi
+Alternatively, you may set the environment variables GUI_CFLAGS
+and GUI_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
 
-          if test -n "$LINGUAS"; then
-       for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done
-     fi
-   fi
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+else
+       GUI_CFLAGS=$pkg_cv_GUI_CFLAGS
+       GUI_LIBS=$pkg_cv_GUI_LIBS
+        { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+       :
+fi
 
-            MKINSTALLDIRS=
-   if test -n "$ac_aux_dir"; then
-     MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs"
-   fi
-   if test -z "$MKINSTALLDIRS"; then
-     MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs"
-   fi
+    # Extract the first word of "gtk-builder-convert", so it can be a program name with args.
+set dummy gtk-builder-convert; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_GTK_BUILDER_CONV+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $GTK_BUILDER_CONV in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_GTK_BUILDER_CONV="$GTK_BUILDER_CONV" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_GTK_BUILDER_CONV="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
 
+  ;;
+esac
+fi
+GTK_BUILDER_CONV=$ac_cv_path_GTK_BUILDER_CONV
+if test -n "$GTK_BUILDER_CONV"; then
+  { echo "$as_me:$LINENO: result: $GTK_BUILDER_CONV" >&5
+echo "${ECHO_T}$GTK_BUILDER_CONV" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
 
-         test -d po || mkdir po
-   if test "x$srcdir" != "x."; then
-     if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then
-       posrcprefix="$srcdir/"
-     else
-       posrcprefix="../$srcdir/"
-     fi
-   else
-     posrcprefix="../"
-   fi
-   rm -f po/POTFILES
-   sed -e "/^#/d" -e "/^\$/d" -e "s,.*,        $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \
-       < $srcdir/po/POTFILES.in > po/POTFILES
 
-    SYNCEVOLUTION_LOCALEDIR=${datadir}/locale
+elif test "$enable_dbus_service" = "yes"; then
+    # syncevo-dbus-server needs localization
+    :
 else
     INTLTOOL_UPDATE="true"
     USE_NLS="no"
@@ -9958,6 +10172,11 @@ echo "$as_me: error: --with-synthesis-src=$SYNTHESIS_SRC: no Synthesis configure
     SYNTHESIS_CFLAGS="-I$SYNTHESIS_SUBDIR/src"
     SYNTHESIS_LIBS="$SYNTHESIS_SUBDIR/src/libsynthesissdk.la"
 
+    if test "$enable_core" = "no" && test "$enable_gui" != "no"; then
+       # SYNTHESIS_SUBDIR is ignored, at least build headers for GUI
+       SYNTHESIS_SUBDIR_INCLUDES=synthesis-includes
+    fi
+
     if test "$enable_shared" = "no"; then
         # link against the engines that were enabled
         case $SYNCML_ENGINES in both|client|server) SYNTHESIS_LIBS="$SYNTHESIS_LIBS $SYNTHESIS_SUBDIR/src/libsynthesis.la";; esac
@@ -9996,6 +10215,7 @@ fi
 
 
 
+
 BACKENDS=""
 
 # AC_ARG_ENABLE_BACKEND(BACKEND, DIR, HELP-STRING, [ACTION-IF-GIVEN],
@@ -12441,7 +12661,7 @@ ia64-*-hpux*)
   ;;
 *-*-irix6*)
   # Find out which ABI we are using.
-  echo '#line 12444 "configure"' > conftest.$ac_ext
+  echo '#line 12664 "configure"' > conftest.$ac_ext
   if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
@@ -14546,11 +14766,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:14549: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:14769: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>conftest.err)
    ac_status=$?
    cat conftest.err >&5
-   echo "$as_me:14553: \$? = $ac_status" >&5
+   echo "$as_me:14773: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s "$ac_outfile"; then
      # The compiler can only warn and ignore the option if not recognized
      # So say no if there are warnings other than the usual output.
@@ -14836,11 +15056,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:14839: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:15059: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>conftest.err)
    ac_status=$?
    cat conftest.err >&5
-   echo "$as_me:14843: \$? = $ac_status" >&5
+   echo "$as_me:15063: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s "$ac_outfile"; then
      # The compiler can only warn and ignore the option if not recognized
      # So say no if there are warnings other than the usual output.
@@ -14940,11 +15160,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:14943: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:15163: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>out/conftest.err)
    ac_status=$?
    cat out/conftest.err >&5
-   echo "$as_me:14947: \$? = $ac_status" >&5
+   echo "$as_me:15167: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s out/conftest2.$ac_objext
    then
      # The compiler can only warn and ignore the option if not recognized
@@ -17317,7 +17537,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<EOF
-#line 17320 "configure"
+#line 17540 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -17417,7 +17637,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<EOF
-#line 17420 "configure"
+#line 17640 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -19818,11 +20038,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:19821: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:20041: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>conftest.err)
    ac_status=$?
    cat conftest.err >&5
-   echo "$as_me:19825: \$? = $ac_status" >&5
+   echo "$as_me:20045: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s "$ac_outfile"; then
      # The compiler can only warn and ignore the option if not recognized
      # So say no if there are warnings other than the usual output.
@@ -19922,11 +20142,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:19925: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:20145: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>out/conftest.err)
    ac_status=$?
    cat out/conftest.err >&5
-   echo "$as_me:19929: \$? = $ac_status" >&5
+   echo "$as_me:20149: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s out/conftest2.$ac_objext
    then
      # The compiler can only warn and ignore the option if not recognized
@@ -21520,11 +21740,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:21523: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:21743: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>conftest.err)
    ac_status=$?
    cat conftest.err >&5
-   echo "$as_me:21527: \$? = $ac_status" >&5
+   echo "$as_me:21747: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s "$ac_outfile"; then
      # The compiler can only warn and ignore the option if not recognized
      # So say no if there are warnings other than the usual output.
@@ -21624,11 +21844,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:21627: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:21847: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>out/conftest.err)
    ac_status=$?
    cat out/conftest.err >&5
-   echo "$as_me:21631: \$? = $ac_status" >&5
+   echo "$as_me:21851: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s out/conftest2.$ac_objext
    then
      # The compiler can only warn and ignore the option if not recognized
@@ -23844,11 +24064,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:23847: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:24067: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>conftest.err)
    ac_status=$?
    cat conftest.err >&5
-   echo "$as_me:23851: \$? = $ac_status" >&5
+   echo "$as_me:24071: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s "$ac_outfile"; then
      # The compiler can only warn and ignore the option if not recognized
      # So say no if there are warnings other than the usual output.
@@ -24134,11 +24354,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:24137: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:24357: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>conftest.err)
    ac_status=$?
    cat conftest.err >&5
-   echo "$as_me:24141: \$? = $ac_status" >&5
+   echo "$as_me:24361: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s "$ac_outfile"; then
      # The compiler can only warn and ignore the option if not recognized
      # So say no if there are warnings other than the usual output.
@@ -24238,11 +24458,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:24241: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:24461: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>out/conftest.err)
    ac_status=$?
    cat out/conftest.err >&5
-   echo "$as_me:24245: \$? = $ac_status" >&5
+   echo "$as_me:24465: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s out/conftest2.$ac_objext
    then
      # The compiler can only warn and ignore the option if not recognized
        # Put the nasty error message in config.log where it belongs
        echo "$NSS_PKG_ERRORS" >&5
 
-       { { echo "$as_me:$LINENO: error: Package requirements (\"nss\") were not met:
-
-$NSS_PKG_ERRORS
-
-Consider adjusting the PKG_CONFIG_PATH environment variable if you
-installed software in a non-standard prefix.
-
-Alternatively, you may set the environment variables NSS_CFLAGS
-and NSS_LIBS to avoid the need to call pkg-config.
-See the pkg-config man page for more details.
-" >&5
-echo "$as_me: error: Package requirements (\"nss\") were not met:
-
-$NSS_PKG_ERRORS
-
-Consider adjusting the PKG_CONFIG_PATH environment variable if you
-installed software in a non-standard prefix.
-
-Alternatively, you may set the environment variables NSS_CFLAGS
-and NSS_LIBS to avoid the need to call pkg-config.
-See the pkg-config man page for more details.
-" >&2;}
-   { (exit 1); exit 1; }; }
+       { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+                true
 elif test $pkg_failed = untried; then
-       { { echo "$as_me:$LINENO: error: The pkg-config script could not be found or is too old.  Make sure it
-is in your PATH or set the PKG_CONFIG environment variable to the full
-path to pkg-config.
-
-Alternatively, you may set the environment variables NSS_CFLAGS
-and NSS_LIBS to avoid the need to call pkg-config.
-See the pkg-config man page for more details.
-
-To get pkg-config, see <http://pkg-config.freedesktop.org/>.
-See \`config.log' for more details." >&5
-echo "$as_me: error: The pkg-config script could not be found or is too old.  Make sure it
-is in your PATH or set the PKG_CONFIG environment variable to the full
-path to pkg-config.
-
-Alternatively, you may set the environment variables NSS_CFLAGS
-and NSS_LIBS to avoid the need to call pkg-config.
-See the pkg-config man page for more details.
-
-To get pkg-config, see <http://pkg-config.freedesktop.org/>.
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
+       true
 else
        NSS_CFLAGS=$pkg_cv_NSS_CFLAGS
        NSS_LIBS=$pkg_cv_NSS_LIBS
@@ -27616,7 +27796,7 @@ if test ! "$docdir"; then
 
 fi
 
-ac_config_files="$ac_config_files Makefile src/dbus/interfaces/Makefile src/gdbus/Makefile src/dbus/Makefile src/Makefile src/syncevo/Makefile src/syncevo/syncevolution.pc src/syncevo/configs/Makefile src/gtk-ui/Makefile po/Makefile.in test/Makefile src/dbus/syncevo-dbus.pc"
+ac_config_files="$ac_config_files Makefile src/dbus/interfaces/Makefile src/gdbus/Makefile src/dbus/Makefile src/Makefile src/syncevo/Makefile src/syncevo/syncevolution.pc src/syncevo/configs/Makefile src/synthesis-includes/Makefile src/gtk-ui/Makefile po/Makefile.in test/Makefile src/dbus/syncevo-dbus.pc"
 
 cat >confcache <<\_ACEOF
 # This file is a shell script that caches the results of configure
@@ -27763,6 +27943,13 @@ echo "$as_me: error: conditional \"COND_GUI\" was never defined.
 Usually this means the macro was only invoked conditionally." >&2;}
    { (exit 1); exit 1; }; }
 fi
+if test -z "${COND_CORE_TRUE}" && test -z "${COND_CORE_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"COND_CORE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"COND_CORE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
 if test -z "${COND_DBUS_TRUE}" && test -z "${COND_DBUS_FALSE}"; then
   { { echo "$as_me:$LINENO: error: conditional \"COND_DBUS\" was never defined.
 Usually this means the macro was only invoked conditionally." >&5
@@ -28116,7 +28303,7 @@ exec 6>&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.0beta2a, which was
+This file was extended by syncevolution $as_me 1.0beta3, which was
 generated by GNU Autoconf 2.61.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -28169,7 +28356,7 @@ Report bugs to <bug-autoconf@gnu.org>."
 _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF
 ac_cs_version="\\
-syncevolution config.status 1.0beta2a
+syncevolution config.status 1.0beta3
 configured by $0, generated by GNU Autoconf 2.61,
   with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
 
@@ -28302,6 +28489,7 @@ do
     "src/syncevo/Makefile") CONFIG_FILES="$CONFIG_FILES src/syncevo/Makefile" ;;
     "src/syncevo/syncevolution.pc") CONFIG_FILES="$CONFIG_FILES src/syncevo/syncevolution.pc" ;;
     "src/syncevo/configs/Makefile") CONFIG_FILES="$CONFIG_FILES src/syncevo/configs/Makefile" ;;
+    "src/synthesis-includes/Makefile") CONFIG_FILES="$CONFIG_FILES src/synthesis-includes/Makefile" ;;
     "src/gtk-ui/Makefile") CONFIG_FILES="$CONFIG_FILES src/gtk-ui/Makefile" ;;
     "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;;
     "test/Makefile") CONFIG_FILES="$CONFIG_FILES test/Makefile" ;;
@@ -28513,27 +28701,22 @@ TRANSPORT_CFLAGS!$TRANSPORT_CFLAGS$ac_delim
 XSLT!$XSLT$ac_delim
 COND_GUI_TRUE!$COND_GUI_TRUE$ac_delim
 COND_GUI_FALSE!$COND_GUI_FALSE$ac_delim
+COND_CORE_TRUE!$COND_CORE_TRUE$ac_delim
+COND_CORE_FALSE!$COND_CORE_FALSE$ac_delim
 COND_DBUS_TRUE!$COND_DBUS_TRUE$ac_delim
 COND_DBUS_FALSE!$COND_DBUS_FALSE$ac_delim
 KEYRING_CFLAGS!$KEYRING_CFLAGS$ac_delim
 KEYRING_LIBS!$KEYRING_LIBS$ac_delim
 KEYRING_2_20_CFLAGS!$KEYRING_2_20_CFLAGS$ac_delim
 KEYRING_2_20_LIBS!$KEYRING_2_20_LIBS$ac_delim
-DBUS_GLIB_CFLAGS!$DBUS_GLIB_CFLAGS$ac_delim
-DBUS_GLIB_LIBS!$DBUS_GLIB_LIBS$ac_delim
-DBUS_BINDING_TOOL!$DBUS_BINDING_TOOL$ac_delim
-GLIB_GENMARSHAL!$GLIB_GENMARSHAL$ac_delim
 DBUS_CFLAGS!$DBUS_CFLAGS$ac_delim
 DBUS_LIBS!$DBUS_LIBS$ac_delim
+LIBNOTIFY_CFLAGS!$LIBNOTIFY_CFLAGS$ac_delim
+LIBNOTIFY_LIBS!$LIBNOTIFY_LIBS$ac_delim
+DBUS_GLIB_CFLAGS!$DBUS_GLIB_CFLAGS$ac_delim
+DBUS_GLIB_LIBS!$DBUS_GLIB_LIBS$ac_delim
 LIBEXECDIR!$LIBEXECDIR$ac_delim
 DBUS_SERVICES_DIR!$DBUS_SERVICES_DIR$ac_delim
-UNIQUE_CFLAGS!$UNIQUE_CFLAGS$ac_delim
-UNIQUE_LIBS!$UNIQUE_LIBS$ac_delim
-GTK_2_18_CFLAGS!$GTK_2_18_CFLAGS$ac_delim
-GTK_2_18_LIBS!$GTK_2_18_LIBS$ac_delim
-GUI_CFLAGS!$GUI_CFLAGS$ac_delim
-GUI_LIBS!$GUI_LIBS$ac_delim
-GTK_BUILDER_CONV!$GTK_BUILDER_CONV$ac_delim
 USE_NLS!$USE_NLS$ac_delim
 INTLTOOL_UPDATE!$INTLTOOL_UPDATE$ac_delim
 INTLTOOL_MERGE!$INTLTOOL_MERGE$ac_delim
@@ -28575,6 +28758,17 @@ PO_IN_DATADIR_FALSE!$PO_IN_DATADIR_FALSE$ac_delim
 POFILES!$POFILES$ac_delim
 POSUB!$POSUB$ac_delim
 MKINSTALLDIRS!$MKINSTALLDIRS$ac_delim
+DBUS_BINDING_TOOL!$DBUS_BINDING_TOOL$ac_delim
+GLIB_GENMARSHAL!$GLIB_GENMARSHAL$ac_delim
+MX_GTK_0_99_1_CFLAGS!$MX_GTK_0_99_1_CFLAGS$ac_delim
+MX_GTK_0_99_1_LIBS!$MX_GTK_0_99_1_LIBS$ac_delim
+UNIQUE_CFLAGS!$UNIQUE_CFLAGS$ac_delim
+UNIQUE_LIBS!$UNIQUE_LIBS$ac_delim
+GTK_2_18_CFLAGS!$GTK_2_18_CFLAGS$ac_delim
+GTK_2_18_LIBS!$GTK_2_18_LIBS$ac_delim
+GUI_CFLAGS!$GUI_CFLAGS$ac_delim
+GUI_LIBS!$GUI_LIBS$ac_delim
+GTK_BUILDER_CONV!$GTK_BUILDER_CONV$ac_delim
 SYNCEVOLUTION_LOCALEDIR!$SYNCEVOLUTION_LOCALEDIR$ac_delim
 GETTEXT_PACKAGE!$GETTEXT_PACKAGE$ac_delim
 GUI_PROGRAMS!$GUI_PROGRAMS$ac_delim
@@ -28592,18 +28786,12 @@ SYNTHESIS_CFLAGS!$SYNTHESIS_CFLAGS$ac_delim
 SYNTHESIS_LIBS!$SYNTHESIS_LIBS$ac_delim
 SYNTHESIS!$SYNTHESIS$ac_delim
 SYNTHESIS_SUBDIR!$SYNTHESIS_SUBDIR$ac_delim
+SYNTHESIS_SUBDIR_INCLUDES!$SYNTHESIS_SUBDIR_INCLUDES$ac_delim
 SYNTHESIS_DEP!$SYNTHESIS_DEP$ac_delim
 SYNTHESIS_ENGINE!$SYNTHESIS_ENGINE$ac_delim
 SYNTHESIS_LIB!$SYNTHESIS_LIB$ac_delim
 SYNTHESISSRC!$SYNTHESISSRC$ac_delim
 SYNCSOURCES!$SYNCSOURCES$ac_delim
-BACKEND_DEFINES!$BACKEND_DEFINES$ac_delim
-BACKEND_CPPFLAGS!$BACKEND_CPPFLAGS$ac_delim
-GNOMEBLUETOOTH_CFLAGS!$GNOMEBLUETOOTH_CFLAGS$ac_delim
-GNOMEBLUETOOTH_LIBS!$GNOMEBLUETOOTH_LIBS$ac_delim
-GNOMEBLUETOOTH_DIR!$GNOMEBLUETOOTH_DIR$ac_delim
-ENABLE_GNOME_BLUETOOTH_PANEL_TRUE!$ENABLE_GNOME_BLUETOOTH_PANEL_TRUE$ac_delim
-ENABLE_GNOME_BLUETOOTH_PANEL_FALSE!$ENABLE_GNOME_BLUETOOTH_PANEL_FALSE$ac_delim
 _ACEOF
 
   if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then
@@ -28645,6 +28833,13 @@ _ACEOF
 ac_delim='%!_!# '
 for ac_last_try in false false false false false :; do
   cat >conf$$subs.sed <<_ACEOF
+BACKEND_DEFINES!$BACKEND_DEFINES$ac_delim
+BACKEND_CPPFLAGS!$BACKEND_CPPFLAGS$ac_delim
+GNOMEBLUETOOTH_CFLAGS!$GNOMEBLUETOOTH_CFLAGS$ac_delim
+GNOMEBLUETOOTH_LIBS!$GNOMEBLUETOOTH_LIBS$ac_delim
+GNOMEBLUETOOTH_DIR!$GNOMEBLUETOOTH_DIR$ac_delim
+ENABLE_GNOME_BLUETOOTH_PANEL_TRUE!$ENABLE_GNOME_BLUETOOTH_PANEL_TRUE$ac_delim
+ENABLE_GNOME_BLUETOOTH_PANEL_FALSE!$ENABLE_GNOME_BLUETOOTH_PANEL_FALSE$ac_delim
 ADDRESSBOOK_CFLAGS!$ADDRESSBOOK_CFLAGS$ac_delim
 ADDRESSBOOK_LIBS!$ADDRESSBOOK_LIBS$ac_delim
 EPACKAGE_CFLAGS!$EPACKAGE_CFLAGS$ac_delim
@@ -28707,7 +28902,7 @@ LIBOBJS!$LIBOBJS$ac_delim
 LTLIBOBJS!$LTLIBOBJS$ac_delim
 _ACEOF
 
-  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 60; then
+  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 67; then
     break
   elif $ac_last_try; then
     { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
@@ -29334,6 +29529,7 @@ fi
 
 echo
 echo CONFIGURATION SUMMARY
+echo "Core SyncEvolution: $enable_core"
 for backend in $BACKENDS; do
     eval echo $backend: \${enable_${backend}}
 done
index 79f9b13..8d64332 100644 (file)
@@ -65,7 +65,8 @@ if test "$have_sha" = "no"; then
    # file and a simple API.
    PKG_CHECK_MODULES(NSS, "nss",
                      [AC_DEFINE(USE_SHA256, 2, [choose implementation of SHA-256])
-                      have_sha="nss"])
+                      have_sha="nss"],
+                     [true])
 fi
 
 dnl figure out whether we link all code statically or as modules
@@ -121,11 +122,12 @@ if test ! "$docdir"; then
    AC_SUBST(docdir)
 fi
 
-AC_CONFIG_FILES(Makefile src/dbus/interfaces/Makefile src/gdbus/Makefile src/dbus/Makefile src/Makefile src/syncevo/Makefile src/syncevo/syncevolution.pc src/syncevo/configs/Makefile src/gtk-ui/Makefile po/Makefile.in test/Makefile src/dbus/syncevo-dbus.pc)
+AC_CONFIG_FILES(Makefile src/dbus/interfaces/Makefile src/gdbus/Makefile src/dbus/Makefile src/Makefile src/syncevo/Makefile src/syncevo/syncevolution.pc src/syncevo/configs/Makefile src/synthesis-includes/Makefile src/gtk-ui/Makefile po/Makefile.in test/Makefile src/dbus/syncevo-dbus.pc)
 AC_OUTPUT
 
 echo
 echo CONFIGURATION SUMMARY
+echo "Core SyncEvolution: $enable_core"
 for backend in $BACKENDS; do
     eval echo $backend: \${enable_${backend}}
 done
index 1184a6d..6fdddef 100644 (file)
@@ -5,7 +5,7 @@ dnl Invoke autogen.sh to produce a configure script.
 # Debian packages. For prereleases (beta, alpha),
 # set it to something like "0.9.2+" and the AC_INIT
 # VERSION to 1.0beta1 to produce 0.9.2+1.0beta1.
-AC_INIT([syncevolution], [1.0beta2a])
+AC_INIT([syncevolution], [1.0beta3])
 STABLE_VERSION=0.9.2+
 AC_SUBST(STABLE_VERSION)
 
@@ -320,8 +320,7 @@ AC_ARG_ENABLE(gui,
                              [enables building the GTK+ UI that uses the SyncEvolution DBus API.
                               Options: gtk, moblin, all (builds sync-ui-gtk and sync-ui-moblin)
                               "gtk" is the default for --enable-gui without type. No GUI is
-                              built when --enable-gui is not used.
-                              --enable-gui implies --enable-dbus.]),
+                              built when --enable-gui is not used.]),
               [ if test "$enableval" = "gtk" ; then
                     enable_gui=gtk
                 elif test "$enableval" = "yes" ; then
@@ -340,9 +339,17 @@ AC_ARG_ENABLE(gui,
 
 AM_CONDITIONAL([COND_GUI], [test "$enable_gui" != "no"])
 
+AC_ARG_ENABLE(core,
+              AS_HELP_STRING([--enable-core],
+                             [enables building the core SyncEvolution (library, backends)]),
+              enable_core="$enableval",
+              enable_core="yes")
+AM_CONDITIONAL([COND_CORE], [test "$enable_core" = "yes"])
+
 AC_ARG_ENABLE(dbus-service,
               AS_HELP_STRING([--enable-dbus-service],
-                             [enables building the dbus service executable and the wrapper library for it]),
+                             [enables building the dbus service executable and all related features
+                             (the DBus wrapper library, command line usage of server, etc).]),
               enable_dbus_service="$enableval",
               [if test $enable_gui == "no"; then
                   enable_dbus_service="no"
@@ -351,10 +358,6 @@ AC_ARG_ENABLE(dbus-service,
                fi])
 AM_CONDITIONAL([COND_DBUS], [test "$enable_dbus_service" = "yes"])
 
-if test $enable_gui != "no" && test $enable_dbus_service == "no"; then
-   AC_ERROR([cannot build GUI without building the D-Bus service])
-fi
-
 PKG_CHECK_MODULES(KEYRING, [gnome-keyring-1], HAVE_KEYRING=yes, HAVE_KEYRING=no)
 if test $HAVE_KEYRING == "yes"; then
     AC_DEFINE(USE_GNOME_KEYRING, 1, [define if gnome keyring should be used in dbus service])
@@ -365,9 +368,6 @@ if test $HAVE_KEYRING == "yes"; then
 fi
 
 if test $enable_dbus_service == "yes"; then
-    PKG_CHECK_MODULES(DBUS_GLIB, dbus-glib-1 glib-2.0)
-    AC_PATH_PROG(DBUS_BINDING_TOOL, dbus-binding-tool)
-    AC_PATH_PROG(GLIB_GENMARSHAL, glib-genmarshal)
     if test -z "$XSLT"; then
        AC_ERROR([xsltproc not found, is required for D-Bus service])
     fi
@@ -377,6 +377,16 @@ if test $enable_dbus_service == "yes"; then
                  AC_DEFINE(NEED_DBUS_WATCH_GET_UNIX_FD, 1,
                  [Define to 1 if you need the dbus_watch_get_unix_fd() function.]))
     need_glib=yes
+    PKG_CHECK_MODULES(LIBNOTIFY, [libnotify], HAVE_LIBNOTIFY=yes, HAVE_LIBNOTIFY=no)
+    AC_ARG_ENABLE(notify,
+                  AS_HELP_STRING([--enable-notify],
+                                 [send notifications for automatic sync events]),
+                  [ test "$enableval" = "no" || test $HAVE_LIBNOTIFY = "yes" || AC_ERROR([required libnotify package not found]) ],
+                  [ test $HAVE_LIBNOTIFY = "yes" || AC_ERROR([required libnotify package not found, use --disable-notify to compile without notifications]) ])
+    if test $HAVE_LIBNOTIFY == "yes"; then
+        AC_DEFINE(HAS_NOTIFY, 1, [define if libnotify could be used in dbus service])
+    fi
+    AC_DEFINE(DBUS_SERVICE, 1, [define if dbus service is enabled])
 fi
 AC_SUBST(DBUS_CFLAGS)
 AC_SUBST(DBUS_LIBS)
@@ -384,12 +394,22 @@ AC_SUBST(DBUS_GLIB_CFLAGS)
 AC_SUBST(DBUS_GLIB_LIBS)
 AC_SUBST(KEYRING_CFLAGS) 
 AC_SUBST(KEYRING_LIBS) 
+AC_SUBST(LIBNOTIFY_CFLAGS)
+AC_SUBST(LIBNOTIFY_LIBS)
 AC_SUBST(LIBEXECDIR)
 
 DBUS_SERVICES_DIR="${datadir}/dbus-1/services"
 AC_SUBST(DBUS_SERVICES_DIR)
 AC_DEFINE_UNQUOTED(DBUS_SERVICES_DIR, "$DBUS_SERVICES_DIR", [Location of D-Bus services directory])
 
+if test $enable_gui != "no" || test $enable_dbus_service == "yes"; then
+    IT_PROG_INTLTOOL([0.37.1])
+    GETTEXT_PACKAGE=syncevolution
+    AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", [The gettext package name])
+    AM_GLIB_GNU_GETTEXT
+    SYNCEVOLUTION_LOCALEDIR=[${datadir}/locale]
+fi
+
 # decide which sync-ui(s) we are building:
 # sync-ui (in either GTK or Moblin mode) or both (in separate binaries)
 case $enable_gui in
@@ -400,12 +420,23 @@ case $enable_gui in
 esac
 
 if test $enable_gui != "no"; then
+    PKG_CHECK_MODULES(DBUS_GLIB, dbus-glib-1 glib-2.0)
+    AC_PATH_PROG(DBUS_BINDING_TOOL, dbus-binding-tool)
+    AC_PATH_PROG(GLIB_GENMARSHAL, glib-genmarshal)
+
     gui_modules="glib-2.0 dbus-glib-1 >= 0.60 gtk+-2.0 libglade-2.0 gio-2.0"
     if test $enable_gui == "moblin"; then
         AC_DEFINE(USE_MOBLIN_UX, 1, [Use Moblin UI widgets])
     fi
     if test $enable_gui == "moblin" -o $enable_gui == "all"; then
         gui_modules="$guimodules mx-gtk-1.0"
+
+        PKG_CHECK_MODULES(MX_GTK_0_99_1, mx-gtk-1.0 >= 0.99.1,
+                          have_mx_gtk_0_99_1="yes",
+                          have_mx_gtk_0_99_1="no")
+        if test $have_mx_gtk_0_99_1 == "yes"; then
+            AC_DEFINE(MX_GTK_0_99_1, 1, [we have Mx-Gtk 0.99.1 or better])
+        fi
     fi
 
     PKG_CHECK_MODULES(UNIQUE, unique-1.0,
@@ -426,11 +457,9 @@ if test $enable_gui != "no"; then
     PKG_CHECK_MODULES(GUI, $gui_modules)
 
     AC_PATH_PROG([GTK_BUILDER_CONV], gtk-builder-convert)
-    IT_PROG_INTLTOOL([0.37.1])
-    GETTEXT_PACKAGE=syncevolution
-    AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", [The gettext package name])
-    AM_GLIB_GNU_GETTEXT
-    SYNCEVOLUTION_LOCALEDIR=[${datadir}/locale]
+elif test "$enable_dbus_service" = "yes"; then
+    # syncevo-dbus-server needs localization
+    :
 else
     INTLTOOL_UPDATE="true"
     USE_NLS="no"
@@ -537,6 +566,11 @@ if test $SYNTHESIS_SRC != "no-synthesis-source"; then
     SYNTHESIS_CFLAGS="-I$SYNTHESIS_SUBDIR/src"
     SYNTHESIS_LIBS="$SYNTHESIS_SUBDIR/src/libsynthesissdk.la"
 
+    if test "$enable_core" = "no" && test "$enable_gui" != "no"; then
+       # SYNTHESIS_SUBDIR is ignored, at least build headers for GUI
+       SYNTHESIS_SUBDIR_INCLUDES=synthesis-includes
+    fi
+
     if test "$enable_shared" = "no"; then
         # link against the engines that were enabled
         case $SYNCML_ENGINES in both|client|server) SYNTHESIS_LIBS="$SYNTHESIS_LIBS $SYNTHESIS_SUBDIR/src/libsynthesis.la";; esac
@@ -563,6 +597,7 @@ AC_SUBST(SYNTHESIS_CFLAGS)
 AC_SUBST(SYNTHESIS_LIBS)
 AC_SUBST(SYNTHESIS)
 AC_SUBST(SYNTHESIS_SUBDIR)
+AC_SUBST(SYNTHESIS_SUBDIR_INCLUDES)
 AC_SUBST(SYNTHESIS_DEP)
 AC_SUBST(SYNTHESIS_ENGINE)
 AC_SUBST(SYNTHESIS_LIB)
index 00f756e..8549802 100644 (file)
@@ -5,7 +5,7 @@ dnl Invoke autogen.sh to produce a configure script.
 # Debian packages. For prereleases (beta, alpha),
 # set it to something like "0.9.2+" and the AC_INIT
 # VERSION to 1.0beta1 to produce 0.9.2+1.0beta1.
-AC_INIT([syncevolution], [1.0beta2a])
+AC_INIT([syncevolution], [1.0beta3])
 STABLE_VERSION=0.9.2+
 AC_SUBST(STABLE_VERSION)
 
@@ -320,8 +320,7 @@ AC_ARG_ENABLE(gui,
                              [enables building the GTK+ UI that uses the SyncEvolution DBus API.
                               Options: gtk, moblin, all (builds sync-ui-gtk and sync-ui-moblin)
                               "gtk" is the default for --enable-gui without type. No GUI is
-                              built when --enable-gui is not used.
-                              --enable-gui implies --enable-dbus.]),
+                              built when --enable-gui is not used.]),
               [ if test "$enableval" = "gtk" ; then
                     enable_gui=gtk
                 elif test "$enableval" = "yes" ; then
@@ -340,9 +339,17 @@ AC_ARG_ENABLE(gui,
 
 AM_CONDITIONAL([COND_GUI], [test "$enable_gui" != "no"])
 
+AC_ARG_ENABLE(core,
+              AS_HELP_STRING([--enable-core],
+                             [enables building the core SyncEvolution (library, backends)]),
+              enable_core="$enableval",
+              enable_core="yes")
+AM_CONDITIONAL([COND_CORE], [test "$enable_core" = "yes"])
+
 AC_ARG_ENABLE(dbus-service,
               AS_HELP_STRING([--enable-dbus-service],
-                             [enables building the dbus service executable and the wrapper library for it]),
+                             [enables building the dbus service executable and all related features
+                             (the DBus wrapper library, command line usage of server, etc).]),
               enable_dbus_service="$enableval",
               [if test $enable_gui == "no"; then
                   enable_dbus_service="no"
@@ -351,10 +358,6 @@ AC_ARG_ENABLE(dbus-service,
                fi])
 AM_CONDITIONAL([COND_DBUS], [test "$enable_dbus_service" = "yes"])
 
-if test $enable_gui != "no" && test $enable_dbus_service == "no"; then
-   AC_ERROR([cannot build GUI without building the D-Bus service])
-fi
-
 PKG_CHECK_MODULES(KEYRING, [gnome-keyring-1], HAVE_KEYRING=yes, HAVE_KEYRING=no)
 if test $HAVE_KEYRING == "yes"; then
     AC_DEFINE(USE_GNOME_KEYRING, 1, [define if gnome keyring should be used in dbus service])
@@ -365,9 +368,6 @@ if test $HAVE_KEYRING == "yes"; then
 fi
 
 if test $enable_dbus_service == "yes"; then
-    PKG_CHECK_MODULES(DBUS_GLIB, dbus-glib-1 glib-2.0)
-    AC_PATH_PROG(DBUS_BINDING_TOOL, dbus-binding-tool)
-    AC_PATH_PROG(GLIB_GENMARSHAL, glib-genmarshal)
     if test -z "$XSLT"; then
        AC_ERROR([xsltproc not found, is required for D-Bus service])
     fi
@@ -377,6 +377,16 @@ if test $enable_dbus_service == "yes"; then
                  AC_DEFINE(NEED_DBUS_WATCH_GET_UNIX_FD, 1,
                  [Define to 1 if you need the dbus_watch_get_unix_fd() function.]))
     need_glib=yes
+    PKG_CHECK_MODULES(LIBNOTIFY, [libnotify], HAVE_LIBNOTIFY=yes, HAVE_LIBNOTIFY=no)
+    AC_ARG_ENABLE(notify,
+                  AS_HELP_STRING([--enable-notify],
+                                 [send notifications for automatic sync events]),
+                  [ test "$enableval" = "no" || test $HAVE_LIBNOTIFY = "yes" || AC_ERROR([required libnotify package not found]) ],
+                  [ test $HAVE_LIBNOTIFY = "yes" || AC_ERROR([required libnotify package not found, use --disable-notify to compile without notifications]) ])
+    if test $HAVE_LIBNOTIFY == "yes"; then
+        AC_DEFINE(HAS_NOTIFY, 1, [define if libnotify could be used in dbus service])
+    fi
+    AC_DEFINE(DBUS_SERVICE, 1, [define if dbus service is enabled])
 fi
 AC_SUBST(DBUS_CFLAGS)
 AC_SUBST(DBUS_LIBS)
@@ -384,12 +394,22 @@ AC_SUBST(DBUS_GLIB_CFLAGS)
 AC_SUBST(DBUS_GLIB_LIBS)
 AC_SUBST(KEYRING_CFLAGS) 
 AC_SUBST(KEYRING_LIBS) 
+AC_SUBST(LIBNOTIFY_CFLAGS)
+AC_SUBST(LIBNOTIFY_LIBS)
 AC_SUBST(LIBEXECDIR)
 
 DBUS_SERVICES_DIR="${datadir}/dbus-1/services"
 AC_SUBST(DBUS_SERVICES_DIR)
 AC_DEFINE_UNQUOTED(DBUS_SERVICES_DIR, "$DBUS_SERVICES_DIR", [Location of D-Bus services directory])
 
+if test $enable_gui != "no" || test $enable_dbus_service == "yes"; then
+    IT_PROG_INTLTOOL([0.37.1])
+    GETTEXT_PACKAGE=syncevolution
+    AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", [The gettext package name])
+    AM_GLIB_GNU_GETTEXT
+    SYNCEVOLUTION_LOCALEDIR=[${datadir}/locale]
+fi
+
 # decide which sync-ui(s) we are building:
 # sync-ui (in either GTK or Moblin mode) or both (in separate binaries)
 case $enable_gui in
@@ -400,12 +420,23 @@ case $enable_gui in
 esac
 
 if test $enable_gui != "no"; then
+    PKG_CHECK_MODULES(DBUS_GLIB, dbus-glib-1 glib-2.0)
+    AC_PATH_PROG(DBUS_BINDING_TOOL, dbus-binding-tool)
+    AC_PATH_PROG(GLIB_GENMARSHAL, glib-genmarshal)
+
     gui_modules="glib-2.0 dbus-glib-1 >= 0.60 gtk+-2.0 libglade-2.0 gio-2.0"
     if test $enable_gui == "moblin"; then
         AC_DEFINE(USE_MOBLIN_UX, 1, [Use Moblin UI widgets])
     fi
     if test $enable_gui == "moblin" -o $enable_gui == "all"; then
         gui_modules="$guimodules mx-gtk-1.0"
+
+        PKG_CHECK_MODULES(MX_GTK_0_99_1, mx-gtk-1.0 >= 0.99.1,
+                          have_mx_gtk_0_99_1="yes",
+                          have_mx_gtk_0_99_1="no")
+        if test $have_mx_gtk_0_99_1 == "yes"; then
+            AC_DEFINE(MX_GTK_0_99_1, 1, [we have Mx-Gtk 0.99.1 or better])
+        fi
     fi
 
     PKG_CHECK_MODULES(UNIQUE, unique-1.0,
@@ -426,11 +457,9 @@ if test $enable_gui != "no"; then
     PKG_CHECK_MODULES(GUI, $gui_modules)
 
     AC_PATH_PROG([GTK_BUILDER_CONV], gtk-builder-convert)
-    IT_PROG_INTLTOOL([0.37.1])
-    GETTEXT_PACKAGE=syncevolution
-    AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", [The gettext package name])
-    AM_GLIB_GNU_GETTEXT
-    SYNCEVOLUTION_LOCALEDIR=[${datadir}/locale]
+elif test "$enable_dbus_service" = "yes"; then
+    # syncevo-dbus-server needs localization
+    :
 else
     INTLTOOL_UPDATE="true"
     USE_NLS="no"
@@ -537,6 +566,11 @@ if test $SYNTHESIS_SRC != "no-synthesis-source"; then
     SYNTHESIS_CFLAGS="-I$SYNTHESIS_SUBDIR/src"
     SYNTHESIS_LIBS="$SYNTHESIS_SUBDIR/src/libsynthesissdk.la"
 
+    if test "$enable_core" = "no" && test "$enable_gui" != "no"; then
+       # SYNTHESIS_SUBDIR is ignored, at least build headers for GUI
+       SYNTHESIS_SUBDIR_INCLUDES=synthesis-includes
+    fi
+
     if test "$enable_shared" = "no"; then
         # link against the engines that were enabled
         case $SYNCML_ENGINES in both|client|server) SYNTHESIS_LIBS="$SYNTHESIS_LIBS $SYNTHESIS_SUBDIR/src/libsynthesis.la";; esac
@@ -563,6 +597,7 @@ AC_SUBST(SYNTHESIS_CFLAGS)
 AC_SUBST(SYNTHESIS_LIBS)
 AC_SUBST(SYNTHESIS)
 AC_SUBST(SYNTHESIS_SUBDIR)
+AC_SUBST(SYNTHESIS_SUBDIR_INCLUDES)
 AC_SUBST(SYNTHESIS_DEP)
 AC_SUBST(SYNTHESIS_ENGINE)
 AC_SUBST(SYNTHESIS_LIB)
@@ -952,7 +987,8 @@ if test "$have_sha" = "no"; then
    # file and a simple API.
    PKG_CHECK_MODULES(NSS, "nss",
                      [AC_DEFINE(USE_SHA256, 2, [choose implementation of SHA-256])
-                      have_sha="nss"])
+                      have_sha="nss"],
+                     [true])
 fi
 
 dnl figure out whether we link all code statically or as modules
@@ -1008,11 +1044,12 @@ if test ! "$docdir"; then
    AC_SUBST(docdir)
 fi
 
-AC_CONFIG_FILES(Makefile src/dbus/interfaces/Makefile src/gdbus/Makefile src/dbus/Makefile src/Makefile src/syncevo/Makefile src/syncevo/syncevolution.pc src/syncevo/configs/Makefile src/gtk-ui/Makefile po/Makefile.in test/Makefile src/dbus/syncevo-dbus.pc)
+AC_CONFIG_FILES(Makefile src/dbus/interfaces/Makefile src/gdbus/Makefile src/dbus/Makefile src/Makefile src/syncevo/Makefile src/syncevo/syncevolution.pc src/syncevo/configs/Makefile src/synthesis-includes/Makefile src/gtk-ui/Makefile po/Makefile.in test/Makefile src/dbus/syncevo-dbus.pc)
 AC_OUTPUT
 
 echo
 echo CONFIGURATION SUMMARY
+echo "Core SyncEvolution: $enable_core"
 for backend in $BACKENDS; do
     eval echo $backend: \${enable_${backend}}
 done
index 248b2d4..01c10ab 100755 (executable)
 # out-of-tree backends. Now git pretty much removes
 # the need for such tricks, but it's still around.
 
+# Another reason for gen-autotools.sh is that it generates
+# the version in the configure script. This cannot be
+# done inside the script because autoconf expects a
+# literal string, not some kind of variable.
+#
+# To use the version specified in AC_INIT() unmodified,
+# the following checks must pass:
+# - SyncEvolution source is clean (git status reports
+#   no "modified" files or "untracked" files, or the source
+#   is not in git at all)
+# - the source is tagged with the version of SyncEvolution
+#   (git describe --tags HEAD reports something which matches,
+#   for example syncevolution-1-0-beta-2a for 1.0beta2a)
+# - same for libsynthesis, if the SYNTHESISSRC env variable
+#   is set
+#
+# If these tests fail, the version is extended:
+# +<yyyymmdd>+SE+<status>+SYSYNC+<status>
+# <yyyymmdd> = date
+# <status> = <hash>[+unclean]
+# <hash> = shortened hash from describe (for example, 1040ffd)
+# +unclean = source was dirty
+
+set -e
+
+version=`grep '^AC_INIT' configure-pre.in | sed -e 's/.*\[\(.*\)\])/\1/'`
+checksource () {
+    dir=$1
+    force=$2
+    dirty=
+    if [ ! -d $dir/.git ]; then
+        return
+    fi
+
+    cur=`pwd`
+    cd $dir
+    
+    if git status | grep -e "modified:" -e "Untracked files:" -q; then
+        dirty=+unclean
+    fi
+    describe=`git describe --tags`
+    hash=`git show-ref --abbrev --hash HEAD`
+    if echo $describe | grep -e '-[0-9]+-[0-9a-f]{8}$' -q; then
+        exact=
+        tag=`echo $describe | sed -e 's/-[0123456789]*-g.*//'`
+    else
+        exact=1
+        tag=$describe
+    fi
+    simpletag=$tag
+    # Hyphens between numbers in the tag are dots in the version
+    # and all other hyphens can be removed.
+    while true; do
+        tmp=`echo $simpletag | sed -e 's/\([0123456789]\)-\([0123456789]\)/\1.\2/'`
+        if [ $tmp = $simpletag ]; then
+            break
+        else
+            simpletag=$tmp
+        fi
+    done
+    simpletag=`echo $simpletag | sed -e 's/-//g'`
+    if [ "$dirty" ] || [ "$force" ]; then
+        # previous check failed, always print hash
+        echo $hash$dirty
+    elif [ "$exact" ] &&
+        echo $simpletag | grep -q "syncevolution${version}\$"; then
+        true
+    else
+        echo $hash$dirty
+    fi
+    cd $cur
+}
+
+versionsuffix=
+syncevo=`checksource .`
+if [ "$SYNTHESISSRC" ]; then
+    sysync=`checksource $SYNTHESISSRC $syncevo`
+fi
+# run check again, to get hash when only libsynthesis failed
+syncevo=`checksource . $sysync`
+if [ "$syncevo" ]; then
+    versionsuffix=+SE+$syncevo
+fi
+if [ "$sysync" ]; then
+    versionsuffix=$versionsuffix+SYSYNC+$sysync
+fi
+if [ "$versionsuffix" ]; then
+    versionsuffix=+`date +%Y%m%d`$versionsuffix
+fi
+
+
 # generate configure.in from main configure-*.in pieces
 # and all backend configure-sub.in pieces
 rm -f configure.in
-cat configure-pre.in >>configure.in
+sed -e "s/^\\(AC_INIT.*\\)\\[\\(.*\\)\\]/\\1[\\2$versionsuffix]/" configure-pre.in >>configure.in
+
 BACKENDS=
 SUBS=
 for sub in src/backends/*/configure-sub.in; do
index 67d4446..b87570b 100644 (file)
@@ -15,6 +15,7 @@ nl
 pl
 pt_BR
 ro
+ru
 sv
 th
 zh_CN
index bb172d0..b02affc 100644 (file)
@@ -6,3 +6,4 @@ src/gtk-ui/sync.desktop.in
 src/gtk-ui/sync-gtk.desktop.in
 src/gtk-ui/sync-config-widget.c
 src/gnome-bluetooth/syncevolution.c
+src/syncevo-dbus-server.cpp
index b5d8f32..026ac29 100644 (file)
--- a/po/de.po
+++ b/po/de.po
@@ -1,11 +1,10 @@
-#: ../src/gtk-ui/sync-ui.c:764
 msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: http://moblin.org/projects/syncevolution\n"
-"POT-Creation-Date: 2009-10-01 19:27+0000\n"
+"POT-Creation-Date: 2010-04-07 09:29+0000\n"
 "PO-Revision-Date: \n"
-"Last-Translator: Clara <steiner-jay.clarax@intel.com>\n"
+"Last-Translator: Clara Steiner-Jay <csteiner@aracnet.com>\n"
 "Language-Team: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -18,555 +17,639 @@ msgstr ""
 # If this is supposed to be a verb, then it would be "synchronisieren" in DEU)
 #. TRANSLATORS: this is the application name that may be used by e.g.
 #. the windowmanager
-#: ../src/gtk-ui/main.c:31 ../src/gtk-ui/ui.glade.h:28
+#: ../src/gtk-ui/main.c:40
+#: ../src/gtk-ui/ui.glade.h:38
 #: ../src/gtk-ui/sync.desktop.in.h:1
+#: ../src/gnome-bluetooth/syncevolution.c:112
 msgid "Sync"
 msgstr "Synchronisation"
 
-#: ../src/gtk-ui/sync-ui.c:259
-msgid "Addressbook"
-msgstr "Adressbuch"
+#: ../src/gtk-ui/sync-ui.c:260
+msgid "Contacts"
+msgstr "Kontakte"
 
-#: ../src/gtk-ui/sync-ui.c:261
-msgid "Calendar"
-msgstr "Kalender"
+#: ../src/gtk-ui/sync-ui.c:262
+msgid "Appointments"
+msgstr "Termine"
 
-# "tasks"
-#: ../src/gtk-ui/sync-ui.c:263
-msgid "Todo"
+#: ../src/gtk-ui/sync-ui.c:264
+#: ../src/gtk-ui/ui.glade.h:40
+msgid "Tasks"
 msgstr "Aufgaben"
 
-#: ../src/gtk-ui/sync-ui.c:265
-msgid "Memo"
-msgstr "Notiz"
-
-#: ../src/gtk-ui/sync-ui.c:320
-msgid "Failed to save current service in GConf configuration system"
-msgstr ""
-"Aktueller Service konnte nicht im GConf Konfigurationssystem gespeichert "
-"werden."
-
-#: ../src/gtk-ui/sync-ui.c:331
-msgid "Failed to save service configuration to SyncEvolution"
-msgstr "Service-Konfiguration konnte nicht in SyncEvolution gespeichert werden"
-
-#: ../src/gtk-ui/sync-ui.c:416
-msgid "Failed to get service configuration from SyncEvolution"
-msgstr "Service-Konfiguration konnte nicht von SyncEvolution empfangen werden"
-
-#: ../src/gtk-ui/sync-ui.c:479
-msgid "Failed to remove service configuration from SyncEvolution"
-msgstr "Service-Konfiguration konnte nicht aus SyncEvolution entfernt werden"
-
-#: ../src/gtk-ui/sync-ui.c:599
-msgid "Service must have a name and server URL"
-msgstr "Der Service muss einen Namen und eine URL haben"
-
-#. sync is no longer in progress for some reason
-#: ../src/gtk-ui/sync-ui.c:675
-msgid "Failed to cancel: sync was no longer in progress"
-msgstr "Abbruch fehlgeschlagen: Synchronisation lief bereits nicht mehr"
-
-#: ../src/gtk-ui/sync-ui.c:679
-msgid "Failed to cancel sync"
-msgstr "Synchronisation konnte nicht abgebrochen werden"
+#: ../src/gtk-ui/sync-ui.c:266
+msgid "Notes"
+msgstr "Notizen"
 
-#: ../src/gtk-ui/sync-ui.c:683
-msgid "Canceling sync"
-msgstr "Sync wird abgebrochen"
+#. TRANSLATORS: This is a "combination source" for syncing with devices
+#. * that combine appointments and tasks. the name should match the ones
+#. * used for calendar and todo above
+#: ../src/gtk-ui/sync-ui.c:271
+msgid "Appointments & Tasks"
+msgstr "Termine & Aufgaben"
 
-#: ../src/gtk-ui/sync-ui.c:697
-msgid "Trying to cancel sync"
-msgstr "Versuch die Synchronisation abzubrechen"
+# shortened to fix truncation issue
+#: ../src/gtk-ui/sync-ui.c:343
+msgid "Starting sync"
+msgstr "Sync wird gestartet"
 
-#: ../src/gtk-ui/sync-ui.c:704
+#. TRANSLATORS: slow sync confirmation dialog message. Placeholder
+#. * is service/device name
+#: ../src/gtk-ui/sync-ui.c:381
 #, c-format
-msgid ""
-"Do you want to delete all local data and replace it with data from %s? This "
-"is not usually advised."
-msgstr ""
-"Möchtest du alle lokalen Daten löschen und mit Daten von %s ersetzen? Dies "
-"ist normalerweise nicht empfohlen."
+msgid "Do you want to slow sync with %s?"
+msgstr "Willst du mit %s eine langsame Synchronisation durchführen?"
 
-#: ../src/gtk-ui/sync-ui.c:709
-#, c-format
-msgid ""
-"Do you want to delete all data in %s and replace it with your local data? "
-"This is not usually advised."
-msgstr ""
-"Möchtest du alle Daten in %s löschen und mit deinen lokalen Daten ersetzen? "
-"Dies ist normalerweise nicht empfohlen."
+#: ../src/gtk-ui/sync-ui.c:385
+msgid "Yes, do slow sync"
+msgstr "Ja, langsame Synchronisation durchführen"
 
-#: ../src/gtk-ui/sync-ui.c:726
+#: ../src/gtk-ui/sync-ui.c:385
 msgid "No, cancel sync"
 msgstr "Nein, Synchronisation abbrechen"
 
-#: ../src/gtk-ui/sync-ui.c:727
+#. TRANSLATORS: confirmation dialog for refresh-from-server. Placeholder
+#. * is service/device name
+#: ../src/gtk-ui/sync-ui.c:418
+#, c-format
+msgid "Do you want to delete all local data and replace it with data from %s? This is not usually advised."
+msgstr "Möchtest du alle lokalen Daten löschen und mit Daten von %s ersetzen? Dies ist normalerweise nicht empfohlen."
+
+#: ../src/gtk-ui/sync-ui.c:423
+#: ../src/gtk-ui/sync-ui.c:454
 msgid "Yes, delete and replace"
 msgstr "Ja, löschen und ersetzen"
 
-#: ../src/gtk-ui/sync-ui.c:749
-msgid "No sources are enabled, not syncing"
-msgstr "Keine Quellen sind aktiviert, keine Synchronisation findet statt"
+#: ../src/gtk-ui/sync-ui.c:423
+#: ../src/gtk-ui/sync-ui.c:454
+#: ../src/gtk-ui/sync-ui.c:1566
+msgid "No"
+msgstr "Nein"
 
-# shortened
-#: ../src/gtk-ui/sync-ui.c:766
-msgid "A sync is already in progress"
-msgstr "Eine Synchronisation läuft bereits"
+#. TRANSLATORS: confirmation dialog for refresh-from-client. Placeholder
+#. * is service/device name
+#: ../src/gtk-ui/sync-ui.c:449
+#, c-format
+msgid "Do you want to delete all data in %s and replace it with your local data? This is not usually advised."
+msgstr "Möchtest du alle Daten in %s löschen und mit deinen lokalen Daten ersetzen? Dies ist normalerweise nicht empfohlen."
 
-# shortened
-#: ../src/gtk-ui/sync-ui.c:768
-msgid "Failed to start sync"
-msgstr "Sync konnte nicht starten"
+#: ../src/gtk-ui/sync-ui.c:481
+msgid "Trying to cancel sync"
+msgstr "Abbruchversuch der Synchronisation"
 
-# shortened to fix truncation issue
-#: ../src/gtk-ui/sync-ui.c:773
-msgid "Starting sync"
-msgstr "Sync wird gestartet"
+#: ../src/gtk-ui/sync-ui.c:521
+msgid "No service or device selected"
+msgstr "Kein Service oder Gerät gewählt"
 
 # "last synchronization happened a few seconds ago"
-#: ../src/gtk-ui/sync-ui.c:798
-msgid "Last synced just seconds ago"
-msgstr "Letzte Synchronisation fand vor wenigen Sekunden statt"
-
-#: ../src/gtk-ui/sync-ui.c:801
-msgid "Last synced a minute ago"
-msgstr "Letzte Synchronisation fand vor einer Minute statt"
+#. TRANSLATORS: This is the title on main view. Placeholder is
+#. * the service name. Example: "Google - synced just now"
+#: ../src/gtk-ui/sync-ui.c:529
+#, c-format
+msgid "%s - synced just now"
+msgstr "%s - Synchronisation fand vor wenigen Sekunden statt"
 
-#: ../src/gtk-ui/sync-ui.c:804
+#: ../src/gtk-ui/sync-ui.c:533
 #, c-format
-msgid "Last synced %ld minutes ago"
-msgstr "Letzte Synchronisation fand vor %ld Minuten statt"
+msgid "%s - synced a minute ago"
+msgstr "%s - Synchronisation fand vor einer Minute statt"
 
-#: ../src/gtk-ui/sync-ui.c:807
-msgid "Last synced an hour ago"
-msgstr "Letzte Synchronisation fand vor einer Stunde statt"
+#: ../src/gtk-ui/sync-ui.c:537
+#, c-format
+msgid "%s - synced %ld minutes ago"
+msgstr "%s - Synchronisation fand vor %ld Minuten statt"
 
-#: ../src/gtk-ui/sync-ui.c:810
+#: ../src/gtk-ui/sync-ui.c:542
 #, c-format
-msgid "Last synced %ld hours ago"
-msgstr "Letzte Synchronisation fand vor %ld Stunden statt"
+msgid "%s - synced an hour ago"
+msgstr "%s - Synchronisation fand vor einer Stunde statt"
 
-#: ../src/gtk-ui/sync-ui.c:813
-msgid "Last synced a day ago"
-msgstr "Letzte Synchronisation fand vor einem Tag statt"
+#: ../src/gtk-ui/sync-ui.c:546
+#, c-format
+msgid "%s - synced %ld hours ago"
+msgstr "%s - Synchronisation fand vor %ld Stunden statt"
 
-#: ../src/gtk-ui/sync-ui.c:816
+#: ../src/gtk-ui/sync-ui.c:551
 #, c-format
-msgid "Last synced %ld days ago"
-msgstr "Letzte Synchronisation fand vor %ld Tagen statt"
+msgid "%s - synced a day ago"
+msgstr "%s - Synchronisation fand vor einem Tag statt"
 
-# changed to avoid truncation
-#: ../src/gtk-ui/sync-ui.c:901
-msgid "Sync again"
-msgstr "Erneut syncen"
+#: ../src/gtk-ui/sync-ui.c:555
+#, c-format
+msgid "%s - synced %ld days ago"
+msgstr "%s - Synchronisation fand vor %ld Tagen statt"
 
 # use of the horrible word "syncen" is necessary to avoid truncation
-#: ../src/gtk-ui/sync-ui.c:903 ../src/gtk-ui/ui.glade.h:29
+#. TRANSLATORS: Action button in info bar in main view. Shown with e.g.
+#. * "You've just restored a backup. The changes have not been "
+#. * "synced with %s yet"
+#: ../src/gtk-ui/sync-ui.c:604
+#: ../src/gtk-ui/sync-ui.c:719
 msgid "Sync now"
 msgstr "Jetzt syncen"
 
+#. TRANSLATORS: Action button in info bar in main view. Shown with e.g.
+#. * "A normal sync is not possible at this time..." message.
+#. * "Other options" will open Emergency view
+#: ../src/gtk-ui/sync-ui.c:610
+#: ../src/gtk-ui/ui.glade.h:37
+msgid "Slow sync"
+msgstr "Langsame Synchronisation"
+
+#: ../src/gtk-ui/sync-ui.c:611
+msgid "Other options..."
+msgstr "Andere Optionen..."
+
+#. TRANSLATORS: Action button in info bar in main view. Shown e.g.
+#. * when no service is selected. Will open configuration view
+#: ../src/gtk-ui/sync-ui.c:616
+msgid "Select sync service"
+msgstr "Synchronisations-Service auswählen"
+
+#. TRANSLATORS: Action button in info bar in main view. Shown e.g.
+#. * login to service fails. Will open configuration view for this service
+#: ../src/gtk-ui/sync-ui.c:621
+msgid "Edit service settings"
+msgstr "Service-Einstellungen bearbeiten"
+
+#: ../src/gtk-ui/sync-ui.c:670
+msgid "You haven't selected a sync service or device yet. Sync services let you synchronize your data between your netbook and a web service. You can also sync directly with some devices."
+msgstr "Es ist noch kein Synchronisations-Service oder Gerät ausgewählt. Sync-Services synchronisieren die Daten deines Netbooks mit einem Web-Service. Mit einigen Geräten kannst du auch direkt synchronisieren."
+
+# Shortened to avoid truncation. If truncation is no longer an issue, please use the full form of the verb: 'synchronisieren'.
+#: ../src/gtk-ui/sync-ui.c:717
+msgid "Sync again"
+msgstr "Erneut syncen"
+
+#: ../src/gtk-ui/sync-ui.c:730
+msgid "Restoring"
+msgstr "Wiederherstellung"
+
 # looks horrible to my German eyes, but is necessary to avoid truncation
-#: ../src/gtk-ui/sync-ui.c:912
+#: ../src/gtk-ui/sync-ui.c:732
 msgid "Syncing"
 msgstr "Syncen..."
 
-#: ../src/gtk-ui/sync-ui.c:918
+#. TRANSLATORS: This is for the button in main view, right side.
+#. Keep line length below ~20 characters, use two lines if needed
+#: ../src/gtk-ui/sync-ui.c:743
+#: ../src/gtk-ui/sync-ui.c:3358
 msgid "Cancel sync"
-msgstr "Sync abbrechen"
+msgstr ""
+"Synchronisation\n"
+"abbrechen"
+
+#: ../src/gtk-ui/sync-ui.c:908
+msgid "Back to sync"
+msgstr "Zurück zur Synchronisation"
+
+#. TRANSLATORS: label for checkbutton/toggle in main view.
+#. * Please stick to similar length strings or break the line with
+#. * "\n" if absolutely needed
+#: ../src/gtk-ui/sync-ui.c:1209
+msgid "Automatic sync"
+msgstr ""
+"Automatische\n"
+"Synchronisation"
+
+#. This is the expander label in emergency view. It summarizes the
+#. * currently selected data sources. First placeholder is service/device
+#. * name, second a comma separeted list of sources.
+#. * E.g. "Affected data: Google Contacts, Appointments"
+#: ../src/gtk-ui/sync-ui.c:1480
+#, c-format
+msgid "Affected data: %s %s"
+msgstr "Betroffene Daten: %s %s"
+
+#: ../src/gtk-ui/sync-ui.c:1485
+#, c-format
+msgid "Affected data: none"
+msgstr "Betroffene Daten: Keine"
+
+#. TRANSLATORS: confirmation for restoring a backup. placeholder is the
+#. * backup time string defined below
+#: ../src/gtk-ui/sync-ui.c:1563
+#, c-format
+msgid "Do you want to restore the backup from %s? All changes you have made since then will be lost."
+msgstr "Soll die Sicherheitskopie von %s wiederhergestellt werden? Alle seither gemachten Änderungen gehen dann verloren"
+
+#: ../src/gtk-ui/sync-ui.c:1566
+msgid "Yes, restore"
+msgstr "Ja, wiederherstellen"
+
+#. TRANSLATORS: date/time for strftime(), used in emergency view backup
+#. * label. Any time format that shows date and time is good.
+#: ../src/gtk-ui/sync-ui.c:1598
+#, c-format
+msgid "%x %X"
+msgstr "%x %X"
+
+#. TRANSLATORS: label for a backup in emergency view. Placeholder is
+#. * service or device name
+#: ../src/gtk-ui/sync-ui.c:1617
+#, c-format
+msgid "Backed up before syncing with %s"
+msgstr "Sicherheitskopie wurde erstellt vor Synchronisation mit %s"
+
+#: ../src/gtk-ui/sync-ui.c:1634
+msgid "Restore"
+msgstr "Wiederherstellen"
 
-#. TRANSLATORS: placeholder is a source name, shown with checkboxes in main window
-#: ../src/gtk-ui/sync-ui.c:1265
+#. TRANSLATORS: this is an explanation in Emergency view.
+#. * Placeholder is a service/device name
+#: ../src/gtk-ui/sync-ui.c:1741
 #, c-format
-msgid "%s (not supported by this service)"
-msgstr "%s (von diesem Service nicht unterstützt)"
+msgid "A normal sync with %s is not possible at this time. You can do a slow two-way sync or start from scratch. You can also restore a backup, but a slow sync or starting from scratch will still be required before normal sync is possible."
+msgstr "Eine normale Synchronisation mit %s ist zur Zeit nicht möglich. Du kannst eine langsame Zwei-Wege-Synchronisation durchführen, neu anfangen, oder eine Sicherheitskopie wiederherstellen. Eine langsame Synchronisation oder ein Neuanfang sind jedoch erforderlich, bevor eine normale Synchronisation mäglich ist."
 
-#: ../src/gtk-ui/sync-ui.c:1298
+#: ../src/gtk-ui/sync-ui.c:1751
+#, c-format
+msgid "If something has gone horribly wrong, you can try a slow sync, start from scratch or restore from backup."
+msgstr "Falls etwas fehlgschlagen ist, kannst du eine langsame Synchcronisation versuchen, neu anfangen oder von der Sicherheitskopie Daten wiederherstellen."
+
+#. TRANSLATORS: These are a buttons in Emergency view. Placeholder is a
+#. * service/device name. Please don't use too long lines, but feel free to
+#. * use several lines.
+#: ../src/gtk-ui/sync-ui.c:1760
+#, c-format
+msgid ""
+"Delete all your local\n"
+"data and replace with\n"
+"data from %s"
+msgstr ""
+"Alle lokalen\n"
+"Daten löschen und ersetzen mit\n"
+"Daten von %s"
+
+#: ../src/gtk-ui/sync-ui.c:1766
+#, c-format
+msgid ""
+"Delete all data on\n"
+"%s and replace\n"
+"with your local data"
+msgstr ""
+"Alle Daten auf\n"
+"%s löschen und ersetzen\n"
+"mit deinen lokalen Daten"
+
+#: ../src/gtk-ui/sync-ui.c:2226
+msgid "Failed to get list of supported services from SyncEvolution"
+msgstr "Liste der unterstützten Services konnte nicht von SyncEvolution empfangen werden"
+
+#: ../src/gtk-ui/sync-ui.c:2280
+msgid "There was a problem communicating with the sync process. Please try again later."
+msgstr "Bei der Kommunikation mit dem Sync-Service trat ein Problem auf. Versuche es später nochmal."
+
+#: ../src/gtk-ui/sync-ui.c:2339
+msgid "Restore failed"
+msgstr "Verbindung fehlgeschlagen"
+
+# changed to avoid truncation
+#: ../src/gtk-ui/sync-ui.c:2342
+#: ../src/gtk-ui/sync-ui.c:3227
+msgid "Sync failed"
+msgstr "Sync gescheitert"
+
+#: ../src/gtk-ui/sync-ui.c:2348
+msgid "Restore complete"
+msgstr "Wiederherstellung beendet"
+
+#: ../src/gtk-ui/sync-ui.c:2351
+msgid "Sync complete"
+msgstr "Sync beendet"
+
+#: ../src/gtk-ui/sync-ui.c:2443
+#, c-format
+msgid "Preparing '%s'"
+msgstr "'%s' wird vorbereitet"
+
+#: ../src/gtk-ui/sync-ui.c:2446
+#, c-format
+msgid "Receiving '%s'"
+msgstr "'%s' wird empfangen"
+
+#: ../src/gtk-ui/sync-ui.c:2449
+#, c-format
+msgid "Sending '%s'"
+msgstr "'%s' wird gesendet"
+
+#: ../src/gtk-ui/sync-ui.c:2570
 #, c-format
 msgid "There was one remote rejection."
-msgid_plural "There were %d remote rejections."
+msgid_plural "There were %ld remote rejections."
 msgstr[0] "Es gab eine Remote-Ablehnung."
-msgstr[1] "Es gab % Remote-Ablehnungen."
+msgstr[1] "Es gab %ld Remote-Ablehnungen."
 
-#: ../src/gtk-ui/sync-ui.c:1303
+#: ../src/gtk-ui/sync-ui.c:2575
 #, c-format
 msgid "There was one local rejection."
-msgid_plural "There were %d local rejections."
+msgid_plural "There were %ld local rejections."
 msgstr[0] "Es gab eine lokale Ablehnung."
-msgstr[1] "Es gab %d lokale Ablehnungen."
+msgstr[1] "Es gab %ld lokale Ablehnungen."
 
-#: ../src/gtk-ui/sync-ui.c:1308
+#: ../src/gtk-ui/sync-ui.c:2580
 #, c-format
-msgid "There were %d local rejections and %d remote rejections."
-msgstr "Es gab %d lokale Ablehnungen und %d Remote-Ablehnungen."
+msgid "There were %ld local rejections and %ld remote rejections."
+msgstr "Es gab %ld lokale Ablehnungen und %ld Remote-Ablehnungen."
 
-#: ../src/gtk-ui/sync-ui.c:1313
+#: ../src/gtk-ui/sync-ui.c:2585
 #, c-format
 msgid "Last time: No changes."
 msgstr "Letztes Mal: Keine Änderungen."
 
-#: ../src/gtk-ui/sync-ui.c:1315
+#: ../src/gtk-ui/sync-ui.c:2587
 #, c-format
 msgid "Last time: Sent one change."
-msgid_plural "Last time: Sent %d changes."
+msgid_plural "Last time: Sent %ld changes."
 msgstr[0] "Letztes Mal: Eine Änderung abgeschickt."
-msgstr[1] "Letztes Mal: %d Änderungen abgeschickt."
+msgstr[1] "Letztes Mal: %ld Änderungen abgeschickt."
 
 #. This is about changes made to the local data. Not all of these
 #. changes were requested by the remote server, so "applied"
 #. is a better word than "received" (bug #5185).
-#: ../src/gtk-ui/sync-ui.c:1323
+#: ../src/gtk-ui/sync-ui.c:2595
 #, c-format
 msgid "Last time: Applied one change."
-msgid_plural "Last time: Applied %d changes."
+msgid_plural "Last time: Applied %ld changes."
 msgstr[0] "Letztes Mal: Eine Änderung angewandt."
-msgstr[1] "Letztes Mal: %d Änderungen erhalten."
+msgstr[1] "Letztes Mal: %ld Änderungen angewandt."
 
-#: ../src/gtk-ui/sync-ui.c:1328
+#: ../src/gtk-ui/sync-ui.c:2600
 #, c-format
-msgid "Last time: Applied %d changes and sent %d changes."
-msgstr "Letztes Mal: %d Änderungen angewandt und %d Änderungen abgeschickt."
-
-#: ../src/gtk-ui/sync-ui.c:1420
-msgid "Failed to get server configuration from SyncEvolution"
-msgstr "Serverkonfiguration konnte nicht von SyncEvolution empfangen werden"
-
-#: ../src/gtk-ui/sync-ui.c:1472
-msgid ""
-"ScheduleWorld enables you to keep your contacts, events, tasks, and notes in "
-"sync."
-msgstr ""
-"ScheduleWorld erlaubt Ihnen Ihre Kontakte, Events, Aufgaben und Notizen zu "
-"synchronisieren."
-
-#: ../src/gtk-ui/sync-ui.c:1475
-msgid ""
-"Google Sync can backup and synchronize your Address Book with your Gmail "
-"contacts."
-msgstr ""
-"Google Synchronisation kann Ihr Addressbuch mit Ihren Gmail Kontakten "
-"synchronisieren und eine Sicherheitskopie davon erstellen."
+msgid "Last time: Applied %ld changes and sent %ld changes."
+msgstr "Letztes Mal: %ld  Änderungen angeaandt und %ld  Änderungen abgeschickt."
 
-#. TRANSLATORS: Please include the word "demo" (or the equivalent in
-#. your language): Funambol is going to be a 90 day demo service
-#. in the future
-#: ../src/gtk-ui/sync-ui.c:1481
+#. TRANSLATORS: the placeholder is a error message (hopefully)
+#. * explaining the problem
+#: ../src/gtk-ui/sync-ui.c:2807
+#, c-format
 msgid ""
-"Backup your contacts and calendar. Sync with a singleclick, anytime, "
-"anywhere (DEMO)."
+"There was a problem with last sync:\n"
+"%s"
 msgstr ""
-"Erstellen Sie Sicherheitskopien Ihrer Kontakte und Ihres Kalenders. Sync mit "
-"einem einzigen Klick, irgendwann, irgendwo (DEMO)."
-
-#: ../src/gtk-ui/sync-ui.c:1509
-msgid "New service"
-msgstr "Neuer Service"
+"Bei der letzten Synchronisation trat ein Problem auf:\n"
+"%s"
 
-#: ../src/gtk-ui/sync-ui.c:1556
-msgid "Server URL"
-msgstr "URL des Servers"
-
-#. TRANSLATORS: placeholder is a source name in settings window
-#: ../src/gtk-ui/sync-ui.c:1578
+#: ../src/gtk-ui/sync-ui.c:2817
 #, c-format
-msgid "%s URI"
-msgstr "URI von %s"
+msgid "You've just restored a backup. The changes have not been synced with %s yet"
+msgstr "Du hast soeben eine Sicherheitskopie erstellt. Die Änderungen wurden noch nicht mit %s synchronisiert."
 
-#: ../src/gtk-ui/sync-ui.c:1715 ../src/gtk-ui/ui.glade.h:17
-msgid "Launch website"
-msgstr "Website starten"
+#: ../src/gtk-ui/sync-ui.c:3105
+msgid "Waiting for current operation to finish..."
+msgstr "Warten auf Beenden des laufenden Vorgangs..."
 
-# shortened to prevent truncation
-# BUT, the only way to make it fit is to leave out the "...and use" portion of the string completely.
-#: ../src/gtk-ui/sync-ui.c:1719
-msgid "Setup and use"
-msgstr "Einrichten"
+#. TRANSLATORS: next strings are error messages.
+#: ../src/gtk-ui/sync-ui.c:3139
+msgid "A normal sync is not possible at this time. The server suggests a slow sync, but this might not always be what you want if both ends already have data."
+msgstr "Eine normale Synchronisation ist zur Zeit nicht möglich. Der Server schlägt eine langsame Synchronisation vor, doch wenn beide Enden bereits Daten haben ist dies vielleicht nicht immer wünschenswert."
 
-# List of manually configured services could not be received from SyncEvolution
-#: ../src/gtk-ui/sync-ui.c:1765
-msgid "Failed to get list of manually setup services from SyncEvolution"
-msgstr ""
-"Liste der manuell konfigurierten Services konnte nicht von SyncEvolution "
-"empfangen werden"
+#: ../src/gtk-ui/sync-ui.c:3143
+msgid "The sync process died unexpectedly."
+msgstr "Sync-Prozess wurde unerwartet abgebrochen."
 
-#: ../src/gtk-ui/sync-ui.c:1806
-msgid "Failed to get list of supported services from SyncEvolution"
-msgstr ""
-"Liste der unterstützten Services konnte nicht von SyncEvolution empfangen "
-"werden"
+#: ../src/gtk-ui/sync-ui.c:3148
+msgid "Password request was not answered. You can save the password in the settings to prevent the request."
+msgstr "Passwortanfrage wurde nicht beantwortet. Du kannst das Passwort in den Einstellungen speichern, um die Anfrage zu vermeiden."
 
-#. TODO: this is a hack... SyncEnd should be a signal of it's own,
-#. not just hacked on top of the syncevolution error codes
-#: ../src/gtk-ui/sync-ui.c:1967
-msgid "Service configuration not found"
-msgstr "Service-Konfiguration nicht gefunden"
+#. TODO use the service device name here, this is a remote problem
+#: ../src/gtk-ui/sync-ui.c:3152
+msgid "There was a problem processing sync request. Trying again may help."
+msgstr "Beim Bearbeiten der Synchronisationsanfrage trat ein Problem auf. Es wird empfohlen, es noch einmal zu versuchen."
 
-#: ../src/gtk-ui/sync-ui.c:1973
-msgid "Not authorized"
-msgstr "Nicht authorisiert"
+#: ../src/gtk-ui/sync-ui.c:3158
+msgid "Failed to login. Could there be a problem with your username or password?"
+msgstr "Anmeldung gescheitert. Es könnte ein Problem mit dem Benutzernamen oder dem Kennwort bestehen."
 
-#: ../src/gtk-ui/sync-ui.c:1975
+#: ../src/gtk-ui/sync-ui.c:3161
 msgid "Forbidden"
 msgstr "Verboten"
 
-#: ../src/gtk-ui/sync-ui.c:1977
-msgid "Not found"
-msgstr "Nicht gefunden"
+#. TRANSLATORS: data source means e.g. calendar or addressbook
+#: ../src/gtk-ui/sync-ui.c:3167
+msgid "A data source could not be found. Could there be a problem with the settings?"
+msgstr "Die Datenquelle wurde nicht gefunden. Könnrte es ein Problem bei den Einstellungen geben?"
 
-#: ../src/gtk-ui/sync-ui.c:1979
-msgid "Fatal database error"
-msgstr "unbehebbarer Datenbankfehler"
+#: ../src/gtk-ui/sync-ui.c:3171
+msgid "Remote database error"
+msgstr "Fehler bei Remote-Datenbank"
 
-#: ../src/gtk-ui/sync-ui.c:1981
-msgid "Database error"
-msgstr "Datenbankfehler"
+#. This can happen when EDS is borked, restart it may help...
+#: ../src/gtk-ui/sync-ui.c:3174
+msgid "There is a problem with the local database. Syncing again or rebooting may help."
+msgstr "Es gibt ein Problem mit der lokalen Datenbank. Es wird empfohlen, noch einmal zu synchronisieren oder den Computer neu zu starten"
 
-#: ../src/gtk-ui/sync-ui.c:1983
-msgid "No space left"
-msgstr "Kein Platz mehr"
+#: ../src/gtk-ui/sync-ui.c:3177
+msgid "No space on disk"
+msgstr "Kein Platz auf der Festplatte"
 
-#. TODO identify problem item somehow ?
-#: ../src/gtk-ui/sync-ui.c:1986
+#: ../src/gtk-ui/sync-ui.c:3179
 msgid "Failed to process SyncML"
 msgstr "SyncML konnte nicht verarbeitet werden"
 
-#: ../src/gtk-ui/sync-ui.c:1988
+#: ../src/gtk-ui/sync-ui.c:3181
 msgid "Server authorization failed"
 msgstr "Serverauthentifizierung fehlgeschlagen"
 
-#: ../src/gtk-ui/sync-ui.c:1990
+#: ../src/gtk-ui/sync-ui.c:3183
 msgid "Failed to parse configuration file"
 msgstr "Konfigurationsdatei konnte nicht analysiert werden"
 
-#: ../src/gtk-ui/sync-ui.c:1992
+#: ../src/gtk-ui/sync-ui.c:3185
 msgid "Failed to read configuration file"
 msgstr "Konfigurationsdatei konnte nicht gelesen werden"
 
-#: ../src/gtk-ui/sync-ui.c:1994
+#: ../src/gtk-ui/sync-ui.c:3187
 msgid "No configuration found"
 msgstr "Keine Konfiguration gefunden"
 
-#: ../src/gtk-ui/sync-ui.c:1996
+#: ../src/gtk-ui/sync-ui.c:3189
 msgid "No configuration file found"
 msgstr "Keine Konfigurationsdatei gefunden"
 
 # "The Server has sent invalid content"
-#: ../src/gtk-ui/sync-ui.c:1998
+#: ../src/gtk-ui/sync-ui.c:3191
 msgid "Server sent bad content"
 msgstr "Der Server hat ungültigen Inhalt gesendet"
 
-#: ../src/gtk-ui/sync-ui.c:2000
-msgid "Transport failure (no connection?)"
-msgstr "Transportfehler (evtl. keine Verbindung?)"
-
-# "the waiting time for the connection has expired"
-#: ../src/gtk-ui/sync-ui.c:2002
-msgid "Connection timed out"
-msgstr "Die Wartezeit für die Verbindung ist abgelaufen"
-
-#: ../src/gtk-ui/sync-ui.c:2004
+#: ../src/gtk-ui/sync-ui.c:3193
 msgid "Connection certificate has expired"
 msgstr "Das Zertifikat der Verbindung ist abgelaufen"
 
-#: ../src/gtk-ui/sync-ui.c:2006
+#: ../src/gtk-ui/sync-ui.c:3195
 msgid "Connection certificate is invalid"
 msgstr "Das Zertifikat der Verbindung ist ungültig"
 
-#: ../src/gtk-ui/sync-ui.c:2009
-msgid "Connection failed"
-msgstr "Verbindung fehlgeschlagen"
+#: ../src/gtk-ui/sync-ui.c:3203
+msgid "We were unable to connect to the server. The problem could be temporary or there could be something wrong with the settings."
+msgstr "Verbindung mit dem Server konnte nicht hergestellt werden. Das Problem ist vielleicht nur temporär, oder es könnte ein Fehler bei den Einstellungen vorliegen."
 
-# "the URL is not correct"
-#: ../src/gtk-ui/sync-ui.c:2011
-msgid "URL is bad"
-msgstr "Die URL ist nicht korrekt"
+#: ../src/gtk-ui/sync-ui.c:3210
+msgid "The server URL is bad"
+msgstr "Server-URL ist nicht korrekt"
 
-#: ../src/gtk-ui/sync-ui.c:2013
-msgid "Server not found"
-msgstr "Server nicht gefunden"
+#: ../src/gtk-ui/sync-ui.c:3215
+msgid "The server was not found"
+msgstr "Der Server wurde nicht gefunden"
 
-#: ../src/gtk-ui/sync-ui.c:2015
+#: ../src/gtk-ui/sync-ui.c:3217
 #, c-format
 msgid "Error %d"
 msgstr "Fehler %d"
 
-#: ../src/gtk-ui/sync-ui.c:2025
-msgid "Sync D-Bus service exited unexpectedly"
-msgstr "D-Bus Synchronisationsservice wurde unerwartet beendet"
-
-# changed to avoid truncation
-#: ../src/gtk-ui/sync-ui.c:2028 ../src/gtk-ui/sync-ui.c:2079
-msgid "Sync Failed"
-msgstr "Sync gescheitert"
-
-#: ../src/gtk-ui/sync-ui.c:2071
-msgid "Sync complete"
-msgstr "Sync beendet"
-
-#: ../src/gtk-ui/sync-ui.c:2076
-msgid "Sync canceled"
-msgstr "Synchronisation abgebrochen"
-
-#. NOTE extra1 can be error here
-#: ../src/gtk-ui/sync-ui.c:2094
-msgid "Ending sync"
-msgstr "Synchronisation wird beendet"
-
-#. TRANSLATORS: placeholder is a source name (e.g. 'Calendar') in a progress text
-#: ../src/gtk-ui/sync-ui.c:2118
-#, c-format
-msgid "Preparing '%s'"
-msgstr "'%s' wird vorbereitet"
+#. TRANSLATORS: password request dialog contents: title, cancel button
+#. * and ok button
+#: ../src/gtk-ui/sync-ui.c:3355
+msgid "Password is required for sync"
+msgstr "Kennwort ist zur Synchronisation erforderlich"
 
-#. TRANSLATORS: placeholder is a source name in a progress text
-#: ../src/gtk-ui/sync-ui.c:2130
-#, c-format
-msgid "Sending '%s'"
-msgstr "'%s' wird gesendet"
+#: ../src/gtk-ui/sync-ui.c:3359
+msgid "Sync with password"
+msgstr "Synchronisation mit Kennwort"
 
-#. TRANSLATORS: placeholder is a source name in a progress text
-#: ../src/gtk-ui/sync-ui.c:2142
+#. TRANSLATORS: password request dialog message, placeholder is service name
+#: ../src/gtk-ui/sync-ui.c:3369
 #, c-format
-msgid "Receiving '%s'"
-msgstr "'%s' wird empfangen"
-
-#: ../src/gtk-ui/ui.glade.h:1
-msgid "<b>Data</b>"
-msgstr "<b>Daten</b>"
+msgid "Please enter password for syncing with %s:"
+msgstr "Kennwort zur Synchronisation eingeben mit %s:"
 
+#. title for the buttons on the right side of main view
 #: ../src/gtk-ui/ui.glade.h:2
-msgid "<b>No sync service in use</b>"
-msgstr "<b>Kein Synchronisations-Service in Gebrauch</b>"
-
-#: ../src/gtk-ui/ui.glade.h:3
-msgid "<b>Sync failure</b>"
-msgstr "<b>Synchronisationsfehler</b>"
+msgid "<b>Actions</b>"
+msgstr "<b>Handlungen</b>"
 
+#. text between the two "start from scratch" buttons in emergency view
 #: ../src/gtk-ui/ui.glade.h:4
-msgid "<b>Type of Sync</b>"
-msgstr "<b>Synchronisationstyp</b>"
+msgid "<b>or</b>"
+msgstr "<b>oder</b>"
 
 #: ../src/gtk-ui/ui.glade.h:5
-msgid "<big>Manual setup</big>"
-msgstr "<big>Manuelle Konfiguration</big>"
+msgid "<big>Direct sync</big>"
+msgstr "<big>Direkte Synchronisation</big>"
 
 #: ../src/gtk-ui/ui.glade.h:6
-msgid "<big>Supported services</big>"
-msgstr "<big>unterstützte Services</big>"
-
-# "add new" - shortened to avoid truncation
-#: ../src/gtk-ui/ui.glade.h:7
-msgid "Add new service"
-msgstr "Neu hinzufügen"
+msgid "<big>Network sync</big>"
+msgstr "<b>Netzwerk-Synchronisation</b>"
 
+#. a title in emergency view
 #: ../src/gtk-ui/ui.glade.h:8
-msgid "Back to sync"
-msgstr "Zurück zur Synchronisation"
+msgid "<big>Restore from backup</big>"
+msgstr "<big>Wiederherstellung von der Sicherheitskopie</big>"
 
-#: ../src/gtk-ui/ui.glade.h:9
-msgid ""
-"Change sync\n"
-"service"
-msgstr ""
-"Synchronisations-\n"
-"Service wechseln"
-
-#: ../src/gtk-ui/ui.glade.h:11
-msgid "Delete all local data and replace it with remote data"
-msgstr "Alle lokalen Daten löschen und mit Remote-Daten ersetzen"
+#. a title in emergency view
+#: ../src/gtk-ui/ui.glade.h:10
+msgid "<big>Slow sync</big>"
+msgstr "<big>Langsame Synchronisation</big>"
 
+#. a title in emergency view
 #: ../src/gtk-ui/ui.glade.h:12
-msgid "Delete all remote data and replace it with local data"
-msgstr "Alle Remote-Daten löschen und mit lokalen Daten ersetzen"
+msgid "<big>Start from scratch</big>"
+msgstr "<big>Neu anfangen</big>"
 
 #: ../src/gtk-ui/ui.glade.h:13
-msgid "Delete this service"
-msgstr "Diesen Service löschen"
-
-#: ../src/gtk-ui/ui.glade.h:14
-msgid "Edit service settings"
-msgstr "Service-Einstellungen bearbeiten"
-
-#: ../src/gtk-ui/ui.glade.h:15
 msgid ""
-"If you don't see your service above but know that your sync provider uses "
-"SyncML\n"
-"you can setup a service manually."
+"A slow sync compares items from both sides and tries to merge them. \n"
+"This may fail in some cases, leading to duplicates or lost information."
 msgstr ""
-"Wenn dein Service nicht aufgelistet ist, aber dein Synchronisationsanbieter "
-"SyncML\n"
-"verwendet, kannst du einen Service manuell konfigurieren."
+"Eine langsame Synchronisation vergleicht Elemente beider Seiten und versucht sie zu zusammenzufügen. \n"
+"Dies kann manchmal fehlschlagen und Duplikate oder verlorene Informationen zur Folge haben."
+
+# "add new" - shortened to avoid truncation
+#: ../src/gtk-ui/ui.glade.h:15
+msgid "Add new device"
+msgstr "Neues Gerät hinzufügen"
+
+# "add new" - shortened to avoid truncation
+#: ../src/gtk-ui/ui.glade.h:16
+msgid "Add new service"
+msgstr "Neu hinzufügen"
 
+#. explanation of "Restore backup" function
 #: ../src/gtk-ui/ui.glade.h:18
-msgid "Merge local and remote data (recommended)"
-msgstr "Lokale und Remote-Daten zusammenführen (empfohlen)"
+msgid "Backups are made before every time we Sync. Choose a backup to restore. Any changes you have made since then will be lost."
+msgstr "Bei jeder Synchronisation wird eine Sicherheitskopie erstellt. Wähle zur Wiederherstellung eine Sicherheitskopie. Seither vorgenommene Änderungen gehen verloren."
 
 #: ../src/gtk-ui/ui.glade.h:19
-msgid "Password"
-msgstr "Kennwort"
-
-#: ../src/gtk-ui/ui.glade.h:20
-msgid "Reset original server settings"
-msgstr "Ursprüngliche Servereinstellungen wiederherstellen"
+msgid "Calendar"
+msgstr "Kalender"
 
+#. Button in main view, right side. Keep to below 20 chars per line, feel free to use two lines
 #: ../src/gtk-ui/ui.glade.h:21
-msgid "Save and use this service"
-msgstr "Diesen Service speichern und benutzen"
-
-#: ../src/gtk-ui/ui.glade.h:22
-msgid "Select sync service"
-msgstr "Synchronisations-Service auswählen"
-
-#: ../src/gtk-ui/ui.glade.h:23
-msgid "Server settings"
-msgstr "Servereinstellungen"
+msgid ""
+"Change or edit\n"
+"sync service"
+msgstr ""
+"Ändern oder bearbeiten\n"
+"Sync Service"
 
+#. close button for settings window
 #: ../src/gtk-ui/ui.glade.h:24
-msgid "Service name"
-msgstr "Service-Name"
+msgid "Close"
+msgstr "Schließen"
 
-# "An Internet connection is needed for synchronization"
 #: ../src/gtk-ui/ui.glade.h:25
 msgid ""
-"Sorry, you need an internet\n"
-"connection to sync."
+"Delete all data on Zyb \n"
+"and replace with your\n"
+"local information"
 msgstr ""
-"Zur Synchronisation ist eine\n"
-"Internetverbindung nötig"
+"Alle Daten auf Zyb löschen \n"
+"und mit lokaler Information\n"
+"ersetzen"
 
-#: ../src/gtk-ui/ui.glade.h:27
-msgid "Stop using this service"
-msgstr "Diesen Service nicht mehr benutzen"
+#: ../src/gtk-ui/ui.glade.h:28
+msgid ""
+"Delete all your local\n"
+"information and replace\n"
+"with data from Zyb"
+msgstr ""
+"Alle lokalen Informationen\n"
+"löschen und ersetzen\n"
+"mit Daten von Zyb"
 
-#: ../src/gtk-ui/ui.glade.h:30
+#. button in main view, right side. Keep length to 20 characters or so, use two lines if needed
+#: ../src/gtk-ui/ui.glade.h:32
 msgid ""
-"Synchronization is not available (D-Bus service does not answer), sorry."
+"Fix a sync\n"
+"emergency"
 msgstr ""
-"Leider ist Synchronisation nicht verfügbar (D-Bus Service antwortet nicht)."
+"Einen Sync\n"
+"Notfall  beheben"
 
-#: ../src/gtk-ui/ui.glade.h:31
+#: ../src/gtk-ui/ui.glade.h:34
 msgid ""
-"To sync you'll need a network connection and an account with a sync "
-"service.\n"
-"We support the following services: "
+"If you don't see your service above but know that your sync provider uses SyncML\n"
+"you can setup a service manually."
 msgstr ""
-"Zur Synchronisation brauchst du eine Netzwerkverbindung und ein Konto bei "
-"einem\n"
-"Synchronisations-Service. Wir unterstützen die folgenden Services:"
+"Wenn dein Service nicht aufgelistet ist, aber dein Synchronisationsanbieter SyncML\n"
+"verwendet, kannst du einen Service manuell konfigurieren."
 
-#: ../src/gtk-ui/ui.glade.h:33
-msgid "Username"
-msgstr "Benutzername"
+#: ../src/gtk-ui/ui.glade.h:36
+msgid "Settings"
+msgstr "Einstellungen"
 
-#: ../src/gtk-ui/ui.glade.h:34
+#: ../src/gtk-ui/ui.glade.h:39
+msgid "Sync Emergency"
+msgstr "Sync Notfall"
+
+#: ../src/gtk-ui/ui.glade.h:41
 msgid ""
-"You haven't selected a sync service yet. Sync services let you \n"
-"synchronize your data between your netbook and a web service."
+"To sync you'll need a network connection and an account with a sync service.\n"
+"We support the following services: "
 msgstr ""
-"Es ist kein Synchronisations-Service ausgewählt. Diese \n"
-"Services synchronisieren das Netbook mit einem Web-Service ."
+"Zur Synchronisation brauchst du eine Netzwerkverbindung und ein Konto bei einem\n"
+"Synchronisations-Service. Wir unterstützen die folgenden Services:"
+
+#: ../src/gtk-ui/ui.glade.h:43
+msgid "Use Bluetooth to Sync your data from one device to another."
+msgstr "Benutze Bluetooth, um die Daten von einem Gerät mit einem anderen zu synchronisieren."
 
-#: ../src/gtk-ui/sync.desktop.in.h:2 ../src/gtk-ui/sync-gtk.desktop.in.h:2
+#: ../src/gtk-ui/ui.glade.h:44
+msgid "You will need to add Bluetooth devices before they can be synced."
+msgstr "Bluetooth-Geräte müssen zugefügt werden, bevor sie synchronisiert werden können."
+
+#: ../src/gtk-ui/sync.desktop.in.h:2
+#: ../src/gtk-ui/sync-gtk.desktop.in.h:2
 msgid "Up to date"
 msgstr "Aktuell bleiben"
 
@@ -574,23 +657,245 @@ msgstr "Aktuell bleiben"
 msgid "Sync (GTK)"
 msgstr "Synchronisation (GTK)"
 
-#~ msgid "Last time: Received one change."
-#~ msgid_plural "Last time: Received %d changes."
-#~ msgstr[0] "Letztes Mal: Eine Änderung erhalten."
-#~ msgstr[1] "Letztes Mal: %d Änderungen erhalten."
+#: ../src/gtk-ui/sync-config-widget.c:74
+msgid "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in sync."
+msgstr "ScheduleWorld erlaubt Ihnen Ihre Kontakte, Events, Aufgaben und Notizen zu synchronisieren."
+
+#: ../src/gtk-ui/sync-config-widget.c:77
+msgid "Google Sync can backup and synchronize your contacts with your Gmail contacts."
+msgstr "Google Synchronisation kann Ihr Addressbuch mit Ihren Gmail Kontakten synchronisieren und eine Sicherheitskopie davon erstellen."
+
+#. TRANSLATORS: Please include the word "demo" (or the equivalent in
+#. your language): Funambol is going to be a 90 day demo service
+#. in the future
+#: ../src/gtk-ui/sync-config-widget.c:83
+msgid "Backup your contacts and calendar. Sync with a single click, anytime, anywhere (DEMO)."
+msgstr "Erstellen Sie Sicherheitskopien Ihrer Kontakte und Ihres Kalenders. Sync mit einem einzigen Klick, irgendwann, irgendwo (DEMO)."
+
+#: ../src/gtk-ui/sync-config-widget.c:86
+msgid "Mobical Backup and Restore service allows you to securely backup your personal mobile data for free."
+msgstr "Mit Mobical Backup und Restore Service kannst du gratis eine Sicherheitskopie deiner persönlichen mobilen Daten erstellen."
+
+#: ../src/gtk-ui/sync-config-widget.c:89
+msgid "ZYB is a simple way for people to store and share mobile information online."
+msgstr "Mit ZYB können mobile Informationen online geteilt und gespeichert werden."
+
+#: ../src/gtk-ui/sync-config-widget.c:92
+msgid "Memotoo lets you access your personal data from any computer connected to the Internet."
+msgstr "Memotoo gibt Zugriff auf persönliche Daten von jedem Computer, der mit dem Internet verbunden ist."
+
+#: ../src/gtk-ui/sync-config-widget.c:188
+msgid "Sorry, failed to save the configuration"
+msgstr "Das Speichern der Konfiguration ist leider fehlgeschlagen"
+
+#: ../src/gtk-ui/sync-config-widget.c:377
+msgid "Service must have a name and server URL"
+msgstr "Der Service muss einen Namen und eine URL haben"
+
+#: ../src/gtk-ui/sync-config-widget.c:418
+#, c-format
+msgid "Do you want to reset the settings for %s? This will not remove any synced information on either end."
+msgstr "Sollen die Einstellungen für %s neu eingerichtet werden? Es wird dabei keine synchronisierte Information gelöscht."
+
+#. TRANSLATORS: buttons in reset-service warning dialog
+#: ../src/gtk-ui/sync-config-widget.c:422
+msgid "Yes, reset"
+msgstr "Ja, neu einrichten"
+
+#: ../src/gtk-ui/sync-config-widget.c:423
+#: ../src/gtk-ui/sync-config-widget.c:434
+msgid "No, keep settings"
+msgstr "Nein, Einstellungen behalten"
+
+#: ../src/gtk-ui/sync-config-widget.c:428
+#, c-format
+msgid "Do you want to delete the settings for %s? This will not remove any synced information on either end but it will remove these settings."
+msgstr "Sollen die Einstellungen für %s gelöscht werden? Dabei werden keine synchronisierten Information gelöscht, jedoch wird die Service-Konfiguration gelöscht."
+
+#. TRANSLATORS: buttons in delete-service warning dialog
+#: ../src/gtk-ui/sync-config-widget.c:433
+msgid "Yes, delete"
+msgstr "Ja, löschen"
+
+#: ../src/gtk-ui/sync-config-widget.c:463
+msgid "Reset settings"
+msgstr "Einstellungen zurücksetzen"
+
+#: ../src/gtk-ui/sync-config-widget.c:466
+msgid "Delete settings"
+msgstr "Einstellungen löschen"
+
+# shortened to prevent truncation
+# BUT, the only way to make it fit is to leave out the "...and use" portion of the string completely.
+#: ../src/gtk-ui/sync-config-widget.c:476
+msgid "Save and use"
+msgstr "Speichern und benutzen"
+
+#: ../src/gtk-ui/sync-config-widget.c:479
+msgid ""
+"Save and replace\n"
+"current service"
+msgstr ""
+"Speichern und ersetzen\n"
+"diesen Service "
+
+#: ../src/gtk-ui/sync-config-widget.c:489
+msgid "Stop using device"
+msgstr "Service nicht mehr benutzen"
+
+#: ../src/gtk-ui/sync-config-widget.c:492
+msgid "Stop using service"
+msgstr "Service nicht mehr benutzen"
+
+#. TRANSLATORS: label for an entry in service configuration form.
+#. * Placeholder is a source  name.
+#. * Example: "Appointments URI"
+#: ../src/gtk-ui/sync-config-widget.c:675
+#, c-format
+msgid "%s URI"
+msgstr "URI von %s"
+
+#. TRANSLATORS: toggles in service configuration form, placeholder is service
+#. * or device name
+#: ../src/gtk-ui/sync-config-widget.c:850
+#, c-format
+msgid "Send changes to %s"
+msgstr "Önderungen senden an %s"
+
+#: ../src/gtk-ui/sync-config-widget.c:855
+#, c-format
+msgid "Receive changes from %s"
+msgstr "Änderungen von %s empfangen"
+
+#: ../src/gtk-ui/sync-config-widget.c:871
+msgid "<b>Sync</b>"
+msgstr "<b>Sync</b>"
+
+#. TRANSLATORS: label of a entry in service configuration
+#: ../src/gtk-ui/sync-config-widget.c:887
+msgid "Server address"
+msgstr "Serveradresse"
+
+#. TRANSLATORS: explanation before a device template combobox.
+#. * Placeholder is a device name like 'Nokia N85' or 'Syncevolution
+#. * Client'
+#: ../src/gtk-ui/sync-config-widget.c:963
+#, c-format
+msgid "This device looks like it might be a '%s'. If this is not correct, please take a look at the list of supported devices and pick yours if it is listed"
+msgstr "Dieses Gerät scheint ein '%s' zu sein. Sollte das nicht stimmen, schau dir bitte die Liste der unterstützten Geräte an, um dein Gerät auszuwählen."
+
+#: ../src/gtk-ui/sync-config-widget.c:969
+msgid "We don't know what this device is exactly. Please take a look at the list of supported devices and pick yours if it is listed"
+msgstr "Dieses Gerät kann nicht genau identifiziert werden. Schau dir bitte die Liste der unterstützten Geräte an, um dein Gerät auszuwählen."
+
+#: ../src/gtk-ui/sync-config-widget.c:1122
+#, c-format
+msgid "%s - Bluetooth device"
+msgstr "%s - Bluetooth-Gerät"
+
+#. TRANSLATORS: service title for services that are not based on a
+#. * template in service list, the placeholder is the name of the service
+#: ../src/gtk-ui/sync-config-widget.c:1128
+#, c-format
+msgid "%s - manually setup"
+msgstr "%s - manuell einrichten"
+
+#. TRANSLATORS: link button in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1803
+msgid "Launch website"
+msgstr "Website starten"
+
+# shortened to prevent truncation
+# BUT, the only way to make it fit is to leave out the "...and use" portion of the string completely.
+#. TRANSLATORS: button in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1812
+msgid "Setup now"
+msgstr "Jetzt einrichten"
+
+#. TRANSLATORS: labels of entries in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1908
+msgid "Username"
+msgstr "Benutzername"
+
+#: ../src/gtk-ui/sync-config-widget.c:1923
+msgid "Password"
+msgstr "Kennwort"
+
+#. TRANSLATORS: warning in service configuration form for people
+#. who have modified the configuration via other means.
+#: ../src/gtk-ui/sync-config-widget.c:1946
+msgid "Current configuration is more complex than what can be shown here. Changes to sync mode or synced data types will overwrite that configuration."
+msgstr "Die Service-Konfiguration ist komplexer als hier angezeigt werden kann. Änderungen am Synchronisationsmodus oder den synchronisierten Datentypen werden diese Konfiguration überschreiben."
+
+#. TRANSLATORS: this is the epander label for server settings
+#. in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1965
+msgid "Hide server settings"
+msgstr "Servereinstellungen "
+
+#. TRANSLATORS: this is the epander label for server settings
+#. in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1985
+msgid "Show server settings"
+msgstr "Servereinstellungen anzeigen"
+
+#: ../src/gnome-bluetooth/syncevolution.c:110
+msgid "Sync in the Sync application"
+msgstr "Sync in der Sync Anwendung"
+
+#: ../src/syncevo-dbus-server.cpp:5622
+#, c-format
+msgid "%s is syncing"
+msgstr "%s Synchronisation"
+
+#: ../src/syncevo-dbus-server.cpp:5623
+#, c-format
+msgid "We have just started to sync your computer with the %s sync service."
+msgstr "Die Synchronisation deines Computers mit dem %s Sync-Service wurde gestartet."
+
+#. if sync is successfully started and done
+#: ../src/syncevo-dbus-server.cpp:5637
+#, c-format
+msgid "%s sync complete"
+msgstr "%s Synchronisation abgeschlossen"
+
+#: ../src/syncevo-dbus-server.cpp:5638
+#, c-format
+msgid "We have just finished syncing your computer with the %s sync service."
+msgstr "Die Synchronisation deines Computers mit dem %s Sync-Service ist abgeschlossen."
+
+#. if sync is successfully started and has errors, or not started successful with a fatal problem
+#: ../src/syncevo-dbus-server.cpp:5643
+msgid "Sync problem."
+msgstr "Sync-Problem"
+
+#: ../src/syncevo-dbus-server.cpp:5644
+msgid "Sorry, there's a problem with your sync that you need to attend to."
+msgstr "Ein Problem mit der Synchronisation bedarf deiner Aufmerksamkeit."
 
-#~ msgid "Last time: Received %d changes and sent %d changes."
-#~ msgstr "Letztes Mal: %d Änderungen erhalten und %d Änderungen abgeschickt."
+#: ../src/syncevo-dbus-server.cpp:5717
+msgid "View"
+msgstr "Anzeigen"
 
-#~ msgid "Setup sync service"
-#~ msgstr "Synchronisations-Service konfigurieren"
+#: ../src/syncevo-dbus-server.cpp:5718
+msgid "Dismiss"
+msgstr "Ignorieren"
 
+#~ msgid "Database error"
+#~ msgstr "Datenbankfehler"
 #~ msgid ""
-#~ "You haven't set up a sync service yet. Sync services let you \n"
-#~ "synchronize your data between your netbook and a web service."
+#~ "Do you want to replace %s with %s? This will not remove any synced "
+#~ "information on either end but you will no longer be able to sync with %s."
 #~ msgstr ""
-#~ "Es ist kein Synchronisations-Service konfiguriert. Diese \n"
-#~ "Services synchronisieren das Netbook mit einem Web-Service ."
+#~ "Soll %s durch %s? ersetzt werden? Es wird dabei keine synchronisierte "
+#~ "Information gelöscht,  Synchronisierung mit %s ist jedoch nichit mehr "
+#~ "möglich."
+#~ msgid "Yes, use %s"
+#~ msgstr "Ja, %s benutzen"
+#~ msgid "No, use %s"
+#~ msgstr "Nein, %s benutzen"
+#~ msgid "Reset service"
+#~ msgstr "Service neu einstellen"
+#~ msgid "Addressbook"
+#~ msgstr "Adressbuch"
 
-#~ msgid "Bring your data with you"
-#~ msgstr "Bring deine Daten mit"
index 6baf6fc..b41394e 100644 (file)
--- a/po/es.po
+++ b/po/es.po
@@ -1,9 +1,8 @@
-#: ../src/gtk-ui/sync-ui.c:764
 msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: http://moblin.org/projects/syncevolution\n"
-"POT-Creation-Date: 2009-10-01 19:27+0000\n"
+"POT-Creation-Date: 2010-04-07 09:29+0000\n"
 "PO-Revision-Date: \n"
 "Last-Translator: Tomás Galicia <tomas.galicia@intel.com>\n"
 "Language-Team: \n"
@@ -16,587 +15,655 @@ msgstr ""
 
 #. TRANSLATORS: this is the application name that may be used by e.g.
 #. the windowmanager
-#: ../src/gtk-ui/main.c:31 ../src/gtk-ui/ui.glade.h:28
+#: ../src/gtk-ui/main.c:40
+#: ../src/gtk-ui/ui.glade.h:38
 #: ../src/gtk-ui/sync.desktop.in.h:1
+#: ../src/gnome-bluetooth/syncevolution.c:112
 msgid "Sync"
-msgstr "Sincronizar"
+msgstr "Sincronizador"
 
-#: ../src/gtk-ui/sync-ui.c:259
-msgid "Addressbook"
-msgstr "Lista de amigos"
+#: ../src/gtk-ui/sync-ui.c:260
+msgid "Contacts"
+msgstr "Contactos"
 
-#: ../src/gtk-ui/sync-ui.c:261
-msgid "Calendar"
-msgstr "Calendario"
+#: ../src/gtk-ui/sync-ui.c:262
+msgid "Appointments"
+msgstr "Citas"
 
-# <to do>
-#: ../src/gtk-ui/sync-ui.c:263
-msgid "Todo"
-msgstr "Por hacer"
+#: ../src/gtk-ui/sync-ui.c:264
+#: ../src/gtk-ui/ui.glade.h:40
+msgid "Tasks"
+msgstr "Tareas"
 
-# Note
-#: ../src/gtk-ui/sync-ui.c:265
-msgid "Memo"
-msgstr "Nota"
+#: ../src/gtk-ui/sync-ui.c:266
+msgid "Notes"
+msgstr "Notas"
 
-# Error while saving the current service into the configuration system GConf
-#: ../src/gtk-ui/sync-ui.c:320
-msgid "Failed to save current service in GConf configuration system"
-msgstr ""
-"Error al guardar el servicio actual en el systema de configuración GConf"
+#. TRANSLATORS: This is a "combination source" for syncing with devices
+#. * that combine appointments and tasks. the name should match the ones
+#. * used for calendar and todo above
+#: ../src/gtk-ui/sync-ui.c:271
+msgid "Appointments & Tasks"
+msgstr "Citas y tareas"
 
-# Error while saving the configuration of the service in SyncEvolution
-#: ../src/gtk-ui/sync-ui.c:331
-msgid "Failed to save service configuration to SyncEvolution"
-msgstr "Error al guardar la configuración del servicio en SyncEvolution"
-
-# Error while saving the current service into the configuration system GConf
-#: ../src/gtk-ui/sync-ui.c:416
-msgid "Failed to get service configuration from SyncEvolution"
-msgstr ""
-"Error al guardar el servicio actual en el systema de configuración GConf"
-
-# Error while deleting the configuration of the service from SyncEvolution
-#: ../src/gtk-ui/sync-ui.c:479
-msgid "Failed to remove service configuration from SyncEvolution"
-msgstr "Error al borrar la configuración del servicio de SyncEvolution"
-
-#: ../src/gtk-ui/sync-ui.c:599
-msgid "Service must have a name and server URL"
-msgstr "El servicio debe llamarse de alguna manera y tener una URL"
-
-#. sync is no longer in progress for some reason
-#: ../src/gtk-ui/sync-ui.c:675
-msgid "Failed to cancel: sync was no longer in progress"
-msgstr ""
-"Error durante la cancelación: ya no estaba efectuándose la sincronización"
-
-# Error during the cancellation of the synchronization
-#: ../src/gtk-ui/sync-ui.c:679
-msgid "Failed to cancel sync"
-msgstr "Error durante la cancelación de la sincronización"
-
-# The synchronization is being cancelled
-#: ../src/gtk-ui/sync-ui.c:683
-msgid "Canceling sync"
-msgstr "Se está cancelando la sincronización"
-
-# We are trying  to cancel the synchronization
-#: ../src/gtk-ui/sync-ui.c:697
-msgid "Trying to cancel sync"
-msgstr "Estamos intentando cancelar la sincronización"
+#: ../src/gtk-ui/sync-ui.c:343
+msgid "Starting sync"
+msgstr "Iniciando..."
 
-#: ../src/gtk-ui/sync-ui.c:704
+#. TRANSLATORS: slow sync confirmation dialog message. Placeholder
+#. * is service/device name
+#: ../src/gtk-ui/sync-ui.c:381
 #, c-format
-msgid ""
-"Do you want to delete all local data and replace it with data from %s? This "
-"is not usually advised."
-msgstr ""
-"¿Quieres borrar todos los datos locales y sustituirlos por los datos de %s? "
-"Normalmente, no es recomendable."
+msgid "Do you want to slow sync with %s?"
+msgstr "Deseas una sincronización lenta con %s?"
 
-#: ../src/gtk-ui/sync-ui.c:709
-#, c-format
-msgid ""
-"Do you want to delete all data in %s and replace it with your local data? "
-"This is not usually advised."
-msgstr ""
-"¿Quieres borrar todos los datos de %s y sustituirlos por los datos locales? "
-"Normalmente, no es recomendable."
+#: ../src/gtk-ui/sync-ui.c:385
+msgid "Yes, do slow sync"
+msgstr "Sí, realizar sincronización lenta"
 
-#: ../src/gtk-ui/sync-ui.c:726
+#: ../src/gtk-ui/sync-ui.c:385
 msgid "No, cancel sync"
 msgstr "No, cancelar la sincronización"
 
-#: ../src/gtk-ui/sync-ui.c:727
+#. TRANSLATORS: confirmation dialog for refresh-from-server. Placeholder
+#. * is service/device name
+#: ../src/gtk-ui/sync-ui.c:418
+#, c-format
+msgid "Do you want to delete all local data and replace it with data from %s? This is not usually advised."
+msgstr "¿Quieres borrar todos los datos locales y sustituirlos por los datos de %s? Normalmente, no es recomendable."
+
+#: ../src/gtk-ui/sync-ui.c:423
+#: ../src/gtk-ui/sync-ui.c:454
 msgid "Yes, delete and replace"
 msgstr "Sí, borrar y reemplazar"
 
-# Synchronization won't take place because it has not been set with what it will be compared to
-#: ../src/gtk-ui/sync-ui.c:749
-msgid "No sources are enabled, not syncing"
-msgstr ""
-"No se hará la sincronización porque no se ha establecido con qué se va a "
-"hacer la comparación"
+#: ../src/gtk-ui/sync-ui.c:423
+#: ../src/gtk-ui/sync-ui.c:454
+#: ../src/gtk-ui/sync-ui.c:1566
+msgid "No"
+msgstr "No"
 
-# A synchronization is already being processed
-#: ../src/gtk-ui/sync-ui.c:766
-msgid "A sync is already in progress"
-msgstr "Ya se está procesando una sincronización"
+#. TRANSLATORS: confirmation dialog for refresh-from-client. Placeholder
+#. * is service/device name
+#: ../src/gtk-ui/sync-ui.c:449
+#, c-format
+msgid "Do you want to delete all data in %s and replace it with your local data? This is not usually advised."
+msgstr "¿Quieres borrar todos los datos de %s y sustituirlos por los datos locales? Normalmente, no es recomendable."
 
-#: ../src/gtk-ui/sync-ui.c:768
-msgid "Failed to start sync"
-msgstr "Error al iniciar la sincronización"
+# We are trying  to cancel the synchronization
+#: ../src/gtk-ui/sync-ui.c:481
+msgid "Trying to cancel sync"
+msgstr "Estamos intentando cancelar la sincronización"
 
-#: ../src/gtk-ui/sync-ui.c:773
-msgid "Starting sync"
-msgstr "Iniciando..."
+# There is no space left
+#: ../src/gtk-ui/sync-ui.c:521
+msgid "No service or device selected"
+msgstr "No se ha seleccionado ningún servicio o dispositivo"
 
 # Last synchronization happened a few seconds ago
-#: ../src/gtk-ui/sync-ui.c:798
-msgid "Last synced just seconds ago"
-msgstr "La última sincronización tuvo lugar hace unos segundos"
+#. TRANSLATORS: This is the title on main view. Placeholder is
+#. * the service name. Example: "Google - synced just now"
+#: ../src/gtk-ui/sync-ui.c:529
+#, c-format
+msgid "%s - synced just now"
+msgstr "%s - se sincronizo hace unos segundos"
 
 # Last synchronization happened one minute ago
-#: ../src/gtk-ui/sync-ui.c:801
-msgid "Last synced a minute ago"
-msgstr "La última sincronización tuvo lugar hace un minuto"
+#: ../src/gtk-ui/sync-ui.c:533
+#, c-format
+msgid "%s - synced a minute ago"
+msgstr "%s - se sincronizo hace un minuto"
 
 # Last synchronization happened %ld minutes ago
-#: ../src/gtk-ui/sync-ui.c:804
+#: ../src/gtk-ui/sync-ui.c:537
 #, c-format
-msgid "Last synced %ld minutes ago"
-msgstr "La última sincronización tuvo lugar hace %ld minutos"
+msgid "%s - synced %ld minutes ago"
+msgstr "%s - se sincronizo hace %ld minutos"
 
 # Last synchronization happened one hour ago
-#: ../src/gtk-ui/sync-ui.c:807
-msgid "Last synced an hour ago"
-msgstr "La última sincronización tuvo lugar hace una hora"
+#: ../src/gtk-ui/sync-ui.c:542
+#, c-format
+msgid "%s - synced an hour ago"
+msgstr "%s - se sincronizo hace una hora"
 
 # Last synchronization happened %ld hours ago
-#: ../src/gtk-ui/sync-ui.c:810
+#: ../src/gtk-ui/sync-ui.c:546
 #, c-format
-msgid "Last synced %ld hours ago"
-msgstr "La última sincronización tuvo lugar hace %ld horas"
+msgid "%s - synced %ld hours ago"
+msgstr "%s - se sincronizo hace %ld horas"
 
 # Last synchronization happened one day ago
-#: ../src/gtk-ui/sync-ui.c:813
-msgid "Last synced a day ago"
-msgstr "La última sincronización tuvo lugar hace un día"
+#: ../src/gtk-ui/sync-ui.c:551
+#, c-format
+msgid "%s - synced a day ago"
+msgstr "%s - se sincronizo hace un día"
 
 # Last synchronization happened %ld days ago
-#: ../src/gtk-ui/sync-ui.c:816
+#: ../src/gtk-ui/sync-ui.c:555
 #, c-format
-msgid "Last synced %ld days ago"
-msgstr "La última sincronización tuvo lugar hace %ld días"
+msgid "%s - synced %ld days ago"
+msgstr "%s - se sincronizo hace %ld días"
+
+#. TRANSLATORS: Action button in info bar in main view. Shown with e.g.
+#. * "You've just restored a backup. The changes have not been "
+#. * "synced with %s yet"
+#: ../src/gtk-ui/sync-ui.c:604
+#: ../src/gtk-ui/sync-ui.c:719
+msgid "Sync now"
+msgstr "¡Sincronízate!"
+
+#. TRANSLATORS: Action button in info bar in main view. Shown with e.g.
+#. * "A normal sync is not possible at this time..." message.
+#. * "Other options" will open Emergency view
+#: ../src/gtk-ui/sync-ui.c:610
+#: ../src/gtk-ui/ui.glade.h:37
+msgid "Slow sync"
+msgstr "Sincronización lenta"
+
+#: ../src/gtk-ui/sync-ui.c:611
+msgid "Other options..."
+msgstr "Otras opciones..."
+
+# Configuration of the synchronization service
+#. TRANSLATORS: Action button in info bar in main view. Shown e.g.
+#. * when no service is selected. Will open configuration view
+#: ../src/gtk-ui/sync-ui.c:616
+msgid "Select sync service"
+msgstr "Selecciona el servicio de sincronización"
+
+# Edit the configuration of the service
+#. TRANSLATORS: Action button in info bar in main view. Shown e.g.
+#. * login to service fails. Will open configuration view for this service
+#: ../src/gtk-ui/sync-ui.c:621
+msgid "Edit service settings"
+msgstr "Editar la configuración del servicio"
 
-#: ../src/gtk-ui/sync-ui.c:901
+# There's no sync service yet between the netbook and a web service.
+#: ../src/gtk-ui/sync-ui.c:670
+msgid "You haven't selected a sync service or device yet. Sync services let you synchronize your data between your netbook and a web service. You can also sync directly with some devices."
+msgstr "Todavía no has seleccionado ningún servicio o dispositivo de sincronización. Estos servicios te permiten sincronizar los datos entre el miniportátil y un servicio web. También puede hacerse directamente con algunos dispositivos."
+
+#: ../src/gtk-ui/sync-ui.c:717
 msgid "Sync again"
 msgstr "¡Sincronízate!"
 
-#: ../src/gtk-ui/sync-ui.c:903 ../src/gtk-ui/ui.glade.h:29
-msgid "Sync now"
-msgstr "¡Sincronízate!"
+#: ../src/gtk-ui/sync-ui.c:730
+msgid "Restoring"
+msgstr "Restaurando"
 
 # Synchronization is taking place
-#: ../src/gtk-ui/sync-ui.c:912
+#: ../src/gtk-ui/sync-ui.c:732
 msgid "Syncing"
 msgstr "Sincronizando..."
 
-#: ../src/gtk-ui/sync-ui.c:918
+#. TRANSLATORS: This is for the button in main view, right side.
+#. Keep line length below ~20 characters, use two lines if needed
+#: ../src/gtk-ui/sync-ui.c:743
+#: ../src/gtk-ui/sync-ui.c:3358
 msgid "Cancel sync"
 msgstr "Cancelar la sincronización"
 
-# %s (not compatible with this service)
-#. TRANSLATORS: placeholder is a source name, shown with checkboxes in main window
-#: ../src/gtk-ui/sync-ui.c:1265
+#: ../src/gtk-ui/sync-ui.c:908
+msgid "Back to sync"
+msgstr "Volver a la sincronización"
+
+#. TRANSLATORS: label for checkbutton/toggle in main view.
+#. * Please stick to similar length strings or break the line with
+#. * "\n" if absolutely needed
+#: ../src/gtk-ui/sync-ui.c:1209
+msgid "Automatic sync"
+msgstr ""
+"Sincronización\n"
+"automática"
+
+#. This is the expander label in emergency view. It summarizes the
+#. * currently selected data sources. First placeholder is service/device
+#. * name, second a comma separeted list of sources.
+#. * E.g. "Affected data: Google Contacts, Appointments"
+#: ../src/gtk-ui/sync-ui.c:1480
+#, c-format
+msgid "Affected data: %s %s"
+msgstr "Datos afectados: %s %s"
+
+#: ../src/gtk-ui/sync-ui.c:1485
+#, c-format
+msgid "Affected data: none"
+msgstr "Datos afectados: ninguno"
+
+#. TRANSLATORS: confirmation for restoring a backup. placeholder is the
+#. * backup time string defined below
+#: ../src/gtk-ui/sync-ui.c:1563
+#, c-format
+msgid "Do you want to restore the backup from %s? All changes you have made since then will be lost."
+msgstr "¿Deseas restaurar la copia de seguridad de %s? Todos los cambios que hayas realizado desde entonces se perderán."
+
+#: ../src/gtk-ui/sync-ui.c:1566
+msgid "Yes, restore"
+msgstr "Sí, restaurar"
+
+#. TRANSLATORS: date/time for strftime(), used in emergency view backup
+#. * label. Any time format that shows date and time is good.
+#: ../src/gtk-ui/sync-ui.c:1598
+#, c-format
+msgid "%x %X"
+msgstr "%x %X"
+
+#. TRANSLATORS: label for a backup in emergency view. Placeholder is
+#. * service or device name
+#: ../src/gtk-ui/sync-ui.c:1617
 #, c-format
-msgid "%s (not supported by this service)"
-msgstr "%s (no es compatible con este servicio)"
+msgid "Backed up before syncing with %s"
+msgstr "Copia de seguridad realizada ante de sincronizar con %s"
+
+#: ../src/gtk-ui/sync-ui.c:1634
+msgid "Restore"
+msgstr "Restaurar"
+
+#. TRANSLATORS: this is an explanation in Emergency view.
+#. * Placeholder is a service/device name
+#: ../src/gtk-ui/sync-ui.c:1741
+#, c-format
+msgid "A normal sync with %s is not possible at this time. You can do a slow two-way sync or start from scratch. You can also restore a backup, but a slow sync or starting from scratch will still be required before normal sync is possible."
+msgstr "Una sincronización normal con %s no es posible en este momento. Puedes realizar una sincronización lenta de dos vías o iniciar de cero. También puedes restaurar una copia de seguridad, pero una sincronización lenta o iniciar de cero igual será necesaria antes de que sea posible una sincronización normal."
+
+#: ../src/gtk-ui/sync-ui.c:1751
+#, c-format
+msgid "If something has gone horribly wrong, you can try a slow sync, start from scratch or restore from backup."
+msgstr "Si algo realmente malo sucede, puedes intentar una sincronización lenta, empezar de cero o restaurar la copia de seguridad."
+
+#. TRANSLATORS: These are a buttons in Emergency view. Placeholder is a
+#. * service/device name. Please don't use too long lines, but feel free to
+#. * use several lines.
+#: ../src/gtk-ui/sync-ui.c:1760
+#, c-format
+msgid ""
+"Delete all your local\n"
+"data and replace with\n"
+"data from %s"
+msgstr ""
+"Borrar todos los datos\n"
+"locales y reemplazarlos con\n"
+"datos de %s"
+
+#: ../src/gtk-ui/sync-ui.c:1766
+#, c-format
+msgid ""
+"Delete all data on\n"
+"%s and replace\n"
+"with your local data"
+msgstr ""
+"Borrar todos los datos en\n"
+"%s y reemplazarlos\n"
+"con tus datos locales"
+
+#: ../src/gtk-ui/sync-ui.c:2226
+msgid "Failed to get list of supported services from SyncEvolution"
+msgstr "Error al obtener la lista de servicios compatibles de SyncEvolution"
+
+#: ../src/gtk-ui/sync-ui.c:2280
+msgid "There was a problem communicating with the sync process. Please try again later."
+msgstr "Ha ocurrido un problema de comunicación en el proceso de sincronización. Inténtalo más tarde."
+
+#: ../src/gtk-ui/sync-ui.c:2339
+msgid "Restore failed"
+msgstr "Restaurar falló"
+
+#: ../src/gtk-ui/sync-ui.c:2342
+#: ../src/gtk-ui/sync-ui.c:3227
+msgid "Sync failed"
+msgstr "Sincronización falló"
+
+#: ../src/gtk-ui/sync-ui.c:2348
+msgid "Restore complete"
+msgstr "Restaurado completo"
+
+#: ../src/gtk-ui/sync-ui.c:2351
+msgid "Sync complete"
+msgstr "¡Sincronizado!"
+
+#: ../src/gtk-ui/sync-ui.c:2443
+#, c-format
+msgid "Preparing '%s'"
+msgstr "Preparando '%s'"
+
+#: ../src/gtk-ui/sync-ui.c:2446
+#, c-format
+msgid "Receiving '%s'"
+msgstr "Recibiendo '%s'"
+
+#: ../src/gtk-ui/sync-ui.c:2449
+#, c-format
+msgid "Sending '%s'"
+msgstr "Enviando '%s'"
 
-#: ../src/gtk-ui/sync-ui.c:1298
+#: ../src/gtk-ui/sync-ui.c:2570
 #, c-format
 msgid "There was one remote rejection."
-msgid_plural "There were %d remote rejections."
-msgstr[0] "Hubo un rechazo remoto"
-msgstr[1] "Hubo %d rechazos remotos"
+msgid_plural "There were %ld remote rejections."
+msgstr[0] "Hubo un rechazo remoto."
+msgstr[1] "Hubo %ld rechazos remotos."
 
-#: ../src/gtk-ui/sync-ui.c:1303
+#: ../src/gtk-ui/sync-ui.c:2575
 #, c-format
 msgid "There was one local rejection."
-msgid_plural "There were %d local rejections."
-msgstr[0] "Hubo un rechazo local"
-msgstr[1] "Hubo %d rechazos locales"
+msgid_plural "There were %ld local rejections."
+msgstr[0] "Hubo un rechazo local."
+msgstr[1] "Hubo %ld rechazos locales."
 
-#: ../src/gtk-ui/sync-ui.c:1308
+#: ../src/gtk-ui/sync-ui.c:2580
 #, c-format
-msgid "There were %d local rejections and %d remote rejections."
-msgstr "Se han producido %d rechazos locales y %d rechazos remotos."
+msgid "There were %ld local rejections and %ld remote rejections."
+msgstr "Se han producido %ld rechazos locales y %ld rechazos remotos."
 
-#: ../src/gtk-ui/sync-ui.c:1313
+#: ../src/gtk-ui/sync-ui.c:2585
 #, c-format
 msgid "Last time: No changes."
 msgstr "La última vez: no hubo cambios."
 
-#: ../src/gtk-ui/sync-ui.c:1315
+#: ../src/gtk-ui/sync-ui.c:2587
 #, c-format
 msgid "Last time: Sent one change."
-msgid_plural "Last time: Sent %d changes."
-msgstr[0] "La última vez: se envió un cambio"
-msgstr[1] "La última vez: se enviaron %d cambios"
+msgid_plural "Last time: Sent %ld changes."
+msgstr[0] "La última vez: se envió un cambio."
+msgstr[1] "La última vez: se enviaron %ld cambios."
 
 #. This is about changes made to the local data. Not all of these
 #. changes were requested by the remote server, so "applied"
 #. is a better word than "received" (bug #5185).
-#: ../src/gtk-ui/sync-ui.c:1323
+#: ../src/gtk-ui/sync-ui.c:2595
 #, c-format
 msgid "Last time: Applied one change."
-msgid_plural "Last time: Applied %d changes."
+msgid_plural "Last time: Applied %ld changes."
 msgstr[0] "La última vez: se aplicó un cambio."
-msgstr[1] "La última vez: se aplicaron %d cambios."
+msgstr[1] "La última vez: se aplicaron %ld cambios."
 
-#: ../src/gtk-ui/sync-ui.c:1328
+#: ../src/gtk-ui/sync-ui.c:2600
 #, c-format
-msgid "Last time: Applied %d changes and sent %d changes."
-msgstr "La última vez: se aplicaron %d cambios y se enviaron %d cambios."
+msgid "Last time: Applied %ld changes and sent %ld changes."
+msgstr "La última vez: se aplicaron %ld cambios y se enviaron %ld cambios."
 
-#: ../src/gtk-ui/sync-ui.c:1420
-msgid "Failed to get server configuration from SyncEvolution"
-msgstr "Error al obtener de SyncEvolution la configuración del servidor"
-
-#: ../src/gtk-ui/sync-ui.c:1472
-msgid ""
-"ScheduleWorld enables you to keep your contacts, events, tasks, and notes in "
-"sync."
-msgstr ""
-"ScheduleWorld te permite sincronizar los contactos, eventos, tareas y notas."
-
-#: ../src/gtk-ui/sync-ui.c:1475
-msgid ""
-"Google Sync can backup and synchronize your Address Book with your Gmail "
-"contacts."
-msgstr ""
-"Google Sync te permite hacer copia de resguardo y sincronizar la agenda de "
-"direcciones y los contactos de Gmail."
-
-#. TRANSLATORS: Please include the word "demo" (or the equivalent in
-#. your language): Funambol is going to be a 90 day demo service
-#. in the future
-#: ../src/gtk-ui/sync-ui.c:1481
+#. TRANSLATORS: the placeholder is a error message (hopefully)
+#. * explaining the problem
+#: ../src/gtk-ui/sync-ui.c:2807
+#, c-format
 msgid ""
-"Backup your contacts and calendar. Sync with a singleclick, anytime, "
-"anywhere (DEMO)."
+"There was a problem with last sync:\n"
+"%s"
 msgstr ""
-"Guarda los contactos y el calendario. Sincronízalos con un clic, en "
-"cualquier momento y desde donde sea (DEMO)."
-
-# New service
-#: ../src/gtk-ui/sync-ui.c:1509
-msgid "New service"
-msgstr "Nuevo servicio"
-
-# URL of the server
-#: ../src/gtk-ui/sync-ui.c:1556
-msgid "Server URL"
-msgstr "URL del servidor"
+"Hubo un problema en la última sincronización:\n"
+"%s"
 
-# URI of %s
-#. TRANSLATORS: placeholder is a source name in settings window
-#: ../src/gtk-ui/sync-ui.c:1578
+#: ../src/gtk-ui/sync-ui.c:2817
 #, c-format
-msgid "%s URI"
-msgstr "URI de %s"
+msgid "You've just restored a backup. The changes have not been synced with %s yet"
+msgstr "Has restaurado una copia de resguardo. Los cambios aún no se sincronizan con %s"
 
-# Open the website
-#: ../src/gtk-ui/sync-ui.c:1715 ../src/gtk-ui/ui.glade.h:17
-msgid "Launch website"
-msgstr "Abrir el sitio web"
+#: ../src/gtk-ui/sync-ui.c:3105
+msgid "Waiting for current operation to finish..."
+msgstr "Esperando que la operación actual termine..."
 
-# Configuring and using
-#: ../src/gtk-ui/sync-ui.c:1719
-msgid "Setup and use"
-msgstr "Configurar y usar"
+#. TRANSLATORS: next strings are error messages.
+#: ../src/gtk-ui/sync-ui.c:3139
+msgid "A normal sync is not possible at this time. The server suggests a slow sync, but this might not always be what you want if both ends already have data."
+msgstr "Una sincronización normal no es posible en este momento. El servidor sugiere una sincronización lenta, pero esto no es necesariamente lo que deseas si ambas partes ya tienen datos."
 
-# Error while obtaining the list of services configured manually from SyncEvolution
-#: ../src/gtk-ui/sync-ui.c:1765
-msgid "Failed to get list of manually setup services from SyncEvolution"
-msgstr ""
-"Error al obtener de SyncEvolution la lista de servicios establecidos "
-"manualmente"
+# the syncronization service D-Bus closed unexpectedly
+#: ../src/gtk-ui/sync-ui.c:3143
+msgid "The sync process died unexpectedly."
+msgstr "El servicio de sincronización se cerró inesperadamente."
 
-#: ../src/gtk-ui/sync-ui.c:1806
-msgid "Failed to get list of supported services from SyncEvolution"
-msgstr "Error al obtener la lista de servicios compatibles de SyncEvolution"
+#: ../src/gtk-ui/sync-ui.c:3148
+msgid "Password request was not answered. You can save the password in the settings to prevent the request."
+msgstr "No se ha respondido a la solicitud de contraseña. Para evitar que aparezca otra vez, se puede guardar la contraseña en los ajustes."
 
-# The configuration service has not been found
-#. TODO: this is a hack... SyncEnd should be a signal of it's own,
-#. not just hacked on top of the syncevolution error codes
-#: ../src/gtk-ui/sync-ui.c:1967
-msgid "Service configuration not found"
-msgstr "No se ha encontrado el servicio de configuración"
+#. TODO use the service device name here, this is a remote problem
+#: ../src/gtk-ui/sync-ui.c:3152
+msgid "There was a problem processing sync request. Trying again may help."
+msgstr "Ha ocurrido un problema al procesar la solicitud de sincronización. Intentar otra vez puede ayudar."
 
-#: ../src/gtk-ui/sync-ui.c:1973
-msgid "Not authorized"
-msgstr "No autorizado"
+#: ../src/gtk-ui/sync-ui.c:3158
+msgid "Failed to login. Could there be a problem with your username or password?"
+msgstr "Acceso fallido. ¿Podría haber algún problema con tu usuario o contraseña?"
 
-#: ../src/gtk-ui/sync-ui.c:1975
+#: ../src/gtk-ui/sync-ui.c:3161
 msgid "Forbidden"
 msgstr "Prohibido"
 
-# has not been found
-#: ../src/gtk-ui/sync-ui.c:1977
-msgid "Not found"
-msgstr "No se ha encontrado"
+#. TRANSLATORS: data source means e.g. calendar or addressbook
+#: ../src/gtk-ui/sync-ui.c:3167
+msgid "A data source could not be found. Could there be a problem with the settings?"
+msgstr "No se pudo hallar la fuente de datos. ¿Podría haber algún problema con la configuración?"
 
 # Fatal error in the database
-#: ../src/gtk-ui/sync-ui.c:1979
-msgid "Fatal database error"
-msgstr "Error fatal en la base de datos"
+#: ../src/gtk-ui/sync-ui.c:3171
+msgid "Remote database error"
+msgstr "Error en la base de datos remota"
 
-#: ../src/gtk-ui/sync-ui.c:1981
-msgid "Database error"
-msgstr "Error en la base de datos"
+#. This can happen when EDS is borked, restart it may help...
+#: ../src/gtk-ui/sync-ui.c:3174
+msgid "There is a problem with the local database. Syncing again or rebooting may help."
+msgstr "Hay un problema con la base de datos local. Sincronizar otra vez o reiniciar puede ayudar."
 
 # There is no space left
-#: ../src/gtk-ui/sync-ui.c:1983
-msgid "No space left"
+#: ../src/gtk-ui/sync-ui.c:3177
+msgid "No space on disk"
 msgstr "No queda espacio"
 
-#. TODO identify problem item somehow ?
-#: ../src/gtk-ui/sync-ui.c:1986
+#: ../src/gtk-ui/sync-ui.c:3179
 msgid "Failed to process SyncML"
 msgstr "Error al procesar SyncML"
 
 # the server didn't accept the authorization
-#: ../src/gtk-ui/sync-ui.c:1988
+#: ../src/gtk-ui/sync-ui.c:3181
 msgid "Server authorization failed"
 msgstr "El servidor no ha aceptado la autorización"
 
 # Error while analysing the syntax of the configuration file
-#: ../src/gtk-ui/sync-ui.c:1990
+#: ../src/gtk-ui/sync-ui.c:3183
 msgid "Failed to parse configuration file"
 msgstr "Error al analizar la sintaxis del archivo de configuración"
 
 # Error while reading the configuration file
-#: ../src/gtk-ui/sync-ui.c:1992
+#: ../src/gtk-ui/sync-ui.c:3185
 msgid "Failed to read configuration file"
 msgstr "Error al leer del archivo de configuración"
 
 # The configuration has not been found
-#: ../src/gtk-ui/sync-ui.c:1994
+#: ../src/gtk-ui/sync-ui.c:3187
 msgid "No configuration found"
 msgstr "No se ha encontrado la configuración"
 
 # The configuration file has not been found
-#: ../src/gtk-ui/sync-ui.c:1996
+#: ../src/gtk-ui/sync-ui.c:3189
 msgid "No configuration file found"
 msgstr "No se ha encontrado el archivo de configuración"
 
 # The server sent an an invalid content
-#: ../src/gtk-ui/sync-ui.c:1998
+#: ../src/gtk-ui/sync-ui.c:3191
 msgid "Server sent bad content"
 msgstr "El servidor envió un contenido no válido"
 
-# Error during transport (is there no connection?)
-#: ../src/gtk-ui/sync-ui.c:2000
-msgid "Transport failure (no connection?)"
-msgstr "Error durante el transporte (¿no hay conexión?)"
-
-# Connection went over the waiting time
-#: ../src/gtk-ui/sync-ui.c:2002
-msgid "Connection timed out"
-msgstr "La conexión superó el tiempo de espera"
-
-#: ../src/gtk-ui/sync-ui.c:2004
+#: ../src/gtk-ui/sync-ui.c:3193
 msgid "Connection certificate has expired"
 msgstr "El certificado de conexión está vencido"
 
 # The connection certificate is not valid
-#: ../src/gtk-ui/sync-ui.c:2006
+#: ../src/gtk-ui/sync-ui.c:3195
 msgid "Connection certificate is invalid"
 msgstr "El certificado de conexión no es válido"
 
-#: ../src/gtk-ui/sync-ui.c:2009
-msgid "Connection failed"
-msgstr "Falló la conexión"
+#: ../src/gtk-ui/sync-ui.c:3203
+msgid "We were unable to connect to the server. The problem could be temporary or there could be something wrong with the settings."
+msgstr "No hemos podido conectarnos con el servidor. El problema podría ser temporal o podría haber algún problema con la configuración."
 
 # The URL is incorrect
-#: ../src/gtk-ui/sync-ui.c:2011
-msgid "URL is bad"
-msgstr "La URL es incorrecta"
+#: ../src/gtk-ui/sync-ui.c:3210
+msgid "The server URL is bad"
+msgstr "La URL del servidor es incorrecta"
 
-#: ../src/gtk-ui/sync-ui.c:2013
-msgid "Server not found"
+#: ../src/gtk-ui/sync-ui.c:3215
+msgid "The server was not found"
 msgstr "No se ha encontrado el servidor"
 
-#: ../src/gtk-ui/sync-ui.c:2015
+#: ../src/gtk-ui/sync-ui.c:3217
 #, c-format
 msgid "Error %d"
 msgstr "Error: %d"
 
-# the syncronization service D-Bus closed unexpectedly
-#: ../src/gtk-ui/sync-ui.c:2025
-msgid "Sync D-Bus service exited unexpectedly"
-msgstr "El servicio de sincronización D-Bus se cerró inesperadamente"
-
-#: ../src/gtk-ui/sync-ui.c:2028 ../src/gtk-ui/sync-ui.c:2079
-msgid "Sync Failed"
-msgstr "No funcionó"
-
-#: ../src/gtk-ui/sync-ui.c:2071
-msgid "Sync complete"
-msgstr "¡Sincronizado!"
+#. TRANSLATORS: password request dialog contents: title, cancel button
+#. * and ok button
+#: ../src/gtk-ui/sync-ui.c:3355
+msgid "Password is required for sync"
+msgstr "Se requiere contraseña para la sincronización"
 
-#: ../src/gtk-ui/sync-ui.c:2076
-msgid "Sync canceled"
-msgstr "Cancelada"
+#: ../src/gtk-ui/sync-ui.c:3359
+msgid "Sync with password"
+msgstr "Sincronización con contraseña"
 
-#. NOTE extra1 can be error here
-#: ../src/gtk-ui/sync-ui.c:2094
-msgid "Ending sync"
-msgstr "Terminando..."
-
-#. TRANSLATORS: placeholder is a source name (e.g. 'Calendar') in a progress text
-#: ../src/gtk-ui/sync-ui.c:2118
+#. TRANSLATORS: password request dialog message, placeholder is service name
+#: ../src/gtk-ui/sync-ui.c:3369
 #, c-format
-msgid "Preparing '%s'"
-msgstr "Preparando: '%s'"
+msgid "Please enter password for syncing with %s:"
+msgstr "Por favor ingresa la contraseña para sincronizar con %s:"
 
-#. TRANSLATORS: placeholder is a source name in a progress text
-#: ../src/gtk-ui/sync-ui.c:2130
-#, c-format
-msgid "Sending '%s'"
-msgstr "Enviando: '%s'"
-
-#. TRANSLATORS: placeholder is a source name in a progress text
-#: ../src/gtk-ui/sync-ui.c:2142
-#, c-format
-msgid "Receiving '%s'"
-msgstr "Recibiendo: '%s'"
-
-#: ../src/gtk-ui/ui.glade.h:1
-msgid "<b>Data</b>"
-msgstr "<b>Datos</b>"
-
-# there's no synchronization service in use
+#. title for the buttons on the right side of main view
 #: ../src/gtk-ui/ui.glade.h:2
-msgid "<b>No sync service in use</b>"
-msgstr "<b>No se está usando ningún servicio de sincronización</b>"
-
-#: ../src/gtk-ui/ui.glade.h:3
-msgid "<b>Sync failure</b>"
-msgstr "<b>Error en la sincronización</b>"
+msgid "<b>Actions</b>"
+msgstr "<b>Acciones</b>"
 
+#. text between the two "start from scratch" buttons in emergency view
 #: ../src/gtk-ui/ui.glade.h:4
-msgid "<b>Type of Sync</b>"
-msgstr "<b>Tipo de sincronización</b>"
+msgid "<b>or</b>"
+msgstr "<b>o</b>"
 
+# compatible services
 #: ../src/gtk-ui/ui.glade.h:5
-msgid "<big>Manual setup</big>"
-msgstr "<big>Configuración manual</big>"
+msgid "<big>Direct sync</big>"
+msgstr "<big>Sincronización directa</big>"
 
-# compatible services
 #: ../src/gtk-ui/ui.glade.h:6
-msgid "<big>Supported services</big>"
-msgstr "<big>Servicios compatibles</big>"
-
-#: ../src/gtk-ui/ui.glade.h:7
-msgid "Add new service"
-msgstr "Agregar servicio"
+msgid "<big>Network sync</big>"
+msgstr "<big>Sincronización de red</big>"
 
+#. a title in emergency view
 #: ../src/gtk-ui/ui.glade.h:8
-msgid "Back to sync"
-msgstr "Volver a la sincronización"
+msgid "<big>Restore from backup</big>"
+msgstr "<big>Restaurar de la copia de seguridad</big>"
 
-#: ../src/gtk-ui/ui.glade.h:9
-msgid ""
-"Change sync\n"
-"service"
-msgstr ""
-"Cambiar el servicio\n"
-"de sincronización"
-
-#: ../src/gtk-ui/ui.glade.h:11
-msgid "Delete all local data and replace it with remote data"
-msgstr "Borrar todos los datos locales y sustituirlos por los remotos"
+# compatible services
+#. a title in emergency view
+#: ../src/gtk-ui/ui.glade.h:10
+msgid "<big>Slow sync</big>"
+msgstr "<big>Sincronización lenta</big>"
 
+# compatible services
+#. a title in emergency view
 #: ../src/gtk-ui/ui.glade.h:12
-msgid "Delete all remote data and replace it with local data"
-msgstr "Borrar todos los datos remotos y sustituirlos por los locales"
+msgid "<big>Start from scratch</big>"
+msgstr "<big>Comenzar desde cero</big>"
 
 #: ../src/gtk-ui/ui.glade.h:13
-msgid "Delete this service"
-msgstr "Borrar este servicio"
-
-# Edit the configuration of the service
-#: ../src/gtk-ui/ui.glade.h:14
-msgid "Edit service settings"
-msgstr "Editar la configuración del servicio"
-
-#: ../src/gtk-ui/ui.glade.h:15
 msgid ""
-"If you don't see your service above but know that your sync provider uses "
-"SyncML\n"
-"you can setup a service manually."
+"A slow sync compares items from both sides and tries to merge them. \n"
+"This may fail in some cases, leading to duplicates or lost information."
 msgstr ""
-"Si no puedes ver tú servicio de sincronización arriba, pero sabes que tú "
-"proveedor emplea SyncML\n"
-"puedes configurar el servicio manualmente."
+"Una sincronización lenta compara elementos de ambos lados e intenta combinarlos. \n"
+"Esto puede fallar en algunos casos, creando duplicados o perdida de información."
+
+#: ../src/gtk-ui/ui.glade.h:15
+msgid "Add new device"
+msgstr "Agregar nuevo dispositivo"
+
+#: ../src/gtk-ui/ui.glade.h:16
+msgid "Add new service"
+msgstr "Agregar servicio"
 
+#. explanation of "Restore backup" function
 #: ../src/gtk-ui/ui.glade.h:18
-msgid "Merge local and remote data (recommended)"
-msgstr "Combinar los datos locales y remotos (recomendado)"
+msgid "Backups are made before every time we Sync. Choose a backup to restore. Any changes you have made since then will be lost."
+msgstr "Las copias de seguridad son realizadas antes cada vez que sincronizamos. Elije una copia de seguridad para restaurar. Cualquier cambio que hayas realizado desde entonces se perderá."
 
 #: ../src/gtk-ui/ui.glade.h:19
-msgid "Password"
-msgstr "Contraseña"
-
-# Go back to the original configuration of the server
-#: ../src/gtk-ui/ui.glade.h:20
-msgid "Reset original server settings"
-msgstr "Volver a la configuración original del servidor"
+msgid "Calendar"
+msgstr "Calendario"
 
+#. Button in main view, right side. Keep to below 20 chars per line, feel free to use two lines
 #: ../src/gtk-ui/ui.glade.h:21
-msgid "Save and use this service"
-msgstr "Guardar y usar este servicio"
-
-# Configuration of the synchronization service
-#: ../src/gtk-ui/ui.glade.h:22
-msgid "Select sync service"
-msgstr "Selecciona el servicio de sincronización"
-
-#: ../src/gtk-ui/ui.glade.h:23
-msgid "Server settings"
-msgstr "Configuración del servidor"
+msgid ""
+"Change or edit\n"
+"sync service"
+msgstr ""
+"Cambiar o editar\n"
+"servicio de sincronización"
 
+#. close button for settings window
 #: ../src/gtk-ui/ui.glade.h:24
-msgid "Service name"
-msgstr "Nombre del servicio"
+msgid "Close"
+msgstr "Cerrar"
 
-# Synchronization needs an Internet connection.
 #: ../src/gtk-ui/ui.glade.h:25
 msgid ""
-"Sorry, you need an internet\n"
-"connection to sync."
+"Delete all data on Zyb \n"
+"and replace with your\n"
+"local information"
 msgstr ""
-"La sincronización necesita\n"
-"una conexión a Internet."
+"Borrar todos los datos en Zyb \n"
+"y sustituirlos con tu\n"
+"información local"
 
-#: ../src/gtk-ui/ui.glade.h:27
-msgid "Stop using this service"
-msgstr "Dejar de usar este servicio"
+#: ../src/gtk-ui/ui.glade.h:28
+msgid ""
+"Delete all your local\n"
+"information and replace\n"
+"with data from Zyb"
+msgstr ""
+"Borrar todos los datos\n"
+"locales y reemplazarlos con\n"
+"datos de %s"
 
-#: ../src/gtk-ui/ui.glade.h:30
+#. button in main view, right side. Keep length to 20 characters or so, use two lines if needed
+#: ../src/gtk-ui/ui.glade.h:32
 msgid ""
-"Synchronization is not available (D-Bus service does not answer), sorry."
+"Fix a sync\n"
+"emergency"
 msgstr ""
-"Lo sentimos, pero la sincronización no está disponible (el servicio D-Bus no "
-"responde)."
+"Arreglar una sincronización\n"
+"de emergencia"
 
-#: ../src/gtk-ui/ui.glade.h:31
+#: ../src/gtk-ui/ui.glade.h:34
 msgid ""
-"To sync you'll need a network connection and an account with a sync "
-"service.\n"
-"We support the following services: "
+"If you don't see your service above but know that your sync provider uses SyncML\n"
+"you can setup a service manually."
 msgstr ""
-"Para ejecutar la sincronización hacen falta una conexión de red y una "
-"cuenta\n"
-"en un servicio de sincronización. Son compatibles los siguientes servicios:"
+"Si no puedes ver tú servicio de sincronización arriba, pero sabes que tú proveedor emplea SyncML\n"
+"puedes configurar el servicio manualmente."
 
-#: ../src/gtk-ui/ui.glade.h:33
-msgid "Username"
-msgstr "Usuario"
+#: ../src/gtk-ui/ui.glade.h:36
+msgid "Settings"
+msgstr "Configuración"
 
-# There's no sync service yet between the netbook and a web service.
-#: ../src/gtk-ui/ui.glade.h:34
+#: ../src/gtk-ui/ui.glade.h:39
+msgid "Sync Emergency"
+msgstr "Sincronización de emergencia"
+
+#: ../src/gtk-ui/ui.glade.h:41
 msgid ""
-"You haven't selected a sync service yet. Sync services let you \n"
-"synchronize your data between your netbook and a web service."
+"To sync you'll need a network connection and an account with a sync service.\n"
+"We support the following services: "
 msgstr ""
-"Todavía no se ha seleccionado ningún servicio\n"
-"de sincronización entre el miniportátil y un servicio web."
+"Para ejecutar la sincronización hacen falta una conexión de red y una cuenta en un servicio de sincronización. \n"
+"Son compatibles los siguientes servicios:"
 
-#: ../src/gtk-ui/sync.desktop.in.h:2 ../src/gtk-ui/sync-gtk.desktop.in.h:2
+#: ../src/gtk-ui/ui.glade.h:43
+msgid "Use Bluetooth to Sync your data from one device to another."
+msgstr "Utiliza Bluetooth para sincronizar tus datos a partir de un dispositivo a otro. "
+
+#: ../src/gtk-ui/ui.glade.h:44
+msgid "You will need to add Bluetooth devices before they can be synced."
+msgstr "Necesitarás agregar dispositivos Bluetooth antes de que puedan ser sincronizados."
+
+#: ../src/gtk-ui/sync.desktop.in.h:2
+#: ../src/gtk-ui/sync-gtk.desktop.in.h:2
 msgid "Up to date"
 msgstr "Al día"
 
@@ -604,5 +671,243 @@ msgstr "Al día"
 msgid "Sync (GTK)"
 msgstr "Sync (GTK)"
 
-#~ msgid "Bring your data with you"
-#~ msgstr "Llévate tus datos"
+#: ../src/gtk-ui/sync-config-widget.c:74
+msgid "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in sync."
+msgstr "ScheduleWorld te permite sincronizar los contactos, eventos, tareas y notas."
+
+#: ../src/gtk-ui/sync-config-widget.c:77
+msgid "Google Sync can backup and synchronize your contacts with your Gmail contacts."
+msgstr "Google Sync puede hacer copia de resguardo y sincroniza tus contactos y con los que tengas en Gmail."
+
+#. TRANSLATORS: Please include the word "demo" (or the equivalent in
+#. your language): Funambol is going to be a 90 day demo service
+#. in the future
+#: ../src/gtk-ui/sync-config-widget.c:83
+msgid "Backup your contacts and calendar. Sync with a single click, anytime, anywhere (DEMO)."
+msgstr "Resguarda tus contactos y el calendario. Sincronízalos con un clic, en cualquier momento y desde donde sea (DEMO)."
+
+#: ../src/gtk-ui/sync-config-widget.c:86
+msgid "Mobical Backup and Restore service allows you to securely backup your personal mobile data for free."
+msgstr "El servicio Mobical Backup and Restore te permite realizar copias de resguardo seguras de la información de tu móvil gratis."
+
+#: ../src/gtk-ui/sync-config-widget.c:89
+msgid "ZYB is a simple way for people to store and share mobile information online."
+msgstr "ZYB es una manera simple para que la gente almacene y comparta la información móvil en línea."
+
+#: ../src/gtk-ui/sync-config-widget.c:92
+msgid "Memotoo lets you access your personal data from any computer connected to the Internet."
+msgstr "Memotoo te permite acceder a tus datos personales desde cualquier computadora conectada con Internet."
+
+# Error while analysing the syntax of the configuration file
+#: ../src/gtk-ui/sync-config-widget.c:188
+msgid "Sorry, failed to save the configuration"
+msgstr "Lo sentimos, no se pudo guardar la configuración"
+
+#: ../src/gtk-ui/sync-config-widget.c:377
+msgid "Service must have a name and server URL"
+msgstr "El servicio debe llamarse de alguna manera y tener una URL"
+
+#: ../src/gtk-ui/sync-config-widget.c:418
+#, c-format
+msgid "Do you want to reset the settings for %s? This will not remove any synced information on either end."
+msgstr "¿Deseas reajustar la configuración para %s? Esto no removerá ninguna información sincronizada en las partes."
+
+#. TRANSLATORS: buttons in reset-service warning dialog
+#: ../src/gtk-ui/sync-config-widget.c:422
+msgid "Yes, reset"
+msgstr "Sí, reiniciar"
+
+#: ../src/gtk-ui/sync-config-widget.c:423
+#: ../src/gtk-ui/sync-config-widget.c:434
+msgid "No, keep settings"
+msgstr "No, mantener configuración"
+
+#: ../src/gtk-ui/sync-config-widget.c:428
+#, c-format
+msgid "Do you want to delete the settings for %s? This will not remove any synced information on either end but it will remove these settings."
+msgstr "¿Quieres eliminar la configuración de %s? Esto no eliminará ninguna información sincronizada en ninguno de los dos lados, pero eliminará esta configuración. "
+
+#. TRANSLATORS: buttons in delete-service warning dialog
+#: ../src/gtk-ui/sync-config-widget.c:433
+msgid "Yes, delete"
+msgstr "Sí, borrar"
+
+#: ../src/gtk-ui/sync-config-widget.c:463
+msgid "Reset settings"
+msgstr "Devolver la configuración a sus valores originales"
+
+#: ../src/gtk-ui/sync-config-widget.c:466
+msgid "Delete settings"
+msgstr "Borrar la configuración"
+
+# Configuring and using
+#: ../src/gtk-ui/sync-config-widget.c:476
+msgid "Save and use"
+msgstr "Guardar y usar"
+
+#: ../src/gtk-ui/sync-config-widget.c:479
+msgid ""
+"Save and replace\n"
+"current service"
+msgstr ""
+"Guardar y reeemplazar\n"
+"servicio actual"
+
+#: ../src/gtk-ui/sync-config-widget.c:489
+msgid "Stop using device"
+msgstr "Dejar de usar este dispositivo"
+
+#: ../src/gtk-ui/sync-config-widget.c:492
+msgid "Stop using service"
+msgstr "Dejar de usar este servicio"
+
+# URI of %s
+#. TRANSLATORS: label for an entry in service configuration form.
+#. * Placeholder is a source  name.
+#. * Example: "Appointments URI"
+#: ../src/gtk-ui/sync-config-widget.c:675
+#, c-format
+msgid "%s URI"
+msgstr "URI de %s"
+
+#. TRANSLATORS: toggles in service configuration form, placeholder is service
+#. * or device name
+#: ../src/gtk-ui/sync-config-widget.c:850
+#, c-format
+msgid "Send changes to %s"
+msgstr "Enviar cambios a %s"
+
+#: ../src/gtk-ui/sync-config-widget.c:855
+#, c-format
+msgid "Receive changes from %s"
+msgstr "Recibir cambio de %s"
+
+#: ../src/gtk-ui/sync-config-widget.c:871
+msgid "<b>Sync</b>"
+msgstr "<b>Sincronizar</b>"
+
+#. TRANSLATORS: label of a entry in service configuration
+#: ../src/gtk-ui/sync-config-widget.c:887
+msgid "Server address"
+msgstr "Dirección del servidor"
+
+# I had to use colon to avoid the problem of selecting a masculine or feminine gender in the article, which would create problems down the road.
+#. TRANSLATORS: explanation before a device template combobox.
+#. * Placeholder is a device name like 'Nokia N85' or 'Syncevolution
+#. * Client'
+#: ../src/gtk-ui/sync-config-widget.c:963
+#, c-format
+msgid "This device looks like it might be a '%s'. If this is not correct, please take a look at the list of supported devices and pick yours if it is listed"
+msgstr "Parece que este dispositivo es: %s'. Si no es cierto, mira la lista de los dispositivos compatibles y selecciona el correcto, si aparece."
+
+#: ../src/gtk-ui/sync-config-widget.c:969
+msgid "We don't know what this device is exactly. Please take a look at the list of supported devices and pick yours if it is listed"
+msgstr "No sabemos qué dispositivo es éste. Mira la lista de los dispositivos compatibles y selecciona el correcto, si aparece."
+
+#: ../src/gtk-ui/sync-config-widget.c:1122
+#, c-format
+msgid "%s - Bluetooth device"
+msgstr "%s - Dispositivo Bluetooth"
+
+#. TRANSLATORS: service title for services that are not based on a
+#. * template in service list, the placeholder is the name of the service
+#: ../src/gtk-ui/sync-config-widget.c:1128
+#, c-format
+msgid "%s - manually setup"
+msgstr "%s - configurar manualmente"
+
+# Open the website
+#. TRANSLATORS: link button in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1803
+msgid "Launch website"
+msgstr "Abrir el sitio web"
+
+# Configuring and using
+#. TRANSLATORS: button in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1812
+msgid "Setup now"
+msgstr "Configurar ahora"
+
+#. TRANSLATORS: labels of entries in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1908
+msgid "Username"
+msgstr "Usuario"
+
+#: ../src/gtk-ui/sync-config-widget.c:1923
+msgid "Password"
+msgstr "Contraseña"
+
+#. TRANSLATORS: warning in service configuration form for people
+#. who have modified the configuration via other means.
+#: ../src/gtk-ui/sync-config-widget.c:1946
+msgid "Current configuration is more complex than what can be shown here. Changes to sync mode or synced data types will overwrite that configuration."
+msgstr "La configuración es más compleja de lo que podemos mostrar aquí. Cambios en el modo de sincronización o los tipos de datos sincronizados sobrescribirán esa configuración."
+
+#. TRANSLATORS: this is the epander label for server settings
+#. in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1965
+msgid "Hide server settings"
+msgstr "Ocultar la configuración del servidor"
+
+#. TRANSLATORS: this is the epander label for server settings
+#. in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1985
+msgid "Show server settings"
+msgstr "Mostrar la configuración del servidor"
+
+#: ../src/gnome-bluetooth/syncevolution.c:110
+msgid "Sync in the Sync application"
+msgstr "Sincronizar en la aplicación de sincronización"
+
+# Synchronization is taking place
+#: ../src/syncevo-dbus-server.cpp:5622
+#, c-format
+msgid "%s is syncing"
+msgstr "%s está sincronizándose"
+
+#: ../src/syncevo-dbus-server.cpp:5623
+#, c-format
+msgid "We have just started to sync your computer with the %s sync service."
+msgstr "Hemos empezado a sincronizar esta máquina con el servicio de sincronización %s."
+
+#. if sync is successfully started and done
+#: ../src/syncevo-dbus-server.cpp:5637
+#, c-format
+msgid "%s sync complete"
+msgstr "Se ha completado la sincronización de %s"
+
+#: ../src/syncevo-dbus-server.cpp:5638
+#, c-format
+msgid "We have just finished syncing your computer with the %s sync service."
+msgstr "Hemos terminado de sincronizar esta máquina con el servicio de sincronización %s."
+
+#. if sync is successfully started and has errors, or not started successful with a fatal problem
+#: ../src/syncevo-dbus-server.cpp:5643
+msgid "Sync problem."
+msgstr "Problemas en la sincronización."
+
+#: ../src/syncevo-dbus-server.cpp:5644
+msgid "Sorry, there's a problem with your sync that you need to attend to."
+msgstr "Ha ocurrido un problema durante la sincronización que debes solucionar."
+
+#: ../src/syncevo-dbus-server.cpp:5717
+msgid "View"
+msgstr "Ver"
+
+#: ../src/syncevo-dbus-server.cpp:5718
+msgid "Dismiss"
+msgstr "Cerrar"
+
+#~ msgid ""
+#~ "Do you want to replace %s with %s? This will not remove any synced "
+#~ "information on either end but you will no longer be able to sync with %s."
+#~ msgstr ""
+#~ "¿Deseas reemplazar %s por %s? Esto no removerá ninguna información "
+#~ "sincronizada en las partes pero no podrás volver a sincronizar con %s."
+#~ msgid "Yes, use %s"
+#~ msgstr "Sí, usa %s"
+#~ msgid "No, use %s"
+#~ msgstr "No, usa %s"
+#~ msgid "Database error"
+#~ msgstr "Error en la base de datos"
+
index ac89462..bdad745 100644 (file)
--- a/po/fi.po
+++ b/po/fi.po
@@ -2,9 +2,9 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: http://moblin.org/projects/syncevolution\n"
-"POT-Creation-Date: 2009-10-01 19:27+0000\n"
+"POT-Creation-Date: 2010-04-07 09:29+0000\n"
 "PO-Revision-Date: \n"
-"Last-Translator: Paju <PajuPekka@gmail.com>\n"
+"Last-Translator: Eija <eija@wimma.com>\n"
 "Language-Team: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -15,448 +15,602 @@ msgstr ""
 
 #. TRANSLATORS: this is the application name that may be used by e.g.
 #. the windowmanager
-#: ../src/gtk-ui/main.c:31
-#: ../src/gtk-ui/ui.glade.h:28
+#: ../src/gtk-ui/main.c:40
+#: ../src/gtk-ui/ui.glade.h:38
 #: ../src/gtk-ui/sync.desktop.in.h:1
+#: ../src/gnome-bluetooth/syncevolution.c:112
 msgid "Sync"
 msgstr "Synkkaus"
 
-#: ../src/gtk-ui/sync-ui.c:259
-msgid "Addressbook"
-msgstr "Osoitekirja"
-
-#: ../src/gtk-ui/sync-ui.c:261
-msgid "Calendar"
-msgstr "Kalenteri"
-
-#: ../src/gtk-ui/sync-ui.c:263
-msgid "Todo"
-msgstr "Tehtävälista"
+#: ../src/gtk-ui/sync-ui.c:260
+msgid "Contacts"
+msgstr "Yhteyshenkilöt"
 
-#: ../src/gtk-ui/sync-ui.c:265
-msgid "Memo"
-msgstr "Muistio"
+#: ../src/gtk-ui/sync-ui.c:262
+msgid "Appointments"
+msgstr "Tapaamiset"
 
-#: ../src/gtk-ui/sync-ui.c:320
-msgid "Failed to save current service in GConf configuration system"
-msgstr "Tämänhetkisen palvelun tallentaminen GConf määritysjärjestelmään epäonnistui"
+#: ../src/gtk-ui/sync-ui.c:264
+#: ../src/gtk-ui/ui.glade.h:40
+msgid "Tasks"
+msgstr "Tehtävät"
 
-#: ../src/gtk-ui/sync-ui.c:331
-msgid "Failed to save service configuration to SyncEvolution"
-msgstr "Palvelun määritysten tallentaminen SyncEvolutioniin epäonnistui"
+#: ../src/gtk-ui/sync-ui.c:266
+msgid "Notes"
+msgstr "Huomautukset"
 
-#: ../src/gtk-ui/sync-ui.c:416
-msgid "Failed to get service configuration from SyncEvolution"
-msgstr "Palvelun määritysten saanti SyncEvolutionista epäonnistui"
+#. TRANSLATORS: This is a "combination source" for syncing with devices
+#. * that combine appointments and tasks. the name should match the ones
+#. * used for calendar and todo above
+#: ../src/gtk-ui/sync-ui.c:271
+msgid "Appointments & Tasks"
+msgstr "Tapaamiset ja tehtävät"
 
-#: ../src/gtk-ui/sync-ui.c:479
-msgid "Failed to remove service configuration from SyncEvolution"
-msgstr "Palvelun määritysten poistaminen SyncEvolutionista epäonnistui"
-
-#: ../src/gtk-ui/sync-ui.c:599
-msgid "Service must have a name and server URL"
-msgstr "Palvelulla pitää olla nimi ja palvelimen URL"
-
-#. sync is no longer in progress for some reason
-#: ../src/gtk-ui/sync-ui.c:675
-msgid "Failed to cancel: sync was no longer in progress"
-msgstr "Peruminen epäonnistui: synkkaus ei ole enää käynnissä"
+#: ../src/gtk-ui/sync-ui.c:343
+msgid "Starting sync"
+msgstr "Aloitetaan synkkaus"
 
-#: ../src/gtk-ui/sync-ui.c:679
-msgid "Failed to cancel sync"
-msgstr "Synkkauksen peruminen epäonnistui"
+#. TRANSLATORS: slow sync confirmation dialog message. Placeholder
+#. * is service/device name
+#: ../src/gtk-ui/sync-ui.c:381
+#, c-format
+msgid "Do you want to slow sync with %s?"
+msgstr "Haluatko hitaan synkkauksen kohteen %s kanssa?"
 
-#: ../src/gtk-ui/sync-ui.c:683
-msgid "Canceling sync"
-msgstr "Synkkaus perutaan"
+#: ../src/gtk-ui/sync-ui.c:385
+msgid "Yes, do slow sync"
+msgstr "Kyllä, tehdään hidas synkkaus"
 
-#: ../src/gtk-ui/sync-ui.c:697
-msgid "Trying to cancel sync"
-msgstr "Yritetään perua synkkaus"
+#: ../src/gtk-ui/sync-ui.c:385
+msgid "No, cancel sync"
+msgstr "Ei, peru synkkaus"
 
-#: ../src/gtk-ui/sync-ui.c:704
+#. TRANSLATORS: confirmation dialog for refresh-from-server. Placeholder
+#. * is service/device name
+#: ../src/gtk-ui/sync-ui.c:418
 #, c-format
 msgid "Do you want to delete all local data and replace it with data from %s? This is not usually advised."
 msgstr "Haluatko poistaa kaikki paikalliset tiedot ja korvata ne tiedoilla kohteesta %s? Tämä ei ole yleensä suositeltavaa."
 
-#: ../src/gtk-ui/sync-ui.c:709
-#, c-format
-msgid "Do you want to delete all data in %s and replace it with your local data? This is not usually advised."
-msgstr "Haluatko poistaa kaikki tiedot kohteessa %s ja korvata ne paikallisilla tiedoillasi? Tämä ei ole yleensä suositeltavaa."
-
-#: ../src/gtk-ui/sync-ui.c:726
-msgid "No, cancel sync"
-msgstr "Ei, peru synkkaus"
-
-#: ../src/gtk-ui/sync-ui.c:727
+#: ../src/gtk-ui/sync-ui.c:423
+#: ../src/gtk-ui/sync-ui.c:454
 msgid "Yes, delete and replace"
 msgstr "Kyllä, poista ja korvaa"
 
-#: ../src/gtk-ui/sync-ui.c:749
-msgid "No sources are enabled, not syncing"
-msgstr "Mitään kohteita ei ole otettu käyttöön. Synkkaus ei käynnissä."
+#: ../src/gtk-ui/sync-ui.c:423
+#: ../src/gtk-ui/sync-ui.c:454
+#: ../src/gtk-ui/sync-ui.c:1566
+msgid "No"
+msgstr "Ei"
 
-#: ../src/gtk-ui/sync-ui.c:766
-msgid "A sync is already in progress"
-msgstr "Synkkaus on jo meneillään"
+#. TRANSLATORS: confirmation dialog for refresh-from-client. Placeholder
+#. * is service/device name
+#: ../src/gtk-ui/sync-ui.c:449
+#, c-format
+msgid "Do you want to delete all data in %s and replace it with your local data? This is not usually advised."
+msgstr "Haluatko poistaa kaikki tiedot kohteessa %s ja korvata ne paikallisilla tiedoillasi? Tämä ei ole yleensä suositeltavaa."
 
-#: ../src/gtk-ui/sync-ui.c:768
-msgid "Failed to start sync"
-msgstr "Synkkauksen aloitus epäonnistui"
+#: ../src/gtk-ui/sync-ui.c:481
+msgid "Trying to cancel sync"
+msgstr "Yritetään perua synkkaus"
 
-#: ../src/gtk-ui/sync-ui.c:773
-msgid "Starting sync"
-msgstr "Aloitetaan synkkaus"
+#: ../src/gtk-ui/sync-ui.c:521
+msgid "No service or device selected"
+msgstr "Palvelua tai laitetta ei ole valittuna"
 
-#: ../src/gtk-ui/sync-ui.c:798
-msgid "Last synced just seconds ago"
-msgstr "Synkattu viimeksi vain muutama sekunti sitten"
+#. TRANSLATORS: This is the title on main view. Placeholder is
+#. * the service name. Example: "Google - synced just now"
+#: ../src/gtk-ui/sync-ui.c:529
+#, c-format
+msgid "%s - synced just now"
+msgstr "%s - synkataan juuri nyt"
 
-#: ../src/gtk-ui/sync-ui.c:801
-msgid "Last synced a minute ago"
-msgstr "Synkattu viimeksi minuutti sitten"
+#: ../src/gtk-ui/sync-ui.c:533
+#, c-format
+msgid "%s - synced a minute ago"
+msgstr "%s - Synkattu viimeksi minuutti sitten"
 
-#: ../src/gtk-ui/sync-ui.c:804
+#: ../src/gtk-ui/sync-ui.c:537
 #, c-format
-msgid "Last synced %ld minutes ago"
-msgstr "Synkattu viimeksi %ld minuuttia sitten"
+msgid "%s - synced %ld minutes ago"
+msgstr "%s - Synkattu viimeksi %ld minuuttia sitten"
 
-#: ../src/gtk-ui/sync-ui.c:807
-msgid "Last synced an hour ago"
-msgstr "Synkattu viimeksi tunti sitten"
+#: ../src/gtk-ui/sync-ui.c:542
+#, c-format
+msgid "%s - synced an hour ago"
+msgstr "%s - Synkattu viimeksi tunti sitten"
 
-#: ../src/gtk-ui/sync-ui.c:810
+#: ../src/gtk-ui/sync-ui.c:546
 #, c-format
-msgid "Last synced %ld hours ago"
-msgstr "Synkattu viimeksi %ld tuntia sitten"
+msgid "%s - synced %ld hours ago"
+msgstr "%s - Synkattu viimeksi %ld tuntia sitten"
 
 # last synced yesterday
-#: ../src/gtk-ui/sync-ui.c:813
-msgid "Last synced a day ago"
-msgstr "Synkattu viimeksi eilen"
+#: ../src/gtk-ui/sync-ui.c:551
+#, c-format
+msgid "%s - synced a day ago"
+msgstr "%s - Synkattu viimeksi eilen"
 
-#: ../src/gtk-ui/sync-ui.c:816
+#: ../src/gtk-ui/sync-ui.c:555
 #, c-format
-msgid "Last synced %ld days ago"
-msgstr "Synkattu viimeksi %ld päivää sitten"
+msgid "%s - synced %ld days ago"
+msgstr "%s - Synkattu viimeksi %ld päivää sitten"
+
+#. TRANSLATORS: Action button in info bar in main view. Shown with e.g.
+#. * "You've just restored a backup. The changes have not been "
+#. * "synced with %s yet"
+#: ../src/gtk-ui/sync-ui.c:604
+#: ../src/gtk-ui/sync-ui.c:719
+msgid "Sync now"
+msgstr "Synkkaa nyt"
+
+#. TRANSLATORS: Action button in info bar in main view. Shown with e.g.
+#. * "A normal sync is not possible at this time..." message.
+#. * "Other options" will open Emergency view
+#: ../src/gtk-ui/sync-ui.c:610
+#: ../src/gtk-ui/ui.glade.h:37
+msgid "Slow sync"
+msgstr "Hidas synkkaus"
+
+#: ../src/gtk-ui/sync-ui.c:611
+msgid "Other options..."
+msgstr "Muut asetukset..."
+
+#. TRANSLATORS: Action button in info bar in main view. Shown e.g.
+#. * when no service is selected. Will open configuration view
+#: ../src/gtk-ui/sync-ui.c:616
+msgid "Select sync service"
+msgstr "Määritä synkkauspalvelu"
+
+#. TRANSLATORS: Action button in info bar in main view. Shown e.g.
+#. * login to service fails. Will open configuration view for this service
+#: ../src/gtk-ui/sync-ui.c:621
+msgid "Edit service settings"
+msgstr "Muuta palveluasetuksia"
+
+#: ../src/gtk-ui/sync-ui.c:670
+msgid "You haven't selected a sync service or device yet. Sync services let you synchronize your data between your netbook and a web service. You can also sync directly with some devices."
+msgstr "Synkkauspalvelua tai laitetta ei ole vielä valittu. Synkkauspalvelu mahdollistaa Netbookisi ja verkkopalvelusi tietojen synkkauksen. Voit myös synkata suoraan joitakin laitteita."
 
 # using taas instead of uudelleen to fix a truncation
-#: ../src/gtk-ui/sync-ui.c:901
+#: ../src/gtk-ui/sync-ui.c:717
 msgid "Sync again"
 msgstr "Synkkaa taas"
 
-#: ../src/gtk-ui/sync-ui.c:903
-#: ../src/gtk-ui/ui.glade.h:29
-msgid "Sync now"
-msgstr "Synkkaa nyt"
+#: ../src/gtk-ui/sync-ui.c:730
+msgid "Restoring"
+msgstr "Palautetaan"
 
-#: ../src/gtk-ui/sync-ui.c:912
+#: ../src/gtk-ui/sync-ui.c:732
 msgid "Syncing"
 msgstr "Synkkaus käynnissä"
 
-#: ../src/gtk-ui/sync-ui.c:918
+#. TRANSLATORS: This is for the button in main view, right side.
+#. Keep line length below ~20 characters, use two lines if needed
+#: ../src/gtk-ui/sync-ui.c:743
+#: ../src/gtk-ui/sync-ui.c:3358
 msgid "Cancel sync"
 msgstr "Peru synkkaus"
 
-#. TRANSLATORS: placeholder is a source name, shown with checkboxes in main window
-#: ../src/gtk-ui/sync-ui.c:1265
+#: ../src/gtk-ui/sync-ui.c:908
+msgid "Back to sync"
+msgstr "Takaisin synkkaukseen"
+
+#. TRANSLATORS: label for checkbutton/toggle in main view.
+#. * Please stick to similar length strings or break the line with
+#. * "\n" if absolutely needed
+#: ../src/gtk-ui/sync-ui.c:1209
+msgid "Automatic sync"
+msgstr "Automaattinen synkkaus"
+
+#. This is the expander label in emergency view. It summarizes the
+#. * currently selected data sources. First placeholder is service/device
+#. * name, second a comma separeted list of sources.
+#. * E.g. "Affected data: Google Contacts, Appointments"
+#: ../src/gtk-ui/sync-ui.c:1480
+#, c-format
+msgid "Affected data: %s %s"
+msgstr "Koskee tietoja: %s %s"
+
+#: ../src/gtk-ui/sync-ui.c:1485
+#, c-format
+msgid "Affected data: none"
+msgstr "Koskee tietoja: ei mitään"
+
+#. TRANSLATORS: confirmation for restoring a backup. placeholder is the
+#. * backup time string defined below
+#: ../src/gtk-ui/sync-ui.c:1563
+#, c-format
+msgid "Do you want to restore the backup from %s? All changes you have made since then will be lost."
+msgstr "Haluatko palauttaa varmuuskopioinnin kohteesta %s? Menetät kaikki tämän jälkeen tekemäsi muutokset."
+
+#: ../src/gtk-ui/sync-ui.c:1566
+msgid "Yes, restore"
+msgstr "Kyllä, palauta"
+
+#. TRANSLATORS: date/time for strftime(), used in emergency view backup
+#. * label. Any time format that shows date and time is good.
+#: ../src/gtk-ui/sync-ui.c:1598
+#, c-format
+msgid "%x %X"
+msgstr "%x %X"
+
+#. TRANSLATORS: label for a backup in emergency view. Placeholder is
+#. * service or device name
+#: ../src/gtk-ui/sync-ui.c:1617
+#, c-format
+msgid "Backed up before syncing with %s"
+msgstr "Varmuuskopioitu ennen sunkkausta kohteen %s kanssa"
+
+#: ../src/gtk-ui/sync-ui.c:1634
+msgid "Restore"
+msgstr "Palauttaa"
+
+#. TRANSLATORS: this is an explanation in Emergency view.
+#. * Placeholder is a service/device name
+#: ../src/gtk-ui/sync-ui.c:1741
+#, c-format
+msgid "A normal sync with %s is not possible at this time. You can do a slow two-way sync or start from scratch. You can also restore a backup, but a slow sync or starting from scratch will still be required before normal sync is possible."
+msgstr "Normaali synkkaus kohteen %s ei ole mahdollinen täällä kertaa. Voit tehdä hitaan kaksisuuntaisen synkkauksen tai aloittaa nollasta. Voit myös palauttaa varmuuskopion, mutta joko hidas synkkaus tai aloittaminen nollasta vaaditaan, ennen kuin normaali synkkaus on mahdollinen."
+
+#: ../src/gtk-ui/sync-ui.c:1751
+#, c-format
+msgid "If something has gone horribly wrong, you can try a slow sync, start from scratch or restore from backup."
+msgstr "Jos jotakin on mennyt järkyttävän pieleen, voit yrittää hidasta synkkausta, aloittamista nollasta tai palauttaa varmuuskopiosta."
+
+#. TRANSLATORS: These are a buttons in Emergency view. Placeholder is a
+#. * service/device name. Please don't use too long lines, but feel free to
+#. * use several lines.
+#: ../src/gtk-ui/sync-ui.c:1760
+#, c-format
+msgid ""
+"Delete all your local\n"
+"data and replace with\n"
+"data from %s"
+msgstr ""
+"Poista kaikki paikalliset\n"
+" tiedot ja korvaa ne \n"
+"tiedoilla kohteesta %s"
+
+#: ../src/gtk-ui/sync-ui.c:1766
+#, c-format
+msgid ""
+"Delete all data on\n"
+"%s and replace\n"
+"with your local data"
+msgstr ""
+"Poista kaikki tiedot kohteesta\n"
+"%s ja korvaa \n"
+"paikallisilla tiedoilla"
+
+#: ../src/gtk-ui/sync-ui.c:2226
+msgid "Failed to get list of supported services from SyncEvolution"
+msgstr "Tuettujen palveluiden listan saaminen SyncEvolutionista epäonnistui"
+
+#: ../src/gtk-ui/sync-ui.c:2280
+msgid "There was a problem communicating with the sync process. Please try again later."
+msgstr "Ilmeni onglema kommunikoitaessa synkkausprosessin kanssa. Yritä myöhemmin uudelleen."
+
+#: ../src/gtk-ui/sync-ui.c:2339
+msgid "Restore failed"
+msgstr "Palauttaminen epäonnistui"
+
+# changed to "sync error" in order to fix a truncation in the UI.
+#: ../src/gtk-ui/sync-ui.c:2342
+#: ../src/gtk-ui/sync-ui.c:3227
+msgid "Sync failed"
+msgstr "Synkkaus epäonnistui"
+
+#: ../src/gtk-ui/sync-ui.c:2348
+msgid "Restore complete"
+msgstr "Palautus valmis"
+
+#: ../src/gtk-ui/sync-ui.c:2351
+msgid "Sync complete"
+msgstr "Synkkaus valmis"
+
+#: ../src/gtk-ui/sync-ui.c:2443
 #, c-format
-msgid "%s (not supported by this service)"
-msgstr "%s (tämä palvelu ei tue tätä)"
+msgid "Preparing '%s'"
+msgstr "Valmistellaan: '%s'"
+
+#: ../src/gtk-ui/sync-ui.c:2446
+#, c-format
+msgid "Receiving '%s'"
+msgstr "Vastaanotetaan: '%s'"
+
+#: ../src/gtk-ui/sync-ui.c:2449
+#, c-format
+msgid "Sending '%s'"
+msgstr "Lähetetään: '%s'"
 
-#: ../src/gtk-ui/sync-ui.c:1298
+#: ../src/gtk-ui/sync-ui.c:2570
 #, c-format
 msgid "There was one remote rejection."
-msgid_plural "There were %d remote rejections."
+msgid_plural "There were %ld remote rejections."
 msgstr[0] "Tapahtui yksi etähylkäys"
-msgstr[1] "Tapahtui %d etähylkäystä"
+msgstr[1] "Tapahtui %ld etähylkäystä"
 
-#: ../src/gtk-ui/sync-ui.c:1303
+#: ../src/gtk-ui/sync-ui.c:2575
 #, c-format
 msgid "There was one local rejection."
-msgid_plural "There were %d local rejections."
+msgid_plural "There were %ld local rejections."
 msgstr[0] "Tapahtui yksi paikallinen hylkäys"
-msgstr[1] "Tapahtui %d paikallista hylkäystä"
+msgstr[1] "Tapahtui %ld paikallista hylkäystä"
 
-#: ../src/gtk-ui/sync-ui.c:1308
+#: ../src/gtk-ui/sync-ui.c:2580
 #, c-format
-msgid "There were %d local rejections and %d remote rejections."
-msgstr "Tapahtui %d paikallista hylkäystä ja %d etähylkäystä"
+msgid "There were %ld local rejections and %ld remote rejections."
+msgstr "Tapahtui %ld paikallista hylkäystä ja %ld etähylkäystä"
 
-#: ../src/gtk-ui/sync-ui.c:1313
+#: ../src/gtk-ui/sync-ui.c:2585
 #, c-format
 msgid "Last time: No changes."
 msgstr "Viime kerta: ei muutoksia"
 
-#: ../src/gtk-ui/sync-ui.c:1315
+#: ../src/gtk-ui/sync-ui.c:2587
 #, c-format
 msgid "Last time: Sent one change."
-msgid_plural "Last time: Sent %d changes."
+msgid_plural "Last time: Sent %ld changes."
 msgstr[0] "Viime kerralla: yksi muutos lähetetty."
-msgstr[1] "Viime kerralla: %d muutosta lähetetty."
+msgstr[1] "Viime kerralla: %ld muutosta lähetetty."
 
 #. This is about changes made to the local data. Not all of these
 #. changes were requested by the remote server, so "applied"
 #. is a better word than "received" (bug #5185).
-#: ../src/gtk-ui/sync-ui.c:1323
+#: ../src/gtk-ui/sync-ui.c:2595
 #, c-format
 msgid "Last time: Applied one change."
-msgid_plural "Last time: Applied %d changes."
+msgid_plural "Last time: Applied %ld changes."
 msgstr[0] "Viime kerralla: yksi muutos sovellettu."
-msgstr[1] "Viime kerralla: %d muutosta sovellettu."
+msgstr[1] "Viime kerralla: %ld muutosta sovellettu."
 
-#: ../src/gtk-ui/sync-ui.c:1328
+#: ../src/gtk-ui/sync-ui.c:2600
 #, c-format
-msgid "Last time: Applied %d changes and sent %d changes."
-msgstr "Viime kerralla: Sovellettu %d muutosta ja lähetetty %d muutosta."
+msgid "Last time: Applied %ld changes and sent %ld changes."
+msgstr "Viime kerralla: Sovellettu %ld muutosta ja lähetetty %ld muutosta."
 
-#: ../src/gtk-ui/sync-ui.c:1420
-msgid "Failed to get server configuration from SyncEvolution"
-msgstr "Serverin asetusten saanti SyncEvolutionista epäonnistui"
-
-#: ../src/gtk-ui/sync-ui.c:1472
-msgid "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in sync."
-msgstr "ScheduleWorld mahdollistaa kontaktien,tapahtumien,tehtävien, ja viestien synkkaamisen. "
-
-#: ../src/gtk-ui/sync-ui.c:1475
-msgid "Google Sync can backup and synchronize your Address Book with your Gmail contacts."
-msgstr "Google Sync voi kopioida ja synkata Osoitekirjasi Gmail kontakteihisi"
-
-#. TRANSLATORS: Please include the word "demo" (or the equivalent in
-#. your language): Funambol is going to be a 90 day demo service
-#. in the future
-#: ../src/gtk-ui/sync-ui.c:1481
-msgid "Backup your contacts and calendar. Sync with a singleclick, anytime, anywhere (DEMO)."
-msgstr "Tallenna kontaktisi ja kalenterisi. Synkkaa yhdellä klikkauksella, milloin ja missä tahansa (DEMO)."
-
-#: ../src/gtk-ui/sync-ui.c:1509
-msgid "New service"
-msgstr "Uusi palvelu"
-
-#: ../src/gtk-ui/sync-ui.c:1556
-msgid "Server URL"
-msgstr "Serverin URL"
+#. TRANSLATORS: the placeholder is a error message (hopefully)
+#. * explaining the problem
+#: ../src/gtk-ui/sync-ui.c:2807
+#, c-format
+msgid ""
+"There was a problem with last sync:\n"
+"%s"
+msgstr ""
+"Ilmeni onglema viimeisen synkkauksen kanssa :\n"
+"%s"
 
-# URI for target %s
-#. TRANSLATORS: placeholder is a source name in settings window
-#: ../src/gtk-ui/sync-ui.c:1578
+#: ../src/gtk-ui/sync-ui.c:2817
 #, c-format
-msgid "%s URI"
-msgstr "Kohteen %s URI"
+msgid "You've just restored a backup. The changes have not been synced with %s yet"
+msgstr "Olet juuri palauttanut varmuuskopion. Muutoksia ei ole vielä synkattu kohteen %s kanssa."
 
-#: ../src/gtk-ui/sync-ui.c:1715
-#: ../src/gtk-ui/ui.glade.h:17
-msgid "Launch website"
-msgstr "Siirry sivustoon"
+#: ../src/gtk-ui/sync-ui.c:3105
+msgid "Waiting for current operation to finish..."
+msgstr "Nykyisen toiminnon päättymistä odotetaan..."
 
-#: ../src/gtk-ui/sync-ui.c:1719
-msgid "Setup and use"
-msgstr "Määritä ja käytä"
+#. TRANSLATORS: next strings are error messages.
+#: ../src/gtk-ui/sync-ui.c:3139
+msgid "A normal sync is not possible at this time. The server suggests a slow sync, but this might not always be what you want if both ends already have data."
+msgstr "Normaali synkkaus ei ole mahdollinen tällä kertaa. Palvelin suosittelee hidasta synkkausta, mutta tämä ei aina ehkä ole sitä, mitä haluat, jos molemmissa päissä on jo tietoja."
 
-#: ../src/gtk-ui/sync-ui.c:1765
-msgid "Failed to get list of manually setup services from SyncEvolution"
-msgstr "Manuaalisesti määritettyjen palveluiden listan saaminen SyncEvolutionista epäonnistui"
+# ...service ended unexpectedly
+#: ../src/gtk-ui/sync-ui.c:3143
+msgid "The sync process died unexpectedly."
+msgstr "Synkkauspalvelu loppui odottamattomasti"
 
-#: ../src/gtk-ui/sync-ui.c:1806
-msgid "Failed to get list of supported services from SyncEvolution"
-msgstr "Tuettujen palveluiden listan saaminen SyncEvolutionista epäonnistui"
+#: ../src/gtk-ui/sync-ui.c:3148
+msgid "Password request was not answered. You can save the password in the settings to prevent the request."
+msgstr "Salasanapyyntöön ei vastattu. Voit tallentaa salasanan asetuksissa estääksesi pyynnön."
 
-#. TODO: this is a hack... SyncEnd should be a signal of it's own,
-#. not just hacked on top of the syncevolution error codes
-#: ../src/gtk-ui/sync-ui.c:1967
-msgid "Service configuration not found"
-msgstr "Palvelun määritystietoja ei löydy"
+#. TODO use the service device name here, this is a remote problem
+#: ../src/gtk-ui/sync-ui.c:3152
+msgid "There was a problem processing sync request. Trying again may help."
+msgstr "Synkkauspyynnön prosessoimisessa ilmeni ongelma. Voi auttaa, jos yrität uudelleen."
 
-#: ../src/gtk-ui/sync-ui.c:1973
-msgid "Not authorized"
-msgstr "Ei käyttöoikeutta"
+#: ../src/gtk-ui/sync-ui.c:3158
+msgid "Failed to login. Could there be a problem with your username or password?"
+msgstr "Sisäänkirjautuminen ei onnistunut. Voisiko käyttäjänimen tai salasanan kanssa olla ongelma?"
 
-#: ../src/gtk-ui/sync-ui.c:1975
+#: ../src/gtk-ui/sync-ui.c:3161
 msgid "Forbidden"
 msgstr "Kielletty"
 
-#: ../src/gtk-ui/sync-ui.c:1977
-msgid "Not found"
-msgstr "Ei löydy"
+#. TRANSLATORS: data source means e.g. calendar or addressbook
+#: ../src/gtk-ui/sync-ui.c:3167
+msgid "A data source could not be found. Could there be a problem with the settings?"
+msgstr "Tietolähdettä ei löydy. Voisiko asetusten kanssa olla ongelma?"
 
-#: ../src/gtk-ui/sync-ui.c:1979
-msgid "Fatal database error"
-msgstr "Vakava tietokantavirhe"
+#: ../src/gtk-ui/sync-ui.c:3171
+msgid "Remote database error"
+msgstr "Etätietokantavirhe"
 
-#: ../src/gtk-ui/sync-ui.c:1981
-msgid "Database error"
-msgstr "Tietokantavirhe"
+#. This can happen when EDS is borked, restart it may help...
+#: ../src/gtk-ui/sync-ui.c:3174
+msgid "There is a problem with the local database. Syncing again or rebooting may help."
+msgstr "Paikallisen tietokannan kanssa on ongelmia. Voi auttaa, jos synkkaat uudelleen tai buuttaat."
 
-#: ../src/gtk-ui/sync-ui.c:1983
-msgid "No space left"
-msgstr "Tila lopussa"
+#: ../src/gtk-ui/sync-ui.c:3177
+msgid "No space on disk"
+msgstr "Levykkeen tila lopussa"
 
-#. TODO identify problem item somehow ?
-#: ../src/gtk-ui/sync-ui.c:1986
+#: ../src/gtk-ui/sync-ui.c:3179
 msgid "Failed to process SyncML"
 msgstr "SyncML:n käsittely epäonnistui"
 
-#: ../src/gtk-ui/sync-ui.c:1988
+#: ../src/gtk-ui/sync-ui.c:3181
 msgid "Server authorization failed"
 msgstr "Serverin varmennus epäonnistui"
 
-#: ../src/gtk-ui/sync-ui.c:1990
+#: ../src/gtk-ui/sync-ui.c:3183
 msgid "Failed to parse configuration file"
 msgstr "Asetustiedoston jäsennys epäonnistui"
 
-#: ../src/gtk-ui/sync-ui.c:1992
+#: ../src/gtk-ui/sync-ui.c:3185
 msgid "Failed to read configuration file"
 msgstr "Asetustiedoston lukeminen epäonnistui"
 
-#: ../src/gtk-ui/sync-ui.c:1994
+#: ../src/gtk-ui/sync-ui.c:3187
 msgid "No configuration found"
 msgstr "Asetuksia ei löydy"
 
-#: ../src/gtk-ui/sync-ui.c:1996
+#: ../src/gtk-ui/sync-ui.c:3189
 msgid "No configuration file found"
 msgstr "Asetustiedostoa ei löytynyt"
 
 # using erroneous instead of bad
-#: ../src/gtk-ui/sync-ui.c:1998
+#: ../src/gtk-ui/sync-ui.c:3191
 msgid "Server sent bad content"
 msgstr "Serveri lähetti virheellistä sisältöä"
 
-#: ../src/gtk-ui/sync-ui.c:2000
-msgid "Transport failure (no connection?)"
-msgstr "Siirtyminen epäonnistui (ei yhteyttä?)"
-
-#: ../src/gtk-ui/sync-ui.c:2002
-msgid "Connection timed out"
-msgstr "Yhteys aikakatkaistu"
-
-#: ../src/gtk-ui/sync-ui.c:2004
+#: ../src/gtk-ui/sync-ui.c:3193
 msgid "Connection certificate has expired"
 msgstr "Yhteyden varmenne on vanhentunut"
 
-#: ../src/gtk-ui/sync-ui.c:2006
+#: ../src/gtk-ui/sync-ui.c:3195
 msgid "Connection certificate is invalid"
 msgstr "Yhteyden varmenne on virheellinen"
 
-#: ../src/gtk-ui/sync-ui.c:2009
-msgid "Connection failed"
-msgstr "Yhteys epäonnistui"
+#: ../src/gtk-ui/sync-ui.c:3203
+msgid "We were unable to connect to the server. The problem could be temporary or there could be something wrong with the settings."
+msgstr "Palvelimeen ei saada yhteyttä. Ongelma voi olla tilapäinen tai palvelimen asetuksissa voi olla virhe. "
 
-#: ../src/gtk-ui/sync-ui.c:2011
-msgid "URL is bad"
-msgstr "URL on virheellinen"
+#: ../src/gtk-ui/sync-ui.c:3210
+msgid "The server URL is bad"
+msgstr "Serverin URL on virheellinen"
 
-#: ../src/gtk-ui/sync-ui.c:2013
-msgid "Server not found"
+#: ../src/gtk-ui/sync-ui.c:3215
+msgid "The server was not found"
 msgstr "Serveriä ei löydy"
 
-#: ../src/gtk-ui/sync-ui.c:2015
+#: ../src/gtk-ui/sync-ui.c:3217
 #, c-format
 msgid "Error %d"
 msgstr "Virhe: %d"
 
-# ...service ended unexpectedly
-#: ../src/gtk-ui/sync-ui.c:2025
-msgid "Sync D-Bus service exited unexpectedly"
-msgstr "Sync D-Bus -palvelu loppui odottamattomasti"
-
-# changed to "sync error" in order to fix a truncation in the UI.
-#: ../src/gtk-ui/sync-ui.c:2028
-#: ../src/gtk-ui/sync-ui.c:2079
-msgid "Sync Failed"
-msgstr "Synkkausvirhe"
+#. TRANSLATORS: password request dialog contents: title, cancel button
+#. * and ok button
+#: ../src/gtk-ui/sync-ui.c:3355
+msgid "Password is required for sync"
+msgstr "Synkkaukseen vaaditaan salasana."
 
-#: ../src/gtk-ui/sync-ui.c:2071
-msgid "Sync complete"
-msgstr "Synkkaus valmis"
+#: ../src/gtk-ui/sync-ui.c:3359
+msgid "Sync with password"
+msgstr "Synkkaa salasanan kanssa"
 
-#: ../src/gtk-ui/sync-ui.c:2076
-msgid "Sync canceled"
-msgstr "Synkkaus peruttu"
-
-#. NOTE extra1 can be error here
-#: ../src/gtk-ui/sync-ui.c:2094
-msgid "Ending sync"
-msgstr "Lopetetaan synkkaus"
-
-#. TRANSLATORS: placeholder is a source name (e.g. 'Calendar') in a progress text
-#: ../src/gtk-ui/sync-ui.c:2118
+#. TRANSLATORS: password request dialog message, placeholder is service name
+#: ../src/gtk-ui/sync-ui.c:3369
 #, c-format
-msgid "Preparing '%s'"
-msgstr "Valmistellaan: '%s'"
-
-#. TRANSLATORS: placeholder is a source name in a progress text
-#: ../src/gtk-ui/sync-ui.c:2130
-#, c-format
-msgid "Sending '%s'"
-msgstr "Lähetetään: '%s'"
-
-#. TRANSLATORS: placeholder is a source name in a progress text
-#: ../src/gtk-ui/sync-ui.c:2142
-#, c-format
-msgid "Receiving '%s'"
-msgstr "Vastaanotetaan: '%s'"
-
-#: ../src/gtk-ui/ui.glade.h:1
-msgid "<b>Data</b>"
-msgstr "<b>Tiedot</b>"
+msgid "Please enter password for syncing with %s:"
+msgstr "Anna salasana synkkaukseen kohteen %s kanssa:"
 
+#. title for the buttons on the right side of main view
 #: ../src/gtk-ui/ui.glade.h:2
-msgid "<b>No sync service in use</b>"
-msgstr "<b>Ei mitään synkkauspalvelua käytössä</b>"
-
-#: ../src/gtk-ui/ui.glade.h:3
-msgid "<b>Sync failure</b>"
-msgstr "<b>Synkkausvirhe</b>"
+msgid "<b>Actions</b>"
+msgstr "<b>Toiminnot</b>"
 
+#. text between the two "start from scratch" buttons in emergency view
 #: ../src/gtk-ui/ui.glade.h:4
-msgid "<b>Type of Sync</b>"
-msgstr "<b>Synkkaustyyppi</b>"
+msgid "<b>or</b>"
+msgstr "<b>tai</b>"
 
 #: ../src/gtk-ui/ui.glade.h:5
-msgid "<big>Manual setup</big>"
-msgstr "<big>Manuaalinen määritys</big>"
+msgid "<big>Direct sync</big>"
+msgstr "<big>Suora synkkaus</big>"
 
 #: ../src/gtk-ui/ui.glade.h:6
-msgid "<big>Supported services</big>"
-msgstr "<big>Tuetut palvelut</big>"
+msgid "<big>Network sync</big>"
+msgstr "<b>Verkon synkkaus</b>"
+
+#. a title in emergency view
+#: ../src/gtk-ui/ui.glade.h:8
+msgid "<big>Restore from backup</big>"
+msgstr "<big>Palauta varmuuskopiosta</big>"
+
+#. a title in emergency view
+#: ../src/gtk-ui/ui.glade.h:10
+msgid "<big>Slow sync</big>"
+msgstr "<big>Hidas synkkaus</big>"
+
+#. a title in emergency view
+#: ../src/gtk-ui/ui.glade.h:12
+msgid "<big>Start from scratch</big>"
+msgstr "<big>Aloita nollasta</big>"
+
+#: ../src/gtk-ui/ui.glade.h:13
+msgid ""
+"A slow sync compares items from both sides and tries to merge them. \n"
+"This may fail in some cases, leading to duplicates or lost information."
+msgstr ""
+"Hidas synkkaus vertailee kohteita molemmista päistä ja yrittää yhdistää ne. \n"
+"Tämä saattaa joissakin tapauksissa epäonnistua, johtaa kaksoiskappeleiden muodostumiseen tai tietojen menettämiseen."
 
-#: ../src/gtk-ui/ui.glade.h:7
+#: ../src/gtk-ui/ui.glade.h:15
+msgid "Add new device"
+msgstr "Lisää uusi laite"
+
+#: ../src/gtk-ui/ui.glade.h:16
 msgid "Add new service"
 msgstr "Lisää uusi palvelu"
 
-#: ../src/gtk-ui/ui.glade.h:8
-msgid "Back to sync"
-msgstr "Takaisin synkkaukseen"
+#. explanation of "Restore backup" function
+#: ../src/gtk-ui/ui.glade.h:18
+msgid "Backups are made before every time we Sync. Choose a backup to restore. Any changes you have made since then will be lost."
+msgstr "Varmuuskopiot tehdään ennen jokaista synkkausta. Valitse varmuuskopio palautettavaksi. Kaikki tämän jälkeen tekemäsi muutokset menetetään. "
+
+#: ../src/gtk-ui/ui.glade.h:19
+msgid "Calendar"
+msgstr "Kalenteri"
 
 # use:
 # "Muuta\n
 # synkkausta"
 # if not enough space. This translates as "change sync".
-#: ../src/gtk-ui/ui.glade.h:9
+#. Button in main view, right side. Keep to below 20 chars per line, feel free to use two lines
+#: ../src/gtk-ui/ui.glade.h:21
 msgid ""
-"Change sync\n"
-"service"
+"Change or edit\n"
+"sync service"
 msgstr ""
-"Muuta\n"
+"Muuta tai muokkaa\n"
 "synkkauspalvelua"
 
-#: ../src/gtk-ui/ui.glade.h:11
-msgid "Delete all local data and replace it with remote data"
-msgstr "Poista kaikki paikalliset tiedot ja korvaa ne etätiedoilla"
+#. close button for settings window
+#: ../src/gtk-ui/ui.glade.h:24
+msgid "Close"
+msgstr "Sulje"
 
-#: ../src/gtk-ui/ui.glade.h:12
-msgid "Delete all remote data and replace it with local data"
-msgstr "Poista kaikki etätiedot ja korvaa ne paikallisilla tiedoilla"
+#: ../src/gtk-ui/ui.glade.h:25
+msgid ""
+"Delete all data on Zyb \n"
+"and replace with your\n"
+"local information"
+msgstr ""
+"Poista kaikki tiedot kohteessa Zyb \n"
+"ja korvaa ne omilla\n"
+"paikallisilla tiedoilla"
 
-#: ../src/gtk-ui/ui.glade.h:13
-msgid "Delete this service"
-msgstr "Poista tämä palvelu"
+#: ../src/gtk-ui/ui.glade.h:28
+msgid ""
+"Delete all your local\n"
+"information and replace\n"
+"with data from Zyb"
+msgstr ""
+"Poista kaikki paikalliset\n"
+"tiedot ja korvaa\n"
+"ne Zybin tiedoilla"
 
-#: ../src/gtk-ui/ui.glade.h:14
-msgid "Edit service settings"
-msgstr "Muuta palveluasetuksia"
+#. button in main view, right side. Keep length to 20 characters or so, use two lines if needed
+#: ../src/gtk-ui/ui.glade.h:32
+msgid ""
+"Fix a sync\n"
+"emergency"
+msgstr ""
+"Korjaa sync\n"
+"hätätila"
 
-#: ../src/gtk-ui/ui.glade.h:15
+#: ../src/gtk-ui/ui.glade.h:34
 msgid ""
 "If you don't see your service above but know that your sync provider uses SyncML\n"
 "you can setup a service manually."
@@ -464,52 +618,15 @@ msgstr ""
 "Jos et näe palveluasi yllä mutta tiedät, että synkkauspalvelun tarjoajasi käyttää\n"
 "SyncML:ää, voit määrittää palvelun manuaalisesti."
 
-#: ../src/gtk-ui/ui.glade.h:18
-msgid "Merge local and remote data (recommended)"
-msgstr "Sulauta paikallis- ja etätiedot (suositeltavaa)"
-
-#: ../src/gtk-ui/ui.glade.h:19
-msgid "Password"
-msgstr "Salasana"
-
-#: ../src/gtk-ui/ui.glade.h:20
-msgid "Reset original server settings"
-msgstr "Palauta alkuperäiset serveriasetukset"
-
-#: ../src/gtk-ui/ui.glade.h:21
-msgid "Save and use this service"
-msgstr "Tallenna ja käytä tätä palvelua"
-
-#: ../src/gtk-ui/ui.glade.h:22
-msgid "Select sync service"
-msgstr "Määritä synkkauspalvelu"
-
-#: ../src/gtk-ui/ui.glade.h:23
-msgid "Server settings"
-msgstr "Serverin asetukset"
-
-#: ../src/gtk-ui/ui.glade.h:24
-msgid "Service name"
-msgstr "Palvelun nimi"
-
-# Sync requires an internet connection
-#: ../src/gtk-ui/ui.glade.h:25
-msgid ""
-"Sorry, you need an internet\n"
-"connection to sync."
-msgstr ""
-"Synkkaus edellyttää\n"
-"verkkoyhteyttä."
+#: ../src/gtk-ui/ui.glade.h:36
+msgid "Settings"
+msgstr "Asetukset"
 
-#: ../src/gtk-ui/ui.glade.h:27
-msgid "Stop using this service"
-msgstr "Lopeta tämän palvelun käyttö"
+#: ../src/gtk-ui/ui.glade.h:39
+msgid "Sync Emergency"
+msgstr "Synkkauksen hätätila"
 
-#: ../src/gtk-ui/ui.glade.h:30
-msgid "Synchronization is not available (D-Bus service does not answer), sorry."
-msgstr "Synkkaus ei ole valitettavasti mahdollista (D-Bus-palvelu ei vastaa)."
-
-#: ../src/gtk-ui/ui.glade.h:31
+#: ../src/gtk-ui/ui.glade.h:41
 msgid ""
 "To sync you'll need a network connection and an account with a sync service.\n"
 "We support the following services: "
@@ -517,17 +634,13 @@ msgstr ""
 "Synkkaus edellyttää verkkoyhteyttä ja synkkauspalvelutiliä.\n"
 "Me tuemme seuraavia palveluita:"
 
-#: ../src/gtk-ui/ui.glade.h:33
-msgid "Username"
-msgstr "Käyttäjätunnus"
+#: ../src/gtk-ui/ui.glade.h:43
+msgid "Use Bluetooth to Sync your data from one device to another."
+msgstr "Käytä Bluetoothia ja synkkaa tiedot yhdeltä laitteelta toiselle."
 
-#: ../src/gtk-ui/ui.glade.h:34
-msgid ""
-"You haven't selected a sync service yet. Sync services let you \n"
-"synchronize your data between your netbook and a web service."
-msgstr ""
-"Synkkauspalvelua ei ole vielä määritetty. Synkkauspalvelu\n"
-"mahdollistaa ultrakannettavasi ja verkkopalvelusi tietojen synkkauksen."
+#: ../src/gtk-ui/ui.glade.h:44
+msgid "You will need to add Bluetooth devices before they can be synced."
+msgstr "Sinun täytyy lisätä Bluetooth-laitteet ennen kuin niitä voi synkata."
 
 #: ../src/gtk-ui/sync.desktop.in.h:2
 #: ../src/gtk-ui/sync-gtk.desktop.in.h:2
@@ -538,20 +651,334 @@ msgstr "Ajantasalla"
 msgid "Sync (GTK)"
 msgstr "Synkkaa (GTK)"
 
-#~ msgid "Last time: Received one change."
-#~ msgid_plural "Last time: Received %d changes."
-#~ msgstr[0] "Viime kerralla: yksi muutos vastaanotettu."
-#~ msgstr[1] "Viime kerralla: %d muutosta vastaanotettu"
-#~ msgid "Last time: Received %d changes and sent %d changes."
-#~ msgstr "Viime kerralla: Vastaanotettu %d muutosta ja lähetetty %d muutosta."
-#~ msgid "Setup sync service"
-#~ msgstr "Määritä synkkauspalvelu"
+#: ../src/gtk-ui/sync-config-widget.c:74
+msgid "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in sync."
+msgstr "ScheduleWorld mahdollistaa kontaktien,tapahtumien,tehtävien, ja viestien synkkaamisen. "
+
+#: ../src/gtk-ui/sync-config-widget.c:77
+msgid "Google Sync can backup and synchronize your contacts with your Gmail contacts."
+msgstr "Google Sync voi kopioida ja synkata kontaktisi Gmail-kontakteihisi"
+
+#. TRANSLATORS: Please include the word "demo" (or the equivalent in
+#. your language): Funambol is going to be a 90 day demo service
+#. in the future
+#: ../src/gtk-ui/sync-config-widget.c:83
+msgid "Backup your contacts and calendar. Sync with a single click, anytime, anywhere (DEMO)."
+msgstr "Varmuuskopioi kontaktisi ja kalenterisi. Synkkaa yhdellä klikkauksella, milloin ja missä tahansa (DEMO)."
+
+#: ../src/gtk-ui/sync-config-widget.c:86
+msgid "Mobical Backup and Restore service allows you to securely backup your personal mobile data for free."
+msgstr "Mobical-varmuuskopio- ja palautuspalvelun avulla voit varmuuskopioida omat mobiilitietosi ilmaiseksi ja varmasti."
+
+#: ../src/gtk-ui/sync-config-widget.c:89
+msgid "ZYB is a simple way for people to store and share mobile information online."
+msgstr "ZYB on yksinkertainen tapa tallentaa ja jakaa mobiilitietoja verkossa."
+
+#: ../src/gtk-ui/sync-config-widget.c:92
+msgid "Memotoo lets you access your personal data from any computer connected to the Internet."
+msgstr "Mometoon avulla voi käyttää omia tietoja kaikilta koneilta, joilla on Internet-yhteys. "
+
+#: ../src/gtk-ui/sync-config-widget.c:188
+msgid "Sorry, failed to save the configuration"
+msgstr "Konfiguraation tallennus epäonnistui"
+
+#: ../src/gtk-ui/sync-config-widget.c:377
+msgid "Service must have a name and server URL"
+msgstr "Palvelulla pitää olla nimi ja palvelimen URL"
+
+#: ../src/gtk-ui/sync-config-widget.c:418
+#, c-format
+msgid "Do you want to reset the settings for %s? This will not remove any synced information on either end."
+msgstr "Haluatko nollata kohteen %s asetukset? Tämä ei poista mitään synkattuja tietoja kummassakaan päässä."
+
+#. TRANSLATORS: buttons in reset-service warning dialog
+#: ../src/gtk-ui/sync-config-widget.c:422
+msgid "Yes, reset"
+msgstr "Kyllä, nollaa."
+
+#: ../src/gtk-ui/sync-config-widget.c:423
+#: ../src/gtk-ui/sync-config-widget.c:434
+msgid "No, keep settings"
+msgstr "Ei, säilytä asetukset"
+
+#: ../src/gtk-ui/sync-config-widget.c:428
+#, c-format
+msgid "Do you want to delete the settings for %s? This will not remove any synced information on either end but it will remove these settings."
+msgstr "Haluatko poistaa kohteen %s asetukset?  Tämä ei poista mitään synkattuja tietoja kummassakaan päässä, mutta poistaa nämä  asetukset. "
+
+#. TRANSLATORS: buttons in delete-service warning dialog
+#: ../src/gtk-ui/sync-config-widget.c:433
+msgid "Yes, delete"
+msgstr "Kyllä, poista"
+
+#: ../src/gtk-ui/sync-config-widget.c:463
+msgid "Reset settings"
+msgstr "Nollaa asetukset"
+
+#: ../src/gtk-ui/sync-config-widget.c:466
+msgid "Delete settings"
+msgstr "Poista asetukset"
+
+#: ../src/gtk-ui/sync-config-widget.c:476
+msgid "Save and use"
+msgstr "Tallenna ja käytä"
+
+#: ../src/gtk-ui/sync-config-widget.c:479
+msgid ""
+"Save and replace\n"
+"current service"
+msgstr ""
+"Tallenna ja korvaa\n"
+"nykyinen palvelu"
+
+#: ../src/gtk-ui/sync-config-widget.c:489
+msgid "Stop using device"
+msgstr "Lopeta laitteen käyttö"
+
+#: ../src/gtk-ui/sync-config-widget.c:492
+msgid "Stop using service"
+msgstr "Lopeta palvelun käyttö"
+
+# URI for target %s
+#. TRANSLATORS: label for an entry in service configuration form.
+#. * Placeholder is a source  name.
+#. * Example: "Appointments URI"
+#: ../src/gtk-ui/sync-config-widget.c:675
+#, c-format
+msgid "%s URI"
+msgstr "Kohteen %s URI"
+
+#. TRANSLATORS: toggles in service configuration form, placeholder is service
+#. * or device name
+#: ../src/gtk-ui/sync-config-widget.c:850
+#, c-format
+msgid "Send changes to %s"
+msgstr "Lähetä muutokset kohteeseen %s"
+
+#: ../src/gtk-ui/sync-config-widget.c:855
+#, c-format
+msgid "Receive changes from %s"
+msgstr "Vastaanota muutokset kohteesta %s"
+
+#: ../src/gtk-ui/sync-config-widget.c:871
+msgid "<b>Sync</b>"
+msgstr "<b>Synkkaa</b>"
+
+#. TRANSLATORS: label of a entry in service configuration
+#: ../src/gtk-ui/sync-config-widget.c:887
+msgid "Server address"
+msgstr "Serverin osoite"
+
+#. TRANSLATORS: explanation before a device template combobox.
+#. * Placeholder is a device name like 'Nokia N85' or 'Syncevolution
+#. * Client'
+#: ../src/gtk-ui/sync-config-widget.c:963
+#, c-format
+msgid "This device looks like it might be a '%s'. If this is not correct, please take a look at the list of supported devices and pick yours if it is listed"
+msgstr "Tämä laite näyttää siltä, että se saattaisi olla '%s'. Jos tämä ei ole oikein, katso tätä tuettujen laitteiden luetteloa ja poimi omasi, jos se on luettelossa."
+
+#: ../src/gtk-ui/sync-config-widget.c:969
+msgid "We don't know what this device is exactly. Please take a look at the list of supported devices and pick yours if it is listed"
+msgstr "Emme tiedä täsmälleen, mikä tämä laite on. Katso luetteloa tuetuista ja poimi omasi, jos se on luettelossa."
+
+#: ../src/gtk-ui/sync-config-widget.c:1122
+#, c-format
+msgid "%s - Bluetooth device"
+msgstr "%s - Bluetooth-laite"
+
+#. TRANSLATORS: service title for services that are not based on a
+#. * template in service list, the placeholder is the name of the service
+#: ../src/gtk-ui/sync-config-widget.c:1128
+#, c-format
+msgid "%s - manually setup"
+msgstr "%s - manuaalinen asetus"
+
+#. TRANSLATORS: link button in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1803
+msgid "Launch website"
+msgstr "Siirry sivustoon"
+
+#. TRANSLATORS: button in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1812
+msgid "Setup now"
+msgstr "Tee asetukset nyt"
+
+#. TRANSLATORS: labels of entries in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1908
+msgid "Username"
+msgstr "Käyttäjätunnus"
+
+#: ../src/gtk-ui/sync-config-widget.c:1923
+msgid "Password"
+msgstr "Salasana"
+
+#. TRANSLATORS: warning in service configuration form for people
+#. who have modified the configuration via other means.
+#: ../src/gtk-ui/sync-config-widget.c:1946
+msgid "Current configuration is more complex than what can be shown here. Changes to sync mode or synced data types will overwrite that configuration."
+msgstr "Nykyinen konfiguraatio on monimutkaisempi kuin täällä voidaan näyttää. Muutokset synkkaustilaan tai synkattuihin tietotyyppeihin korvaavat tämän konfiguroinnin. "
+
+#. TRANSLATORS: this is the epander label for server settings
+#. in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1965
+msgid "Hide server settings"
+msgstr "Piilota serverin asetukset"
+
+#. TRANSLATORS: this is the epander label for server settings
+#. in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1985
+msgid "Show server settings"
+msgstr "Näytä serverin asetukset"
+
+#: ../src/gnome-bluetooth/syncevolution.c:110
+msgid "Sync in the Sync application"
+msgstr "Synkkaa synkkaussovelluksessa. "
+
+#: ../src/syncevo-dbus-server.cpp:5622
+#, c-format
+msgid "%s is syncing"
+msgstr "Synkkaus käynnissä kohteessa %s"
+
+#: ../src/syncevo-dbus-server.cpp:5623
+#, c-format
+msgid "We have just started to sync your computer with the %s sync service."
+msgstr "Tietokoneesi synkkaus on juuri aloitettu %s-synkkauspalvelulla."
+
+#. if sync is successfully started and done
+#: ../src/syncevo-dbus-server.cpp:5637
+#, c-format
+msgid "%s sync complete"
+msgstr "Kohteen %s synkkaus valmis"
+
+#: ../src/syncevo-dbus-server.cpp:5638
+#, c-format
+msgid "We have just finished syncing your computer with the %s sync service."
+msgstr "Tietokoneesi synkkaus on juuri lopetettu %s-synkkauspalvelulla."
+
+#. if sync is successfully started and has errors, or not started successful with a fatal problem
+#: ../src/syncevo-dbus-server.cpp:5643
+msgid "Sync problem."
+msgstr "Synkkauksen ongelma"
+
+#: ../src/syncevo-dbus-server.cpp:5644
+msgid "Sorry, there's a problem with your sync that you need to attend to."
+msgstr "Sorry, ilmeni ongelma synkkauksessa, jota sinun täytyy seurata."
+
+#: ../src/syncevo-dbus-server.cpp:5717
+msgid "View"
+msgstr "Näytä"
+
+#: ../src/syncevo-dbus-server.cpp:5718
+msgid "Dismiss"
+msgstr "Hylkää"
+
+#~ msgid "Database error"
+#~ msgstr "Tietokantavirhe"
+
 #~ msgid ""
-#~ "You haven't set up a sync service yet. Sync services let you \n"
-#~ "synchronize your data between your netbook and a web service."
+#~ "Do you want to replace %s with %s? This will not remove any synced "
+#~ "information on either end but you will no longer be able to sync with %s."
+#~ msgstr ""
+#~ "Haluatko korvata kohteen %s kohteella %s? Tämä ei poista mitään "
+#~ "synkattuja tietoja kummassakaan päässä, mutta et voi enää synkata kohteen "
+#~ "%s kanssa."
+
+#~ msgid "Yes, use %s"
+#~ msgstr "Kyllä, käytä kohdetta %s"
+
+#~ msgid "No, use %s"
+#~ msgstr "Ei, älä käytä kohdetta %s"
+
+#~ msgid "Reset service"
+#~ msgstr "Nollaa palvelu"
+
+#~ msgid "Addressbook"
+#~ msgstr "Osoitekirja"
+
+#~ msgid "Todo"
+#~ msgstr "Tehtävälista"
+
+#~ msgid "Memo"
+#~ msgstr "Muistio"
+
+#~ msgid "Failed to save current service in GConf configuration system"
+#~ msgstr ""
+#~ "Tämänhetkisen palvelun tallentaminen GConf määritysjärjestelmään "
+#~ "epäonnistui"
+
+#~ msgid "Failed to save service configuration to SyncEvolution"
+#~ msgstr "Palvelun määritysten tallentaminen SyncEvolutioniin epäonnistui"
+
+#~ msgid "Failed to get service configuration from SyncEvolution"
+#~ msgstr "Palvelun määritysten saanti SyncEvolutionista epäonnistui"
+
+#~ msgid "Failed to remove service configuration from SyncEvolution"
+#~ msgstr "Palvelun määritysten poistaminen SyncEvolutionista epäonnistui"
+
+#~ msgid "Failed to cancel: sync was no longer in progress"
+#~ msgstr "Peruminen epäonnistui: synkkaus ei ole enää käynnissä"
+
+#~ msgid "Failed to cancel sync"
+#~ msgstr "Synkkauksen peruminen epäonnistui"
+
+#~ msgid "Canceling sync"
+#~ msgstr "Synkkaus perutaan"
+
+#~ msgid "No sources are enabled, not syncing"
+#~ msgstr "Mitään kohteita ei ole otettu käyttöön. Synkkaus ei käynnissä."
+
+#~ msgid "A sync is already in progress"
+#~ msgstr "Synkkaus on jo meneillään"
+
+#~ msgid "Failed to start sync"
+#~ msgstr "Synkkauksen aloitus epäonnistui"
+
+#~ msgid "%s (not supported by this service)"
+#~ msgstr "%s (tämä palvelu ei tue tätä)"
+
+#~ msgid "Failed to get server configuration from SyncEvolution"
+#~ msgstr "Serverin asetusten saanti SyncEvolutionista epäonnistui"
+
+#~ msgid "Server URL"
+#~ msgstr "Serverin URL"
+
+#~ msgid "Failed to get list of manually setup services from SyncEvolution"
 #~ msgstr ""
-#~ "Synkkauspalvelua ei ole vielä määritetty. Synkkauspalvelu\n"
-#~ "mahdollistaa ultrakannettavasi ja verkkopalvelusi tietojen synkkauksen."
-#~ msgid "Bring your data with you"
-#~ msgstr "Ota tietosi mukaan"
+#~ "Manuaalisesti määritettyjen palveluiden listan saaminen SyncEvolutionista "
+#~ "epäonnistui"
+
+#~ msgid "Service configuration not found"
+#~ msgstr "Palvelun määritystietoja ei löydy"
+
+#~ msgid "Not authorized"
+#~ msgstr "Ei käyttöoikeutta"
+
+#~ msgid "Not found"
+#~ msgstr "Ei löydy"
+
+#~ msgid "Transport failure (no connection?)"
+#~ msgstr "Siirtyminen epäonnistui (ei yhteyttä?)"
+
+#~ msgid "Connection timed out"
+#~ msgstr "Yhteys aikakatkaistu"
+
+#~ msgid "Sync canceled"
+#~ msgstr "Synkkaus peruttu"
+
+#~ msgid "Ending sync"
+#~ msgstr "Lopetetaan synkkaus"
+
+#~ msgid "<b>No sync service in use</b>"
+#~ msgstr "<b>Ei mitään synkkauspalvelua käytössä</b>"
+
+#~ msgid "<big>Manual setup</big>"
+#~ msgstr "<big>Manuaalinen määritys</big>"
+
+#~ msgid "Merge local and remote data (recommended)"
+#~ msgstr "Sulauta paikallis- ja etätiedot (suositeltavaa)"
+
+#~ msgid "Reset original server settings"
+#~ msgstr "Palauta alkuperäiset serveriasetukset"
 
+#~ msgid "Service name"
+#~ msgstr "Palvelun nimi"
index 190bca8..a9a6345 100644 (file)
--- a/po/fr.po
+++ b/po/fr.po
@@ -1,11 +1,10 @@
-#: ../src/gtk-ui/sync-ui.c:764
 msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: http://moblin.org/projects/syncevolution\n"
-"POT-Creation-Date: 2009-10-01 19:27+0000\n"
-"PO-Revision-Date: \n"
-"Last-Translator: Loïc Dufresne de Virel <loic.dufresne.de.virel@intel.com>\n"
+"POT-Creation-Date: 2010-04-07 09:29+0000\n"
+"PO-Revision-Date: 2010-04-08 23:55-0800\n"
+"Last-Translator: David Cicognani <david.cicognani@ptiglobal.net>\n"
 "Language-Team: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -16,547 +15,636 @@ msgstr ""
 
 #. TRANSLATORS: this is the application name that may be used by e.g.
 #. the windowmanager
-#: ../src/gtk-ui/main.c:31 ../src/gtk-ui/ui.glade.h:28
+#: ../src/gtk-ui/main.c:40
+#: ../src/gtk-ui/ui.glade.h:38
 #: ../src/gtk-ui/sync.desktop.in.h:1
+#: ../src/gnome-bluetooth/syncevolution.c:112
 msgid "Sync"
 msgstr "Synchronisation"
 
-#: ../src/gtk-ui/sync-ui.c:259
-msgid "Addressbook"
-msgstr "Carnet d'adresses"
+#: ../src/gtk-ui/sync-ui.c:260
+msgid "Contacts"
+msgstr "Contacts"
 
-#: ../src/gtk-ui/sync-ui.c:261
-msgid "Calendar"
-msgstr "Calendrier"
-
-#: ../src/gtk-ui/sync-ui.c:263
-msgid "Todo"
-msgstr "À Faire"
-
-#: ../src/gtk-ui/sync-ui.c:265
-msgid "Memo"
-msgstr "Mémo"
-
-#: ../src/gtk-ui/sync-ui.c:320
-msgid "Failed to save current service in GConf configuration system"
-msgstr ""
-"Impossible de sauvegarder le service actuel dans le système de configuration "
-"GConf"
-
-#: ../src/gtk-ui/sync-ui.c:331
-msgid "Failed to save service configuration to SyncEvolution"
-msgstr ""
-"Impossible de sauvegarder la configuration du service dans SyncEvolution"
+#: ../src/gtk-ui/sync-ui.c:262
+msgid "Appointments"
+msgstr "Rendez-vous"
 
-#: ../src/gtk-ui/sync-ui.c:416
-msgid "Failed to get service configuration from SyncEvolution"
-msgstr "Impossible d'obtenir la configuration du service depuis SyncEvolution"
+#: ../src/gtk-ui/sync-ui.c:264
+#: ../src/gtk-ui/ui.glade.h:40
+msgid "Tasks"
+msgstr "Tâches"
 
-#: ../src/gtk-ui/sync-ui.c:479
-msgid "Failed to remove service configuration from SyncEvolution"
-msgstr "Impossible d'éliminer la configuration du service de SyncEvolution"
+#: ../src/gtk-ui/sync-ui.c:266
+msgid "Notes"
+msgstr "Notes"
 
-#: ../src/gtk-ui/sync-ui.c:599
-msgid "Service must have a name and server URL"
-msgstr "Le service doit avoir un nom et une URL de serveur"
+#. TRANSLATORS: This is a "combination source" for syncing with devices
+#. * that combine appointments and tasks. the name should match the ones
+#. * used for calendar and todo above
+#: ../src/gtk-ui/sync-ui.c:271
+msgid "Appointments & Tasks"
+msgstr "Rendez-vous & Tâches"
 
-#. sync is no longer in progress for some reason
-#: ../src/gtk-ui/sync-ui.c:675
-msgid "Failed to cancel: sync was no longer in progress"
-msgstr "Impossible d'annuler : sync n'était plus en cours de fonctionnement"
-
-#: ../src/gtk-ui/sync-ui.c:679
-msgid "Failed to cancel sync"
-msgstr "Impossible d'annuler la synchronisation"
-
-#: ../src/gtk-ui/sync-ui.c:683
-msgid "Canceling sync"
-msgstr "Synchronisation en cours d'annulation"
-
-#: ../src/gtk-ui/sync-ui.c:697
-msgid "Trying to cancel sync"
-msgstr "Essai d'annulation de la synchronisation"
+#: ../src/gtk-ui/sync-ui.c:343
+msgid "Starting sync"
+msgstr "Synchronisation en cours de démarrage"
 
-#: ../src/gtk-ui/sync-ui.c:704
+#. TRANSLATORS: slow sync confirmation dialog message. Placeholder
+#. * is service/device name
+#: ../src/gtk-ui/sync-ui.c:381
 #, c-format
-msgid ""
-"Do you want to delete all local data and replace it with data from %s? This "
-"is not usually advised."
-msgstr ""
-"Voulez-vous effacer toutes les données locales et les remplacer avec les "
-"données de %s ? Ceci est en général une mauvaise idée."
+msgid "Do you want to slow sync with %s?"
+msgstr "Voulez-vous effectuer une synchro lente avec %s ?"
 
-#: ../src/gtk-ui/sync-ui.c:709
-#, c-format
-msgid ""
-"Do you want to delete all data in %s and replace it with your local data? "
-"This is not usually advised."
-msgstr ""
-"Voulez-vous effacer toutes les données de %s et les remplacer avec vos "
-"données locales ? Ceci est en général une mauvaise idée."
+#: ../src/gtk-ui/sync-ui.c:385
+msgid "Yes, do slow sync"
+msgstr "Oui, effectuer une synchro lente"
 
-#: ../src/gtk-ui/sync-ui.c:726
+#: ../src/gtk-ui/sync-ui.c:385
 msgid "No, cancel sync"
 msgstr "Non, annuler la synchronisation"
 
-#: ../src/gtk-ui/sync-ui.c:727
+#. TRANSLATORS: confirmation dialog for refresh-from-server. Placeholder
+#. * is service/device name
+#: ../src/gtk-ui/sync-ui.c:418
+#, c-format
+msgid "Do you want to delete all local data and replace it with data from %s? This is not usually advised."
+msgstr "Voulez-vous effacer toutes les données locales et les remplacer avec les données de %s ? Ceci est en général une mauvaise idée."
+
+#: ../src/gtk-ui/sync-ui.c:423
+#: ../src/gtk-ui/sync-ui.c:454
 msgid "Yes, delete and replace"
 msgstr "Oui, supprimer et remplacer"
 
-#: ../src/gtk-ui/sync-ui.c:749
-msgid "No sources are enabled, not syncing"
-msgstr "Pas de source activée, échec de la synchronisation"
+#: ../src/gtk-ui/sync-ui.c:423
+#: ../src/gtk-ui/sync-ui.c:454
+#: ../src/gtk-ui/sync-ui.c:1566
+msgid "No"
+msgstr "Non"
 
-#: ../src/gtk-ui/sync-ui.c:766
-msgid "A sync is already in progress"
-msgstr "Une synchronisation est déjà en cours"
-
-#: ../src/gtk-ui/sync-ui.c:768
-msgid "Failed to start sync"
-msgstr "Impossible de démarrer la synchronisation"
+#. TRANSLATORS: confirmation dialog for refresh-from-client. Placeholder
+#. * is service/device name
+#: ../src/gtk-ui/sync-ui.c:449
+#, c-format
+msgid "Do you want to delete all data in %s and replace it with your local data? This is not usually advised."
+msgstr "Voulez-vous effacer toutes les données de %s et les remplacer avec vos données locales ? Ceci est en général une mauvaise idée."
 
-#: ../src/gtk-ui/sync-ui.c:773
-msgid "Starting sync"
-msgstr "Synchronisation en cours de démarrage"
+#: ../src/gtk-ui/sync-ui.c:481
+msgid "Trying to cancel sync"
+msgstr "Essai d'annulation de la synchronisation"
 
-#: ../src/gtk-ui/sync-ui.c:798
-msgid "Last synced just seconds ago"
-msgstr "Dernière synchro il y a quelques secondes"
+#: ../src/gtk-ui/sync-ui.c:521
+msgid "No service or device selected"
+msgstr "Aucun service ou périphérique sélectionné"
 
-#: ../src/gtk-ui/sync-ui.c:801
-msgid "Last synced a minute ago"
-msgstr "Dernière synchro il y a moins d'une minute"
+#. TRANSLATORS: This is the title on main view. Placeholder is
+#. * the service name. Example: "Google - synced just now"
+#: ../src/gtk-ui/sync-ui.c:529
+#, c-format
+msgid "%s - synced just now"
+msgstr "%s - dernière synchro il y a quelques secondes"
 
-#: ../src/gtk-ui/sync-ui.c:804
+#: ../src/gtk-ui/sync-ui.c:533
 #, c-format
-msgid "Last synced %ld minutes ago"
-msgstr "Dernière synchro il y a %ld minutes"
+msgid "%s - synced a minute ago"
+msgstr "%s - dernière synchro il y a moins d'une minute"
 
-#: ../src/gtk-ui/sync-ui.c:807
-msgid "Last synced an hour ago"
-msgstr "Dernière synchro il y a moins d'une heure"
+#: ../src/gtk-ui/sync-ui.c:537
+#, c-format
+msgid "%s - synced %ld minutes ago"
+msgstr "%s - dernière synchro il y a %ld minutes"
 
-#: ../src/gtk-ui/sync-ui.c:810
+#: ../src/gtk-ui/sync-ui.c:542
 #, c-format
-msgid "Last synced %ld hours ago"
-msgstr "Dernière synchro il y a %ld heures"
+msgid "%s - synced an hour ago"
+msgstr "%s - dernière synchro il y a moins d'une heure"
 
-#: ../src/gtk-ui/sync-ui.c:813
-msgid "Last synced a day ago"
-msgstr "Dernière synchro hier"
+#: ../src/gtk-ui/sync-ui.c:546
+#, c-format
+msgid "%s - synced %ld hours ago"
+msgstr "%s - dernière synchro il y a %ld heures"
 
-#: ../src/gtk-ui/sync-ui.c:816
+#: ../src/gtk-ui/sync-ui.c:551
 #, c-format
-msgid "Last synced %ld days ago"
-msgstr "Dernière synchro il y a %ld jours"
+msgid "%s - synced a day ago"
+msgstr "%s - dernière synchro hier"
 
-#: ../src/gtk-ui/sync-ui.c:901
-msgid "Sync again"
-msgstr "Synchroniser de nouveau"
+#: ../src/gtk-ui/sync-ui.c:555
+#, c-format
+msgid "%s - synced %ld days ago"
+msgstr "%s - dernière synchro il y a %ld jours"
 
 # QA FRA : I erased the "now" in the French translation because it caused a truncation
-#: ../src/gtk-ui/sync-ui.c:903 ../src/gtk-ui/ui.glade.h:29
+#. TRANSLATORS: Action button in info bar in main view. Shown with e.g.
+#. * "You've just restored a backup. The changes have not been "
+#. * "synced with %s yet"
+#: ../src/gtk-ui/sync-ui.c:604
+#: ../src/gtk-ui/sync-ui.c:719
 msgid "Sync now"
 msgstr "Synchroniser"
 
-#: ../src/gtk-ui/sync-ui.c:912
+#. TRANSLATORS: Action button in info bar in main view. Shown with e.g.
+#. * "A normal sync is not possible at this time..." message.
+#. * "Other options" will open Emergency view
+#: ../src/gtk-ui/sync-ui.c:610
+#: ../src/gtk-ui/ui.glade.h:37
+msgid "Slow sync"
+msgstr "Synchronisation lente"
+
+#: ../src/gtk-ui/sync-ui.c:611
+msgid "Other options..."
+msgstr "Autres options..."
+
+#. TRANSLATORS: Action button in info bar in main view. Shown e.g.
+#. * when no service is selected. Will open configuration view
+#: ../src/gtk-ui/sync-ui.c:616
+msgid "Select sync service"
+msgstr "Sélectionner le service de synchronisation"
+
+#. TRANSLATORS: Action button in info bar in main view. Shown e.g.
+#. * login to service fails. Will open configuration view for this service
+#: ../src/gtk-ui/sync-ui.c:621
+msgid "Edit service settings"
+msgstr "Modifier les paramètres du service"
+
+#: ../src/gtk-ui/sync-ui.c:670
+msgid "You haven't selected a sync service or device yet. Sync services let you synchronize your data between your netbook and a web service. You can also sync directly with some devices."
+msgstr "Vous n'avez pas encore sélectionné de service de synchronisation ou de périphérique. Les services de synchronisation vous permettent de synchroniser vos données de votre netbook à un service web. Vous pouvez également synchroniser directement avec certains périphériques."
+
+#: ../src/gtk-ui/sync-ui.c:717
+msgid "Sync again"
+msgstr "Synchroniser de nouveau"
+
+#: ../src/gtk-ui/sync-ui.c:730
+msgid "Restoring"
+msgstr "En cours de restauration..."
+
+#: ../src/gtk-ui/sync-ui.c:732
 msgid "Syncing"
 msgstr "Synchronisation en cours"
 
-#: ../src/gtk-ui/sync-ui.c:918
+#. TRANSLATORS: This is for the button in main view, right side.
+#. Keep line length below ~20 characters, use two lines if needed
+#: ../src/gtk-ui/sync-ui.c:743
+#: ../src/gtk-ui/sync-ui.c:3358
 msgid "Cancel sync"
 msgstr "Annuler la synchronisation"
 
-#. TRANSLATORS: placeholder is a source name, shown with checkboxes in main window
-#: ../src/gtk-ui/sync-ui.c:1265
+#: ../src/gtk-ui/sync-ui.c:908
+msgid "Back to sync"
+msgstr "Retourner à la synchronisation"
+
+#. TRANSLATORS: label for checkbutton/toggle in main view.
+#. * Please stick to similar length strings or break the line with
+#. * "\n" if absolutely needed
+#: ../src/gtk-ui/sync-ui.c:1209
+msgid "Automatic sync"
+msgstr "Synchronisation automatique"
+
+#. This is the expander label in emergency view. It summarizes the
+#. * currently selected data sources. First placeholder is service/device
+#. * name, second a comma separeted list of sources.
+#. * E.g. "Affected data: Google Contacts, Appointments"
+#: ../src/gtk-ui/sync-ui.c:1480
+#, c-format
+msgid "Affected data: %s %s"
+msgstr "Données affectées : %s %s"
+
+#: ../src/gtk-ui/sync-ui.c:1485
+#, c-format
+msgid "Affected data: none"
+msgstr "Données affectées : aucunes"
+
+#. TRANSLATORS: confirmation for restoring a backup. placeholder is the
+#. * backup time string defined below
+#: ../src/gtk-ui/sync-ui.c:1563
+#, c-format
+msgid "Do you want to restore the backup from %s? All changes you have made since then will be lost."
+msgstr "Voulez-vous restaurer la sauvegarde de %s ? Toutes les modifications effectuées à partir de là seront perdues."
+
+#: ../src/gtk-ui/sync-ui.c:1566
+msgid "Yes, restore"
+msgstr "Oui, restaurer"
+
+#. TRANSLATORS: date/time for strftime(), used in emergency view backup
+#. * label. Any time format that shows date and time is good.
+#: ../src/gtk-ui/sync-ui.c:1598
+#, c-format
+msgid "%x %X"
+msgstr "%x %X"
+
+#. TRANSLATORS: label for a backup in emergency view. Placeholder is
+#. * service or device name
+#: ../src/gtk-ui/sync-ui.c:1617
+#, c-format
+msgid "Backed up before syncing with %s"
+msgstr "Sauvegardé avant la synchronisation avec %s"
+
+#: ../src/gtk-ui/sync-ui.c:1634
+msgid "Restore"
+msgstr "Restaurer"
+
+#. TRANSLATORS: this is an explanation in Emergency view.
+#. * Placeholder is a service/device name
+#: ../src/gtk-ui/sync-ui.c:1741
+#, c-format
+msgid "A normal sync with %s is not possible at this time. You can do a slow two-way sync or start from scratch. You can also restore a backup, but a slow sync or starting from scratch will still be required before normal sync is possible."
+msgstr "Une synchronisation normale avec %s est actuellement impossible. Vous pouvez effectuer une synchronisation lente à deux files ou alors reprendre à zéro. Vous pouvez aussi restaurer une sauvegarde, mais une synchronisation lente ou une reprise à zéro seront nécessaires avant qu'une synchronisation soit possible."
+
+#: ../src/gtk-ui/sync-ui.c:1751
+#, c-format
+msgid "If something has gone horribly wrong, you can try a slow sync, start from scratch or restore from backup."
+msgstr "En cas de problème sérieux, vous pouvez essayer une synchronisation lente, reprendre à zéro ou alors restaurer depuis une sauvegarde."
+
+#. TRANSLATORS: These are a buttons in Emergency view. Placeholder is a
+#. * service/device name. Please don't use too long lines, but feel free to
+#. * use several lines.
+#: ../src/gtk-ui/sync-ui.c:1760
+#, c-format
+msgid ""
+"Delete all your local\n"
+"data and replace with\n"
+"data from %s"
+msgstr ""
+"Supprimer toutes\n"
+"les données locales\n"
+"et les remplacer avec\n"
+"les données de %s"
+
+#: ../src/gtk-ui/sync-ui.c:1766
+#, c-format
+msgid ""
+"Delete all data on\n"
+"%s and replace\n"
+"with your local data"
+msgstr ""
+"Supprimer toutes les données\n"
+"sur %s et les remplacer\n"
+"avec les données locales"
+
+#: ../src/gtk-ui/sync-ui.c:2226
+msgid "Failed to get list of supported services from SyncEvolution"
+msgstr "Impossible d'obtenir la liste des services pris en charge depuis SyncEvolution"
+
+#: ../src/gtk-ui/sync-ui.c:2280
+msgid "There was a problem communicating with the sync process. Please try again later."
+msgstr "Un problème est survenu en communiquant avec le processus de synchronisation. Veuillez réessayer ultérieurement."
+
+#: ../src/gtk-ui/sync-ui.c:2339
+msgid "Restore failed"
+msgstr "Échec de la restauration"
+
+#: ../src/gtk-ui/sync-ui.c:2342
+#: ../src/gtk-ui/sync-ui.c:3227
+msgid "Sync failed"
+msgstr "Échec de la synchronisation"
+
+#: ../src/gtk-ui/sync-ui.c:2348
+msgid "Restore complete"
+msgstr "Restauration terminée"
+
+#: ../src/gtk-ui/sync-ui.c:2351
+msgid "Sync complete"
+msgstr "Synchronisation terminée"
+
+#: ../src/gtk-ui/sync-ui.c:2443
 #, c-format
-msgid "%s (not supported by this service)"
-msgstr "%s (non pris en charge par ce service)"
+msgid "Preparing '%s'"
+msgstr "'%s' en cours de préparation"
 
-#: ../src/gtk-ui/sync-ui.c:1298
+#: ../src/gtk-ui/sync-ui.c:2446
+#, c-format
+msgid "Receiving '%s'"
+msgstr "'%s' en cours de réception"
+
+#: ../src/gtk-ui/sync-ui.c:2449
+#, c-format
+msgid "Sending '%s'"
+msgstr "'%s' en cours d'envoi"
+
+#: ../src/gtk-ui/sync-ui.c:2570
 #, c-format
 msgid "There was one remote rejection."
-msgid_plural "There were %d remote rejections."
+msgid_plural "There were %ld remote rejections."
 msgstr[0] "Il y a eu un rejet distant."
-msgstr[1] "Il y a eu %d rejets distants."
+msgstr[1] "Il y a eu %ld rejets distants."
 
-#: ../src/gtk-ui/sync-ui.c:1303
+#: ../src/gtk-ui/sync-ui.c:2575
 #, c-format
 msgid "There was one local rejection."
-msgid_plural "There were %d local rejections."
+msgid_plural "There were %ld local rejections."
 msgstr[0] "Il y a eu un rejet local."
-msgstr[1] "Il y a eu %d rejets locaux."
+msgstr[1] "Il y a eu %ld rejets locaux."
 
-#: ../src/gtk-ui/sync-ui.c:1308
+#: ../src/gtk-ui/sync-ui.c:2580
 #, c-format
-msgid "There were %d local rejections and %d remote rejections."
-msgstr "Il y a eu %d rejets locaux et %d rejets distants."
+msgid "There were %ld local rejections and %ld remote rejections."
+msgstr "Il y a eu %ld rejets locaux et %ld rejets distants."
 
-#: ../src/gtk-ui/sync-ui.c:1313
+#: ../src/gtk-ui/sync-ui.c:2585
 #, c-format
 msgid "Last time: No changes."
 msgstr "Dernière fois : pas de changement. "
 
-#: ../src/gtk-ui/sync-ui.c:1315
+#: ../src/gtk-ui/sync-ui.c:2587
 #, c-format
 msgid "Last time: Sent one change."
-msgid_plural "Last time: Sent %d changes."
+msgid_plural "Last time: Sent %ld changes."
 msgstr[0] "Dernière fois : un changement envoyé."
-msgstr[1] "Dernière fois : %d changements envoyés."
+msgstr[1] "Dernière fois : %ld changements envoyés."
 
 #. This is about changes made to the local data. Not all of these
 #. changes were requested by the remote server, so "applied"
 #. is a better word than "received" (bug #5185).
-#: ../src/gtk-ui/sync-ui.c:1323
+#: ../src/gtk-ui/sync-ui.c:2595
 #, c-format
 msgid "Last time: Applied one change."
-msgid_plural "Last time: Applied %d changes."
+msgid_plural "Last time: Applied %ld changes."
 msgstr[0] "Dernière fois : un changement reçu."
-msgstr[1] "Dernière fois : %d changements reçus."
+msgstr[1] "Dernière fois : %ld changements reçus."
 
-#: ../src/gtk-ui/sync-ui.c:1328
+#: ../src/gtk-ui/sync-ui.c:2600
 #, c-format
-msgid "Last time: Applied %d changes and sent %d changes."
-msgstr "Dernière fois : %d changements reçus et %d changements envoyés."
-
-#: ../src/gtk-ui/sync-ui.c:1420
-msgid "Failed to get server configuration from SyncEvolution"
-msgstr "Impossible d'obtenir la configuration du serveur depuis SyncEvolution"
-
-#: ../src/gtk-ui/sync-ui.c:1472
-msgid ""
-"ScheduleWorld enables you to keep your contacts, events, tasks, and notes in "
-"sync."
-msgstr ""
-"ScheduleWorld vous permet de garder vos contacts, événements, tâches et "
-"notes synchronisés."
-
-#: ../src/gtk-ui/sync-ui.c:1475
-msgid ""
-"Google Sync can backup and synchronize your Address Book with your Gmail "
-"contacts."
-msgstr ""
-"Google Sync permet de sauvegarder et synchroniser votre carnet d'adresses "
-"avec vos contacts Gmail."
+msgid "Last time: Applied %ld changes and sent %ld changes."
+msgstr "Dernière fois : %ld changements reçus et %ld changements envoyés."
 
-#. TRANSLATORS: Please include the word "demo" (or the equivalent in
-#. your language): Funambol is going to be a 90 day demo service
-#. in the future
-#: ../src/gtk-ui/sync-ui.c:1481
+#. TRANSLATORS: the placeholder is a error message (hopefully)
+#. * explaining the problem
+#: ../src/gtk-ui/sync-ui.c:2807
+#, c-format
 msgid ""
-"Backup your contacts and calendar. Sync with a singleclick, anytime, "
-"anywhere (DEMO)."
+"There was a problem with last sync:\n"
+"%s"
 msgstr ""
-"Sauvegarde de vos contacts et calendrier. Synchronisation avec un "
-"SingleClick, n'importe quand, n'importe où (DEMO)."
-
-#: ../src/gtk-ui/sync-ui.c:1509
-msgid "New service"
-msgstr "Nouveau service"
+"Un problème est survenu lors de la dernière synchronisation :\n"
+"%s"
 
-#: ../src/gtk-ui/sync-ui.c:1556
-msgid "Server URL"
-msgstr "URL du serveur"
-
-#. TRANSLATORS: placeholder is a source name in settings window
-#: ../src/gtk-ui/sync-ui.c:1578
+#: ../src/gtk-ui/sync-ui.c:2817
 #, c-format
-msgid "%s URI"
-msgstr "%s URI"
+msgid "You've just restored a backup. The changes have not been synced with %s yet"
+msgstr "Vous venez de restaurer une sauvegarde. Les modifications n'ont pas encore été synchronisées avec %s"
 
-#: ../src/gtk-ui/sync-ui.c:1715 ../src/gtk-ui/ui.glade.h:17
-msgid "Launch website"
-msgstr "Lancer le site Web"
+#: ../src/gtk-ui/sync-ui.c:3105
+msgid "Waiting for current operation to finish..."
+msgstr "En attente de fin d'opération en cours..."
 
-# "setup" for limited space
-#: ../src/gtk-ui/sync-ui.c:1719
-msgid "Setup and use"
-msgstr "Configurer"
+#. TRANSLATORS: next strings are error messages.
+#: ../src/gtk-ui/sync-ui.c:3139
+msgid "A normal sync is not possible at this time. The server suggests a slow sync, but this might not always be what you want if both ends already have data."
+msgstr "Une synchronisation normale est actuellement impossible. Le serveur suggère une synchronisation lente, mais cela n'est pas forcément dans votre intérêt si les deux côtés contiennent déjà des données."
 
-#: ../src/gtk-ui/sync-ui.c:1765
-msgid "Failed to get list of manually setup services from SyncEvolution"
-msgstr ""
-"Impossible d'obtenir la liste des services configurés manuellement depuis "
-"SyncEvolution"
+#: ../src/gtk-ui/sync-ui.c:3143
+msgid "The sync process died unexpectedly."
+msgstr "Processus de synchronisation terminé de façon inattendue."
 
-#: ../src/gtk-ui/sync-ui.c:1806
-msgid "Failed to get list of supported services from SyncEvolution"
-msgstr ""
-"Impossible d'obtenir la liste des services pris en charge depuis "
-"SyncEvolution"
+#: ../src/gtk-ui/sync-ui.c:3148
+msgid "Password request was not answered. You can save the password in the settings to prevent the request."
+msgstr "La demande de mot de passe n'a pas été prise en compte. Vous pouvez enregistrer le mot de passe dans les paramètres pour empêcher la demande."
 
-#. TODO: this is a hack... SyncEnd should be a signal of it's own,
-#. not just hacked on top of the syncevolution error codes
-#: ../src/gtk-ui/sync-ui.c:1967
-msgid "Service configuration not found"
-msgstr "Configuration du service introuvable"
+#. TODO use the service device name here, this is a remote problem
+#: ../src/gtk-ui/sync-ui.c:3152
+msgid "There was a problem processing sync request. Trying again may help."
+msgstr "Un problème est survenu lors du traitement de la demande de synchronisation. Une nouvelle tentative peut se révéler utile."
 
-#: ../src/gtk-ui/sync-ui.c:1973
-msgid "Not authorized"
-msgstr "Non autorisé"
+#: ../src/gtk-ui/sync-ui.c:3158
+msgid "Failed to login. Could there be a problem with your username or password?"
+msgstr "Échec de connexion. Pourrait-il y avoir un problème avec votre nom d'utilisateur ou bien votre mot de passe ?"
 
-#: ../src/gtk-ui/sync-ui.c:1975
+#: ../src/gtk-ui/sync-ui.c:3161
 msgid "Forbidden"
 msgstr "Interdit"
 
-#: ../src/gtk-ui/sync-ui.c:1977
-msgid "Not found"
-msgstr "Introuvable"
+#. TRANSLATORS: data source means e.g. calendar or addressbook
+#: ../src/gtk-ui/sync-ui.c:3167
+msgid "A data source could not be found. Could there be a problem with the settings?"
+msgstr "Une source de données n'a pas pu être trouvée. Pourrait-il y avoir un problème avec les paramètres ?"
 
-#: ../src/gtk-ui/sync-ui.c:1979
-msgid "Fatal database error"
-msgstr "Erreur fatale de base de données"
+#: ../src/gtk-ui/sync-ui.c:3171
+msgid "Remote database error"
+msgstr "Erreur de base de données à distance"
 
-#: ../src/gtk-ui/sync-ui.c:1981
-msgid "Database error"
-msgstr "Erreur de base de données"
+#. This can happen when EDS is borked, restart it may help...
+#: ../src/gtk-ui/sync-ui.c:3174
+msgid "There is a problem with the local database. Syncing again or rebooting may help."
+msgstr "Il y a un problème avec la base de données locale. Synchroniser de nouveau ou bien redémarrer peut aider."
 
-#: ../src/gtk-ui/sync-ui.c:1983
-msgid "No space left"
-msgstr "Pas d'espace disponible"
+#: ../src/gtk-ui/sync-ui.c:3177
+msgid "No space on disk"
+msgstr "Il n'y a plus d'espace disponible sur le disque"
 
-#. TODO identify problem item somehow ?
-#: ../src/gtk-ui/sync-ui.c:1986
+#: ../src/gtk-ui/sync-ui.c:3179
 msgid "Failed to process SyncML"
 msgstr "Impossible de terminer SyncML"
 
-#: ../src/gtk-ui/sync-ui.c:1988
+#: ../src/gtk-ui/sync-ui.c:3181
 msgid "Server authorization failed"
 msgstr "L'autorisation du serveur a échoué"
 
-#: ../src/gtk-ui/sync-ui.c:1990
+#: ../src/gtk-ui/sync-ui.c:3183
 msgid "Failed to parse configuration file"
 msgstr "Impossible d'analyser le fichier de configuration"
 
-#: ../src/gtk-ui/sync-ui.c:1992
+#: ../src/gtk-ui/sync-ui.c:3185
 msgid "Failed to read configuration file"
 msgstr "Impossible de lire le fichier de configuration"
 
-#: ../src/gtk-ui/sync-ui.c:1994
+#: ../src/gtk-ui/sync-ui.c:3187
 msgid "No configuration found"
 msgstr "Aucune configuration trouvée"
 
-#: ../src/gtk-ui/sync-ui.c:1996
+#: ../src/gtk-ui/sync-ui.c:3189
 msgid "No configuration file found"
 msgstr "Aucun fichier de configuration trouvé"
 
-#: ../src/gtk-ui/sync-ui.c:1998
+#: ../src/gtk-ui/sync-ui.c:3191
 msgid "Server sent bad content"
 msgstr "Le serveur a transmis des données incorrectes"
 
-#: ../src/gtk-ui/sync-ui.c:2000
-msgid "Transport failure (no connection?)"
-msgstr "Échec lors du transport (pas de connexion ?)"
-
-#: ../src/gtk-ui/sync-ui.c:2002
-msgid "Connection timed out"
-msgstr "Connexion expirée"
-
-#: ../src/gtk-ui/sync-ui.c:2004
+#: ../src/gtk-ui/sync-ui.c:3193
 msgid "Connection certificate has expired"
 msgstr "Le certificat de la connexion a expiré"
 
-#: ../src/gtk-ui/sync-ui.c:2006
+#: ../src/gtk-ui/sync-ui.c:3195
 msgid "Connection certificate is invalid"
 msgstr "le certificat de la connexion est invalide"
 
-#: ../src/gtk-ui/sync-ui.c:2009
-msgid "Connection failed"
-msgstr "Échec de la connexion"
+#: ../src/gtk-ui/sync-ui.c:3203
+msgid "We were unable to connect to the server. The problem could be temporary or there could be something wrong with the settings."
+msgstr "Nous n'avons pas pu nous connecter au serveur. Il se peut que le problème soit temporaire ou bien qu’il y ait une erreur avec les paramètres."
 
-#: ../src/gtk-ui/sync-ui.c:2011
-msgid "URL is bad"
-msgstr "URL incorrecte"
+#: ../src/gtk-ui/sync-ui.c:3210
+msgid "The server URL is bad"
+msgstr "L'URL du serveur est mauvaise"
 
-#: ../src/gtk-ui/sync-ui.c:2013
-msgid "Server not found"
-msgstr "Serveur introuvable"
+#: ../src/gtk-ui/sync-ui.c:3215
+msgid "The server was not found"
+msgstr "Le serveur n'a pas été trouvé"
 
-#: ../src/gtk-ui/sync-ui.c:2015
+#: ../src/gtk-ui/sync-ui.c:3217
 #, c-format
 msgid "Error %d"
 msgstr "Erreur %d"
 
-#: ../src/gtk-ui/sync-ui.c:2025
-msgid "Sync D-Bus service exited unexpectedly"
-msgstr "Service de synchronisation D-Bus terminé de façon inattendue"
-
-#: ../src/gtk-ui/sync-ui.c:2028 ../src/gtk-ui/sync-ui.c:2079
-msgid "Sync Failed"
-msgstr "Échec de la synchronisation"
-
-#: ../src/gtk-ui/sync-ui.c:2071
-msgid "Sync complete"
-msgstr "Synchronisation terminée"
-
-#: ../src/gtk-ui/sync-ui.c:2076
-msgid "Sync canceled"
-msgstr "Synchronisation annulée"
-
-#. NOTE extra1 can be error here
-#: ../src/gtk-ui/sync-ui.c:2094
-msgid "Ending sync"
-msgstr "Arrêt de la synchronisation en cours"
-
-#. TRANSLATORS: placeholder is a source name (e.g. 'Calendar') in a progress text
-#: ../src/gtk-ui/sync-ui.c:2118
-#, c-format
-msgid "Preparing '%s'"
-msgstr "'%s' en cours de préparation"
+#. TRANSLATORS: password request dialog contents: title, cancel button
+#. * and ok button
+#: ../src/gtk-ui/sync-ui.c:3355
+msgid "Password is required for sync"
+msgstr "Mot de passe nécessaire pour la synchronisation"
 
-#. TRANSLATORS: placeholder is a source name in a progress text
-#: ../src/gtk-ui/sync-ui.c:2130
-#, c-format
-msgid "Sending '%s'"
-msgstr "'%s' en cours d'envoi"
+#: ../src/gtk-ui/sync-ui.c:3359
+msgid "Sync with password"
+msgstr "Synchronisation avec le mot de passe..."
 
-#. TRANSLATORS: placeholder is a source name in a progress text
-#: ../src/gtk-ui/sync-ui.c:2142
+#. TRANSLATORS: password request dialog message, placeholder is service name
+#: ../src/gtk-ui/sync-ui.c:3369
 #, c-format
-msgid "Receiving '%s'"
-msgstr "'%s' en cours de réception"
-
-#: ../src/gtk-ui/ui.glade.h:1
-msgid "<b>Data</b>"
-msgstr "<b>Données</b>"
+msgid "Please enter password for syncing with %s:"
+msgstr "Veuillez saisir le mot de passe pour synchroniser avec %s :"
 
+#. title for the buttons on the right side of main view
 #: ../src/gtk-ui/ui.glade.h:2
-msgid "<b>No sync service in use</b>"
-msgstr "<b>Pas de service de synchro en cours d'utilisation</b>"
-
-#: ../src/gtk-ui/ui.glade.h:3
-msgid "<b>Sync failure</b>"
-msgstr "<b>Échec de la synchronisation</b>"
+msgid "<b>Actions</b>"
+msgstr "<b>Actions</b>"
 
+#. text between the two "start from scratch" buttons in emergency view
 #: ../src/gtk-ui/ui.glade.h:4
-msgid "<b>Type of Sync</b>"
-msgstr "<b>Type de synchronisation</b>"
+msgid "<b>or</b>"
+msgstr "<b>ou</b>"
 
 #: ../src/gtk-ui/ui.glade.h:5
-msgid "<big>Manual setup</big>"
-msgstr "<big>Configuration manuelle</big>"
+msgid "<big>Direct sync</big>"
+msgstr "<big>Synchronisation directe</big>"
 
 #: ../src/gtk-ui/ui.glade.h:6
-msgid "<big>Supported services</big>"
-msgstr "<big>Services pris en charge</big>"
-
-# "New" for lack of space
-#: ../src/gtk-ui/ui.glade.h:7
-msgid "Add new service"
-msgstr "Nouveau"
+msgid "<big>Network sync</big>"
+msgstr "<big>Synchronisation réseau</big>"
 
+#. a title in emergency view
 #: ../src/gtk-ui/ui.glade.h:8
-msgid "Back to sync"
-msgstr "Retourner à la synchronisation"
+msgid "<big>Restore from backup</big>"
+msgstr "<big>Restaurer depuis une sauvegarde</big>"
 
-#: ../src/gtk-ui/ui.glade.h:9
-msgid ""
-"Change sync\n"
-"service"
-msgstr ""
-"Changer de service\n"
-"de synchronisation"
-
-#: ../src/gtk-ui/ui.glade.h:11
-msgid "Delete all local data and replace it with remote data"
-msgstr ""
-"Supprimer toutes les données locales et les replacer avec les données "
-"distantes"
+#. a title in emergency view
+#: ../src/gtk-ui/ui.glade.h:10
+msgid "<big>Slow sync</big>"
+msgstr "<big>Synchronisation lente</big>"
 
+#. a title in emergency view
 #: ../src/gtk-ui/ui.glade.h:12
-msgid "Delete all remote data and replace it with local data"
-msgstr ""
-"Supprimer toutes les données distantes et les replacer avec les données "
-"locales  "
+msgid "<big>Start from scratch</big>"
+msgstr "<big>Reprendre à zéro</big>"
 
 #: ../src/gtk-ui/ui.glade.h:13
-msgid "Delete this service"
-msgstr "Supprimer ce service"
-
-#: ../src/gtk-ui/ui.glade.h:14
-msgid "Edit service settings"
-msgstr "Modifier les paramètres du service"
-
-#: ../src/gtk-ui/ui.glade.h:15
 msgid ""
-"If you don't see your service above but know that your sync provider uses "
-"SyncML\n"
-"you can setup a service manually."
+"A slow sync compares items from both sides and tries to merge them. \n"
+"This may fail in some cases, leading to duplicates or lost information."
 msgstr ""
-"Si vous ne voyez pas votre service mais savez que votre fournisseur de "
-"services\n"
-"de synchronisation utilise SyncML, vous pouvez configurer un service "
-"manuellement."
+"Une synchronisation lente compare les articles des deux côtés et tente de les fusionner. \n"
+"Cela peut échouer dans certains cas, provoquant des duplicatas ou une perte d'information. "
 
+# "New" for lack of space
+# If it fits , it should be : Nouveau périphérique
+#: ../src/gtk-ui/ui.glade.h:15
+msgid "Add new device"
+msgstr "Nouveau"
+
+# "New" for lack of space
+# If it fits , it should be : Nouveau service
+#: ../src/gtk-ui/ui.glade.h:16
+msgid "Add new service"
+msgstr "Nouveau"
+
+#. explanation of "Restore backup" function
 #: ../src/gtk-ui/ui.glade.h:18
-msgid "Merge local and remote data (recommended)"
-msgstr "Combiner les données locales et distantes (recommandé)"
+msgid "Backups are made before every time we Sync. Choose a backup to restore. Any changes you have made since then will be lost."
+msgstr "Les sauvegardes sont effectuées à chaque synchronisation. Choisissez une sauvegarde à restaurer. Toutes les  modifications effectuées à partir de là seront perdues."
 
 #: ../src/gtk-ui/ui.glade.h:19
-msgid "Password"
-msgstr "Mot de passe"
-
-#: ../src/gtk-ui/ui.glade.h:20
-msgid "Reset original server settings"
-msgstr "Rétablir les paramètres d'origine du serveur"
+msgid "Calendar"
+msgstr "Calendrier"
 
+#. Button in main view, right side. Keep to below 20 chars per line, feel free to use two lines
 #: ../src/gtk-ui/ui.glade.h:21
-msgid "Save and use this service"
-msgstr "Sauvegarder et utiliser ce service"
-
-#: ../src/gtk-ui/ui.glade.h:22
-msgid "Select sync service"
-msgstr "Sélectionner le service de synchronisation"
-
-#: ../src/gtk-ui/ui.glade.h:23
-msgid "Server settings"
-msgstr "Paramètres du serveur"
+msgid ""
+"Change or edit\n"
+"sync service"
+msgstr ""
+"Changer ou modifier\n"
+"le service de\n"
+"synchronisation"
 
+#. close button for settings window
 #: ../src/gtk-ui/ui.glade.h:24
-msgid "Service name"
-msgstr "Nom du service"
+msgid "Close"
+msgstr "Fermer"
 
 #: ../src/gtk-ui/ui.glade.h:25
 msgid ""
-"Sorry, you need an internet\n"
-"connection to sync."
+"Delete all data on Zyb \n"
+"and replace with your\n"
+"local information"
 msgstr ""
-"Désolé, vous avez besoin d'une connexion\n"
-"Internet pour synchroniser."
+"Supprimer toutes\n"
+"les données sur Zyb\n"
+"et les remplacer avec\n"
+"les données locales  "
 
-#: ../src/gtk-ui/ui.glade.h:27
-msgid "Stop using this service"
-msgstr "Ne plus utiliser ce service"
+#: ../src/gtk-ui/ui.glade.h:28
+msgid ""
+"Delete all your local\n"
+"information and replace\n"
+"with data from Zyb"
+msgstr ""
+"Supprimer toutes\n"
+"les données locales\n"
+"et les remplacer avec\n"
+"les données de Zyb"
 
-#: ../src/gtk-ui/ui.glade.h:30
+#. button in main view, right side. Keep length to 20 characters or so, use two lines if needed
+#: ../src/gtk-ui/ui.glade.h:32
 msgid ""
-"Synchronization is not available (D-Bus service does not answer), sorry."
+"Fix a sync\n"
+"emergency"
 msgstr ""
-"Synchronisation non disponible (pas de réponse du service D-Bus), désolé."
+"Réparer une\n"
+"urgence de\n"
+"synchronisation"
 
-#: ../src/gtk-ui/ui.glade.h:31
+#: ../src/gtk-ui/ui.glade.h:34
 msgid ""
-"To sync you'll need a network connection and an account with a sync "
-"service.\n"
-"We support the following services: "
+"If you don't see your service above but know that your sync provider uses SyncML\n"
+"you can setup a service manually."
 msgstr ""
-"Pour synchroniser vous avez besoin d'une connexion réseau et d'un compte "
-"avec un service de synchronisation.\n"
-"Nous prenons en charge les services suivants :"
+"Si vous ne voyez pas votre service mais savez que votre fournisseur de services\n"
+"de synchronisation utilise SyncML, vous pouvez configurer un service manuellement."
 
-#: ../src/gtk-ui/ui.glade.h:33
-msgid "Username"
-msgstr "Nom d'utilisateur"
+#: ../src/gtk-ui/ui.glade.h:36
+msgid "Settings"
+msgstr "Paramètres"
 
-#: ../src/gtk-ui/ui.glade.h:34
+#: ../src/gtk-ui/ui.glade.h:39
+msgid "Sync Emergency"
+msgstr "Urgence de synchronisation"
+
+#: ../src/gtk-ui/ui.glade.h:41
 msgid ""
-"You haven't selected a sync service yet. Sync services let you \n"
-"synchronize your data between your netbook and a web service."
+"To sync you'll need a network connection and an account with a sync service.\n"
+"We support the following services: "
 msgstr ""
-"Vous n'avez sélectionné aucun service de synchronisation. Ces services vous\n"
-"permettent de synchroniser les données de votre netbook et d'un service web."
+"Pour synchroniser vous avez besoin d'une connexion réseau et d'un compte avec un service de synchronisation.\n"
+"Nous prenons en charge les services suivants :"
+
+#: ../src/gtk-ui/ui.glade.h:43
+msgid "Use Bluetooth to Sync your data from one device to another."
+msgstr "Utiliser Bluetooth pour synchroniser vos données d'un périphérique à l'autre."
 
-#: ../src/gtk-ui/sync.desktop.in.h:2 ../src/gtk-ui/sync-gtk.desktop.in.h:2
+#: ../src/gtk-ui/ui.glade.h:44
+msgid "You will need to add Bluetooth devices before they can be synced."
+msgstr "Vous devrez ajouter des périphériques Bluetooth avant de pouvoir les synchroniser. "
+
+#: ../src/gtk-ui/sync.desktop.in.h:2
+#: ../src/gtk-ui/sync-gtk.desktop.in.h:2
 msgid "Up to date"
 msgstr "À jour"
 
@@ -564,5 +652,355 @@ msgstr "À jour"
 msgid "Sync (GTK)"
 msgstr "Sync (GTK)"
 
+#: ../src/gtk-ui/sync-config-widget.c:74
+msgid "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in sync."
+msgstr "ScheduleWorld vous permet de garder vos contacts, événements, tâches et notes synchronisés."
+
+#: ../src/gtk-ui/sync-config-widget.c:77
+msgid "Google Sync can backup and synchronize your contacts with your Gmail contacts."
+msgstr "Google Sync permet de sauvegarder et synchroniser votre carnet d'adresses avec vos contacts Gmail."
+
+#. TRANSLATORS: Please include the word "demo" (or the equivalent in
+#. your language): Funambol is going to be a 90 day demo service
+#. in the future
+#: ../src/gtk-ui/sync-config-widget.c:83
+msgid "Backup your contacts and calendar. Sync with a single click, anytime, anywhere (DEMO)."
+msgstr "Sauvegarde de vos contacts et calendrier. Synchronisation en un seul clic, n'importe quand, n'importe où (DEMO)."
+
+#: ../src/gtk-ui/sync-config-widget.c:86
+msgid "Mobical Backup and Restore service allows you to securely backup your personal mobile data for free."
+msgstr "Le service Mobical de sauvegarde et de restauration vous permet de sauvegarder vos données personnelles mobiles gratuitement et en toute sécurité."
+
+#: ../src/gtk-ui/sync-config-widget.c:89
+msgid "ZYB is a simple way for people to store and share mobile information online."
+msgstr "ZYB est une façon simple de stocker et de partager les informations mobiles en ligne."
+
+#: ../src/gtk-ui/sync-config-widget.c:92
+msgid "Memotoo lets you access your personal data from any computer connected to the Internet."
+msgstr "Memotoo vous permet d'accéder à vos données personnelles depuis n'importe quel ordinateur connecté à Internet."
+
+#: ../src/gtk-ui/sync-config-widget.c:188
+msgid "Sorry, failed to save the configuration"
+msgstr "Désolé, la sauvegarde de la configuration a échoué"
+
+#: ../src/gtk-ui/sync-config-widget.c:377
+msgid "Service must have a name and server URL"
+msgstr "Le service doit avoir un nom et une URL de serveur"
+
+#: ../src/gtk-ui/sync-config-widget.c:418
+#, c-format
+msgid "Do you want to reset the settings for %s? This will not remove any synced information on either end."
+msgstr "Voulez-vous réinitialiser les paramètres pour %s ? Cela ne supprimera aucune information synchronisée de part et d’autre. "
+
+#. TRANSLATORS: buttons in reset-service warning dialog
+#: ../src/gtk-ui/sync-config-widget.c:422
+msgid "Yes, reset"
+msgstr "Oui, réinitialiser"
+
+#: ../src/gtk-ui/sync-config-widget.c:423
+#: ../src/gtk-ui/sync-config-widget.c:434
+msgid "No, keep settings"
+msgstr "Non, conserver les paramètres"
+
+#: ../src/gtk-ui/sync-config-widget.c:428
+#, c-format
+msgid "Do you want to delete the settings for %s? This will not remove any synced information on either end but it will remove these settings."
+msgstr "Voulez-vous supprimer les paramètres pour %s ? Cela ne supprimera aucune information synchronisée de part et d’autre mais supprimera ces paramètres."
+
+#. TRANSLATORS: buttons in delete-service warning dialog
+#: ../src/gtk-ui/sync-config-widget.c:433
+msgid "Yes, delete"
+msgstr "Oui, supprimer"
+
+#: ../src/gtk-ui/sync-config-widget.c:463
+msgid "Reset settings"
+msgstr "Rétablir les paramètres"
+
+#: ../src/gtk-ui/sync-config-widget.c:466
+msgid "Delete settings"
+msgstr "Supprimer les paramètres"
+
+# "setup" for limited space
+#: ../src/gtk-ui/sync-config-widget.c:476
+msgid "Save and use"
+msgstr "Sauvegarder et utiliser"
+
+#: ../src/gtk-ui/sync-config-widget.c:479
+msgid ""
+"Save and replace\n"
+"current service"
+msgstr ""
+"Sauvegarder et utiliser\n"
+"le service actuel"
+
+#: ../src/gtk-ui/sync-config-widget.c:489
+msgid "Stop using device"
+msgstr "Ne plus utiliser ce périphérique"
+
+#: ../src/gtk-ui/sync-config-widget.c:492
+msgid "Stop using service"
+msgstr "Ne plus utiliser ce service"
+
+#. TRANSLATORS: label for an entry in service configuration form.
+#. * Placeholder is a source  name.
+#. * Example: "Appointments URI"
+#: ../src/gtk-ui/sync-config-widget.c:675
+#, c-format
+msgid "%s URI"
+msgstr "%s URI"
+
+#. TRANSLATORS: toggles in service configuration form, placeholder is service
+#. * or device name
+#: ../src/gtk-ui/sync-config-widget.c:850
+#, c-format
+msgid "Send changes to %s"
+msgstr "Envoyer les modifications vers %s"
+
+#: ../src/gtk-ui/sync-config-widget.c:855
+#, c-format
+msgid "Receive changes from %s"
+msgstr "Recevoir les modifications depuis %s"
+
+# verb = Synchroniser
+# noun = Synchronisation
+#: ../src/gtk-ui/sync-config-widget.c:871
+msgid "<b>Sync</b>"
+msgstr "<b>Synchroniser</b>"
+
+#. TRANSLATORS: label of a entry in service configuration
+#: ../src/gtk-ui/sync-config-widget.c:887
+msgid "Server address"
+msgstr "Adresse du serveur"
+
+#. TRANSLATORS: explanation before a device template combobox.
+#. * Placeholder is a device name like 'Nokia N85' or 'Syncevolution
+#. * Client'
+#: ../src/gtk-ui/sync-config-widget.c:963
+#, c-format
+msgid "This device looks like it might be a '%s'. If this is not correct, please take a look at the list of supported devices and pick yours if it is listed"
+msgstr "Il semble que le périphérique est un '%s'. Si ce n'est pas correct, veuillez consulter la liste de périphériques pris en charge et sélectionnez le votre s'il apparait dans la liste"
+
+#: ../src/gtk-ui/sync-config-widget.c:969
+msgid "We don't know what this device is exactly. Please take a look at the list of supported devices and pick yours if it is listed"
+msgstr "Nous ne savons pas exactement ce qu’est ce périphérique. Veuillez consulter la liste de périphériques pris en charge et sélectionnez le votre s'il apparait dans la liste"
+
+#: ../src/gtk-ui/sync-config-widget.c:1122
+#, c-format
+msgid "%s - Bluetooth device"
+msgstr "%s - Périphérique Bluetooth"
+
+#. TRANSLATORS: service title for services that are not based on a
+#. * template in service list, the placeholder is the name of the service
+#: ../src/gtk-ui/sync-config-widget.c:1128
+#, c-format
+msgid "%s - manually setup"
+msgstr "%s - configurer manuellement"
+
+#. TRANSLATORS: link button in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1803
+msgid "Launch website"
+msgstr "Lancer le site Web"
+
+# "setup" for limited space
+#. TRANSLATORS: button in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1812
+msgid "Setup now"
+msgstr "Configurer"
+
+#. TRANSLATORS: labels of entries in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1908
+msgid "Username"
+msgstr "Nom d'utilisateur"
+
+#: ../src/gtk-ui/sync-config-widget.c:1923
+msgid "Password"
+msgstr "Mot de passe"
+
+#. TRANSLATORS: warning in service configuration form for people
+#. who have modified the configuration via other means.
+#: ../src/gtk-ui/sync-config-widget.c:1946
+msgid "Current configuration is more complex than what can be shown here. Changes to sync mode or synced data types will overwrite that configuration."
+msgstr "La configuration actuelle est plus complexe que ce qui peut être affiché ici. Les modifications apportées au mode synchronisation ou aux types de données synchronisées écraseront cette configuration."
+
+#. TRANSLATORS: this is the epander label for server settings
+#. in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1965
+msgid "Hide server settings"
+msgstr "Masquer les paramètres du serveur"
+
+#. TRANSLATORS: this is the epander label for server settings
+#. in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1985
+msgid "Show server settings"
+msgstr "Afficher les paramètres du serveur"
+
+#: ../src/gnome-bluetooth/syncevolution.c:110
+msgid "Sync in the Sync application"
+msgstr "Synchroniser dans l'application Synchronisation"
+
+#: ../src/syncevo-dbus-server.cpp:5622
+#, c-format
+msgid "%s is syncing"
+msgstr "%s est en cours de synchronisation"
+
+#: ../src/syncevo-dbus-server.cpp:5623
+#, c-format
+msgid "We have just started to sync your computer with the %s sync service."
+msgstr "Démarrage de la synchronisation de votre ordinateur avec le service %s."
+
+#. if sync is successfully started and done
+#: ../src/syncevo-dbus-server.cpp:5637
+#, c-format
+msgid "%s sync complete"
+msgstr "Synchronisation %s terminée"
+
+#: ../src/syncevo-dbus-server.cpp:5638
+#, c-format
+msgid "We have just finished syncing your computer with the %s sync service."
+msgstr "Synchronisation de votre ordinateur avec le service %s"
+
+#. if sync is successfully started and has errors, or not started successful with a fatal problem
+#: ../src/syncevo-dbus-server.cpp:5643
+msgid "Sync problem."
+msgstr "Problème de synchronisation."
+
+#: ../src/syncevo-dbus-server.cpp:5644
+msgid "Sorry, there's a problem with your sync that you need to attend to."
+msgstr "Désolé, il y a un problème avec la  synchronisation que vous tentez."
+
+#: ../src/syncevo-dbus-server.cpp:5717
+msgid "View"
+msgstr "Affichage"
+
+#: ../src/syncevo-dbus-server.cpp:5718
+msgid "Dismiss"
+msgstr "Ignorer"
+
+#~ msgid ""
+#~ "Do you want to replace %s with %s? This will not remove any synced "
+#~ "information on either end but you will no longer be able to sync with %s."
+#~ msgstr ""
+#~ "Voulez-vous remplacer %s avec %s ? Cela ne supprimera aucune information "
+#~ "synchronisée de part et d’autre mais vous ne pourrez plus synchroniser "
+#~ "avec %s."
+
+#~ msgid "Yes, use %s"
+#~ msgstr "Oui, utiliser %s"
+
+#~ msgid "No, use %s"
+#~ msgstr "Non, utiliser %s"
+
+#~ msgid "Database error"
+#~ msgstr "Erreur de base de données"
+
+#~ msgid "Reset service"
+#~ msgstr "Réinitialiser le service"
+
+#~ msgid "Addressbook"
+#~ msgstr "Carnet d'adresses"
+
+#~ msgid "Todo"
+#~ msgstr "À Faire"
+
+#~ msgid "Memo"
+#~ msgstr "Mémo"
+
+#~ msgid "Failed to save current service in GConf configuration system"
+#~ msgstr ""
+#~ "Impossible de sauvegarder le service actuel dans le système de "
+#~ "configuration GConf"
+
+#~ msgid "Failed to save service configuration to SyncEvolution"
+#~ msgstr ""
+#~ "Impossible de sauvegarder la configuration du service dans SyncEvolution"
+
+#~ msgid "Failed to get service configuration from SyncEvolution"
+#~ msgstr ""
+#~ "Impossible d'obtenir la configuration du service depuis SyncEvolution"
+
+#~ msgid "Failed to remove service configuration from SyncEvolution"
+#~ msgstr "Impossible d'éliminer la configuration du service de SyncEvolution"
+
+#~ msgid "Failed to cancel: sync was no longer in progress"
+#~ msgstr "Impossible d'annuler : sync n'était plus en cours de fonctionnement"
+
+#~ msgid "Failed to cancel sync"
+#~ msgstr "Impossible d'annuler la synchronisation"
+
+#~ msgid "Canceling sync"
+#~ msgstr "Synchronisation en cours d'annulation"
+
+#~ msgid "No sources are enabled, not syncing"
+#~ msgstr "Pas de source activée, échec de la synchronisation"
+
+#~ msgid "A sync is already in progress"
+#~ msgstr "Une synchronisation est déjà en cours"
+
+#~ msgid "Failed to start sync"
+#~ msgstr "Impossible de démarrer la synchronisation"
+
+#~ msgid "%s (not supported by this service)"
+#~ msgstr "%s (non pris en charge par ce service)"
+
+#~ msgid "Failed to get server configuration from SyncEvolution"
+#~ msgstr ""
+#~ "Impossible d'obtenir la configuration du serveur depuis SyncEvolution"
+
+#~ msgid "Server URL"
+#~ msgstr "URL du serveur"
+
+#~ msgid "Failed to get list of manually setup services from SyncEvolution"
+#~ msgstr ""
+#~ "Impossible d'obtenir la liste des services configurés manuellement depuis "
+#~ "SyncEvolution"
+
+#~ msgid "Service configuration not found"
+#~ msgstr "Configuration du service introuvable"
+
+#~ msgid "Not authorized"
+#~ msgstr "Non autorisé"
+
+#~ msgid "Not found"
+#~ msgstr "Introuvable"
+
+#~ msgid "Transport failure (no connection?)"
+#~ msgstr "Échec lors du transport (pas de connexion ?)"
+
+#~ msgid "Connection timed out"
+#~ msgstr "Connexion expirée"
+
+#~ msgid "Sync canceled"
+#~ msgstr "Synchronisation annulée"
+
+#~ msgid "Ending sync"
+#~ msgstr "Arrêt de la synchronisation en cours"
+
+#~ msgid "<b>No sync service in use</b>"
+#~ msgstr "<b>Pas de service de synchro en cours d'utilisation</b>"
+
+#~ msgid "<big>Manual setup</big>"
+#~ msgstr "<big>Configuration manuelle</big>"
+
+#~ msgid "Merge local and remote data (recommended)"
+#~ msgstr "Combiner les données locales et distantes (recommandé)"
+
+#~ msgid "Reset original server settings"
+#~ msgstr "Rétablir les paramètres d'origine du serveur"
+
+#~ msgid "Service name"
+#~ msgstr "Nom du service"
+
+#~ msgid ""
+#~ "Sorry, you need an internet\n"
+#~ "connection to sync."
+#~ msgstr ""
+#~ "Désolé, vous avez besoin d'une connexion\n"
+#~ "Internet pour synchroniser."
+
+#~ msgid ""
+#~ "Synchronization is not available (D-Bus service does not answer), sorry."
+#~ msgstr ""
+#~ "Synchronisation non disponible (pas de réponse du service D-Bus), désolé."
+
 #~ msgid "Bring your data with you"
 #~ msgstr "Apporter vos données avec vous"
index 804686c..c347408 100644 (file)
--- a/po/it.po
+++ b/po/it.po
@@ -7,245 +7,265 @@ msgid ""
 msgstr ""
 "Project-Id-Version: syncevolution\n"
 "Report-Msgid-Bugs-To: http://moblin.org/projects/syncevolution\n"
-"POT-Creation-Date: 2010-02-12 00:01+0000\n"
-"PO-Revision-Date: 2010-02-24 13:28+0100\n"
+"POT-Creation-Date: 2010-04-07 09:29+0000\n"
+"PO-Revision-Date: 2010-04-09 10:06+0100\n"
 "Last-Translator: Lorenzo <lorenzo.gennaro@ptiglobal.net>\n"
 "Language-Team: Italian <tp@lists.linux.it>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Poedit-Language: Italian\n"
+"X-Poedit-SourceCharset: utf-8\n"
 
 # (ndt) titolo finestra
 #. TRANSLATORS: this is the application name that may be used by e.g.
 #. the windowmanager
 #: ../src/gtk-ui/main.c:40
-#: ../src/gtk-ui/ui.glade.h:36
+#: ../src/gtk-ui/ui.glade.h:38
 #: ../src/gtk-ui/sync.desktop.in.h:1
 #: ../src/gnome-bluetooth/syncevolution.c:112
 msgid "Sync"
 msgstr "Sincronizzazione"
 
-#: ../src/gtk-ui/sync-ui.c:234
+#: ../src/gtk-ui/sync-ui.c:260
 msgid "Contacts"
 msgstr "Contatti"
 
-#: ../src/gtk-ui/sync-ui.c:236
+#: ../src/gtk-ui/sync-ui.c:262
 msgid "Appointments"
 msgstr "Appuntamenti"
 
-#: ../src/gtk-ui/sync-ui.c:238
-#: ../src/gtk-ui/ui.glade.h:38
+#: ../src/gtk-ui/sync-ui.c:264
+#: ../src/gtk-ui/ui.glade.h:40
 msgid "Tasks"
 msgstr "Compiti"
 
-#: ../src/gtk-ui/sync-ui.c:240
+#: ../src/gtk-ui/sync-ui.c:266
 msgid "Notes"
 msgstr "Note"
 
 #. TRANSLATORS: This is a "combination source" for syncing with devices
 #. * that combine appointments and tasks. the name should match the ones
 #. * used for calendar and todo above
-#: ../src/gtk-ui/sync-ui.c:245
+#: ../src/gtk-ui/sync-ui.c:271
 msgid "Appointments & Tasks"
 msgstr "Appuntamenti e compiti"
 
-#: ../src/gtk-ui/sync-ui.c:317
+#: ../src/gtk-ui/sync-ui.c:343
 msgid "Starting sync"
 msgstr "Avvio sincronizzazione"
 
 #. TRANSLATORS: slow sync confirmation dialog message. Placeholder
 #. * is service/device name
-#: ../src/gtk-ui/sync-ui.c:355
+#: ../src/gtk-ui/sync-ui.c:381
 #, c-format
 msgid "Do you want to slow sync with %s?"
 msgstr "Vuoi effettuare la sincronizzazione lenta con %s?"
 
-#: ../src/gtk-ui/sync-ui.c:359
+#: ../src/gtk-ui/sync-ui.c:385
 msgid "Yes, do slow sync"
 msgstr "Sì, effettua la sincronizzazione lenta"
 
 # (ndt) pulsante
-#: ../src/gtk-ui/sync-ui.c:359
+#: ../src/gtk-ui/sync-ui.c:385
 msgid "No, cancel sync"
 msgstr "Annulla sincronizzazione"
 
 #. TRANSLATORS: confirmation dialog for refresh-from-server. Placeholder
 #. * is service/device name
-#: ../src/gtk-ui/sync-ui.c:392
+#: ../src/gtk-ui/sync-ui.c:418
 #, c-format
 msgid "Do you want to delete all local data and replace it with data from %s? This is not usually advised."
 msgstr "Eliminare i dati locali e sostituirli con quelli da %s? Solitamente questo non è consigliato."
 
 # (ndt) pulsante
-#: ../src/gtk-ui/sync-ui.c:397
-#: ../src/gtk-ui/sync-ui.c:428
+#: ../src/gtk-ui/sync-ui.c:423
+#: ../src/gtk-ui/sync-ui.c:454
 msgid "Yes, delete and replace"
 msgstr "Elimia e sostituisci"
 
-#: ../src/gtk-ui/sync-ui.c:397
-#: ../src/gtk-ui/sync-ui.c:428
-#: ../src/gtk-ui/sync-ui.c:1217
+#: ../src/gtk-ui/sync-ui.c:423
+#: ../src/gtk-ui/sync-ui.c:454
+#: ../src/gtk-ui/sync-ui.c:1566
 msgid "No"
 msgstr "No"
 
 #. TRANSLATORS: confirmation dialog for refresh-from-client. Placeholder
 #. * is service/device name
-#: ../src/gtk-ui/sync-ui.c:423
+#: ../src/gtk-ui/sync-ui.c:449
 #, c-format
 msgid "Do you want to delete all data in %s and replace it with your local data? This is not usually advised."
 msgstr "Eliminare i dati in %s e sostituirli con quelli locali? Solitamente questo non è consigliato."
 
-#: ../src/gtk-ui/sync-ui.c:455
+#: ../src/gtk-ui/sync-ui.c:481
 msgid "Trying to cancel sync"
 msgstr "Tentativo di annullare la sincronizzazione"
 
-#: ../src/gtk-ui/sync-ui.c:481
-msgid "No service selected"
-msgstr "Nessun servizio selezionato"
+#: ../src/gtk-ui/sync-ui.c:521
+msgid "No service or device selected"
+msgstr "Nessun servizio o dispositivo selezionato"
 
 #. TRANSLATORS: This is the title on main view. Placeholder is
 #. * the service name. Example: "Google - synced just now"
-#: ../src/gtk-ui/sync-ui.c:489
-#, fuzzy, c-format
+#: ../src/gtk-ui/sync-ui.c:529
+#, c-format
 msgid "%s - synced just now"
-msgstr "Ultima sincronizzazione pochi secondi fa"
+msgstr "%s - Ultima sincronizzazione pochi secondi fa"
 
-#: ../src/gtk-ui/sync-ui.c:493
-#, fuzzy, c-format
+#: ../src/gtk-ui/sync-ui.c:533
+#, c-format
 msgid "%s - synced a minute ago"
-msgstr "Ultima sincronizzazione un minuto fa"
+msgstr "%s - Ultima sincronizzazione un minuto fa"
 
-#: ../src/gtk-ui/sync-ui.c:497
-#, fuzzy, c-format
+#: ../src/gtk-ui/sync-ui.c:537
+#, c-format
 msgid "%s - synced %ld minutes ago"
-msgstr "Ultima sincronizzazione %ld minuti fa"
+msgstr "%s - Ultima sincronizzazione %ld minuti fa"
 
-#: ../src/gtk-ui/sync-ui.c:502
-#, fuzzy, c-format
+#: ../src/gtk-ui/sync-ui.c:542
+#, c-format
 msgid "%s - synced an hour ago"
-msgstr "Ultima sincronizzazione un'ora fa"
+msgstr "%s - Ultima sincronizzazione un'ora fa"
 
-#: ../src/gtk-ui/sync-ui.c:506
-#, fuzzy, c-format
+#: ../src/gtk-ui/sync-ui.c:546
+#, c-format
 msgid "%s - synced %ld hours ago"
-msgstr "Ultima sincronizzazione %ld ore fa"
+msgstr "%s - Ultima sincronizzazione %ld ore fa"
 
-#: ../src/gtk-ui/sync-ui.c:511
-#, fuzzy, c-format
+#: ../src/gtk-ui/sync-ui.c:551
+#, c-format
 msgid "%s - synced a day ago"
-msgstr "Ultima sincronizzazione un giorno fa"
+msgstr "%s - Ultima sincronizzazione un giorno fa"
 
-#: ../src/gtk-ui/sync-ui.c:515
-#, fuzzy, c-format
+#: ../src/gtk-ui/sync-ui.c:555
+#, c-format
 msgid "%s - synced %ld days ago"
-msgstr "Ultima sincronizzazione %ld giorni fa"
+msgstr "%s - Ultima sincronizzazione %ld giorni fa"
+
+# (ndt) pulsante
+#. TRANSLATORS: Action button in info bar in main view. Shown with e.g.
+#. * "You've just restored a backup. The changes have not been "
+#. * "synced with %s yet"
+#: ../src/gtk-ui/sync-ui.c:604
+#: ../src/gtk-ui/sync-ui.c:719
+msgid "Sync now"
+msgstr "Sincronizza ora"
 
 # (ndt) titolo finestra
-#. TRANSLATORS: Action buttons in error/info bars in main view.
-#: ../src/gtk-ui/sync-ui.c:563
-#: ../src/gtk-ui/ui.glade.h:35
-#, fuzzy
+#. TRANSLATORS: Action button in info bar in main view. Shown with e.g.
+#. * "A normal sync is not possible at this time..." message.
+#. * "Other options" will open Emergency view
+#: ../src/gtk-ui/sync-ui.c:610
+#: ../src/gtk-ui/ui.glade.h:37
 msgid "Slow sync"
-msgstr "Sincronizzazione"
+msgstr "Sincronizzazione lenta"
 
-#: ../src/gtk-ui/sync-ui.c:564
+#: ../src/gtk-ui/sync-ui.c:611
 msgid "Other options..."
 msgstr "Altre opzioni..."
 
-#: ../src/gtk-ui/sync-ui.c:567
+#. TRANSLATORS: Action button in info bar in main view. Shown e.g.
+#. * when no service is selected. Will open configuration view
+#: ../src/gtk-ui/sync-ui.c:616
 msgid "Select sync service"
 msgstr "Seleziona servizio di sincronizzazione"
 
 # (ndt) pulsante, sto sul corto
-#: ../src/gtk-ui/sync-ui.c:570
+#. TRANSLATORS: Action button in info bar in main view. Shown e.g.
+#. * login to service fails. Will open configuration view for this service
+#: ../src/gtk-ui/sync-ui.c:621
 msgid "Edit service settings"
 msgstr "Modifica impostazioni"
 
-#: ../src/gtk-ui/sync-ui.c:618
-#, fuzzy
-msgid "You haven't selected a sync service yet. Sync services let you synchronize your data between your netbook and a web service"
-msgstr ""
-"Non è ancora stato selezionato un servizio di sincronizzazione. Questi servizi\n"
-"consentono di sincronizzare i dati tra il proprio netbook e un servizio web."
+#: ../src/gtk-ui/sync-ui.c:670
+msgid "You haven't selected a sync service or device yet. Sync services let you synchronize your data between your netbook and a web service. You can also sync directly with some devices."
+msgstr "Non è ancora stato selezionato un servizio di sincronizzazione. Questi servizi consentono di sincronizzare i dati tra il proprio netbook e un servizio web. E' anche possibile sincronizzare direttamente con alcuni dispositivi."
 
 # (ndt) pulsante
-#: ../src/gtk-ui/sync-ui.c:662
+#: ../src/gtk-ui/sync-ui.c:717
 msgid "Sync again"
 msgstr "Sincronizza ancora"
 
-# (ndt) pulsante
-#: ../src/gtk-ui/sync-ui.c:664
-msgid "Sync now"
-msgstr "Sincronizza ora"
+#: ../src/gtk-ui/sync-ui.c:730
+msgid "Restoring"
+msgstr "Ripristino"
 
-#: ../src/gtk-ui/sync-ui.c:674
+#: ../src/gtk-ui/sync-ui.c:732
 msgid "Syncing"
 msgstr "Sincronizzazione"
 
 # (ndt) pulsante
 #. TRANSLATORS: This is for the button in main view, right side.
 #. Keep line length below ~20 characters, use two lines if needed
-#: ../src/gtk-ui/sync-ui.c:683
+#: ../src/gtk-ui/sync-ui.c:743
+#: ../src/gtk-ui/sync-ui.c:3358
 msgid "Cancel sync"
 msgstr "Annulla sincronizzazione"
 
 # (ndt) pulsante, dovrebbe tornare alla finestra principale
-#. TRANSLATORS: button in the Moblin window title bar when main view is
-#. * not visible
-#: ../src/gtk-ui/sync-ui.c:763
+#: ../src/gtk-ui/sync-ui.c:908
 msgid "Back to sync"
 msgstr "Torna indietro"
 
+#. TRANSLATORS: label for checkbutton/toggle in main view.
+#. * Please stick to similar length strings or break the line with
+#. * "\n" if absolutely needed
+#: ../src/gtk-ui/sync-ui.c:1209
+msgid "Automatic sync"
+msgstr "Sincronizzazione automatica"
+
 #. This is the expander label in emergency view. It summarizes the
 #. * currently selected data sources. First placeholder is service/device
 #. * name, second a comma separeted list of sources.
 #. * E.g. "Affected data: Google Contacts, Appointments"
-#: ../src/gtk-ui/sync-ui.c:1134
+#: ../src/gtk-ui/sync-ui.c:1480
 #, c-format
 msgid "Affected data: %s %s"
 msgstr "Dati interessati: %s %s"
 
-#: ../src/gtk-ui/sync-ui.c:1139
+#: ../src/gtk-ui/sync-ui.c:1485
 #, c-format
 msgid "Affected data: none"
 msgstr "Dati interessati: nessuno"
 
 #. TRANSLATORS: confirmation for restoring a backup. placeholder is the
 #. * backup time string defined below
-#: ../src/gtk-ui/sync-ui.c:1214
+#: ../src/gtk-ui/sync-ui.c:1563
 #, c-format
 msgid "Do you want to restore the backup from %s? All changes you have made since then will be lost."
-msgstr "Vuoi ripristinare il backup das? Tutte le modifiche apportate da allora saranno perse."
+msgstr "Vuoi ripristinare il backup da %s? Tutte le modifiche apportate da allora saranno perse."
 
-#: ../src/gtk-ui/sync-ui.c:1217
+#: ../src/gtk-ui/sync-ui.c:1566
 msgid "Yes, restore"
 msgstr "Sì, ripristina"
 
-#: ../src/gtk-ui/sync-ui.c:1249
+#. TRANSLATORS: date/time for strftime(), used in emergency view backup
+#. * label. Any time format that shows date and time is good.
+#: ../src/gtk-ui/sync-ui.c:1598
 #, c-format
 msgid "%x %X"
 msgstr "%x %X"
 
 #. TRANSLATORS: label for a backup in emergency view. Placeholder is
 #. * service or device name
-#: ../src/gtk-ui/sync-ui.c:1268
+#: ../src/gtk-ui/sync-ui.c:1617
 #, c-format
 msgid "Backed up before syncing with %s"
 msgstr "Back up effettuato prima della sincronizzazione con %s"
 
-#: ../src/gtk-ui/sync-ui.c:1285
+#: ../src/gtk-ui/sync-ui.c:1634
 msgid "Restore"
 msgstr "Ripristina"
 
 #. TRANSLATORS: this is an explanation in Emergency view.
 #. * Placeholder is a service/device name
-#: ../src/gtk-ui/sync-ui.c:1392
+#: ../src/gtk-ui/sync-ui.c:1741
 #, c-format
-msgid "A normal sync with %s is not possible at this time. You can do a slow two-way sync, start from scratch or restore from backup."
-msgstr "Una sincronizzazione normale con % s non è possibile in questo momento. Si può fare una sincronizzazione lenta a due vie, iniziare da zero o ripristinare dal backup."
+msgid "A normal sync with %s is not possible at this time. You can do a slow two-way sync or start from scratch. You can also restore a backup, but a slow sync or starting from scratch will still be required before normal sync is possible."
+msgstr "Una sincronizzazione normale con %s non è possibile in questo momento. Si può fare una sincronizzazione lenta a due vie o iniziare da zero. Si può anche ripristinare dal backup, ma una sincronizzazione lenta o un inizio da zero saranno comunque richiesti prima che sia possibile una sincronizzazione normale."
 
-#: ../src/gtk-ui/sync-ui.c:1400
+#: ../src/gtk-ui/sync-ui.c:1751
 #, c-format
 msgid "If something has gone horribly wrong, you can try a slow sync, start from scratch or restore from backup."
 msgstr "Se qualcosa è andato terribilmente storto, puoi provare una sincronizzazione lenta, iniziare da zero o ripristinare dal backup"
@@ -253,231 +273,285 @@ msgstr "Se qualcosa è andato terribilmente storto, puoi provare una sincronizza
 #. TRANSLATORS: These are a buttons in Emergency view. Placeholder is a
 #. * service/device name. Please don't use too long lines, but feel free to
 #. * use several lines.
-#: ../src/gtk-ui/sync-ui.c:1409
-#, fuzzy, c-format
+#: ../src/gtk-ui/sync-ui.c:1760
+#, c-format
 msgid ""
 "Delete all your local\n"
 "data and replace with\n"
 "data from %s"
-msgstr "Eliminare i dati locali e sostituirli con quelli remoti"
+msgstr ""
+"Eliminare i dati locali\n"
+"e sostituirli con\n"
+"quelli da %s"
 
-#: ../src/gtk-ui/sync-ui.c:1415
-#, fuzzy, c-format
+#: ../src/gtk-ui/sync-ui.c:1766
+#, c-format
 msgid ""
 "Delete all data on\n"
 "%s and replace\n"
 "with your local data"
-msgstr "Eliminare i dati remoti e sostituirli con quelli locali"
+msgstr ""
+"Eliminare i dati su\n"
+"%s e sostituirli\n"
+"con quelli locali"
 
-#: ../src/gtk-ui/sync-ui.c:1854
+#: ../src/gtk-ui/sync-ui.c:2226
 msgid "Failed to get list of supported services from SyncEvolution"
 msgstr "Recupero elenco dei servizi supportati da SyncEvolution non riuscito"
 
-#: ../src/gtk-ui/sync-ui.c:1958
-#: ../src/gtk-ui/sync-ui.c:2854
-#, fuzzy
+#: ../src/gtk-ui/sync-ui.c:2280
+msgid "There was a problem communicating with the sync process. Please try again later."
+msgstr "Si è verificato un problema di comunicazione con il processo di sincronizzazione. Si prega di riprovare più tardi."
+
+#: ../src/gtk-ui/sync-ui.c:2339
+msgid "Restore failed"
+msgstr "Ripristino non riuscito"
+
+#: ../src/gtk-ui/sync-ui.c:2342
+#: ../src/gtk-ui/sync-ui.c:3227
 msgid "Sync failed"
 msgstr "Sincronizzazione non riuscita"
 
-#: ../src/gtk-ui/sync-ui.c:1962
+#: ../src/gtk-ui/sync-ui.c:2348
+msgid "Restore complete"
+msgstr "Ripristino completato"
+
+#: ../src/gtk-ui/sync-ui.c:2351
 msgid "Sync complete"
 msgstr "Sincronizzazione completata"
 
-#: ../src/gtk-ui/sync-ui.c:2053
+#: ../src/gtk-ui/sync-ui.c:2443
 #, c-format
 msgid "Preparing '%s'"
-msgstr "Preparazione di «%s»"
+msgstr "Preparazione di '%s'"
 
-#: ../src/gtk-ui/sync-ui.c:2056
+#: ../src/gtk-ui/sync-ui.c:2446
 #, c-format
 msgid "Receiving '%s'"
-msgstr "Ricezione di «%s»"
+msgstr "Ricezione di '%s'"
 
-#: ../src/gtk-ui/sync-ui.c:2059
+#: ../src/gtk-ui/sync-ui.c:2449
 #, c-format
 msgid "Sending '%s'"
-msgstr "Invio di «%s»"
+msgstr "Invio di '%s'"
 
-#: ../src/gtk-ui/sync-ui.c:2180
-#, fuzzy, c-format
+#: ../src/gtk-ui/sync-ui.c:2570
+#, c-format
 msgid "There was one remote rejection."
 msgid_plural "There were %ld remote rejections."
 msgstr[0] "Si è verificato un rifiuto remoto."
-msgstr[1] "Si sono verificati %d rifiuti remoti."
+msgstr[1] "Si sono verificati %ld rifiuti remoti."
 
-#: ../src/gtk-ui/sync-ui.c:2185
-#, fuzzy, c-format
+#: ../src/gtk-ui/sync-ui.c:2575
+#, c-format
 msgid "There was one local rejection."
 msgid_plural "There were %ld local rejections."
 msgstr[0] "Si è verificato un rifiuto locale."
-msgstr[1] "Si sono verificati %d rifiuti locali."
+msgstr[1] "Si sono verificati %ld rifiuti locali."
 
-#: ../src/gtk-ui/sync-ui.c:2190
-#, fuzzy, c-format
+#: ../src/gtk-ui/sync-ui.c:2580
+#, c-format
 msgid "There were %ld local rejections and %ld remote rejections."
-msgstr "Si sono verificati %d rifiuti locali e %d remoti."
+msgstr "Si sono verificati %ld rifiuti locali e %ld remoti."
 
-#: ../src/gtk-ui/sync-ui.c:2195
+#: ../src/gtk-ui/sync-ui.c:2585
 #, c-format
 msgid "Last time: No changes."
 msgstr "Ultima volta: nessuna modifica."
 
-#: ../src/gtk-ui/sync-ui.c:2197
-#, fuzzy, c-format
+#: ../src/gtk-ui/sync-ui.c:2587
+#, c-format
 msgid "Last time: Sent one change."
 msgid_plural "Last time: Sent %ld changes."
 msgstr[0] "Ultima volta: inviata una modifica."
-msgstr[1] "Ultima volta: inviate %d modifiche."
+msgstr[1] "Ultima volta: inviate %ld modifiche."
 
 #. This is about changes made to the local data. Not all of these
 #. changes were requested by the remote server, so "applied"
 #. is a better word than "received" (bug #5185).
-#: ../src/gtk-ui/sync-ui.c:2205
-#, fuzzy, c-format
+#: ../src/gtk-ui/sync-ui.c:2595
+#, c-format
 msgid "Last time: Applied one change."
 msgid_plural "Last time: Applied %ld changes."
 msgstr[0] "Ultima volta: applicata una modifica."
-msgstr[1] "Ultima volta: applicate %d modifiche."
+msgstr[1] "Ultima volta: applicate %ld modifiche."
 
-#: ../src/gtk-ui/sync-ui.c:2210
-#, fuzzy, c-format
+#: ../src/gtk-ui/sync-ui.c:2600
+#, c-format
 msgid "Last time: Applied %ld changes and sent %ld changes."
-msgstr "Ultima volta: applicate %d modifiche e inviate %d."
+msgstr "Ultima volta: applicate %ld modifiche e inviate %ld."
+
+#. TRANSLATORS: the placeholder is a error message (hopefully)
+#. * explaining the problem
+#: ../src/gtk-ui/sync-ui.c:2807
+#, c-format
+msgid ""
+"There was a problem with last sync:\n"
+"%s"
+msgstr ""
+"Si è verificato un problema con l'ultima sincronizzazione:\n"
+"%s"
+
+#: ../src/gtk-ui/sync-ui.c:2817
+#, c-format
+msgid "You've just restored a backup. The changes have not been synced with %s yet"
+msgstr "Hai appena ripristinato un backup. I cambiamenti non sono ancora stati sincronizzati con %s"
 
-#: ../src/gtk-ui/sync-ui.c:2711
+#: ../src/gtk-ui/sync-ui.c:3105
 msgid "Waiting for current operation to finish..."
 msgstr "In attesa che termini l'operazione..."
 
-#: ../src/gtk-ui/sync-ui.c:2784
+#. TRANSLATORS: next strings are error messages.
+#: ../src/gtk-ui/sync-ui.c:3139
 msgid "A normal sync is not possible at this time. The server suggests a slow sync, but this might not always be what you want if both ends already have data."
 msgstr "Una sincronizzazione normale non è possibile in questo momento. Il server suggerisce una sincronizzazione lenta, ma questo potrebbe non essere sempre quello che vuoi, se entrambe le estremità hanno dati."
 
-#: ../src/gtk-ui/sync-ui.c:2791
+#: ../src/gtk-ui/sync-ui.c:3143
+msgid "The sync process died unexpectedly."
+msgstr "Il servizio di sincronizzazione è terminato inaspettatamente."
+
+#: ../src/gtk-ui/sync-ui.c:3148
+msgid "Password request was not answered. You can save the password in the settings to prevent the request."
+msgstr "La richiesta della password ha ricevuto risposta. È possibile salvare la password nelle impostazioni per evitare la richiesta."
+
+#. TODO use the service device name here, this is a remote problem
+#: ../src/gtk-ui/sync-ui.c:3152
+msgid "There was a problem processing sync request. Trying again may help."
+msgstr "C'è stato un problema di elaborazione delle richieste di sincronizzazione. Riprovare potrebbe risolvere il problema."
+
+#: ../src/gtk-ui/sync-ui.c:3158
 msgid "Failed to login. Could there be a problem with your username or password?"
 msgstr "Impossibile effettuare il login. Ci potrebbe essere un problema con il tuo nome utente o la password?"
 
-#: ../src/gtk-ui/sync-ui.c:2794
+#: ../src/gtk-ui/sync-ui.c:3161
 msgid "Forbidden"
 msgstr "Proibito"
 
-#: ../src/gtk-ui/sync-ui.c:2799
-msgid "The source could not be found. Could there be a problem with the server settings?"
-msgstr "Impossibile trovare la sorgente. Ci potrebbe essere un problema con le impostazioni del server?"
+#. TRANSLATORS: data source means e.g. calendar or addressbook
+#: ../src/gtk-ui/sync-ui.c:3167
+msgid "A data source could not be found. Could there be a problem with the settings?"
+msgstr "Impossibile trovare la sorgente. Ci potrebbe essere un problema con le impostazioni?"
 
-#: ../src/gtk-ui/sync-ui.c:2802
-msgid "Fatal database error"
-msgstr "Errore grave nel database"
+#: ../src/gtk-ui/sync-ui.c:3171
+msgid "Remote database error"
+msgstr "Errore remoto nel database"
 
 #. This can happen when EDS is borked, restart it may help...
-#: ../src/gtk-ui/sync-ui.c:2805
+#: ../src/gtk-ui/sync-ui.c:3174
 msgid "There is a problem with the local database. Syncing again or rebooting may help."
 msgstr "C'è un problema con il database locale. Sincronizzare di nuovo o riavviare."
 
-#: ../src/gtk-ui/sync-ui.c:2808
-msgid "Database error"
-msgstr "Errore nel database"
-
-#: ../src/gtk-ui/sync-ui.c:2810
-msgid "No space left"
-msgstr "Spazio esaurito"
+#: ../src/gtk-ui/sync-ui.c:3177
+msgid "No space on disk"
+msgstr "Spazio esaurito sul disco"
 
-#: ../src/gtk-ui/sync-ui.c:2812
+#: ../src/gtk-ui/sync-ui.c:3179
 msgid "Failed to process SyncML"
 msgstr "Elaborazione SyncML non riuscita"
 
-#: ../src/gtk-ui/sync-ui.c:2814
+#: ../src/gtk-ui/sync-ui.c:3181
 msgid "Server authorization failed"
 msgstr "Autorizzazione server non riuscita"
 
-#: ../src/gtk-ui/sync-ui.c:2816
+#: ../src/gtk-ui/sync-ui.c:3183
 msgid "Failed to parse configuration file"
 msgstr "Analisi del file di configurazione non riuscita"
 
-#: ../src/gtk-ui/sync-ui.c:2818
+#: ../src/gtk-ui/sync-ui.c:3185
 msgid "Failed to read configuration file"
 msgstr "Lettura del file di configurazione non riuscita"
 
-#: ../src/gtk-ui/sync-ui.c:2820
+#: ../src/gtk-ui/sync-ui.c:3187
 msgid "No configuration found"
 msgstr "Non è stata trovata alcuna configurazione"
 
-#: ../src/gtk-ui/sync-ui.c:2822
+#: ../src/gtk-ui/sync-ui.c:3189
 msgid "No configuration file found"
 msgstr "Non è stato trovato alcun file di configurazione"
 
-#: ../src/gtk-ui/sync-ui.c:2824
+#: ../src/gtk-ui/sync-ui.c:3191
 msgid "Server sent bad content"
 msgstr "Il server ha inviato dei contenuti errati"
 
-#: ../src/gtk-ui/sync-ui.c:2826
+#: ../src/gtk-ui/sync-ui.c:3193
 msgid "Connection certificate has expired"
 msgstr "Il certificato della connessione è scaduto"
 
-#: ../src/gtk-ui/sync-ui.c:2828
+#: ../src/gtk-ui/sync-ui.c:3195
 msgid "Connection certificate is invalid"
 msgstr "Il certificato della connessione non è valido"
 
-#: ../src/gtk-ui/sync-ui.c:2836
-msgid "We were unable to connect to the server. The problem could be temporary or there could be something wrong with the server settings."
-msgstr "Non siamo stati in grado di connetterci al server. Il problema potrebbe essere temporaneo o ci potrebbe essere qualcosa di sbagliato con le impostazioni del server."
+#: ../src/gtk-ui/sync-ui.c:3203
+msgid "We were unable to connect to the server. The problem could be temporary or there could be something wrong with the settings."
+msgstr "Non siamo stati in grado di connetterci al server. Il problema potrebbe essere temporaneo o ci potrebbe essere qualcosa di sbagliato con le impostazioni."
 
-#: ../src/gtk-ui/sync-ui.c:2840
-msgid "URL is bad"
-msgstr "L'URL non è corretto"
+#: ../src/gtk-ui/sync-ui.c:3210
+msgid "The server URL is bad"
+msgstr "L'URLdel server non è corretto"
 
-#: ../src/gtk-ui/sync-ui.c:2842
-msgid "Server not found"
+#: ../src/gtk-ui/sync-ui.c:3215
+msgid "The server was not found"
 msgstr "Il server non è stato trovato"
 
-#: ../src/gtk-ui/sync-ui.c:2844
+#: ../src/gtk-ui/sync-ui.c:3217
 #, c-format
 msgid "Error %d"
 msgstr "Errore %d"
 
+#. TRANSLATORS: password request dialog contents: title, cancel button
+#. * and ok button
+#: ../src/gtk-ui/sync-ui.c:3355
+msgid "Password is required for sync"
+msgstr "Password necessaria per la sincronizzazione"
+
+#: ../src/gtk-ui/sync-ui.c:3359
+msgid "Sync with password"
+msgstr "Sincronizza con password"
+
+#. TRANSLATORS: password request dialog message, placeholder is service name
+#: ../src/gtk-ui/sync-ui.c:3369
+#, c-format
+msgid "Please enter password for syncing with %s:"
+msgstr "Inserire la passowrd per la sincronizzazione con %s:"
+
 #. title for the buttons on the right side of main view
 #: ../src/gtk-ui/ui.glade.h:2
-#, fuzzy
 msgid "<b>Actions</b>"
-msgstr "<b>Dati</b>"
+msgstr "<b>Azioni</b>"
 
 #. text between the two "start from scratch" buttons in emergency view
 #: ../src/gtk-ui/ui.glade.h:4
-#, fuzzy
 msgid "<b>or</b>"
-msgstr "<b>Dati</b>"
+msgstr "<b>oppure</b>"
 
 #: ../src/gtk-ui/ui.glade.h:5
-#, fuzzy
 msgid "<big>Direct sync</big>"
-msgstr "<big>Servizi supportati</big>"
+msgstr "<big>Sincronizzazione diretta</big>"
 
 #: ../src/gtk-ui/ui.glade.h:6
-#, fuzzy
 msgid "<big>Network sync</big>"
-msgstr "<b>Tipo di sincronizzazione</b>"
+msgstr "<big>Sincronizzazione di rete</big>"
 
 #. a title in emergency view
 #: ../src/gtk-ui/ui.glade.h:8
 msgid "<big>Restore from backup</big>"
-msgstr "<big>Rirpistina dal backup</big>"
+msgstr "<big>Ripristina dal backup</big>"
 
 #. a title in emergency view
 #: ../src/gtk-ui/ui.glade.h:10
-#, fuzzy
 msgid "<big>Slow sync</big>"
-msgstr "<big>Servizi supportati</big>"
+msgstr "<big>Sincronizzazione lenta</big>"
 
 #. a title in emergency view
 #: ../src/gtk-ui/ui.glade.h:12
-#, fuzzy
 msgid "<big>Start from scratch</big>"
-msgstr "<big>Servizi supportati</big>"
+msgstr "<big>Inizia da zeroi</big>"
 
 #: ../src/gtk-ui/ui.glade.h:13
 msgid ""
 "A slow sync compares items from both sides and tries to merge them. \n"
 "This may fail in some cases, leading to duplicates or lost information."
-msgstr "Questo potrebbe non riuscire in alcuni casi, portando a duplicati o a informazioni perse."
+msgstr "Una sincronizzazione lenta compara gli elementi da entrambe le parti e tenta di metterli insieme. `nQuesto potrebbe non riuscire in alcuni casi, portando a duplicati o a informazioni perse."
 
 # (ndt) pulsante
 #: ../src/gtk-ui/ui.glade.h:15
@@ -492,7 +566,7 @@ msgstr "Aggiungi servizio"
 #. explanation of "Restore backup" function
 #: ../src/gtk-ui/ui.glade.h:18
 msgid "Backups are made before every time we Sync. Choose a backup to restore. Any changes you have made since then will be lost."
-msgstr ""
+msgstr "I backup sono effettuati prima di ogni sincronizzazione. Scegli un backup da ripristinare. Ogni modifica fatta da allora andrà persa."
 
 #: ../src/gtk-ui/ui.glade.h:19
 msgid "Calendar"
@@ -501,39 +575,48 @@ msgstr "Calendario"
 # (ndt) pulsante
 #. Button in main view, right side. Keep to below 20 chars per line, feel free to use two lines
 #: ../src/gtk-ui/ui.glade.h:21
-#, fuzzy
 msgid ""
 "Change or edit\n"
 "sync service"
 msgstr ""
-"Modifica servizio\n"
+"Cambia o modifica servizio\n"
 "di sincronizzazione"
 
-#: ../src/gtk-ui/ui.glade.h:23
-#, fuzzy
+#. close button for settings window
+#: ../src/gtk-ui/ui.glade.h:24
+msgid "Close"
+msgstr "Chiudi"
+
+#: ../src/gtk-ui/ui.glade.h:25
 msgid ""
 "Delete all data on Zyb \n"
 "and replace with your\n"
 "local information"
-msgstr "Eliminare i dati remoti e sostituirli con quelli locali"
+msgstr ""
+"Eliminare i dati su Zyb \n"
+"e sostituirli con quelli locali"
 
-#: ../src/gtk-ui/ui.glade.h:26
-#, fuzzy
+#: ../src/gtk-ui/ui.glade.h:28
 msgid ""
 "Delete all your local\n"
 "information and replace\n"
 "with data from Zyb"
-msgstr "Eliminare i dati locali e sostituirli con quelli remoti"
+msgstr ""
+"Eliminare i dati locali\n"
+"e sostituirli con quelli da Zyb"
 
 #. button in main view, right side. Keep length to 20 characters or so, use two lines if needed
-#: ../src/gtk-ui/ui.glade.h:30
+#: ../src/gtk-ui/ui.glade.h:32
 msgid ""
 "Fix a sync\n"
 "emergency"
 msgstr ""
+"Risolvi una\n"
+"sincornizzazione\n"
+"di emergenza"
 
 # (ndt) segnalare SyncML?
-#: ../src/gtk-ui/ui.glade.h:32
+#: ../src/gtk-ui/ui.glade.h:34
 msgid ""
 "If you don't see your service above but know that your sync provider uses SyncML\n"
 "you can setup a service manually."
@@ -541,15 +624,15 @@ msgstr ""
 "Se non vengono visualizzati i propri servizi, ma si è certi che il proprio provider\n"
 "usa SyncML, è possibile impostare un servizio manualmente."
 
-#: ../src/gtk-ui/ui.glade.h:34
+#: ../src/gtk-ui/ui.glade.h:36
 msgid "Settings"
 msgstr "Impostazioni"
 
-#: ../src/gtk-ui/ui.glade.h:37
+#: ../src/gtk-ui/ui.glade.h:39
 msgid "Sync Emergency"
-msgstr ""
+msgstr "Sincronizzazione di emergenza"
 
-#: ../src/gtk-ui/ui.glade.h:39
+#: ../src/gtk-ui/ui.glade.h:41
 msgid ""
 "To sync you'll need a network connection and an account with a sync service.\n"
 "We support the following services: "
@@ -557,13 +640,13 @@ msgstr ""
 "Per effettuare la sincronizzazione sono necessari una connessione e un account con un servizio di sincronizzazione.\n"
 "I servizi supportati sono: "
 
-#: ../src/gtk-ui/ui.glade.h:41
+#: ../src/gtk-ui/ui.glade.h:43
 msgid "Use Bluetooth to Sync your data from one device to another."
-msgstr ""
+msgstr "Usa Blootooth per sincronizzare i dati da un dispositivo all'altro."
 
-#: ../src/gtk-ui/ui.glade.h:42
+#: ../src/gtk-ui/ui.glade.h:44
 msgid "You will need to add Bluetooth devices before they can be synced."
-msgstr ""
+msgstr "Devi aggiungere i dispositivi Bluetooth prima che possano essere sincronizzati."
 
 #: ../src/gtk-ui/sync.desktop.in.h:2
 #: ../src/gtk-ui/sync-gtk.desktop.in.h:2
@@ -574,96 +657,83 @@ msgstr "Aggiornato"
 msgid "Sync (GTK)"
 msgstr "Sync (GTK)"
 
-#: ../src/gtk-ui/sync-config-widget.c:71
+#: ../src/gtk-ui/sync-config-widget.c:74
 msgid "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in sync."
 msgstr "ScheduleWorld consente di tenere sincronizzati contatti, eventi, attività e note."
 
-#: ../src/gtk-ui/sync-config-widget.c:74
+#: ../src/gtk-ui/sync-config-widget.c:77
 msgid "Google Sync can backup and synchronize your contacts with your Gmail contacts."
 msgstr "Google Sync è in grado di eseguire backup di sicurezza e di sincronizzare la propria rubrica con i contatti di Gmail."
 
 #. TRANSLATORS: Please include the word "demo" (or the equivalent in
 #. your language): Funambol is going to be a 90 day demo service
 #. in the future
-#: ../src/gtk-ui/sync-config-widget.c:80
+#: ../src/gtk-ui/sync-config-widget.c:83
 msgid "Backup your contacts and calendar. Sync with a single click, anytime, anywhere (DEMO)."
 msgstr "Eseguire una copia di sicurezza dei propri contatti e del proprio calendario. Sincronizzare con un solo clic, sempre e ovunque (dimostrativo)."
 
-#: ../src/gtk-ui/sync-config-widget.c:83
+#: ../src/gtk-ui/sync-config-widget.c:86
 msgid "Mobical Backup and Restore service allows you to securely backup your personal mobile data for free."
-msgstr ""
+msgstr "Il servizio Mobical Backup and Restore ti permette di effettuare backup dei tuoi mobile data gratuitamente e in tutta sicurezza."
 
-#: ../src/gtk-ui/sync-config-widget.c:86
+#: ../src/gtk-ui/sync-config-widget.c:89
 msgid "ZYB is a simple way for people to store and share mobile information online."
-msgstr ""
+msgstr "ZYB è un modo semplice di memorizzare e condividere le tue informazioni mobili online."
 
-#: ../src/gtk-ui/sync-config-widget.c:89
+#: ../src/gtk-ui/sync-config-widget.c:92
 msgid "Memotoo lets you access your personal data from any computer connected to the Internet."
-msgstr ""
+msgstr "Memotoo ti permettere di accedere ai tuoi dati personali da qualsiasi computer connesso a internet."
 
-#: ../src/gtk-ui/sync-config-widget.c:255
-#, c-format
-msgid "Do you want to replace %s with %s? This will not remove any synced information on either end but you will no longer be able to sync with %s."
-msgstr ""
+#: ../src/gtk-ui/sync-config-widget.c:188
+msgid "Sorry, failed to save the configuration"
+msgstr "Siamo spiacenti, impossibile salvare la configurazione"
 
-#. TRANSLATORS: decline/accept buttons in warning dialog.
-#. Placeholder is service name
-#: ../src/gtk-ui/sync-config-widget.c:267
-#, c-format
-msgid "Yes, use %s"
-msgstr "Sì, utilizza %s"
-
-#: ../src/gtk-ui/sync-config-widget.c:268
-#, c-format
-msgid "No, use %s"
-msgstr "No, utilizza %s"
-
-#: ../src/gtk-ui/sync-config-widget.c:341
+#: ../src/gtk-ui/sync-config-widget.c:377
 msgid "Service must have a name and server URL"
 msgstr "Il servizio deve avere un nome e un indirizzo del server"
 
-#: ../src/gtk-ui/sync-config-widget.c:381
+#: ../src/gtk-ui/sync-config-widget.c:418
 #, c-format
 msgid "Do you want to reset the settings for %s? This will not remove any synced information on either end."
-msgstr ""
+msgstr "Vuoi ripristinare le impostazioni per %s? Questa operazione non rimuoverà nessuna informazione sincronizzata."
 
 #. TRANSLATORS: buttons in reset-service warning dialog
-#: ../src/gtk-ui/sync-config-widget.c:385
+#: ../src/gtk-ui/sync-config-widget.c:422
 msgid "Yes, reset"
 msgstr "Sì, ripristina"
 
-#: ../src/gtk-ui/sync-config-widget.c:386
-#: ../src/gtk-ui/sync-config-widget.c:397
+#: ../src/gtk-ui/sync-config-widget.c:423
+#: ../src/gtk-ui/sync-config-widget.c:434
 msgid "No, keep settings"
 msgstr "No, mantieni le impostazioni"
 
-#: ../src/gtk-ui/sync-config-widget.c:391
+#: ../src/gtk-ui/sync-config-widget.c:428
 #, c-format
-msgid "Do you want to delete the settings for %s? This will not remove any synced information on either end but it will remove this service configuration."
-msgstr ""
+msgid "Do you want to delete the settings for %s? This will not remove any synced information on either end but it will remove these settings."
+msgstr "Vuoi eliminare le impostazioni per %s? Questa operazione non rimuoverà nessuna informazione sincronizzata ma rimuoverà le configurazioni per questo servizio."
 
 # (ndt) pulsante
 #. TRANSLATORS: buttons in delete-service warning dialog
-#: ../src/gtk-ui/sync-config-widget.c:396
+#: ../src/gtk-ui/sync-config-widget.c:433
 msgid "Yes, delete"
 msgstr "Sì, elimina"
 
-#: ../src/gtk-ui/sync-config-widget.c:425
-msgid "Reset service"
-msgstr "Servizio di ripristino"
+#: ../src/gtk-ui/sync-config-widget.c:463
+msgid "Reset settings"
+msgstr "Reimposta le impostazioni"
 
 # (ndt) pulsante
-#: ../src/gtk-ui/sync-config-widget.c:428
-msgid "Delete service"
-msgstr "Elimina servizio"
+#: ../src/gtk-ui/sync-config-widget.c:466
+msgid "Delete settings"
+msgstr "Elimina le impostazioni"
 
 # (ndt) pulsante
-#: ../src/gtk-ui/sync-config-widget.c:438
+#: ../src/gtk-ui/sync-config-widget.c:476
 msgid "Save and use"
 msgstr "Salva e usa"
 
 # (ndt) pulsante
-#: ../src/gtk-ui/sync-config-widget.c:441
+#: ../src/gtk-ui/sync-config-widget.c:479
 msgid ""
 "Save and replace\n"
 "current service"
@@ -671,10 +741,20 @@ msgstr ""
 "Salva e sostituisci\n"
 " il servizio"
 
+# (ndt) pulsante
+#: ../src/gtk-ui/sync-config-widget.c:489
+msgid "Stop using device"
+msgstr "Non usare il servizio"
+
+# (ndt) pulsante
+#: ../src/gtk-ui/sync-config-widget.c:492
+msgid "Stop using service"
+msgstr "Non usare il servizio"
+
 #. TRANSLATORS: label for an entry in service configuration form.
 #. * Placeholder is a source  name.
 #. * Example: "Appointments URI"
-#: ../src/gtk-ui/sync-config-widget.c:672
+#: ../src/gtk-ui/sync-config-widget.c:675
 #, c-format
 msgid "%s URI"
 msgstr "URI di %s"
@@ -686,81 +766,140 @@ msgstr "URI di %s"
 msgid "Send changes to %s"
 msgstr "Invia modifiche a %s"
 
-#: ../src/gtk-ui/sync-config-widget.c:854
+#: ../src/gtk-ui/sync-config-widget.c:855
 #, c-format
 msgid "Receive changes from %s"
-msgstr ""
+msgstr "Ricevi le modifiche per %s"
 
-#: ../src/gtk-ui/sync-config-widget.c:869
+#: ../src/gtk-ui/sync-config-widget.c:871
 msgid "<b>Sync</b>"
 msgstr "<b>Sincronizzazione</b>"
 
 #. TRANSLATORS: label of a entry in service configuration
-#: ../src/gtk-ui/sync-config-widget.c:885
+#: ../src/gtk-ui/sync-config-widget.c:887
 msgid "Server address"
 msgstr "Indirizzo server"
 
-#: ../src/gtk-ui/sync-config-widget.c:1067
+#. TRANSLATORS: explanation before a device template combobox.
+#. * Placeholder is a device name like 'Nokia N85' or 'Syncevolution
+#. * Client'
+#: ../src/gtk-ui/sync-config-widget.c:963
+#, c-format
+msgid "This device looks like it might be a '%s'. If this is not correct, please take a look at the list of supported devices and pick yours if it is listed"
+msgstr "Il dispositivo sembra essere un '%s'. Se questo non è corretto, si prega di dare un'occhiata alla lista dei dispositivi supportati e scegliere quello più appropriato"
+
+#: ../src/gtk-ui/sync-config-widget.c:969
+msgid "We don't know what this device is exactly. Please take a look at the list of supported devices and pick yours if it is listed"
+msgstr "Non sappiamo che sia esattamente questo dispositivo. Si prega di dare un'occhiata alla lista delle periferiche supportate e scegliere quella appropriata se è elencata"
+
+#: ../src/gtk-ui/sync-config-widget.c:1122
 #, c-format
 msgid "%s - Bluetooth device"
-msgstr ""
+msgstr "%s - Dispositivo Bluetooth"
 
 #. TRANSLATORS: service title for services that are not based on a
 #. * template in service list, the placeholder is the name of the service
-#: ../src/gtk-ui/sync-config-widget.c:1073
+#: ../src/gtk-ui/sync-config-widget.c:1128
 #, c-format
 msgid "%s - manually setup"
-msgstr ""
+msgstr "%s - configura manualmente"
 
 # (ndt) è un collegamento
 #. TRANSLATORS: link button in service configuration form
-#: ../src/gtk-ui/sync-config-widget.c:1748
+#: ../src/gtk-ui/sync-config-widget.c:1803
 msgid "Launch website"
 msgstr "Visita il sito web"
 
 # (ndt) pulsante
 #. TRANSLATORS: button in service configuration form
-#: ../src/gtk-ui/sync-config-widget.c:1757
+#: ../src/gtk-ui/sync-config-widget.c:1812
 msgid "Setup now"
 msgstr "Configura adesso"
 
 #. TRANSLATORS: labels of entries in service configuration form
-#: ../src/gtk-ui/sync-config-widget.c:1820
+#: ../src/gtk-ui/sync-config-widget.c:1908
 msgid "Username"
 msgstr "Nome utente"
 
-#: ../src/gtk-ui/sync-config-widget.c:1835
+#: ../src/gtk-ui/sync-config-widget.c:1923
 msgid "Password"
 msgstr "Password"
 
 #. TRANSLATORS: warning in service configuration form for people
 #. who have modified the configuration via other means.
-#: ../src/gtk-ui/sync-config-widget.c:1858
-msgid "Current service configuration is more complex than what can be shown here. Changes to sync mode or synced data types will overwrite that configuration."
-msgstr ""
+#: ../src/gtk-ui/sync-config-widget.c:1946
+msgid "Current configuration is more complex than what can be shown here. Changes to sync mode or synced data types will overwrite that configuration."
+msgstr "La configurazione del servizio attuale è più complessa di quello che può essere mostrato qui. Le modifiche alla modalità di sincronizzazione o ai tipi di dati sincronizzati sovrascriveranno quella configurazione."
 
 #. TRANSLATORS: this is the epander label for server settings
 #. in service configuration form
-#: ../src/gtk-ui/sync-config-widget.c:1877
+#: ../src/gtk-ui/sync-config-widget.c:1965
 msgid "Hide server settings"
 msgstr "Nascondi impostazioni server"
 
 #. TRANSLATORS: this is the epander label for server settings
 #. in service configuration form
-#: ../src/gtk-ui/sync-config-widget.c:1897
+#: ../src/gtk-ui/sync-config-widget.c:1985
 msgid "Show server settings"
 msgstr "Mostra impostazioni server"
 
-# (ndt) pulsante
-#. TRANSLATORS: button in service configuration form
-#: ../src/gtk-ui/sync-config-widget.c:1910
-msgid "Stop using service"
-msgstr "Non usare il servizio"
-
 #: ../src/gnome-bluetooth/syncevolution.c:110
 msgid "Sync in the Sync application"
-msgstr ""
+msgstr "Sincronizza nell'applicazione di sincronizzazione"
+
+#: ../src/syncevo-dbus-server.cpp:5622
+#, c-format
+msgid "%s is syncing"
+msgstr "%s è in fase di sincronizzazione"
 
+#: ../src/syncevo-dbus-server.cpp:5623
+#, c-format
+msgid "We have just started to sync your computer with the %s sync service."
+msgstr "Abbiamo appena iniziato a sincronizzare il computer con il servizio di sincronizzazione %s."
+
+#. if sync is successfully started and done
+#: ../src/syncevo-dbus-server.cpp:5637
+#, c-format
+msgid "%s sync complete"
+msgstr "Sincronizzazione di %s completata"
+
+#: ../src/syncevo-dbus-server.cpp:5638
+#, c-format
+msgid "We have just finished syncing your computer with the %s sync service."
+msgstr "Abbiamo finito di sincronizzare il computer con il servizio di sincronizzazione %s."
+
+#. if sync is successfully started and has errors, or not started successful with a fatal problem
+#: ../src/syncevo-dbus-server.cpp:5643
+msgid "Sync problem."
+msgstr "Problema di sincronizzazione."
+
+#: ../src/syncevo-dbus-server.cpp:5644
+msgid "Sorry, there's a problem with your sync that you need to attend to."
+msgstr "C'è un problema con la sincronizzazione che richiede attenzione."
+
+#: ../src/syncevo-dbus-server.cpp:5717
+msgid "View"
+msgstr "Visualizza"
+
+#: ../src/syncevo-dbus-server.cpp:5718
+msgid "Dismiss"
+msgstr "Scarta"
+
+#~ msgid "Database error"
+#~ msgstr "Errore nel database"
+#~ msgid ""
+#~ "Do you want to replace %s with %s? This will not remove any synced "
+#~ "information on either end but you will no longer be able to sync with %s."
+#~ msgstr ""
+#~ "Vuoi sostituire %s con %s? Questa operazione non rimuoverà nessuna "
+#~ "informazione sincronizzata ma non sarai più in grado di sincronizzare con "
+#~ "%s."
+#~ msgid "Yes, use %s"
+#~ msgstr "Sì, utilizza %s"
+#~ msgid "No, use %s"
+#~ msgstr "No, utilizza %s"
+#~ msgid "Reset service"
+#~ msgstr "Servizio di ripristino"
 #~ msgid "Addressbook"
 #~ msgstr "Rubrica"
 #~ msgid "Todo"
@@ -816,9 +955,6 @@ msgstr ""
 #~ msgstr "La connessione è terminata"
 #~ msgid "Connection failed"
 #~ msgstr "La connessione non è stata stabilita"
-#~ msgid "Sync D-Bus service exited unexpectedly"
-#~ msgstr ""
-#~ "Il servizio di sincronizzazione di D-Bus è terminato inaspettatamente"
 #~ msgid "Sync canceled"
 #~ msgstr "Sincronizzazione annullata"
 #~ msgid "Ending sync"
index 7844897..a43fff3 100644 (file)
--- a/po/ja.po
+++ b/po/ja.po
@@ -2,9 +2,9 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: http://moblin.org/projects/syncevolution\n"
-"POT-Creation-Date: 2009-10-16 11:24+0000\n"
+"POT-Creation-Date: 2010-04-05 09:22+0000\n"
 "PO-Revision-Date: \n"
-"Last-Translator: GLSJPN_Etsuko <etsuko.murozono@ptiglobal.net>\n"
+"Last-Translator: Takashi Kazami <tkazami@gmail.com>\n"
 "Language-Team: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -15,514 +15,630 @@ msgstr ""
 
 #. TRANSLATORS: this is the application name that may be used by e.g.
 #. the windowmanager
-#: ../src/gtk-ui/main.c:31
-#: ../src/gtk-ui/ui.glade.h:28
+#: ../src/gtk-ui/main.c:40
+#: ../src/gtk-ui/ui.glade.h:38
 #: ../src/gtk-ui/sync.desktop.in.h:1
+#: ../src/gnome-bluetooth/syncevolution.c:112
 msgid "Sync"
 msgstr "同期化"
 
-#: ../src/gtk-ui/sync-ui.c:259
-msgid "Addressbook"
-msgstr "アドレスブック"
+#: ../src/gtk-ui/sync-ui.c:260
+msgid "Contacts"
+msgstr "連絡先"
 
-#: ../src/gtk-ui/sync-ui.c:261
-msgid "Calendar"
-msgstr "カレンダー"
+#: ../src/gtk-ui/sync-ui.c:262
+msgid "Appointments"
+msgstr "予定"
 
-# keep in ENU
-#: ../src/gtk-ui/sync-ui.c:263
-msgid "Todo"
-msgstr "ToDo"
+#: ../src/gtk-ui/sync-ui.c:264
+#: ../src/gtk-ui/ui.glade.h:40
+msgid "Tasks"
+msgstr "タスク"
 
-#: ../src/gtk-ui/sync-ui.c:265
-msgid "Memo"
+#: ../src/gtk-ui/sync-ui.c:266
+msgid "Notes"
 msgstr "メモ"
 
-#: ../src/gtk-ui/sync-ui.c:320
-msgid "Failed to save current service in GConf configuration system"
-msgstr "GConf 設定システムでの現在のサービスの保存が失敗しました"
-
-#: ../src/gtk-ui/sync-ui.c:331
-msgid "Failed to save service configuration to SyncEvolution"
-msgstr "SyncEvolution へのサービスの保存が失敗しました"
-
-#: ../src/gtk-ui/sync-ui.c:416
-msgid "Failed to get service configuration from SyncEvolution"
-msgstr "SyncEvolution からサービス設定を入手するのに失敗しました"
-
-#: ../src/gtk-ui/sync-ui.c:480
-msgid "Failed to remove service configuration from SyncEvolution"
-msgstr "SyncEvolution からのサービス設定の削除が失敗しました"
-
-#: ../src/gtk-ui/sync-ui.c:600
-msgid "Service must have a name and server URL"
-msgstr "サービスには名前とサーバーの URL が必要です"
+#. TRANSLATORS: This is a "combination source" for syncing with devices
+#. * that combine appointments and tasks. the name should match the ones
+#. * used for calendar and todo above
+#: ../src/gtk-ui/sync-ui.c:271
+msgid "Appointments & Tasks"
+msgstr "予定とタスク"
 
 # "sync process"
-#. sync is no longer in progress for some reason
-#: ../src/gtk-ui/sync-ui.c:676
-msgid "Failed to cancel: sync was no longer in progress"
-msgstr "キャンセルに失敗しました:同期化プロセスは進行していません"
-
-#: ../src/gtk-ui/sync-ui.c:680
-msgid "Failed to cancel sync"
-msgstr "同期化のキャンセルに失敗しました"
-
-#: ../src/gtk-ui/sync-ui.c:684
-msgid "Canceling sync"
-msgstr "同期化をキャンセルしています"
-
-#: ../src/gtk-ui/sync-ui.c:698
-msgid "Trying to cancel sync"
-msgstr "同期化のキャンセルを試行しています"
+#: ../src/gtk-ui/sync-ui.c:343
+msgid "Starting sync"
+msgstr "同期化を開始しています"
 
-#: ../src/gtk-ui/sync-ui.c:705
+#. TRANSLATORS: slow sync confirmation dialog message. Placeholder
+#. * is service/device name
+#: ../src/gtk-ui/sync-ui.c:381
 #, c-format
-msgid "Do you want to delete all local data and replace it with data from %s? This is not usually advised."
-msgstr "ローカルデータをすべて削除して、%s のデータに置き換えますか?通常は推奨されません。"
+msgid "Do you want to slow sync with %s?"
+msgstr "%s で低速同期しますか?"
 
-#: ../src/gtk-ui/sync-ui.c:710
-#, c-format
-msgid "Do you want to delete all data in %s and replace it with your local data? This is not usually advised."
-msgstr "%s のデータをすべて削除して、ローカルデータに置き換えますか?通常は推奨されません。"
+#: ../src/gtk-ui/sync-ui.c:385
+msgid "Yes, do slow sync"
+msgstr "はい、低速同期します"
 
 # "sync process"
-#: ../src/gtk-ui/sync-ui.c:727
+#: ../src/gtk-ui/sync-ui.c:385
 msgid "No, cancel sync"
 msgstr "いいえ、同期化をキャンセルする"
 
-#: ../src/gtk-ui/sync-ui.c:728
+#. TRANSLATORS: confirmation dialog for refresh-from-server. Placeholder
+#. * is service/device name
+#: ../src/gtk-ui/sync-ui.c:418
+#, c-format
+msgid "Do you want to delete all local data and replace it with data from %s? This is not usually advised."
+msgstr "ローカルデータをすべて削除して、%s のデータに置き換えますか?通常は推奨されません。"
+
+#: ../src/gtk-ui/sync-ui.c:423
+#: ../src/gtk-ui/sync-ui.c:454
 msgid "Yes, delete and replace"
 msgstr "はい、削除して置き換える"
 
-# because sources are not enabled, so there is no syncing.
-#: ../src/gtk-ui/sync-ui.c:750
-msgid "No sources are enabled, not syncing"
-msgstr "ソースが有効化されていないので、同期化されません"
+#: ../src/gtk-ui/sync-ui.c:423
+#: ../src/gtk-ui/sync-ui.c:454
+#: ../src/gtk-ui/sync-ui.c:1566
+msgid "No"
+msgstr "いいえ"
 
-#: ../src/gtk-ui/sync-ui.c:767
-msgid "A sync is already in progress"
-msgstr "同期化がすでに進行中です"
+#. TRANSLATORS: confirmation dialog for refresh-from-client. Placeholder
+#. * is service/device name
+#: ../src/gtk-ui/sync-ui.c:449
+#, c-format
+msgid "Do you want to delete all data in %s and replace it with your local data? This is not usually advised."
+msgstr "%s のデータをすべて削除して、ローカルデータに置き換えますか?通常は推奨されません。"
 
-# sync process
-#: ../src/gtk-ui/sync-ui.c:769
-msgid "Failed to start sync"
-msgstr "同期化の開始に失敗しました"
+#: ../src/gtk-ui/sync-ui.c:481
+msgid "Trying to cancel sync"
+msgstr "同期化のキャンセルを試行しています"
 
-# "sync process"
-#: ../src/gtk-ui/sync-ui.c:774
-msgid "Starting sync"
-msgstr "同期化を開始しています"
+# "there is no space"
+#: ../src/gtk-ui/sync-ui.c:521
+msgid "No service or device selected"
+msgstr "サービスまたはデバイスが選択されていません"
 
 # last syncing happened few sedonds ago
-#: ../src/gtk-ui/sync-ui.c:799
-msgid "Last synced just seconds ago"
-msgstr "前回の同期化は数秒前に行われました"
+#. TRANSLATORS: This is the title on main view. Placeholder is
+#. * the service name. Example: "Google - synced just now"
+#: ../src/gtk-ui/sync-ui.c:529
+#, c-format
+msgid "%s - synced just now"
+msgstr "%s - 同期されました"
 
-#: ../src/gtk-ui/sync-ui.c:802
-msgid "Last synced a minute ago"
-msgstr "前回の同期化は1分前に行われました"
+#: ../src/gtk-ui/sync-ui.c:533
+#, c-format
+msgid "%s - synced a minute ago"
+msgstr "%s - 1 分前に同期されました"
 
-#: ../src/gtk-ui/sync-ui.c:805
+#: ../src/gtk-ui/sync-ui.c:537
 #, c-format
-msgid "Last synced %ld minutes ago"
-msgstr "前回の同期化は%ld分前に行われました"
+msgid "%s - synced %ld minutes ago"
+msgstr "%s - %ld 分前に同期されました"
 
-#: ../src/gtk-ui/sync-ui.c:808
-msgid "Last synced an hour ago"
-msgstr "前回の同期化は1時間前に行われました"
+#: ../src/gtk-ui/sync-ui.c:542
+#, c-format
+msgid "%s - synced an hour ago"
+msgstr "%s - 1 時間前に同期されました"
 
-#: ../src/gtk-ui/sync-ui.c:811
+#: ../src/gtk-ui/sync-ui.c:546
 #, c-format
-msgid "Last synced %ld hours ago"
-msgstr "前回の同期化は%ld時間前に行われました"
+msgid "%s - synced %ld hours ago"
+msgstr "%s - %ld 時間前に同期されました"
 
-#: ../src/gtk-ui/sync-ui.c:814
-msgid "Last synced a day ago"
-msgstr "前回の同期化は前日に行われました"
+#: ../src/gtk-ui/sync-ui.c:551
+#, c-format
+msgid "%s - synced a day ago"
+msgstr "%s - 前日に同期されました"
 
-#: ../src/gtk-ui/sync-ui.c:817
+#: ../src/gtk-ui/sync-ui.c:555
 #, c-format
-msgid "Last synced %ld days ago"
-msgstr "前回の同期化は%ld日前に行われました"
+msgid "%s - synced %ld days ago"
+msgstr "%s - %ld 日前に同期されました"
+
+#. TRANSLATORS: Action button in info bar in main view. Shown with e.g.
+#. * "You've just restored a backup. The changes have not been "
+#. * "synced with %s yet"
+#: ../src/gtk-ui/sync-ui.c:604
+#: ../src/gtk-ui/sync-ui.c:719
+msgid "Sync now"
+msgstr "今、同期化する"
+
+#. TRANSLATORS: Action button in info bar in main view. Shown with e.g.
+#. * "A normal sync is not possible at this time..." message.
+#. * "Other options" will open Emergency view
+#: ../src/gtk-ui/sync-ui.c:610
+#: ../src/gtk-ui/ui.glade.h:37
+msgid "Slow sync"
+msgstr "低速同期"
+
+#: ../src/gtk-ui/sync-ui.c:611
+msgid "Other options..."
+msgstr "他のオプション"
+
+#. TRANSLATORS: Action button in info bar in main view. Shown e.g.
+#. * when no service is selected. Will open configuration view
+#: ../src/gtk-ui/sync-ui.c:616
+msgid "Select sync service"
+msgstr "同期化サービスを選択"
+
+#. TRANSLATORS: Action button in info bar in main view. Shown e.g.
+#. * login to service fails. Will open configuration view for this service
+#: ../src/gtk-ui/sync-ui.c:621
+msgid "Edit service settings"
+msgstr "サービス設定の編集"
+
+# "sync service is not yet configured. With sync service, will sync data between netbook and web service."
+#: ../src/gtk-ui/sync-ui.c:670
+msgid "You haven't selected a sync service or device yet. Sync services let you synchronize your data between your netbook and a web service. You can also sync directly with some devices."
+msgstr "同期化サービスまたはデバイスがまだ選択されていません。同期化サービスでネットブックと Web サービス間のデータを同期できます。また、他の一部のデバイスと直接同期することも可能です。"
 
 # space limitation
-#: ../src/gtk-ui/sync-ui.c:902
+#: ../src/gtk-ui/sync-ui.c:717
 msgid "Sync again"
 msgstr "もう1度同期化"
 
-#: ../src/gtk-ui/sync-ui.c:904
-#: ../src/gtk-ui/ui.glade.h:29
-msgid "Sync now"
-msgstr "今、同期化する"
+#: ../src/gtk-ui/sync-ui.c:730
+msgid "Restoring"
+msgstr "復元中"
 
-#: ../src/gtk-ui/sync-ui.c:913
+#: ../src/gtk-ui/sync-ui.c:732
 msgid "Syncing"
 msgstr "同期化中"
 
-#: ../src/gtk-ui/sync-ui.c:919
+#. TRANSLATORS: This is for the button in main view, right side.
+#. Keep line length below ~20 characters, use two lines if needed
+#: ../src/gtk-ui/sync-ui.c:743
+#: ../src/gtk-ui/sync-ui.c:3358
 msgid "Cancel sync"
 msgstr "同期化のキャンセル"
 
-#. TRANSLATORS: placeholder is a source name, shown with checkboxes in main window
-#: ../src/gtk-ui/sync-ui.c:1266
+#: ../src/gtk-ui/sync-ui.c:908
+msgid "Back to sync"
+msgstr "同期化に戻る"
+
+# "sync process"
+#. TRANSLATORS: label for checkbutton/toggle in main view.
+#. * Please stick to similar length strings or break the line with
+#. * "\n" if absolutely needed
+#: ../src/gtk-ui/sync-ui.c:1209
+msgid "Automatic sync"
+msgstr "自動同期"
+
+#. This is the expander label in emergency view. It summarizes the
+#. * currently selected data sources. First placeholder is service/device
+#. * name, second a comma separeted list of sources.
+#. * E.g. "Affected data: Google Contacts, Appointments"
+#: ../src/gtk-ui/sync-ui.c:1480
+#, c-format
+msgid "Affected data: %s %s"
+msgstr "影響を受けたデータ: %s %s"
+
+#: ../src/gtk-ui/sync-ui.c:1485
+#, c-format
+msgid "Affected data: none"
+msgstr "影響を受けたデータ: なし"
+
+#. TRANSLATORS: confirmation for restoring a backup. placeholder is the
+#. * backup time string defined below
+#: ../src/gtk-ui/sync-ui.c:1563
+#, c-format
+msgid "Do you want to restore the backup from %s? All changes you have made since then will be lost."
+msgstr "%s からバックアップを復元しますか? これまでに変更した内容はすべて失われてしまいます。"
+
+#: ../src/gtk-ui/sync-ui.c:1566
+msgid "Yes, restore"
+msgstr "はい、復元します"
+
+#. TRANSLATORS: date/time for strftime(), used in emergency view backup
+#. * label. Any time format that shows date and time is good.
+#: ../src/gtk-ui/sync-ui.c:1598
+#, c-format
+msgid "%x %X"
+msgstr "%x %X"
+
+#. TRANSLATORS: label for a backup in emergency view. Placeholder is
+#. * service or device name
+#: ../src/gtk-ui/sync-ui.c:1617
+#, c-format
+msgid "Backed up before syncing with %s"
+msgstr "%s で同期する前にバックアップされます"
+
+#: ../src/gtk-ui/sync-ui.c:1634
+msgid "Restore"
+msgstr "復元"
+
+#. TRANSLATORS: this is an explanation in Emergency view.
+#. * Placeholder is a service/device name
+#: ../src/gtk-ui/sync-ui.c:1741
+#, c-format
+msgid "A normal sync with %s is not possible at this time. You can do a slow two-way sync or start from scratch. You can also restore a backup, but a slow sync or starting from scratch will still be required before normal sync is possible."
+msgstr "%s での通常同期は現在できません。低速で双方向同期するか、最初からやり直すことになります。また、バックアップを復元することもできますが、通常の同期を行う前に低速同期を行うか、最初からやり直す必要があります。"
+
+#: ../src/gtk-ui/sync-ui.c:1751
+#, c-format
+msgid "If something has gone horribly wrong, you can try a slow sync, start from scratch or restore from backup."
+msgstr "深刻な問題が生じた場合は、低速同期を行うか、最初からやり直すか、バックアップから復元できます。"
+
+#. TRANSLATORS: These are a buttons in Emergency view. Placeholder is a
+#. * service/device name. Please don't use too long lines, but feel free to
+#. * use several lines.
+#: ../src/gtk-ui/sync-ui.c:1760
+#, c-format
+msgid ""
+"Delete all your local\n"
+"data and replace with\n"
+"data from %s"
+msgstr ""
+"ローカルデータをすべてl\n"
+"削除して、%s のデータにl\n"
+"置き換えます"
+
+#: ../src/gtk-ui/sync-ui.c:1766
+#, c-format
+msgid ""
+"Delete all data on\n"
+"%s and replace\n"
+"with your local data"
+msgstr ""
+"%s のデータをすべて削除\n"
+"して、ローカルデータに\n"
+"置き換えます"
+
+#: ../src/gtk-ui/sync-ui.c:2226
+msgid "Failed to get list of supported services from SyncEvolution"
+msgstr "サポートされているサービスのリストを SyncEvolution から入手するのに失敗しました"
+
+#: ../src/gtk-ui/sync-ui.c:2280
+msgid "There was a problem communicating with the sync process. Please try again later."
+msgstr "同期化プロセスへの通信に問題がありました。時間を置いてからもう一度試してみてください。"
+
+#: ../src/gtk-ui/sync-ui.c:2339
+msgid "Restore failed"
+msgstr "復元に失敗しました"
+
+# space limitation
+#: ../src/gtk-ui/sync-ui.c:2342
+#: ../src/gtk-ui/sync-ui.c:3227
+msgid "Sync failed"
+msgstr "同期に失敗しました"
+
+# space limitation
+#: ../src/gtk-ui/sync-ui.c:2348
+msgid "Restore complete"
+msgstr "復元の完了"
+
+# space limitation
+#: ../src/gtk-ui/sync-ui.c:2351
+msgid "Sync complete"
+msgstr "同期化の完了"
+
+# added colon to separate
+#: ../src/gtk-ui/sync-ui.c:2443
+#, c-format
+msgid "Preparing '%s'"
+msgstr "待機中です:%s"
+
+# added colon to separate
+#: ../src/gtk-ui/sync-ui.c:2446
+#, c-format
+msgid "Receiving '%s'"
+msgstr "受信中です:%s"
+
+# added colon to separate
+#: ../src/gtk-ui/sync-ui.c:2449
 #, c-format
-msgid "%s (not supported by this service)"
-msgstr "%s (このサービスではサポートされていません)"
+msgid "Sending '%s'"
+msgstr "送信中です:%s"
 
-#: ../src/gtk-ui/sync-ui.c:1299
+#: ../src/gtk-ui/sync-ui.c:2570
 #, c-format
 msgid "There was one remote rejection."
-msgid_plural "There were %d remote rejections."
+msgid_plural "There were %ld remote rejections."
 msgstr[0] "リモートで接続拒否が 1 件ありました。"
-msgstr[1] "リモートで接続拒否が %d 件ありました。"
+msgstr[1] "リモートで接続拒否が %ld 件ありました。"
 
-#: ../src/gtk-ui/sync-ui.c:1304
+#: ../src/gtk-ui/sync-ui.c:2575
 #, c-format
 msgid "There was one local rejection."
-msgid_plural "There were %d local rejections."
+msgid_plural "There were %ld local rejections."
 msgstr[0] "ローカルで接続拒否が 1 件ありました。"
-msgstr[1] "ローカルで接続拒否が %d 件ありました。"
+msgstr[1] "ローカルで接続拒否が %ld 件ありました。"
 
-#: ../src/gtk-ui/sync-ui.c:1309
+#: ../src/gtk-ui/sync-ui.c:2580
 #, c-format
-msgid "There were %d local rejections and %d remote rejections."
-msgstr "ローカルの接続拒否が %d 件、およびリモートの接続拒否が %d 件あります。"
+msgid "There were %ld local rejections and %ld remote rejections."
+msgstr "ローカルの接続拒否が %ld 件、およびリモートの接続拒否が %ld 件あります。"
 
-#: ../src/gtk-ui/sync-ui.c:1314
+#: ../src/gtk-ui/sync-ui.c:2585
 #, c-format
 msgid "Last time: No changes."
 msgstr "前回:変更なし。"
 
-#: ../src/gtk-ui/sync-ui.c:1316
+#: ../src/gtk-ui/sync-ui.c:2587
 #, c-format
 msgid "Last time: Sent one change."
-msgid_plural "Last time: Sent %d changes."
+msgid_plural "Last time: Sent %ld changes."
 msgstr[0] "前回:1 箇所の変更が送信されました。"
-msgstr[1] "前回:%d 箇所の変更が送信されました。"
+msgstr[1] "前回:%ld 箇所の変更が送信されました。"
 
 #. This is about changes made to the local data. Not all of these
 #. changes were requested by the remote server, so "applied"
 #. is a better word than "received" (bug #5185).
-#: ../src/gtk-ui/sync-ui.c:1324
+#: ../src/gtk-ui/sync-ui.c:2595
 #, c-format
 msgid "Last time: Applied one change."
-msgid_plural "Last time: Applied %d changes."
+msgid_plural "Last time: Applied %ld changes."
 msgstr[0] "前回:1 箇所の変更を適用しました。"
-msgstr[1] "前回:%d 箇所の変更を受信しました。"
+msgstr[1] "前回:%ld 箇所の変更を受信しました。"
 
-#: ../src/gtk-ui/sync-ui.c:1329
+#: ../src/gtk-ui/sync-ui.c:2600
 #, c-format
-msgid "Last time: Applied %d changes and sent %d changes."
-msgstr "前回:%d 箇所の変更を適用し、%d 箇所の変更を送信しました。"
+msgid "Last time: Applied %ld changes and sent %ld changes."
+msgstr "前回:%ld 箇所の変更を適用し、%ld 箇所の変更を送信しました。"
 
-#: ../src/gtk-ui/sync-ui.c:1421
-msgid "Failed to get server configuration from SyncEvolution"
-msgstr "サーバー設定を SyncEvolution から入手するのに失敗しました"
-
-#: ../src/gtk-ui/sync-ui.c:1473
-msgid "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in sync."
-msgstr "ScheduleWorld では、連絡先、イベント、タスク、メモを同期させておくことができます。"
-
-#: ../src/gtk-ui/sync-ui.c:1476
-msgid "Google Sync can backup and synchronize your Address Book with your Gmail contacts."
-msgstr "Google Sync では、アドレスブックをバックアップし、Gmail の連絡先と同期化できます。"
-
-#. TRANSLATORS: Please include the word "demo" (or the equivalent in
-#. your language): Funambol is going to be a 90 day demo service
-#. in the future
-#: ../src/gtk-ui/sync-ui.c:1482
-msgid "Backup your contacts and calendar. Sync with a singleclick, anytime, anywhere (DEMO)."
-msgstr "連絡先とカレンダーをバックアップし、いつでも、どこでも、クリック 1 つで同期します (デモ)。"
-
-#: ../src/gtk-ui/sync-ui.c:1510
-msgid "New service"
-msgstr "新規サービス"
-
-#: ../src/gtk-ui/sync-ui.c:1557
-msgid "Server URL"
-msgstr "サーバーの URL"
+#. TRANSLATORS: the placeholder is a error message (hopefully)
+#. * explaining the problem
+#: ../src/gtk-ui/sync-ui.c:2807
+#, c-format
+msgid ""
+"There was a problem with last sync:\n"
+"%s"
+msgstr ""
+"前回の同期化に次の問題がありました:\n"
+"%s"
 
-#. TRANSLATORS: placeholder is a source name in settings window
-#: ../src/gtk-ui/sync-ui.c:1579
+#: ../src/gtk-ui/sync-ui.c:2817
 #, c-format
-msgid "%s URI"
-msgstr "%s の URI"
+msgid "You've just restored a backup. The changes have not been synced with %s yet"
+msgstr "バックアップの復元が完了しました。変更内容はまだ %s と同期されていませn"
 
-# Access Web site
-#: ../src/gtk-ui/sync-ui.c:1716
-#: ../src/gtk-ui/ui.glade.h:17
-msgid "Launch website"
-msgstr "Web サイトにアクセス"
+#: ../src/gtk-ui/sync-ui.c:3105
+msgid "Waiting for current operation to finish..."
+msgstr "実行中の操作の終了を待機しています..."
 
-#: ../src/gtk-ui/sync-ui.c:1720
-msgid "Setup and use"
-msgstr "設定して使用"
+#. TRANSLATORS: next strings are error messages.
+#: ../src/gtk-ui/sync-ui.c:3139
+msgid "A normal sync is not possible at this time. The server suggests a slow sync, but this might not always be what you want if both ends already have data."
+msgstr "通常同期は現在できません。サーバーは低速同期を推奨していますが、双方に既にデータがある場合は期待通りの結果にならない場合があります。"
 
-#: ../src/gtk-ui/sync-ui.c:1766
-msgid "Failed to get list of manually setup services from SyncEvolution"
-msgstr "手動設定サービスのリストを SyncEvolution から入手するのに失敗しました"
+#: ../src/gtk-ui/sync-ui.c:3143
+msgid "The sync process died unexpectedly."
+msgstr "同期サービスが突然終了しました。"
 
-#: ../src/gtk-ui/sync-ui.c:1807
-msgid "Failed to get list of supported services from SyncEvolution"
-msgstr "ã\82µã\83\9dã\83¼ã\83\88ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bã\82µã\83¼ã\83\93ã\82¹ã\81®ã\83ªã\82¹ã\83\88ã\82\92 SyncEvolution ã\81\8bã\82\89å\85¥æ\89\8bã\81\99ã\82\8bã\81®ã\81«å¤±æ\95\97ã\81\97ã\81¾ã\81\97ã\81\9f"
+#: ../src/gtk-ui/sync-ui.c:3148
+msgid "Password request was not answered. You can save the password in the settings to prevent the request."
+msgstr "ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89è¦\81æ±\82ã\81«ç­\94ã\81\88ã\81¦ã\81\84ã\81¾ã\81\9bã\82\93ã\80\82設å®\9aã\81§ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\82\92ä¿\9då­\98ã\81\99ã\82\8bã\81¨ã\80\81ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\81\8cè¦\81æ±\82ã\81\95ã\82\8cã\81ªã\82\88ã\81\86ã\81«ã\81§ã\81\8dã\81¾ã\81\99ã\80\82"
 
-#. TODO: this is a hack... SyncEnd should be a signal of it's own,
-#. not just hacked on top of the syncevolution error codes
-#: ../src/gtk-ui/sync-ui.c:1968
-msgid "Service configuration not found"
-msgstr "サービス設定が見つかりませんでした"
+#. TODO use the service device name here, this is a remote problem
+#: ../src/gtk-ui/sync-ui.c:3152
+msgid "There was a problem processing sync request. Trying again may help."
+msgstr "同期化要求の処理に問題がありました。もう一度試してみてください。"
 
-#: ../src/gtk-ui/sync-ui.c:1974
-msgid "Not authorized"
-msgstr "認証されていません"
+#: ../src/gtk-ui/sync-ui.c:3158
+msgid "Failed to login. Could there be a problem with your username or password?"
+msgstr "ログインに失敗しました。ユーザー名またはパスワードに問題がある可能性があります。"
 
 # "access is forbidden"
-#: ../src/gtk-ui/sync-ui.c:1976
+#: ../src/gtk-ui/sync-ui.c:3161
 msgid "Forbidden"
 msgstr "アクセスが禁止されています"
 
-#: ../src/gtk-ui/sync-ui.c:1978
-msgid "Not found"
-msgstr "見つかりませんでした"
+#. TRANSLATORS: data source means e.g. calendar or addressbook
+#: ../src/gtk-ui/sync-ui.c:3167
+msgid "A data source could not be found. Could there be a problem with the settings?"
+msgstr "データのソースが見つかりません。設定に問題がある可能性があります。"
 
-#: ../src/gtk-ui/sync-ui.c:1980
-msgid "Fatal database error"
-msgstr "ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81®è\87´å\91½ç\9a\84エラー"
+#: ../src/gtk-ui/sync-ui.c:3171
+msgid "Remote database error"
+msgstr "ã\83ªã\83¢ã\83¼ã\83\88ã\83»ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81®エラー"
 
-#: ../src/gtk-ui/sync-ui.c:1982
-msgid "Database error"
-msgstr "データベース・エラー"
+#. This can happen when EDS is borked, restart it may help...
+#: ../src/gtk-ui/sync-ui.c:3174
+msgid "There is a problem with the local database. Syncing again or rebooting may help."
+msgstr "ローカル・データベースに問題があります。再度同期を行うか、再起動で解決できるかも知れません。"
 
 # "there is no space"
-#: ../src/gtk-ui/sync-ui.c:1984
-msgid "No space left"
-msgstr "ã\82¹ã\83\9aã\83¼ã\82¹がありません"
+#: ../src/gtk-ui/sync-ui.c:3177
+msgid "No space on disk"
+msgstr "ã\83\87ã\82£ã\82¹ã\82¯ã\81«ç©ºã\81\8dé \98å\9f\9fがありません"
 
-#. TODO identify problem item somehow ?
-#: ../src/gtk-ui/sync-ui.c:1987
+#: ../src/gtk-ui/sync-ui.c:3179
 msgid "Failed to process SyncML"
 msgstr "SyncML プロセスに失敗しました"
 
-#: ../src/gtk-ui/sync-ui.c:1989
+#: ../src/gtk-ui/sync-ui.c:3181
 msgid "Server authorization failed"
 msgstr "サーバー認証に失敗しました"
 
-#: ../src/gtk-ui/sync-ui.c:1991
+#: ../src/gtk-ui/sync-ui.c:3183
 msgid "Failed to parse configuration file"
 msgstr "設定ファイルの中断に失敗しました"
 
-#: ../src/gtk-ui/sync-ui.c:1993
+#: ../src/gtk-ui/sync-ui.c:3185
 msgid "Failed to read configuration file"
 msgstr "設定ファイルの読み込みに失敗しました"
 
 # "configuration entries (items) are not found"
-#: ../src/gtk-ui/sync-ui.c:1995
+#: ../src/gtk-ui/sync-ui.c:3187
 msgid "No configuration found"
 msgstr "設定項目が見つかりません"
 
 # "configuration file is not found"
-#: ../src/gtk-ui/sync-ui.c:1997
+#: ../src/gtk-ui/sync-ui.c:3189
 msgid "No configuration file found"
 msgstr "設定ファイルが見つかりません"
 
-#: ../src/gtk-ui/sync-ui.c:1999
+#: ../src/gtk-ui/sync-ui.c:3191
 msgid "Server sent bad content"
 msgstr "サーバーが悪いコンテンツを送信しました"
 
-#: ../src/gtk-ui/sync-ui.c:2001
-msgid "Transport failure (no connection?)"
-msgstr "転送の失敗 (接続なし?)"
-
-# "connection time timed out"
-#: ../src/gtk-ui/sync-ui.c:2003
-msgid "Connection timed out"
-msgstr "接続時間がタイムアウトしました"
-
-#: ../src/gtk-ui/sync-ui.c:2005
+#: ../src/gtk-ui/sync-ui.c:3193
 msgid "Connection certificate has expired"
 msgstr "接続証明書の期限が切れています"
 
-#: ../src/gtk-ui/sync-ui.c:2007
+#: ../src/gtk-ui/sync-ui.c:3195
 msgid "Connection certificate is invalid"
 msgstr "接続証明書が無効です"
 
-#: ../src/gtk-ui/sync-ui.c:2010
-msgid "Connection failed"
-msgstr "接続に失敗しました"
+#: ../src/gtk-ui/sync-ui.c:3203
+msgid "We were unable to connect to the server. The problem could be temporary or there could be something wrong with the settings."
+msgstr "サーバーに接続できません。障害は一時的である可能性もありますが、サーバーの設定に問題がある可能性もあります。"
 
 # "URL is not appropriate"
-#: ../src/gtk-ui/sync-ui.c:2012
-msgid "URL is bad"
-msgstr "URL が適切ではありません"
+#: ../src/gtk-ui/sync-ui.c:3210
+msgid "The server URL is bad"
+msgstr "サーバーの URL が正しくありません"
 
-#: ../src/gtk-ui/sync-ui.c:2014
-msgid "Server not found"
-msgstr "サーバーが見つかりません"
+#: ../src/gtk-ui/sync-ui.c:3215
+msgid "The server was not found"
+msgstr "サーバーが見つかりませんでした"
 
 # in case the error message is in JPN, added colon
-#: ../src/gtk-ui/sync-ui.c:2016
+#: ../src/gtk-ui/sync-ui.c:3217
 #, c-format
 msgid "Error %d"
 msgstr "エラー:%d"
 
-#: ../src/gtk-ui/sync-ui.c:2026
-msgid "Sync D-Bus service exited unexpectedly"
-msgstr "同期 D-Bus サービスが突然終了しました"
-
-# space limitation
-#: ../src/gtk-ui/sync-ui.c:2029
-#: ../src/gtk-ui/sync-ui.c:2080
-msgid "Sync Failed"
-msgstr "同期化の失敗"
-
-# space limitation
-#: ../src/gtk-ui/sync-ui.c:2072
-msgid "Sync complete"
-msgstr "同期化の完了"
-
-#: ../src/gtk-ui/sync-ui.c:2077
-msgid "Sync canceled"
-msgstr "同期化キャンセル済み"
-
-#. NOTE extra1 can be error here
-#: ../src/gtk-ui/sync-ui.c:2095
-msgid "Ending sync"
-msgstr "同期化を終了しています"
-
-# added colon to separate
-#. TRANSLATORS: placeholder is a source name (e.g. 'Calendar') in a progress text
-#: ../src/gtk-ui/sync-ui.c:2119
-#, c-format
-msgid "Preparing '%s'"
-msgstr "待機中です:%s"
+#. TRANSLATORS: password request dialog contents: title, cancel button
+#. * and ok button
+#: ../src/gtk-ui/sync-ui.c:3355
+msgid "Password is required for sync"
+msgstr "同期にはパスワードが必要です"
 
-# added colon to separate
-#. TRANSLATORS: placeholder is a source name in a progress text
-#: ../src/gtk-ui/sync-ui.c:2131
-#, c-format
-msgid "Sending '%s'"
-msgstr "送信中です:%s"
+#: ../src/gtk-ui/sync-ui.c:3359
+msgid "Sync with password"
+msgstr "パスワード付き同期"
 
-# added colon to separate
-#. TRANSLATORS: placeholder is a source name in a progress text
-#: ../src/gtk-ui/sync-ui.c:2143
+#. TRANSLATORS: password request dialog message, placeholder is service name
+#: ../src/gtk-ui/sync-ui.c:3369
 #, c-format
-msgid "Receiving '%s'"
-msgstr "受信中です:%s"
-
-#: ../src/gtk-ui/ui.glade.h:1
-msgid "<b>Data</b>"
-msgstr "<b>データ</b>"
+msgid "Please enter password for syncing with %s:"
+msgstr "%s と同期するためのパスワードを入力してください:"
 
+#. title for the buttons on the right side of main view
 #: ../src/gtk-ui/ui.glade.h:2
-msgid "<b>No sync service in use</b>"
-msgstr "<b>同期化サービスは使用されていません</b>"
-
-#: ../src/gtk-ui/ui.glade.h:3
-msgid "<b>Sync failure</b>"
-msgstr "<b>同期化の失敗</b>"
+msgid "<b>Actions</b>"
+msgstr "<b>操作</b>"
 
+#. text between the two "start from scratch" buttons in emergency view
 #: ../src/gtk-ui/ui.glade.h:4
-msgid "<b>Type of Sync</b>"
-msgstr "<b>同期化タイプ</b>"
+msgid "<b>or</b>"
+msgstr "<b>または</b>"
 
 #: ../src/gtk-ui/ui.glade.h:5
-msgid "<big>Manual setup</big>"
-msgstr "<big>手動設定</big>"
+msgid "<big>Direct sync</big>"
+msgstr "<big>直接同期</big>"
 
 #: ../src/gtk-ui/ui.glade.h:6
-msgid "<big>Supported services</big>"
-msgstr "<big>サポートされいてるサービス</big>"
-
-# space limitation
-#: ../src/gtk-ui/ui.glade.h:7
-msgid "Add new service"
-msgstr "新規サービス"
+msgid "<big>Network sync</big>"
+msgstr "<big>ネットワーク同期</big>"
 
+#. a title in emergency view
 #: ../src/gtk-ui/ui.glade.h:8
-msgid "Back to sync"
-msgstr "同期化に戻る"
-
-#: ../src/gtk-ui/ui.glade.h:9
-msgid ""
-"Change sync\n"
-"service"
-msgstr ""
-"同期化サービスの\n"
-"変更"
+msgid "<big>Restore from backup</big>"
+msgstr "<big>バックアップから復元</big>"
 
-#: ../src/gtk-ui/ui.glade.h:11
-msgid "Delete all local data and replace it with remote data"
-msgstr "ローカルデータをすべて削除して、リモートデータに置き換える"
+#. a title in emergency view
+#: ../src/gtk-ui/ui.glade.h:10
+msgid "<big>Slow sync</big>"
+msgstr "<big>低速同期</big>"
 
+#. a title in emergency view
 #: ../src/gtk-ui/ui.glade.h:12
-msgid "Delete all remote data and replace it with local data"
-msgstr "リモートデータをすべて削除して、ローカルデータに置き換える"
+msgid "<big>Start from scratch</big>"
+msgstr "<big>最初からやり直す</big>"
 
 #: ../src/gtk-ui/ui.glade.h:13
-msgid "Delete this service"
-msgstr "このサービスの削除"
-
-#: ../src/gtk-ui/ui.glade.h:14
-msgid "Edit service settings"
-msgstr "サービス設定の編集"
-
-#: ../src/gtk-ui/ui.glade.h:15
 msgid ""
-"If you don't see your service above but know that your sync provider uses SyncML\n"
-"you can setup a service manually."
+"A slow sync compares items from both sides and tries to merge them. \n"
+"This may fail in some cases, leading to duplicates or lost information."
 msgstr ""
-"ご利用の同期化プロバイダーが SyncML を使用していてるのにサービスが上に\n"
-"表示されない場合は、サービスを手動で設定してください。"
+"低速同期では双方のアイテムが比較され、マージが試行されます。\n"
+"失敗した場合、情報の重複や損失が起きる可能性があります。"
 
+# space limitation
+#: ../src/gtk-ui/ui.glade.h:15
+msgid "Add new device"
+msgstr "新規デバイスの追加"
+
+# space limitation
+#: ../src/gtk-ui/ui.glade.h:16
+msgid "Add new service"
+msgstr "新規サービス"
+
+#. explanation of "Restore backup" function
 #: ../src/gtk-ui/ui.glade.h:18
-msgid "Merge local and remote data (recommended)"
-msgstr "ã\83­ã\83¼ã\82«ã\83«ã\83\87ã\83¼ã\82¿ã\81¨ã\83ªã\83¢ã\83¼ã\83\88ã\83\87ã\83¼ã\82¿ã\82\92ã\83\9eã\83¼ã\82¸ã\81\99ã\82\8b (æ\8e¨å¥¨)"
+msgid "Backups are made before every time we Sync. Choose a backup to restore. Any changes you have made since then will be lost."
+msgstr "ã\83\90ã\83\83ã\82¯ã\82¢ã\83\83ã\83\97ã\81¯å\90\8cæ\9c\9fã\82\92å®\9fè¡\8cã\81\99ã\82\8bå\89\8dã\81«å¿\85ã\81\9aå®\9fè¡\8cã\81\95ã\82\8cã\81¾ã\81\99ã\80\82ã\83\90ã\83\83ã\82¯ã\82¢ã\83\83ã\83\97ã\81®å¾©å\85\83ã\82\92é\81¸æ\8a\9eã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ã\80\82ã\83\90ã\83\83ã\82¯ã\82¢ã\83\83ã\83\97æ\99\82以é\99\8dã\81®å¤\89æ\9b´å\86\85容ã\81¯å¤±ã\82\8fã\82\8cã\81¾ã\81\99ã\80\82"
 
 #: ../src/gtk-ui/ui.glade.h:19
-msgid "Password"
-msgstr "パスワード"
-
-#: ../src/gtk-ui/ui.glade.h:20
-msgid "Reset original server settings"
-msgstr "サーバーの初期設定のリセット"
+msgid "Calendar"
+msgstr "カレンダー"
 
+#. Button in main view, right side. Keep to below 20 chars per line, feel free to use two lines
 #: ../src/gtk-ui/ui.glade.h:21
-msgid "Save and use this service"
-msgstr "保存してこのサービスを使用する"
-
-#: ../src/gtk-ui/ui.glade.h:22
-msgid "Select sync service"
-msgstr "同期化サービスを選択"
-
-#: ../src/gtk-ui/ui.glade.h:23
-msgid "Server settings"
-msgstr "サーバー設定"
+msgid ""
+"Change or edit\n"
+"sync service"
+msgstr ""
+"同期化サービスの\n"
+"変更または編集"
 
+#. close button for settings window
 #: ../src/gtk-ui/ui.glade.h:24
-msgid "Service name"
-msgstr "サービス名"
+msgid "Close"
+msgstr "閉じる"
 
-# "sorry" is omitted in JPN
 #: ../src/gtk-ui/ui.glade.h:25
 msgid ""
-"Sorry, you need an internet\n"
-"connection to sync."
+"Delete all data on Zyb \n"
+"and replace with your\n"
+"local information"
 msgstr ""
-"インターネット接続が\n"
-"同期化には必要です。"
+"Zyb 上のデータをすべて\n"
+"削除して、ローカル情報\n"
+"に置き換えます"
 
-#: ../src/gtk-ui/ui.glade.h:27
-msgid "Stop using this service"
-msgstr "このサービスの使用をやめる"
+#: ../src/gtk-ui/ui.glade.h:28
+msgid ""
+"Delete all your local\n"
+"information and replace\n"
+"with data from Zyb"
+msgstr ""
+"ローカル情報をすべてl\n"
+"削除して、Zyb のデータl\n"
+"に置き換えます"
 
-# "sorry" is omitted in JPN
-#: ../src/gtk-ui/ui.glade.h:30
-msgid "Synchronization is not available (D-Bus service does not answer), sorry."
-msgstr "同期化機能は使用できません (D-Bus サービスからの応答がありません)。"
+#. button in main view, right side. Keep length to 20 characters or so, use two lines if needed
+#: ../src/gtk-ui/ui.glade.h:32
+msgid ""
+"Fix a sync\n"
+"emergency"
+msgstr ""
+"緊急同期化\n"
+"を修正"
 
-#: ../src/gtk-ui/ui.glade.h:31
+#: ../src/gtk-ui/ui.glade.h:34
+msgid ""
+"If you don't see your service above but know that your sync provider uses SyncML\n"
+"you can setup a service manually."
+msgstr ""
+"ご利用の同期化プロバイダーが SyncML を使用していてるのにサービスが上に\n"
+"表示されない場合は、サービスを手動で設定してください。"
+
+#: ../src/gtk-ui/ui.glade.h:36
+msgid "Settings"
+msgstr "設定"
+
+#: ../src/gtk-ui/ui.glade.h:39
+msgid "Sync Emergency"
+msgstr "緊急同期化"
+
+#: ../src/gtk-ui/ui.glade.h:41
 msgid ""
 "To sync you'll need a network connection and an account with a sync service.\n"
 "We support the following services: "
@@ -530,18 +646,13 @@ msgstr ""
 "同期化機能を使用するには、ネットワーク接続と同期化サービスのアカウントが\n"
 "必要です。以下が、サポートされているサービスです。"
 
-#: ../src/gtk-ui/ui.glade.h:33
-msgid "Username"
-msgstr "ユーザー名"
+#: ../src/gtk-ui/ui.glade.h:43
+msgid "Use Bluetooth to Sync your data from one device to another."
+msgstr "Bluetooth を使用してデバイス同士のデータを同期します。"
 
-# "sync service is not yet configured. With sync service, will sync data between netbook and web service."
-#: ../src/gtk-ui/ui.glade.h:34
-msgid ""
-"You haven't selected a sync service yet. Sync services let you \n"
-"synchronize your data between your netbook and a web service."
-msgstr ""
-"同期化サービスが、まだ選択されていません。同期化サービスで\n"
-"ネットブックと Web サービス間のデータを同期化します。"
+#: ../src/gtk-ui/ui.glade.h:44
+msgid "You will need to add Bluetooth devices before they can be synced."
+msgstr "同期を行う前に Bluetooth デバイスを追加する必要があります。"
 
 #: ../src/gtk-ui/sync.desktop.in.h:2
 #: ../src/gtk-ui/sync-gtk.desktop.in.h:2
@@ -552,3 +663,247 @@ msgstr "最新の情報に更新"
 msgid "Sync (GTK)"
 msgstr "同期化 (GTK)"
 
+#: ../src/gtk-ui/sync-config-widget.c:74
+msgid "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in sync."
+msgstr "ScheduleWorld では、連絡先、イベント、タスク、メモを同期させておくことができます。"
+
+#: ../src/gtk-ui/sync-config-widget.c:77
+msgid "Google Sync can backup and synchronize your contacts with your Gmail contacts."
+msgstr "Google Sync では、連絡先をバックアップし、Gmail の連絡先と同期できます。"
+
+#. TRANSLATORS: Please include the word "demo" (or the equivalent in
+#. your language): Funambol is going to be a 90 day demo service
+#. in the future
+#: ../src/gtk-ui/sync-config-widget.c:83
+msgid "Backup your contacts and calendar. Sync with a single click, anytime, anywhere (DEMO)."
+msgstr "連絡先とカレンダーをバックアップします。いつでも、どこでも、クリック 1 つで同期します (デモ)。"
+
+#: ../src/gtk-ui/sync-config-widget.c:86
+msgid "Mobical Backup and Restore service allows you to securely backup your personal mobile data for free."
+msgstr "Mobical のバックアップおよび復元サービスを使用すると、無料で個人の携帯電話データを安全にバックアップできます。"
+
+#: ../src/gtk-ui/sync-config-widget.c:89
+msgid "ZYB is a simple way for people to store and share mobile information online."
+msgstr "ZYB を使用すると携帯電話の情報をオンラインで簡単に保存したり共有できます。"
+
+#: ../src/gtk-ui/sync-config-widget.c:92
+msgid "Memotoo lets you access your personal data from any computer connected to the Internet."
+msgstr "Memotoo を使用すると、インターネットに接続したコンピュータから自分の個人データにアクセスできるようになります。"
+
+#: ../src/gtk-ui/sync-config-widget.c:188
+msgid "Sorry, failed to save the configuration"
+msgstr "設置の保存に失敗しました"
+
+#: ../src/gtk-ui/sync-config-widget.c:377
+msgid "Service must have a name and server URL"
+msgstr "サービスには名前とサーバーの URL が必要です"
+
+#: ../src/gtk-ui/sync-config-widget.c:418
+#, c-format
+msgid "Do you want to reset the settings for %s? This will not remove any synced information on either end."
+msgstr "%s の設定内容をリセットしますか? この操作を行っても双方の同期された情報は一切削除されません。"
+
+#. TRANSLATORS: buttons in reset-service warning dialog
+#: ../src/gtk-ui/sync-config-widget.c:422
+msgid "Yes, reset"
+msgstr "はい、リセットします"
+
+#: ../src/gtk-ui/sync-config-widget.c:423
+#: ../src/gtk-ui/sync-config-widget.c:434
+msgid "No, keep settings"
+msgstr "いいえ、設定をそのままにします"
+
+#: ../src/gtk-ui/sync-config-widget.c:428
+#, c-format
+msgid "Do you want to delete the settings for %s? This will not remove any synced information on either end but it will remove these settings."
+msgstr "%s の設定を削除しますか? この操作を行っても双方の同期した情報は一切削除されませんが、どちら側の設定も削除されます。"
+
+#. TRANSLATORS: buttons in delete-service warning dialog
+#: ../src/gtk-ui/sync-config-widget.c:433
+msgid "Yes, delete"
+msgstr "はい、削除します"
+
+#: ../src/gtk-ui/sync-config-widget.c:463
+msgid "Reset settings"
+msgstr "設定のリセット"
+
+#: ../src/gtk-ui/sync-config-widget.c:466
+msgid "Delete settings"
+msgstr "設定の削除"
+
+#: ../src/gtk-ui/sync-config-widget.c:476
+msgid "Save and use"
+msgstr "保存して使用します"
+
+#: ../src/gtk-ui/sync-config-widget.c:479
+msgid ""
+"Save and replace\n"
+"current service"
+msgstr ""
+"保存してこのサービス\n"
+"を置き換えます"
+
+#: ../src/gtk-ui/sync-config-widget.c:489
+msgid "Stop using device"
+msgstr "デバイスの使用を中止する"
+
+#: ../src/gtk-ui/sync-config-widget.c:492
+msgid "Stop using service"
+msgstr "サービスの使用を中止する"
+
+#. TRANSLATORS: label for an entry in service configuration form.
+#. * Placeholder is a source  name.
+#. * Example: "Appointments URI"
+#: ../src/gtk-ui/sync-config-widget.c:675
+#, c-format
+msgid "%s URI"
+msgstr "%s の URI"
+
+#. TRANSLATORS: toggles in service configuration form, placeholder is service
+#. * or device name
+#: ../src/gtk-ui/sync-config-widget.c:850
+#, c-format
+msgid "Send changes to %s"
+msgstr "%s に変更を送信します"
+
+#: ../src/gtk-ui/sync-config-widget.c:855
+#, c-format
+msgid "Receive changes from %s"
+msgstr "%s から変更を受信します"
+
+#: ../src/gtk-ui/sync-config-widget.c:871
+msgid "<b>Sync</b>"
+msgstr "<b>同期化</b>"
+
+#. TRANSLATORS: label of a entry in service configuration
+#: ../src/gtk-ui/sync-config-widget.c:887
+msgid "Server address"
+msgstr "サーバー・アドレス"
+
+#. TRANSLATORS: explanation before a device template combobox.
+#. * Placeholder is a device name like 'Nokia N85' or 'Syncevolution
+#. * Client'
+#: ../src/gtk-ui/sync-config-widget.c:963
+#, c-format
+msgid "This device looks like it might be a '%s'. If this is not correct, please take a look at the list of supported devices and pick yours if it is listed"
+msgstr "このデバイスは「%s」と判断されました。正しくない場合は、サポートされているデバイスのリストからご利用のデバイスを選択してください。"
+
+#: ../src/gtk-ui/sync-config-widget.c:969
+msgid "We don't know what this device is exactly. Please take a look at the list of supported devices and pick yours if it is listed"
+msgstr "このデバイスを判別できません。サポートされているデバイスのリストからご利用のデバイスを選択してください。"
+
+#: ../src/gtk-ui/sync-config-widget.c:1122
+#, c-format
+msgid "%s - Bluetooth device"
+msgstr "%s - Bluetooth デバイス"
+
+#. TRANSLATORS: service title for services that are not based on a
+#. * template in service list, the placeholder is the name of the service
+#: ../src/gtk-ui/sync-config-widget.c:1128
+#, c-format
+msgid "%s - manually setup"
+msgstr "%s - 手動設定"
+
+# Access Web site
+#. TRANSLATORS: link button in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1803
+msgid "Launch website"
+msgstr "Web サイトにアクセス"
+
+#. TRANSLATORS: button in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1812
+msgid "Setup now"
+msgstr "すぐに設定する"
+
+#. TRANSLATORS: labels of entries in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1908
+msgid "Username"
+msgstr "ユーザー名"
+
+#: ../src/gtk-ui/sync-config-widget.c:1923
+msgid "Password"
+msgstr "パスワード"
+
+#. TRANSLATORS: warning in service configuration form for people
+#. who have modified the configuration via other means.
+#: ../src/gtk-ui/sync-config-widget.c:1946
+msgid "Current configuration is more complex than what can be shown here. Changes to sync mode or synced data types will overwrite that configuration."
+msgstr "現在のサービス設定はここに表示できる内容よりも複雑です。同期モードまたは同期データへの変更は、その設定内容を上書きします。"
+
+#. TRANSLATORS: this is the epander label for server settings
+#. in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1965
+msgid "Hide server settings"
+msgstr "サーバの設定を隠す"
+
+#. TRANSLATORS: this is the epander label for server settings
+#. in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1985
+msgid "Show server settings"
+msgstr "サーバの設定を表示する"
+
+#: ../src/gnome-bluetooth/syncevolution.c:110
+msgid "Sync in the Sync application"
+msgstr "同期化アプリケーション内の同期"
+
+#: ../src/syncevo-dbus-server.cpp:5622
+#, c-format
+msgid "%s is syncing"
+msgstr "%s は同期中です。"
+
+#: ../src/syncevo-dbus-server.cpp:5623
+#, c-format
+msgid "We have just started to sync your computer with the %s sync service."
+msgstr "お使いのデバイスと %s 同期化サービスの同期を開始しました。"
+
+# space limitation
+#. if sync is successfully started and done
+#: ../src/syncevo-dbus-server.cpp:5637
+#, c-format
+msgid "%s sync complete"
+msgstr "%s の同期化が完了しました"
+
+#: ../src/syncevo-dbus-server.cpp:5638
+#, c-format
+msgid "We have just finished syncing your computer with the %s sync service."
+msgstr "ご利用のデバイスと %s 同期化サービスの同期が完了しました。"
+
+# space limitation
+#. if sync is successfully started and has errors, or not started successful with a fatal problem
+#: ../src/syncevo-dbus-server.cpp:5643
+msgid "Sync problem."
+msgstr "同期化に問題があります。"
+
+#: ../src/syncevo-dbus-server.cpp:5644
+msgid "Sorry, there's a problem with your sync that you need to attend to."
+msgstr "接続対象の同期化サービスに問題があります。"
+
+#: ../src/syncevo-dbus-server.cpp:5717
+msgid "View"
+msgstr "表示"
+
+#: ../src/syncevo-dbus-server.cpp:5718
+msgid "Dismiss"
+msgstr "閉じる"
+
+#~ msgid "Database error"
+#~ msgstr "データベース・エラー"
+
+#~ msgid ""
+#~ "Do you want to replace %s with %s? This will not remove any synced "
+#~ "information on either end but you will no longer be able to sync with %s."
+#~ msgstr ""
+#~ "%s を %s に入れ替えますか? この操作を行っても、双方の同期した情報は一切削"
+#~ "除されませんが、%s とは同期できなくなります。"
+
+#~ msgid "Yes, use %s"
+#~ msgstr "はい、%s を使用します"
+
+#~ msgid "No, use %s"
+#~ msgstr "いいえ、%s を使用します"
+
+#~ msgid "Reset service"
+#~ msgstr "サービスをリセットします"
+
+#~ msgid "Addressbook"
+#~ msgstr "アドレスブック"
index e28d377..295a5df 100644 (file)
--- a/po/ko.po
+++ b/po/ko.po
@@ -1,11 +1,10 @@
-#: ../src/gtk-ui/sync-ui.c:764
 msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: http://moblin.org/projects/syncevolution\n"
-"POT-Creation-Date: 2009-10-01 19:27+0000\n"
+"POT-Creation-Date: 2010-04-07 09:29+0000\n"
 "PO-Revision-Date: \n"
-"Last-Translator: GLSKOR_SunKim <sunx.kim@intel.com>\n"
+"Last-Translator: KC Lee <kushylee@yahoo.com>\n"
 "Language-Team: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -16,531 +15,626 @@ msgstr ""
 
 #. TRANSLATORS: this is the application name that may be used by e.g.
 #. the windowmanager
-#: ../src/gtk-ui/main.c:31 ../src/gtk-ui/ui.glade.h:28
+#: ../src/gtk-ui/main.c:40
+#: ../src/gtk-ui/ui.glade.h:38
 #: ../src/gtk-ui/sync.desktop.in.h:1
+#: ../src/gnome-bluetooth/syncevolution.c:112
 msgid "Sync"
 msgstr "동기화"
 
-#: ../src/gtk-ui/sync-ui.c:259
-msgid "Addressbook"
-msgstr "주ì\86\8cë¡\9d"
+#: ../src/gtk-ui/sync-ui.c:260
+msgid "Contacts"
+msgstr "ì\97°ë\9d½ì²\98"
 
-#: ../src/gtk-ui/sync-ui.c:261
-msgid "Calendar"
-msgstr "ìº\98린ë\8d\94"
+#: ../src/gtk-ui/sync-ui.c:262
+msgid "Appointments"
+msgstr "ì\95½ì\86\8d"
 
-#: ../src/gtk-ui/sync-ui.c:263
-msgid "Todo"
-msgstr "할일"
+#: ../src/gtk-ui/sync-ui.c:264
+#: ../src/gtk-ui/ui.glade.h:40
+msgid "Tasks"
+msgstr "업무"
 
-#: ../src/gtk-ui/sync-ui.c:265
-msgid "Memo"
+#: ../src/gtk-ui/sync-ui.c:266
+msgid "Notes"
 msgstr "메모"
 
-#: ../src/gtk-ui/sync-ui.c:320
-msgid "Failed to save current service in GConf configuration system"
-msgstr "GConf 구성 시스템의 현재 서비스를 저장하는데 실패했습니다."
-
-#: ../src/gtk-ui/sync-ui.c:331
-msgid "Failed to save service configuration to SyncEvolution"
-msgstr "서비스 구성을 SyncEvolution에 저장하는데 실패했습니다."
-
-#: ../src/gtk-ui/sync-ui.c:416
-msgid "Failed to get service configuration from SyncEvolution"
-msgstr "SyncEvolution으로 부터 구성 서비스를 불러오기를 실패했습니다."
-
-#: ../src/gtk-ui/sync-ui.c:479
-msgid "Failed to remove service configuration from SyncEvolution"
-msgstr "SyncEvolution으로 부터 구성 시스템을 제거하는데 실패했습니다."
-
-#: ../src/gtk-ui/sync-ui.c:599
-msgid "Service must have a name and server URL"
-msgstr "서비스는 반듯이 이름 및 서버 URL이 있어야 합니다."
-
-#. sync is no longer in progress for some reason
-#: ../src/gtk-ui/sync-ui.c:675
-msgid "Failed to cancel: sync was no longer in progress"
-msgstr "취소 실패: 동기화는 더이상 진행되지 않습니다."
-
-#: ../src/gtk-ui/sync-ui.c:679
-msgid "Failed to cancel sync"
-msgstr "동기화 취소 실패"
-
-#: ../src/gtk-ui/sync-ui.c:683
-msgid "Canceling sync"
-msgstr "동기화 취소 중 "
+#. TRANSLATORS: This is a "combination source" for syncing with devices
+#. * that combine appointments and tasks. the name should match the ones
+#. * used for calendar and todo above
+#: ../src/gtk-ui/sync-ui.c:271
+msgid "Appointments & Tasks"
+msgstr "약속 및 업무"
 
-#: ../src/gtk-ui/sync-ui.c:697
-msgid "Trying to cancel sync"
-msgstr "ë\8f\99기í\99\94 ì·¨ì\86\8c ì\8b\9cë\8f\84"
+#: ../src/gtk-ui/sync-ui.c:343
+msgid "Starting sync"
+msgstr "ë\8f\99기í\99\94 ì\8b\9cì\9e\91 "
 
-#: ../src/gtk-ui/sync-ui.c:704
+#. TRANSLATORS: slow sync confirmation dialog message. Placeholder
+#. * is service/device name
+#: ../src/gtk-ui/sync-ui.c:381
 #, c-format
-msgid ""
-"Do you want to delete all local data and replace it with data from %s? This "
-"is not usually advised."
-msgstr ""
-"모든 로컬 데이터을 삭제하고 %s로 부터의 데이터로 바꾸시겠습니까? 항상 권하지"
-"는 않습니다"
+msgid "Do you want to slow sync with %s?"
+msgstr " %s과의 동기화를 늦추시겠습니까?"
 
-#: ../src/gtk-ui/sync-ui.c:709
-#, c-format
-msgid ""
-"Do you want to delete all data in %s and replace it with your local data? "
-"This is not usually advised."
-msgstr ""
-"%s에 있는 모든 데이터를 삭네하고 당신의 로컬 데이터로 바꾸시겠습니까? 항상 권"
-"하지는 않습니다."
+#: ../src/gtk-ui/sync-ui.c:385
+msgid "Yes, do slow sync"
+msgstr "네, 동기화를 늦춰주십시오."
 
-#: ../src/gtk-ui/sync-ui.c:726
+#: ../src/gtk-ui/sync-ui.c:385
 msgid "No, cancel sync"
 msgstr "주소록"
 
-#: ../src/gtk-ui/sync-ui.c:727
+#. TRANSLATORS: confirmation dialog for refresh-from-server. Placeholder
+#. * is service/device name
+#: ../src/gtk-ui/sync-ui.c:418
+#, c-format
+msgid "Do you want to delete all local data and replace it with data from %s? This is not usually advised."
+msgstr "모든 로컬 데이터을 삭제하고 %s로 부터의 데이터로 바꾸시겠습니까? 항상 권하지는 않습니다"
+
+#: ../src/gtk-ui/sync-ui.c:423
+#: ../src/gtk-ui/sync-ui.c:454
 msgid "Yes, delete and replace"
 msgstr "예, 삭제하시고 변경하십시오"
 
-#: ../src/gtk-ui/sync-ui.c:749
-msgid "No sources are enabled, not syncing"
-msgstr "사용 가능한 소스가 없습니다. 동기화 되지 않았습니다."
+#: ../src/gtk-ui/sync-ui.c:423
+#: ../src/gtk-ui/sync-ui.c:454
+#: ../src/gtk-ui/sync-ui.c:1566
+msgid "No"
+msgstr "아니오."
 
-#: ../src/gtk-ui/sync-ui.c:766
-msgid "A sync is already in progress"
-msgstr "동기화가 이미 진행중 입니다."
+#. TRANSLATORS: confirmation dialog for refresh-from-client. Placeholder
+#. * is service/device name
+#: ../src/gtk-ui/sync-ui.c:449
+#, c-format
+msgid "Do you want to delete all data in %s and replace it with your local data? This is not usually advised."
+msgstr "%s에 있는 모든 데이터를 삭네하고 당신의 로컬 데이터로 바꾸시겠습니까? 항상 권하지는 않습니다."
 
-#: ../src/gtk-ui/sync-ui.c:768
-msgid "Failed to start sync"
-msgstr "동기화를 시작하는데 실패했습니다."
+#: ../src/gtk-ui/sync-ui.c:481
+msgid "Trying to cancel sync"
+msgstr "동기화 취소 시도"
 
-#: ../src/gtk-ui/sync-ui.c:773
-msgid "Starting sync"
-msgstr "동기화 시작 "
+#: ../src/gtk-ui/sync-ui.c:521
+msgid "No service or device selected"
+msgstr "서비스나 장치가 선택되지 않았음"
 
-#: ../src/gtk-ui/sync-ui.c:798
-msgid "Last synced just seconds ago"
-msgstr "일 초전 마지막 동기화"
+#. TRANSLATORS: This is the title on main view. Placeholder is
+#. * the service name. Example: "Google - synced just now"
+#: ../src/gtk-ui/sync-ui.c:529
+#, c-format
+msgid "%s - synced just now"
+msgstr "%s - 방금 동기화됨"
 
-#: ../src/gtk-ui/sync-ui.c:801
-msgid "Last synced a minute ago"
-msgstr "일 분전 마지막 동기화"
+#: ../src/gtk-ui/sync-ui.c:533
+#, c-format
+msgid "%s - synced a minute ago"
+msgstr "%s - 일 분 전 동기화됨"
 
-#: ../src/gtk-ui/sync-ui.c:804
+#: ../src/gtk-ui/sync-ui.c:537
 #, c-format
-msgid "Last synced %ld minutes ago"
-msgstr "%ld 분전 마지막 동기화"
+msgid "%s - synced %ld minutes ago"
+msgstr "%s - %ld 분 전 동기화됨"
 
-#: ../src/gtk-ui/sync-ui.c:807
-msgid "Last synced an hour ago"
-msgstr "한 시간전 마지막 동기화"
+#: ../src/gtk-ui/sync-ui.c:542
+#, c-format
+msgid "%s - synced an hour ago"
+msgstr "%s - 한 시간 전 동기화됨"
 
-#: ../src/gtk-ui/sync-ui.c:810
+#: ../src/gtk-ui/sync-ui.c:546
 #, c-format
-msgid "Last synced %ld hours ago"
-msgstr "%ld 시간전 마지막 동기화"
+msgid "%s - synced %ld hours ago"
+msgstr "%s - %ld 시간 전 동기화됨"
 
-#: ../src/gtk-ui/sync-ui.c:813
-msgid "Last synced a day ago"
-msgstr "하루전 마지막 동기화"
+#: ../src/gtk-ui/sync-ui.c:551
+#, c-format
+msgid "%s - synced a day ago"
+msgstr "%s - 하루 전 동기화됨"
 
-#: ../src/gtk-ui/sync-ui.c:816
+#: ../src/gtk-ui/sync-ui.c:555
 #, c-format
-msgid "Last synced %ld days ago"
-msgstr "%ld 일 전 마지막 동기화"
+msgid "%s - synced %ld days ago"
+msgstr "%s - %ld 일 전 동기화됨"
+
+#. TRANSLATORS: Action button in info bar in main view. Shown with e.g.
+#. * "You've just restored a backup. The changes have not been "
+#. * "synced with %s yet"
+#: ../src/gtk-ui/sync-ui.c:604
+#: ../src/gtk-ui/sync-ui.c:719
+msgid "Sync now"
+msgstr "지금 동기화 시도"
+
+#. TRANSLATORS: Action button in info bar in main view. Shown with e.g.
+#. * "A normal sync is not possible at this time..." message.
+#. * "Other options" will open Emergency view
+#: ../src/gtk-ui/sync-ui.c:610
+#: ../src/gtk-ui/ui.glade.h:37
+msgid "Slow sync"
+msgstr "느린 동기화"
+
+#: ../src/gtk-ui/sync-ui.c:611
+msgid "Other options..."
+msgstr "기타 옵션..."
+
+#. TRANSLATORS: Action button in info bar in main view. Shown e.g.
+#. * when no service is selected. Will open configuration view
+#: ../src/gtk-ui/sync-ui.c:616
+msgid "Select sync service"
+msgstr "동기화 서비스를 선택하십시오."
+
+#. TRANSLATORS: Action button in info bar in main view. Shown e.g.
+#. * login to service fails. Will open configuration view for this service
+#: ../src/gtk-ui/sync-ui.c:621
+msgid "Edit service settings"
+msgstr "서비스 설정 편집"
+
+#: ../src/gtk-ui/sync-ui.c:670
+msgid "You haven't selected a sync service or device yet. Sync services let you synchronize your data between your netbook and a web service. You can also sync directly with some devices."
+msgstr "동기화 서비스나 장치를 아직 선택하지 않았습니다. 동기화 서비스는 넷북과 웹 서비스 사이의 데이터를 동기화 시켜줍니다. 또한 일부 장치를 사용하여 직접 동기화할 수도 있습니다. "
 
-#: ../src/gtk-ui/sync-ui.c:901
+#: ../src/gtk-ui/sync-ui.c:717
 msgid "Sync again"
 msgstr "다시 동기화 시도"
 
-#: ../src/gtk-ui/sync-ui.c:903 ../src/gtk-ui/ui.glade.h:29
-msgid "Sync now"
-msgstr "지금 동기화 시도"
+#: ../src/gtk-ui/sync-ui.c:730
+msgid "Restoring"
+msgstr "복원중"
 
-#: ../src/gtk-ui/sync-ui.c:912
+#: ../src/gtk-ui/sync-ui.c:732
 msgid "Syncing"
 msgstr "동기화 시도중"
 
-#: ../src/gtk-ui/sync-ui.c:918
+#. TRANSLATORS: This is for the button in main view, right side.
+#. Keep line length below ~20 characters, use two lines if needed
+#: ../src/gtk-ui/sync-ui.c:743
+#: ../src/gtk-ui/sync-ui.c:3358
 msgid "Cancel sync"
 msgstr "동기화 취소"
 
-#. TRANSLATORS: placeholder is a source name, shown with checkboxes in main window
-#: ../src/gtk-ui/sync-ui.c:1265
+#: ../src/gtk-ui/sync-ui.c:908
+msgid "Back to sync"
+msgstr "동기화로 다시 돌아가기"
+
+#. TRANSLATORS: label for checkbutton/toggle in main view.
+#. * Please stick to similar length strings or break the line with
+#. * "\n" if absolutely needed
+#: ../src/gtk-ui/sync-ui.c:1209
+msgid "Automatic sync"
+msgstr "자동 동기화"
+
+#. This is the expander label in emergency view. It summarizes the
+#. * currently selected data sources. First placeholder is service/device
+#. * name, second a comma separeted list of sources.
+#. * E.g. "Affected data: Google Contacts, Appointments"
+#: ../src/gtk-ui/sync-ui.c:1480
+#, c-format
+msgid "Affected data: %s %s"
+msgstr "영향받은 데이터: %s %s"
+
+#: ../src/gtk-ui/sync-ui.c:1485
+#, c-format
+msgid "Affected data: none"
+msgstr "영향받은 데이터: 없음"
+
+#. TRANSLATORS: confirmation for restoring a backup. placeholder is the
+#. * backup time string defined below
+#: ../src/gtk-ui/sync-ui.c:1563
+#, c-format
+msgid "Do you want to restore the backup from %s? All changes you have made since then will be lost."
+msgstr "%s에서 백업을 복원하시겠습니까? 그 이후의 변경 내용은 모두 손실됩니다."
+
+#: ../src/gtk-ui/sync-ui.c:1566
+msgid "Yes, restore"
+msgstr "네, 복원해 주십시오."
+
+#. TRANSLATORS: date/time for strftime(), used in emergency view backup
+#. * label. Any time format that shows date and time is good.
+#: ../src/gtk-ui/sync-ui.c:1598
+#, c-format
+msgid "%x %X"
+msgstr "%x %X"
+
+#. TRANSLATORS: label for a backup in emergency view. Placeholder is
+#. * service or device name
+#: ../src/gtk-ui/sync-ui.c:1617
 #, c-format
-msgid "%s (not supported by this service)"
-msgstr "%s (이 서비스에 의해 지원되지 않습니다)"
+msgid "Backed up before syncing with %s"
+msgstr "%s와 동기화하기 전에 백업되었습니다."
+
+#: ../src/gtk-ui/sync-ui.c:1634
+msgid "Restore"
+msgstr "복원"
+
+#. TRANSLATORS: this is an explanation in Emergency view.
+#. * Placeholder is a service/device name
+#: ../src/gtk-ui/sync-ui.c:1741
+#, c-format
+msgid "A normal sync with %s is not possible at this time. You can do a slow two-way sync or start from scratch. You can also restore a backup, but a slow sync or starting from scratch will still be required before normal sync is possible."
+msgstr "지금은 %s와의 정상적인 동기화가 가능하지 않습니다. 느린 양방향 동기화를 하거나 처음부터 새로 시작할 수 있습니다. 백업을 복원할 수도 있지만, 정상적인 동기화가 가능해지기 전까지는 느린 동기화를 하거나 처음부터 새로 시작해야 합니다."
+
+#: ../src/gtk-ui/sync-ui.c:1751
+#, c-format
+msgid "If something has gone horribly wrong, you can try a slow sync, start from scratch or restore from backup."
+msgstr "뭔가 아주 잘못되었을 경우, 느린 동기화를 시도해보거나 처음부터 새로 시작하거나 백업으로부터 복원할 수 있습니다."
+
+#. TRANSLATORS: These are a buttons in Emergency view. Placeholder is a
+#. * service/device name. Please don't use too long lines, but feel free to
+#. * use several lines.
+#: ../src/gtk-ui/sync-ui.c:1760
+#, c-format
+msgid ""
+"Delete all your local\n"
+"data and replace with\n"
+"data from %s"
+msgstr ""
+"모든 로컬 데이터를\n"
+"삭제하고 %s의 데이터로\n"
+"교체하십시오."
 
-#: ../src/gtk-ui/sync-ui.c:1298
+#: ../src/gtk-ui/sync-ui.c:1766
+#, c-format
+msgid ""
+"Delete all data on\n"
+"%s and replace\n"
+"with your local data"
+msgstr ""
+"%s의 데이터를 모두\n"
+"삭제하고 로컬 데이터로\n"
+"교체하십시오."
+
+#: ../src/gtk-ui/sync-ui.c:2226
+msgid "Failed to get list of supported services from SyncEvolution"
+msgstr "SyncEvolution으로 부터 지원 서비스 목록을 불러오기를 실패했습니다."
+
+#: ../src/gtk-ui/sync-ui.c:2280
+msgid "There was a problem communicating with the sync process. Please try again later."
+msgstr "동기화 프로세스와의 통신에 문제가 있습니다. 나중에 다시 시도하십시오."
+
+#: ../src/gtk-ui/sync-ui.c:2339
+msgid "Restore failed"
+msgstr "복원 실패"
+
+#: ../src/gtk-ui/sync-ui.c:2342
+#: ../src/gtk-ui/sync-ui.c:3227
+msgid "Sync failed"
+msgstr "동기화 실패"
+
+#: ../src/gtk-ui/sync-ui.c:2348
+msgid "Restore complete"
+msgstr "복원 완료"
+
+#: ../src/gtk-ui/sync-ui.c:2351
+msgid "Sync complete"
+msgstr "동기화 완료"
+
+#: ../src/gtk-ui/sync-ui.c:2443
+#, c-format
+msgid "Preparing '%s'"
+msgstr "'%s' 준비하는 중"
+
+#: ../src/gtk-ui/sync-ui.c:2446
+#, c-format
+msgid "Receiving '%s'"
+msgstr "'%s' 받는 중"
+
+#: ../src/gtk-ui/sync-ui.c:2449
+#, c-format
+msgid "Sending '%s'"
+msgstr "'%s' 보내는 중"
+
+#: ../src/gtk-ui/sync-ui.c:2570
 #, c-format
 msgid "There was one remote rejection."
-msgid_plural "There were %d remote rejections."
-msgstr[0] "한의 원격 거부가 있었습니다."
-msgstr[1] "%d건의 원격 거부가 있었습니다"
+msgid_plural "There were %ld remote rejections."
+msgstr[0] "한 개의 원격 거부가 있었습니다."
+msgstr[1] "%ld건의 원격 거부가 있었습니다"
 
-#: ../src/gtk-ui/sync-ui.c:1303
+#: ../src/gtk-ui/sync-ui.c:2575
 #, c-format
 msgid "There was one local rejection."
-msgid_plural "There were %d local rejections."
-msgstr[0] "한의 로컬 거부가 있었습니다."
-msgstr[1] "%d건의 로컬 거부가 있었습니다."
+msgid_plural "There were %ld local rejections."
+msgstr[0] "한 개의 로컬 거부가 있었습니다."
+msgstr[1] "%ld건의 로컬 거부가 있었습니다."
 
-#: ../src/gtk-ui/sync-ui.c:1308
+#: ../src/gtk-ui/sync-ui.c:2580
 #, c-format
-msgid "There were %d local rejections and %d remote rejections."
-msgstr "%d 로컬 거부와 %d 원격 거부가 있었습니다. "
+msgid "There were %ld local rejections and %ld remote rejections."
+msgstr "%ld 개의 로컬 거부와 %ld 개의 원격 거부가 있었습니다. "
 
-#: ../src/gtk-ui/sync-ui.c:1313
+#: ../src/gtk-ui/sync-ui.c:2585
 #, c-format
 msgid "Last time: No changes."
 msgstr "지난 시간: 변동 사항 없음."
 
-#: ../src/gtk-ui/sync-ui.c:1315
+#: ../src/gtk-ui/sync-ui.c:2587
 #, c-format
 msgid "Last time: Sent one change."
-msgid_plural "Last time: Sent %d changes."
-msgstr[0] "ì§\80ë\82\9c ì\8b\9cê°\84: í\95\9cê±´ì\9d\98 ë³\80ê²½ ì\82¬í\95­을 보냈습니다."
-msgstr[1] "ì§\80ë\82\9c ì\8b\9cê°\84: %d ê±´ì\9d\98 ë³\80ê²½ ì\82¬í\95­을 보냈습니다."
+msgid_plural "Last time: Sent %ld changes."
+msgstr[0] "ìµ\9cê·¼: í\95\9c ê°\9cì\9d\98 ë³\80ê²½ ë\82´ì\9a©을 보냈습니다."
+msgstr[1] "ìµ\9cê·¼: %ld ê°\9cì\9d\98 ë³\80ê²½ ë\82´ì\9a©을 보냈습니다."
 
 #. This is about changes made to the local data. Not all of these
 #. changes were requested by the remote server, so "applied"
 #. is a better word than "received" (bug #5185).
-#: ../src/gtk-ui/sync-ui.c:1323
+#: ../src/gtk-ui/sync-ui.c:2595
 #, c-format
 msgid "Last time: Applied one change."
-msgid_plural "Last time: Applied %d changes."
-msgstr[0] "ì§\80ë\82\9c ì\8b\9cê°\84 : ì \81ì\9a©ë\90\9c í\95\9cê±´ì\9d\98 ë³\80ë\8f\99 ì\82¬í\95­"
-msgstr[1] "ì§\80ë\82\9c ì\8b\9cê°\84: ì \81ì\9a©ë\90\9c %dê±´ì\9d\98 ë³\80ë\8f\99 ì\82¬í\95­"
+msgid_plural "Last time: Applied %ld changes."
+msgstr[0] "ìµ\9cê·¼: í\95\9c ê°\9cì\9d\98 ë³\80ê²½ ë\82´ì\9a©ì\9d\84 ì \81ì\9a©í\96\88ì\8aµë\8b\88ë\8b¤."
+msgstr[1] "ìµ\9cê·¼: %ld ê°\9cì\9d\98 ë³\80ê²½ ë\82´ì\9a©ì\9d\84 ì \81ì\9a©í\96\88ì\8aµë\8b\88ë\8b¤."
 
-#: ../src/gtk-ui/sync-ui.c:1328
+#: ../src/gtk-ui/sync-ui.c:2600
 #, c-format
-msgid "Last time: Applied %d changes and sent %d changes."
-msgstr "지난 시간: 적용된 %d 변동 사항 및 보내진 %d 변동 사항."
-
-#: ../src/gtk-ui/sync-ui.c:1420
-msgid "Failed to get server configuration from SyncEvolution"
-msgstr "SyncEvolution으로 부터 서버 구성 기능을 불러오기를 실패했습니다."
+msgid "Last time: Applied %ld changes and sent %ld changes."
+msgstr "최근: %ld 개의 변경 내용을 적용했고, %ld 개의 변경 내용을 보냈습니다."
 
-#: ../src/gtk-ui/sync-ui.c:1472
-msgid ""
-"ScheduleWorld enables you to keep your contacts, events, tasks, and notes in "
-"sync."
-msgstr ""
-"scheduleworld에서 귀사의 연락처, 이벤트, 작업 및 동기화 노트를 보존할 수 있습"
-"니다.  "
-
-#: ../src/gtk-ui/sync-ui.c:1475
-msgid ""
-"Google Sync can backup and synchronize your Address Book with your Gmail "
-"contacts."
-msgstr ""
-"Google Sync에서 귀하의 Gmail 연락망의 연락처 기록을 백업하거나 동기화할 수 있"
-"습니다. "
-
-#. TRANSLATORS: Please include the word "demo" (or the equivalent in
-#. your language): Funambol is going to be a 90 day demo service
-#. in the future
-#: ../src/gtk-ui/sync-ui.c:1481
+#. TRANSLATORS: the placeholder is a error message (hopefully)
+#. * explaining the problem
+#: ../src/gtk-ui/sync-ui.c:2807
+#, c-format
 msgid ""
-"Backup your contacts and calendar. Sync with a singleclick, anytime, "
-"anywhere (DEMO)."
+"There was a problem with last sync:\n"
+"%s"
 msgstr ""
-"귀하의 연락처 및 캘린더를 백업할 수 있습니다.  한번의 클릭으로 언제 어디서나 "
-"동기화 가능(DEMO).  "
-
-#: ../src/gtk-ui/sync-ui.c:1509
-msgid "New service"
-msgstr "새로운 서비스"
-
-#: ../src/gtk-ui/sync-ui.c:1556
-msgid "Server URL"
-msgstr "서버 URL"
+"최근 동기화에 문제가 있습니다.\n"
+"%s"
 
-#. TRANSLATORS: placeholder is a source name in settings window
-#: ../src/gtk-ui/sync-ui.c:1578
+#: ../src/gtk-ui/sync-ui.c:2817
 #, c-format
-msgid "%s URI"
-msgstr "%s URI"
+msgid "You've just restored a backup. The changes have not been synced with %s yet"
+msgstr "방금 백업을 복원했습니다. 변경 내용은 아직 %s와 동기화되지 않았습니다."
 
-#: ../src/gtk-ui/sync-ui.c:1715 ../src/gtk-ui/ui.glade.h:17
-msgid "Launch website"
-msgstr "웹사이트 시작"
+#: ../src/gtk-ui/sync-ui.c:3105
+msgid "Waiting for current operation to finish..."
+msgstr "현재 작동이 끝나기를 기다리고 있습니다..."
 
-#: ../src/gtk-ui/sync-ui.c:1719
-msgid "Setup and use"
-msgstr "설치 대체 사용"
+#. TRANSLATORS: next strings are error messages.
+#: ../src/gtk-ui/sync-ui.c:3139
+msgid "A normal sync is not possible at this time. The server suggests a slow sync, but this might not always be what you want if both ends already have data."
+msgstr "지금은 정상적인 동기화가 가능하지 않습니다. 서버는 느린 동기화를 제안하지만, 이미 양쪽 끝에 데이터가 있는 경우 이것이 항상 귀하가 원하시는 방법이 아닐 수도 있습니다."
 
-#: ../src/gtk-ui/sync-ui.c:1765
-msgid "Failed to get list of manually setup services from SyncEvolution"
-msgstr ""
-"SyncEvolution으로 부터 수동 설치 서비스 목록을 불러오기를 실패했습니다."
+#: ../src/gtk-ui/sync-ui.c:3143
+msgid "The sync process died unexpectedly."
+msgstr "동기화 프로세스가 갑자기 종료했습니다."
 
-#: ../src/gtk-ui/sync-ui.c:1806
-msgid "Failed to get list of supported services from SyncEvolution"
-msgstr "SyncEvolution으로 부터 지원 서비스 목록을 불러오기를 실패했습니다."
+#: ../src/gtk-ui/sync-ui.c:3148
+msgid "Password request was not answered. You can save the password in the settings to prevent the request."
+msgstr "암호 요청에 응답하지 않았습니다. 설정에 암호를 저장하면 요청을 하지 않습니다."
 
-#. TODO: this is a hack... SyncEnd should be a signal of it's own,
-#. not just hacked on top of the syncevolution error codes
-#: ../src/gtk-ui/sync-ui.c:1967
-msgid "Service configuration not found"
-msgstr "서비스 구성 요소를 찾을 수 없습니다."
+#. TODO use the service device name here, this is a remote problem
+#: ../src/gtk-ui/sync-ui.c:3152
+msgid "There was a problem processing sync request. Trying again may help."
+msgstr "동기화 요청을 처리하는 중에 문제가 발생했습니다. 다시 시도하면 문제가 해결될 수도 있습니다."
 
-#: ../src/gtk-ui/sync-ui.c:1973
-msgid "Not authorized"
-msgstr "권한이 없습니다"
+#: ../src/gtk-ui/sync-ui.c:3158
+msgid "Failed to login. Could there be a problem with your username or password?"
+msgstr "로그인하지 못했습니다. 사용자 이름이나 암호에 문제가 있습니까?"
 
-#: ../src/gtk-ui/sync-ui.c:1975
+#: ../src/gtk-ui/sync-ui.c:3161
 msgid "Forbidden"
 msgstr "금지"
 
-#: ../src/gtk-ui/sync-ui.c:1977
-msgid "Not found"
-msgstr "찾을 수 없음"
+#. TRANSLATORS: data source means e.g. calendar or addressbook
+#: ../src/gtk-ui/sync-ui.c:3167
+msgid "A data source could not be found. Could there be a problem with the settings?"
+msgstr "데이터 원본을 찾을 수 없습니다. 서버 설정에 문제가 있습니까?"
 
-#: ../src/gtk-ui/sync-ui.c:1979
-msgid "Fatal database error"
-msgstr "ì\8b¬ê°\81í\95\9c 데이터베이스 오류"
+#: ../src/gtk-ui/sync-ui.c:3171
+msgid "Remote database error"
+msgstr "ì\9b\90격 데이터베이스 오류"
 
-#: ../src/gtk-ui/sync-ui.c:1981
-msgid "Database error"
-msgstr "데이터베이스 오류"
+#. This can happen when EDS is borked, restart it may help...
+#: ../src/gtk-ui/sync-ui.c:3174
+msgid "There is a problem with the local database. Syncing again or rebooting may help."
+msgstr "이것은 로컬 데이터베이스 문제입니다. 다시 동기화하거나 재부트하면 문제가 해결될 수도 있습니다."
 
-#: ../src/gtk-ui/sync-ui.c:1983
-msgid "No space left"
-msgstr "남은 공간이 없음"
+#: ../src/gtk-ui/sync-ui.c:3177
+msgid "No space on disk"
+msgstr "ë\94\94ì\8a¤í\81¬ì\97\90 ë\82¨ì\9d\80 ê³µê°\84ì\9d´ ì\97\86ì\9d\8c"
 
-#. TODO identify problem item somehow ?
-#: ../src/gtk-ui/sync-ui.c:1986
+#: ../src/gtk-ui/sync-ui.c:3179
 msgid "Failed to process SyncML"
 msgstr "SyncML 프로세스 실패"
 
-#: ../src/gtk-ui/sync-ui.c:1988
+#: ../src/gtk-ui/sync-ui.c:3181
 msgid "Server authorization failed"
 msgstr "서버 권한 부여 실패"
 
-#: ../src/gtk-ui/sync-ui.c:1990
+#: ../src/gtk-ui/sync-ui.c:3183
 msgid "Failed to parse configuration file"
 msgstr "구성 파일 구문 분석 실패"
 
-#: ../src/gtk-ui/sync-ui.c:1992
+#: ../src/gtk-ui/sync-ui.c:3185
 msgid "Failed to read configuration file"
 msgstr "구성요소 파일 읽기 실패"
 
-#: ../src/gtk-ui/sync-ui.c:1994
+#: ../src/gtk-ui/sync-ui.c:3187
 msgid "No configuration found"
 msgstr "구성요소를 찾을수 없습니다."
 
-#: ../src/gtk-ui/sync-ui.c:1996
+#: ../src/gtk-ui/sync-ui.c:3189
 msgid "No configuration file found"
 msgstr "구성요소 파일을 찾지 못했습니다."
 
-#: ../src/gtk-ui/sync-ui.c:1998
+#: ../src/gtk-ui/sync-ui.c:3191
 msgid "Server sent bad content"
 msgstr "서버가 안좋은 컨텐츠를 보냈습니다."
 
-#: ../src/gtk-ui/sync-ui.c:2000
-msgid "Transport failure (no connection?)"
-msgstr "전송 실패(연결 없음?)"
-
-#: ../src/gtk-ui/sync-ui.c:2002
-msgid "Connection timed out"
-msgstr "연결 시간 초과"
-
-#: ../src/gtk-ui/sync-ui.c:2004
+#: ../src/gtk-ui/sync-ui.c:3193
 msgid "Connection certificate has expired"
 msgstr "연결 인증이 만료되었습니다. "
 
-#: ../src/gtk-ui/sync-ui.c:2006
+#: ../src/gtk-ui/sync-ui.c:3195
 msgid "Connection certificate is invalid"
 msgstr "연결 인증이 유효하지 않습니다."
 
-#: ../src/gtk-ui/sync-ui.c:2009
-msgid "Connection failed"
-msgstr "ì\97°ê²° ì\8b¤í\8c¨"
+#: ../src/gtk-ui/sync-ui.c:3203
+msgid "We were unable to connect to the server. The problem could be temporary or there could be something wrong with the settings."
+msgstr "ì\84\9cë²\84ì\97\90 ì\97°ê²°í\95  ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤. ì\9d´ ë¬¸ì \9cë\8a\94 ì\9d¼ì\8b\9cì \81ì\9d´ê±°ë\82\98 ì\84¤ì \95ì\97\90 ë¬¸ì \9cê°\80 ì\9e\88ì\9d\84 ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤."
 
-#: ../src/gtk-ui/sync-ui.c:2011
-msgid "URL is bad"
-msgstr "ì\9e\98못ë\90\9c URL ì\9e\85니다."
+#: ../src/gtk-ui/sync-ui.c:3210
+msgid "The server URL is bad"
+msgstr "ì\84\9cë²\84 URLì\9d´ ì\9e\98못ë\90\98ì\97\88ì\8aµ니다."
 
-#: ../src/gtk-ui/sync-ui.c:2013
-msgid "Server not found"
-msgstr "ì\84\9cë²\84를 ì°¾ì\9d\84 ì\88\98 ì\97\86ì\9d\8c."
+#: ../src/gtk-ui/sync-ui.c:3215
+msgid "The server was not found"
+msgstr "ì\84\9cë²\84를 ì°¾ì\9d\84 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤."
 
-#: ../src/gtk-ui/sync-ui.c:2015
+#: ../src/gtk-ui/sync-ui.c:3217
 #, c-format
 msgid "Error %d"
 msgstr "오류 %d"
 
-#: ../src/gtk-ui/sync-ui.c:2025
-msgid "Sync D-Bus service exited unexpectedly"
-msgstr "갑자기 동기화 D 버스 서비스 종료 "
-
-#: ../src/gtk-ui/sync-ui.c:2028 ../src/gtk-ui/sync-ui.c:2079
-msgid "Sync Failed"
-msgstr "동기화 실패"
-
-#: ../src/gtk-ui/sync-ui.c:2071
-msgid "Sync complete"
-msgstr "동기화 완료"
-
-#: ../src/gtk-ui/sync-ui.c:2076
-msgid "Sync canceled"
-msgstr "동기화 취소"
+#. TRANSLATORS: password request dialog contents: title, cancel button
+#. * and ok button
+#: ../src/gtk-ui/sync-ui.c:3355
+msgid "Password is required for sync"
+msgstr "동기화하려면 암호가 필요합니다."
 
-#. NOTE extra1 can be error here
-#: ../src/gtk-ui/sync-ui.c:2094
-msgid "Ending sync"
-msgstr "동기화 종료"
+#: ../src/gtk-ui/sync-ui.c:3359
+msgid "Sync with password"
+msgstr "암호 동기화"
 
-#. TRANSLATORS: placeholder is a source name (e.g. 'Calendar') in a progress text
-#: ../src/gtk-ui/sync-ui.c:2118
+#. TRANSLATORS: password request dialog message, placeholder is service name
+#: ../src/gtk-ui/sync-ui.c:3369
 #, c-format
-msgid "Preparing '%s'"
-msgstr " '%s' 준비하는 중"
-
-#. TRANSLATORS: placeholder is a source name in a progress text
-#: ../src/gtk-ui/sync-ui.c:2130
-#, c-format
-msgid "Sending '%s'"
-msgstr "'%s' 보내는 중"
-
-#. TRANSLATORS: placeholder is a source name in a progress text
-#: ../src/gtk-ui/sync-ui.c:2142
-#, c-format
-msgid "Receiving '%s'"
-msgstr "'%s' 받는중"
-
-#: ../src/gtk-ui/ui.glade.h:1
-msgid "<b>Data</b>"
-msgstr "<b>데이터</b>"
+msgid "Please enter password for syncing with %s:"
+msgstr "%s 동기화 암호를 입력하십시오."
 
+#. title for the buttons on the right side of main view
 #: ../src/gtk-ui/ui.glade.h:2
-msgid "<b>No sync service in use</b>"
-msgstr "<b>사용중인 동기화 서비스가 없습니다</b>"
-
-#: ../src/gtk-ui/ui.glade.h:3
-msgid "<b>Sync failure</b>"
-msgstr "<b>동기화 실패</b>"
+msgid "<b>Actions</b>"
+msgstr "<b>동작</b>"
 
+#. text between the two "start from scratch" buttons in emergency view
 #: ../src/gtk-ui/ui.glade.h:4
-msgid "<b>Type of Sync</b>"
-msgstr "<b>ë\8f\99기í\99\94 ì\9c í\98\95</b>"
+msgid "<b>or</b>"
+msgstr "<b>ë\98\90ë\8a\94</b>"
 
 #: ../src/gtk-ui/ui.glade.h:5
-msgid "<big>Manual setup</big>"
-msgstr "<big>ì\84¤ëª\85ì\84\9c ì\84¤ì \95</big>"
+msgid "<big>Direct sync</big>"
+msgstr "<big>ì§\81ì \91 ë\8f\99기í\99\94</big>"
 
 #: ../src/gtk-ui/ui.glade.h:6
-msgid "<big>Supported services</big>"
-msgstr "<big>지원된 서비스</big>"
-
-#: ../src/gtk-ui/ui.glade.h:7
-msgid "Add new service"
-msgstr "새로운 서비스 추가"
+msgid "<big>Network sync</big>"
+msgstr "<b>네트워크 동기화</b>"
 
+#. a title in emergency view
 #: ../src/gtk-ui/ui.glade.h:8
-msgid "Back to sync"
-msgstr "동기화로 다시 돌아가기"
+msgid "<big>Restore from backup</big>"
+msgstr "<big>백업으로부터 복원</big>"
 
-#: ../src/gtk-ui/ui.glade.h:9
-msgid ""
-"Change sync\n"
-"service"
-msgstr ""
-"동기화 서비스\n"
-"변경"
-
-#: ../src/gtk-ui/ui.glade.h:11
-msgid "Delete all local data and replace it with remote data"
-msgstr "모든 로컬 데이터를 삭제하고 원격 데이터로 바꾸십시오."
+#. a title in emergency view
+#: ../src/gtk-ui/ui.glade.h:10
+msgid "<big>Slow sync</big>"
+msgstr "<big>느린 동기화</big>"
 
+#. a title in emergency view
 #: ../src/gtk-ui/ui.glade.h:12
-msgid "Delete all remote data and replace it with local data"
-msgstr "모든 원격 데이터를 삭제하고 로컬 데이터로 바꾸십시오."
+msgid "<big>Start from scratch</big>"
+msgstr "<big>처음부터 새로 시작</big>"
 
 #: ../src/gtk-ui/ui.glade.h:13
-msgid "Delete this service"
-msgstr "이 서비스를 삭제하십시오."
-
-#: ../src/gtk-ui/ui.glade.h:14
-msgid "Edit service settings"
-msgstr "서비스 설정 편집"
-
-#: ../src/gtk-ui/ui.glade.h:15
 msgid ""
-"If you don't see your service above but know that your sync provider uses "
-"SyncML\n"
-"you can setup a service manually."
+"A slow sync compares items from both sides and tries to merge them. \n"
+"This may fail in some cases, leading to duplicates or lost information."
 msgstr ""
-"만약 당신의 서비스가 보이지는 않지만 당신의 동기화 제공자가 SyncML을 사용하는"
-"것을 알고 있다면\n"
-"서비스를 수동으로 설정할 수 있습니다."
+"느린 동기화는 양방향의 항목을 비교한 다음, 이들은 병합하려고 합니다.\n"
+"이것은 일부의 경우 실패할 수 있으며 그 결과 복제되거나 또는 정보의 손실을 가져올 수 있습니다."
+
+#: ../src/gtk-ui/ui.glade.h:15
+msgid "Add new device"
+msgstr "새로운 장치 추가"
 
+#: ../src/gtk-ui/ui.glade.h:16
+msgid "Add new service"
+msgstr "새로운 서비스 추가"
+
+#. explanation of "Restore backup" function
 #: ../src/gtk-ui/ui.glade.h:18
-msgid "Merge local and remote data (recommended)"
-msgstr "ë¡\9c컬 ë\8d°ì\9d´í\84°ì\99\80 ì\9b\90격 ë\8d°ì\9d´í\84°ì\9d\98 í\95©ë³\91"
+msgid "Backups are made before every time we Sync. Choose a backup to restore. Any changes you have made since then will be lost."
+msgstr "ë°±ì\97\85ì\9d\80 ë§¤ë²\88 ë\8f\99기í\99\94í\95\98기 ì \84ì\97\90 ë§\8cë\93¤ì\96´ì§\91ë\8b\88ë\8b¤. ë³µì\9b\90í\95  ë°±ì\97\85ì\9d\84 ì\84 í\83\9dí\95\98ì\8b­ì\8b\9cì\98¤. ê·¸ ì\9d´í\9b\84ì\9d\98 ë³\80ê²½ ë\82´ì\9a©ì\9d\80 ëª¨ë\91\90 ì\86\90ì\8b¤ë\90©ë\8b\88ë\8b¤."
 
 #: ../src/gtk-ui/ui.glade.h:19
-msgid "Password"
-msgstr "암호"
-
-#: ../src/gtk-ui/ui.glade.h:20
-msgid "Reset original server settings"
-msgstr "오리지날 서버 설정 다시 설정하기."
+msgid "Calendar"
+msgstr "캘린더"
 
+#. Button in main view, right side. Keep to below 20 chars per line, feel free to use two lines
 #: ../src/gtk-ui/ui.glade.h:21
-msgid "Save and use this service"
-msgstr "저장하고 이 서비스를 사용하세요."
-
-#: ../src/gtk-ui/ui.glade.h:22
-msgid "Select sync service"
-msgstr "동기화 서비스를 선택하십시오."
-
-#: ../src/gtk-ui/ui.glade.h:23
-msgid "Server settings"
-msgstr "서버 설정"
+msgid ""
+"Change or edit\n"
+"sync service"
+msgstr ""
+"동기화 서비스\n"
+"변경 또는 편집"
 
+#. close button for settings window
 #: ../src/gtk-ui/ui.glade.h:24
-msgid "Service name"
-msgstr "서비스 이름"
+msgid "Close"
+msgstr "닫기"
 
 #: ../src/gtk-ui/ui.glade.h:25
 msgid ""
-"Sorry, you need an internet\n"
-"connection to sync."
+"Delete all data on Zyb \n"
+"and replace with your\n"
+"local information"
 msgstr ""
-"죄송합니다, 동기화를 하려면\n"
-"인터넷 연결이 필요합니다."
+"Zyb의 모든 데이터를\n"
+"삭제하고 로컬 정보로\n"
+"교체하십시오."
 
-#: ../src/gtk-ui/ui.glade.h:27
-msgid "Stop using this service"
-msgstr "이 서비스의 사용을 중단 하십시오."
+#: ../src/gtk-ui/ui.glade.h:28
+msgid ""
+"Delete all your local\n"
+"information and replace\n"
+"with data from Zyb"
+msgstr ""
+"모든 로컬 정보를\n"
+"삭제하고 Zyb 데이터로\n"
+"교체하십시오."
 
-#: ../src/gtk-ui/ui.glade.h:30
+#. button in main view, right side. Keep length to 20 characters or so, use two lines if needed
+#: ../src/gtk-ui/ui.glade.h:32
 msgid ""
-"Synchronization is not available (D-Bus service does not answer), sorry."
-msgstr "동기화가 가능하지 않습니다(D-Bus 서비스는 응답이 없습니다),죄송합니다."
+"Fix a sync\n"
+"emergency"
+msgstr ""
+"동기화 수리\n"
+"비상시"
 
-#: ../src/gtk-ui/ui.glade.h:31
+#: ../src/gtk-ui/ui.glade.h:34
 msgid ""
-"To sync you'll need a network connection and an account with a sync "
-"service.\n"
-"We support the following services: "
+"If you don't see your service above but know that your sync provider uses SyncML\n"
+"you can setup a service manually."
 msgstr ""
-"ë\8f\99기í\99\94를 í\95\98려면 ë\84¤í\8a¸ì\9b\8cí\81¬ ì\97°ê²°ê³¼ ê³\84ì \95 ì\84\9cë¹\84ì\8a¤ê°\80 í\95\84ì\9a\94í\95©ë\8b\88ë\8b¤.\n"
-"다음 서비스를 지원합니다:"
+"ë§\8cì\95½ ë\8b¹ì\8b ì\9d\98 ì\84\9cë¹\84ì\8a¤ê°\80 ë³´ì\9d´ì§\80ë\8a\94 ì\95\8aì§\80ë§\8c ë\8b¹ì\8b ì\9d\98 ë\8f\99기í\99\94 ì \9cê³µì\9e\90ê°\80 SyncMLì\9d\84 ì\82¬ì\9a©í\95\98ë\8a\94ê²\83ì\9d\84 ì\95\8cê³  ì\9e\88ë\8b¤ë©´\n"
+"서비스를 수동으로 설정할 수 있습니다."
 
-#: ../src/gtk-ui/ui.glade.h:33
-msgid "Username"
-msgstr "ì\82¬ì\9a©ì\9e\90 ì\9d´ë¦\84"
+#: ../src/gtk-ui/ui.glade.h:36
+msgid "Settings"
+msgstr "ì\84¤ì \95ê°\92"
 
-#: ../src/gtk-ui/ui.glade.h:34
+#: ../src/gtk-ui/ui.glade.h:39
+msgid "Sync Emergency"
+msgstr "동기화 비상"
+
+#: ../src/gtk-ui/ui.glade.h:41
 msgid ""
-"You haven't selected a sync service yet. Sync services let you \n"
-"synchronize your data between your netbook and a web service."
+"To sync you'll need a network connection and an account with a sync service.\n"
+"We support the following services: "
 msgstr ""
-"동기화 서비스를 아직 선택하지 않았습니다. 동기화 서비스는\n"
-"ë\84·ë¶\81ê³¼ ì\9b¹ ì\84\9cë¹\84ì\8a¤ ì\82¬ì\9d´ì\9d\98 ë\8d°ì\9d´í\84°ë¥¼ ë\8f\99기í\99\94 ì\8b\9cì¼\9cì¤\8dë\8b\88ë\8b¤.  "
+"동기화를 하려면 네트워크 연결과 계정 서비스가 필요합니다.\n"
+"ë\8b¤ì\9d\8c ì\84\9cë¹\84ì\8a¤ë¥¼ ì§\80ì\9b\90í\95©ë\8b\88ë\8b¤."
 
-#: ../src/gtk-ui/sync.desktop.in.h:2 ../src/gtk-ui/sync-gtk.desktop.in.h:2
+#: ../src/gtk-ui/ui.glade.h:43
+msgid "Use Bluetooth to Sync your data from one device to another."
+msgstr "데이터를 한 장치에서 다른 장치로 동기화하려면 블루투스를 사용하십시오."
+
+#: ../src/gtk-ui/ui.glade.h:44
+msgid "You will need to add Bluetooth devices before they can be synced."
+msgstr "블루투스 장치가 동기화되기 전에 이들을 추가해야 합니다."
+
+#: ../src/gtk-ui/sync.desktop.in.h:2
+#: ../src/gtk-ui/sync-gtk.desktop.in.h:2
 msgid "Up to date"
 msgstr "최신의"
 
@@ -548,7 +642,347 @@ msgstr "최신의"
 msgid "Sync (GTK)"
 msgstr "Sync (GTK)"
 
+#: ../src/gtk-ui/sync-config-widget.c:74
+msgid "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in sync."
+msgstr "scheduleworld에서 귀사의 연락처, 이벤트, 작업 및 동기화 노트를 보존할 수 있습니다.  "
+
+#: ../src/gtk-ui/sync-config-widget.c:77
+msgid "Google Sync can backup and synchronize your contacts with your Gmail contacts."
+msgstr "Google Sync에서 귀하의 연락처 기록을  Gmail 연락처로 백업하거나 동기화할 수 있습니다. "
+
+#. TRANSLATORS: Please include the word "demo" (or the equivalent in
+#. your language): Funambol is going to be a 90 day demo service
+#. in the future
+#: ../src/gtk-ui/sync-config-widget.c:83
+msgid "Backup your contacts and calendar. Sync with a single click, anytime, anywhere (DEMO)."
+msgstr "귀하의 연락처 및 일정을 백업합니다. 한 번의 클릭으로 언제 어디서나 동기화가 가능합니다(DEMO).  "
+
+#: ../src/gtk-ui/sync-config-widget.c:86
+msgid "Mobical Backup and Restore service allows you to securely backup your personal mobile data for free."
+msgstr "Moblin식 백업과 복원 서비스를 사용하면 개인용 모바일 데이터를 무료로 안전하게 백업할 수 있습니다."
+
+#: ../src/gtk-ui/sync-config-widget.c:89
+msgid "ZYB is a simple way for people to store and share mobile information online."
+msgstr "ZYB는 모바일 정보를 온라인으로 저장하고 공유할 수 있는 간단한 방법입니다."
+
+#: ../src/gtk-ui/sync-config-widget.c:92
+msgid "Memotoo lets you access your personal data from any computer connected to the Internet."
+msgstr "Memotoo를 사용하면 인터넷에 연결된 컴퓨터에서 개인용 데이터를 액세스할 수 있습니다."
+
+#: ../src/gtk-ui/sync-config-widget.c:188
+msgid "Sorry, failed to save the configuration"
+msgstr "죄송합니다만 구성을 저장하지 못했습니다."
+
+#: ../src/gtk-ui/sync-config-widget.c:377
+msgid "Service must have a name and server URL"
+msgstr "서비스는 반듯이 이름 및 서버 URL이 있어야 합니다."
+
+#: ../src/gtk-ui/sync-config-widget.c:418
+#, c-format
+msgid "Do you want to reset the settings for %s? This will not remove any synced information on either end."
+msgstr "%s의 설정값을 다시 설정하시겠습니까? 이것은 동기화된 정보를 어느 한쪽에서도 제거하지 않습니다."
+
+#. TRANSLATORS: buttons in reset-service warning dialog
+#: ../src/gtk-ui/sync-config-widget.c:422
+msgid "Yes, reset"
+msgstr "예, 재설정합니다."
+
+#: ../src/gtk-ui/sync-config-widget.c:423
+#: ../src/gtk-ui/sync-config-widget.c:434
+msgid "No, keep settings"
+msgstr "아니오, 설정값을 유지합니다."
+
+#: ../src/gtk-ui/sync-config-widget.c:428
+#, c-format
+msgid "Do you want to delete the settings for %s? This will not remove any synced information on either end but it will remove these settings."
+msgstr "%s의 설정값을 삭제하시겠습니까? 이것은 동기화된 정보를 어느 한쪽에서도 제거하지는 않지만 이 설정값들은 제거합니다."
+
+#. TRANSLATORS: buttons in delete-service warning dialog
+#: ../src/gtk-ui/sync-config-widget.c:433
+msgid "Yes, delete"
+msgstr "예, 삭제합니다."
+
+#: ../src/gtk-ui/sync-config-widget.c:463
+msgid "Reset settings"
+msgstr "설정값 재설정"
+
+#: ../src/gtk-ui/sync-config-widget.c:466
+msgid "Delete settings"
+msgstr "설정값 삭제"
+
+#: ../src/gtk-ui/sync-config-widget.c:476
+msgid "Save and use"
+msgstr "저장 및 사용"
+
+#: ../src/gtk-ui/sync-config-widget.c:479
+msgid ""
+"Save and replace\n"
+"current service"
+msgstr ""
+"현재 서비스를\n"
+"저장하고 교체합니다."
+
+#: ../src/gtk-ui/sync-config-widget.c:489
+msgid "Stop using device"
+msgstr "장치 사용 중단"
+
+#: ../src/gtk-ui/sync-config-widget.c:492
+msgid "Stop using service"
+msgstr "서비스 사용 중단"
+
+#. TRANSLATORS: label for an entry in service configuration form.
+#. * Placeholder is a source  name.
+#. * Example: "Appointments URI"
+#: ../src/gtk-ui/sync-config-widget.c:675
+#, c-format
+msgid "%s URI"
+msgstr "%s URI"
+
+#. TRANSLATORS: toggles in service configuration form, placeholder is service
+#. * or device name
+#: ../src/gtk-ui/sync-config-widget.c:850
+#, c-format
+msgid "Send changes to %s"
+msgstr "%s으로 변경 내용을 보냅니다."
+
+#: ../src/gtk-ui/sync-config-widget.c:855
+#, c-format
+msgid "Receive changes from %s"
+msgstr "%s에서 변경 내용을 받습니다."
+
+#: ../src/gtk-ui/sync-config-widget.c:871
+msgid "<b>Sync</b>"
+msgstr "<b>동기화</b>"
+
+#. TRANSLATORS: label of a entry in service configuration
+#: ../src/gtk-ui/sync-config-widget.c:887
+msgid "Server address"
+msgstr "서버 주소"
+
+#. TRANSLATORS: explanation before a device template combobox.
+#. * Placeholder is a device name like 'Nokia N85' or 'Syncevolution
+#. * Client'
+#: ../src/gtk-ui/sync-config-widget.c:963
+#, c-format
+msgid "This device looks like it might be a '%s'. If this is not correct, please take a look at the list of supported devices and pick yours if it is listed"
+msgstr "이 장치는 '%s'인 것 같습니다. 그렇지 않으면 지원 장치 목록에서 열거된 것이 있는지 찾아보십시오."
+
+#: ../src/gtk-ui/sync-config-widget.c:969
+msgid "We don't know what this device is exactly. Please take a look at the list of supported devices and pick yours if it is listed"
+msgstr "이 장치가 정확히 무엇인지 모르겠습니다. 지원 장치 목록에서 열거된 것이 있는지 찾아보십시오."
+
+#: ../src/gtk-ui/sync-config-widget.c:1122
+#, c-format
+msgid "%s - Bluetooth device"
+msgstr "%s - 블루투스 장치"
+
+#. TRANSLATORS: service title for services that are not based on a
+#. * template in service list, the placeholder is the name of the service
+#: ../src/gtk-ui/sync-config-widget.c:1128
+#, c-format
+msgid "%s - manually setup"
+msgstr "%s - 수동으로 설정"
+
+#. TRANSLATORS: link button in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1803
+msgid "Launch website"
+msgstr "웹사이트 시작"
+
+#. TRANSLATORS: button in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1812
+msgid "Setup now"
+msgstr "지금 설정"
+
+#. TRANSLATORS: labels of entries in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1908
+msgid "Username"
+msgstr "사용자 이름"
+
+#: ../src/gtk-ui/sync-config-widget.c:1923
+msgid "Password"
+msgstr "암호"
+
+#. TRANSLATORS: warning in service configuration form for people
+#. who have modified the configuration via other means.
+#: ../src/gtk-ui/sync-config-widget.c:1946
+msgid "Current configuration is more complex than what can be shown here. Changes to sync mode or synced data types will overwrite that configuration."
+msgstr "현재 구성은 여기에 표시될 수 있는 것보다 더 복잡합니다. 동기화 모드 또는 동기화된 데이터 유형을 변경하면 그 구성을 덮어쓰게 됩니다."
+
+#. TRANSLATORS: this is the epander label for server settings
+#. in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1965
+msgid "Hide server settings"
+msgstr "서버 설정값 숨김"
+
+#. TRANSLATORS: this is the epander label for server settings
+#. in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1985
+msgid "Show server settings"
+msgstr "서버 설정값 표시"
+
+#: ../src/gnome-bluetooth/syncevolution.c:110
+msgid "Sync in the Sync application"
+msgstr "동기화 응용 프로그램에서 동기화"
+
+#: ../src/syncevo-dbus-server.cpp:5622
+#, c-format
+msgid "%s is syncing"
+msgstr "%s 동기화 중"
+
+#: ../src/syncevo-dbus-server.cpp:5623
+#, c-format
+msgid "We have just started to sync your computer with the %s sync service."
+msgstr "%s 동기화 서비스로 방금 귀하의 컴퓨터를 동기화하기 시작했습니다."
+
+#. if sync is successfully started and done
+#: ../src/syncevo-dbus-server.cpp:5637
+#, c-format
+msgid "%s sync complete"
+msgstr "%s 동기화 완료"
+
+#: ../src/syncevo-dbus-server.cpp:5638
+#, c-format
+msgid "We have just finished syncing your computer with the %s sync service."
+msgstr "%s 동기화 서비스로 방금 귀하의 컴퓨터 동기화를 마쳤습니다."
+
+#. if sync is successfully started and has errors, or not started successful with a fatal problem
+#: ../src/syncevo-dbus-server.cpp:5643
+msgid "Sync problem."
+msgstr "동기화 문제"
+
+#: ../src/syncevo-dbus-server.cpp:5644
+msgid "Sorry, there's a problem with your sync that you need to attend to."
+msgstr "죄송합니다. 동기화에 문제가 있으니 주의를 요합니다."
+
+#: ../src/syncevo-dbus-server.cpp:5717
+msgid "View"
+msgstr "보기"
+
+#: ../src/syncevo-dbus-server.cpp:5718
+msgid "Dismiss"
+msgstr "종료"
+
+#~ msgid "Database error"
+#~ msgstr "데이터베이스 오류"
+
+#~ msgid ""
+#~ "Do you want to replace %s with %s? This will not remove any synced "
+#~ "information on either end but you will no longer be able to sync with %s."
+#~ msgstr ""
+#~ "%s을 %s로 교체하시겠습니까? 이것은 어느 한쪽에서나 동기화된 정보를 제거하"
+#~ "지는 않지만 %s와는 더 이상 동기화할 수 없게 됩니다."
+
+#~ msgid "Yes, use %s"
+#~ msgstr "예, %s을 사용합니다."
+
+#~ msgid "No, use %s"
+#~ msgstr "아니오, %s을 사용합니다."
+
+#~ msgid "Reset service"
+#~ msgstr "서비스 재설정"
+
+#~ msgid "Addressbook"
+#~ msgstr "주소록"
+
+#~ msgid "Todo"
+#~ msgstr "할일"
+
+#~ msgid "Memo"
+#~ msgstr "메모"
+
+#~ msgid "Failed to save current service in GConf configuration system"
+#~ msgstr "GConf 구성 시스템의 현재 서비스를 저장하는데 실패했습니다."
+
+#~ msgid "Failed to save service configuration to SyncEvolution"
+#~ msgstr "서비스 구성을 SyncEvolution에 저장하는데 실패했습니다."
+
+#~ msgid "Failed to get service configuration from SyncEvolution"
+#~ msgstr "SyncEvolution으로 부터 구성 서비스를 불러오기를 실패했습니다."
+
+#~ msgid "Failed to remove service configuration from SyncEvolution"
+#~ msgstr "SyncEvolution으로 부터 구성 시스템을 제거하는데 실패했습니다."
+
+#~ msgid "Failed to cancel: sync was no longer in progress"
+#~ msgstr "취소 실패: 동기화는 더이상 진행되지 않습니다."
+
+#~ msgid "Failed to cancel sync"
+#~ msgstr "동기화 취소 실패"
+
+#~ msgid "Canceling sync"
+#~ msgstr "동기화 취소 중 "
+
+#~ msgid "No sources are enabled, not syncing"
+#~ msgstr "사용 가능한 소스가 없습니다. 동기화 되지 않았습니다."
+
+#~ msgid "A sync is already in progress"
+#~ msgstr "동기화가 이미 진행중 입니다."
+
+#~ msgid "Failed to start sync"
+#~ msgstr "동기화를 시작하는데 실패했습니다."
+
+#~ msgid "%s (not supported by this service)"
+#~ msgstr "%s (이 서비스에 의해 지원되지 않습니다)"
+
+#~ msgid "Failed to get server configuration from SyncEvolution"
+#~ msgstr "SyncEvolution으로 부터 서버 구성 기능을 불러오기를 실패했습니다."
+
+#~ msgid "Server URL"
+#~ msgstr "서버 URL"
+
+#~ msgid "Failed to get list of manually setup services from SyncEvolution"
+#~ msgstr ""
+#~ "SyncEvolution으로 부터 수동 설치 서비스 목록을 불러오기를 실패했습니다."
+
+#~ msgid "Service configuration not found"
+#~ msgstr "서비스 구성 요소를 찾을 수 없습니다."
+
+#~ msgid "Not authorized"
+#~ msgstr "권한이 없습니다"
+
+#~ msgid "Not found"
+#~ msgstr "찾을 수 없음"
+
+#~ msgid "Transport failure (no connection?)"
+#~ msgstr "전송 실패(연결 없음?)"
+
+#~ msgid "Connection timed out"
+#~ msgstr "연결 시간 초과"
+
+#~ msgid "Sync canceled"
+#~ msgstr "동기화 취소"
+
+#~ msgid "Ending sync"
+#~ msgstr "동기화 종료"
+
+#~ msgid "<b>No sync service in use</b>"
+#~ msgstr "<b>사용중인 동기화 서비스가 없습니다</b>"
+
+#~ msgid "<big>Manual setup</big>"
+#~ msgstr "<big>설명서 설정</big>"
+
+#~ msgid "Merge local and remote data (recommended)"
+#~ msgstr "로컬 데이터와 원격 데이터의 합병"
+
+#~ msgid "Reset original server settings"
+#~ msgstr "오리지날 서버 설정 다시 설정하기."
+
+#~ msgid "Service name"
+#~ msgstr "서비스 이름"
+
+#~ msgid ""
+#~ "Sorry, you need an internet\n"
+#~ "connection to sync."
+#~ msgstr ""
+#~ "죄송합니다, 동기화를 하려면\n"
+#~ "인터넷 연결이 필요합니다."
+
+#~ msgid ""
+#~ "Synchronization is not available (D-Bus service does not answer), sorry."
+#~ msgstr ""
+#~ "동기화가 가능하지 않습니다(D-Bus 서비스는 응답이 없습니다),죄송합니다."
+
 #~ msgid "Last time: Received one change."
+
 #~ msgid_plural "Last time: Received %d changes."
 #~ msgstr[0] "지난 시간: 한건의 변경 사항을 받았습니다."
 #~ msgstr[1] "지난 시간: %d건의 변경 사항을 받았습니다."
index 13de181..168b159 100644 (file)
--- a/po/nl.po
+++ b/po/nl.po
-#: ../src/gtk-ui/sync-ui.c:764
 msgid ""
 msgstr ""
 "Project-Id-Version: syncevolution\n"
 "Report-Msgid-Bugs-To: http://moblin.org/projects/syncevolution\n"
-"POT-Creation-Date: 2009-10-01 19:27+0000\n"
-"PO-Revision-Date: 2009-10-05 09:50-0800\n"
-"Last-Translator: Auke Kok <auke-jan.h.kok@intel.com>\n"
+"POT-Creation-Date: 2010-04-05 09:22+0000\n"
+"PO-Revision-Date: 2010-04-06 17:00-0800\n"
+"Last-Translator: GLS_NLD <albert.dijkstra@ptiglobal.net>\n"
 "Language-Team: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Plural-Forms: nplurals=2; plural=n!=1;\n"
 "X-Poedit-Language: Dutch\n"
 
 #. TRANSLATORS: this is the application name that may be used by e.g.
 #. the windowmanager
-#: ../src/gtk-ui/main.c:31 ../src/gtk-ui/ui.glade.h:28
+#: ../src/gtk-ui/main.c:40
+#: ../src/gtk-ui/ui.glade.h:38
 #: ../src/gtk-ui/sync.desktop.in.h:1
+#: ../src/gnome-bluetooth/syncevolution.c:112
 msgid "Sync"
 msgstr "Synchronisatie"
 
-#: ../src/gtk-ui/sync-ui.c:259
-msgid "Addressbook"
-msgstr "Adresboek"
+#: ../src/gtk-ui/sync-ui.c:260
+msgid "Contacts"
+msgstr "Contacten"
 
-#: ../src/gtk-ui/sync-ui.c:261
-msgid "Calendar"
-msgstr "Kalender"
-
-#: ../src/gtk-ui/sync-ui.c:263
-msgid "Todo"
-msgstr "Te doen"
-
-#: ../src/gtk-ui/sync-ui.c:265
-msgid "Memo"
-msgstr "Memo"
-
-#: ../src/gtk-ui/sync-ui.c:320
-msgid "Failed to save current service in GConf configuration system"
-msgstr "Fout bij wegschrijven huidige service in GConf configuratie systeem"
-
-#: ../src/gtk-ui/sync-ui.c:331
-msgid "Failed to save service configuration to SyncEvolution"
-msgstr "Fout bij wegschrijven service configuratie naar SyncEvolution"
-
-#: ../src/gtk-ui/sync-ui.c:416
-msgid "Failed to get service configuration from SyncEvolution"
-msgstr "Fout bij inlezen service configuratie uit SyncEvolution"
-
-#: ../src/gtk-ui/sync-ui.c:479
-msgid "Failed to remove service configuration from SyncEvolution"
-msgstr "Fout bij verwijderen service configuratie uit SyncEvolution"
-
-#: ../src/gtk-ui/sync-ui.c:599
-msgid "Service must have a name and server URL"
-msgstr "Service moet een naam en server URL hebben"
+#: ../src/gtk-ui/sync-ui.c:262
+msgid "Appointments"
+msgstr "Afspraken"
 
-#. sync is no longer in progress for some reason
-#: ../src/gtk-ui/sync-ui.c:675
-msgid "Failed to cancel: sync was no longer in progress"
-msgstr "Afbreken mislukt: syncrhonisatie was niet langer bezig"
+#: ../src/gtk-ui/sync-ui.c:264
+#: ../src/gtk-ui/ui.glade.h:40
+msgid "Tasks"
+msgstr "Taken"
 
-#: ../src/gtk-ui/sync-ui.c:679
-msgid "Failed to cancel sync"
-msgstr "Afbreken synchronisatie mislukt"
+#: ../src/gtk-ui/sync-ui.c:266
+msgid "Notes"
+msgstr "Opmerkingen"
 
-#: ../src/gtk-ui/sync-ui.c:683
-msgid "Canceling sync"
-msgstr "Afbreken synchronisatie"
+#. TRANSLATORS: This is a "combination source" for syncing with devices
+#. * that combine appointments and tasks. the name should match the ones
+#. * used for calendar and todo above
+#: ../src/gtk-ui/sync-ui.c:271
+msgid "Appointments & Tasks"
+msgstr "Afspraken & Taken"
 
-#: ../src/gtk-ui/sync-ui.c:697
-msgid "Trying to cancel sync"
-msgstr "Proberen syncrhonisatie af te breken"
+#: ../src/gtk-ui/sync-ui.c:343
+msgid "Starting sync"
+msgstr "Synchronisatie wordt gestart"
 
-#: ../src/gtk-ui/sync-ui.c:704
+#. TRANSLATORS: slow sync confirmation dialog message. Placeholder
+#. * is service/device name
+#: ../src/gtk-ui/sync-ui.c:381
 #, c-format
-msgid ""
-"Do you want to delete all local data and replace it with data from %s? This "
-"is not usually advised."
-msgstr ""
-"Wil je alle lokale data verwijderen en vervangen met data van %s? Dit is "
-"niet aan te raden."
+msgid "Do you want to slow sync with %s?"
+msgstr "Wilt u langzaam synchroniseren met %s?"
 
-#: ../src/gtk-ui/sync-ui.c:709
-#, c-format
-msgid ""
-"Do you want to delete all data in %s and replace it with your local data? "
-"This is not usually advised."
-msgstr ""
-"Wil je alle data in %s verwijderen en vervangen met lokale data? Dit is niet "
-"aan te raden."
+#: ../src/gtk-ui/sync-ui.c:385
+msgid "Yes, do slow sync"
+msgstr "Ja, voer een synchronisatie uit"
 
-#: ../src/gtk-ui/sync-ui.c:726
+#: ../src/gtk-ui/sync-ui.c:385
 msgid "No, cancel sync"
 msgstr "Nee, breek synchronisatie af"
 
-#: ../src/gtk-ui/sync-ui.c:727
+#. TRANSLATORS: confirmation dialog for refresh-from-server. Placeholder
+#. * is service/device name
+#: ../src/gtk-ui/sync-ui.c:418
+#, c-format
+msgid "Do you want to delete all local data and replace it with data from %s? This is not usually advised."
+msgstr "Wil je alle lokale data verwijderen en vervangen met data van %s? Dit is niet aan te raden."
+
+#: ../src/gtk-ui/sync-ui.c:423
+#: ../src/gtk-ui/sync-ui.c:454
 msgid "Yes, delete and replace"
 msgstr "Ja, verwijder en vervang"
 
-#: ../src/gtk-ui/sync-ui.c:749
-msgid "No sources are enabled, not syncing"
-msgstr "Geen bronnen zijn actief, synchronisatie niet gestart"
+#: ../src/gtk-ui/sync-ui.c:423
+#: ../src/gtk-ui/sync-ui.c:454
+#: ../src/gtk-ui/sync-ui.c:1566
+msgid "No"
+msgstr "Nee"
 
-#: ../src/gtk-ui/sync-ui.c:766
-msgid "A sync is already in progress"
-msgstr "Synchronisatie is al bezig"
+#. TRANSLATORS: confirmation dialog for refresh-from-client. Placeholder
+#. * is service/device name
+#: ../src/gtk-ui/sync-ui.c:449
+#, c-format
+msgid "Do you want to delete all data in %s and replace it with your local data? This is not usually advised."
+msgstr "Wil je alle data in %s verwijderen en vervangen met lokale data? Dit is niet aan te raden."
 
-#: ../src/gtk-ui/sync-ui.c:768
-msgid "Failed to start sync"
-msgstr "Fout bij opstarten synchronisatie"
+#: ../src/gtk-ui/sync-ui.c:481
+msgid "Trying to cancel sync"
+msgstr "Proberen syncrhonisatie af te breken"
 
-#: ../src/gtk-ui/sync-ui.c:773
-msgid "Starting sync"
-msgstr "Synchronisatie wordt gestart"
+#: ../src/gtk-ui/sync-ui.c:521
+msgid "No service or device selected"
+msgstr "Geen service of apparaat geselecteerd"
 
-#: ../src/gtk-ui/sync-ui.c:798
-msgid "Last synced just seconds ago"
-msgstr "Laatst gesynchroniseert enkele seconden geleden"
+#. TRANSLATORS: This is the title on main view. Placeholder is
+#. * the service name. Example: "Google - synced just now"
+#: ../src/gtk-ui/sync-ui.c:529
+#, c-format
+msgid "%s - synced just now"
+msgstr "%s - just klaar met synchroniseren"
 
-#: ../src/gtk-ui/sync-ui.c:801
-msgid "Last synced a minute ago"
-msgstr "Laatst gesynchroniseert een minuut geleden"
+#: ../src/gtk-ui/sync-ui.c:533
+#, c-format
+msgid "%s - synced a minute ago"
+msgstr "%s - een minuut geleden gesynchroniseerd"
 
-#: ../src/gtk-ui/sync-ui.c:804
+#: ../src/gtk-ui/sync-ui.c:537
 #, c-format
-msgid "Last synced %ld minutes ago"
-msgstr "Laatst gesynchroniseert %ld minuten geleden"
+msgid "%s - synced %ld minutes ago"
+msgstr "%s - %ld minuten geleden gesynchroniseerd"
 
-#: ../src/gtk-ui/sync-ui.c:807
-msgid "Last synced an hour ago"
-msgstr "Laatst gesynchroniseert een uur geleden"
+#: ../src/gtk-ui/sync-ui.c:542
+#, c-format
+msgid "%s - synced an hour ago"
+msgstr "%s - een uur geleden gesynchroniseerd"
 
-#: ../src/gtk-ui/sync-ui.c:810
+#: ../src/gtk-ui/sync-ui.c:546
 #, c-format
-msgid "Last synced %ld hours ago"
-msgstr "Laatst gesynchroniseert %ld uren geleden"
+msgid "%s - synced %ld hours ago"
+msgstr "%s - %ld  uren geleden gesynchroniseerd"
 
-#: ../src/gtk-ui/sync-ui.c:813
-msgid "Last synced a day ago"
-msgstr "Laatst gesynchroniseert een dag geleden"
+#: ../src/gtk-ui/sync-ui.c:551
+#, c-format
+msgid "%s - synced a day ago"
+msgstr "%s - een dag geleden gesynchroniseerd"
 
-#: ../src/gtk-ui/sync-ui.c:816
+#: ../src/gtk-ui/sync-ui.c:555
 #, c-format
-msgid "Last synced %ld days ago"
-msgstr "Laatst gesynchroniseert %ld dagen geleden"
+msgid "%s - synced %ld days ago"
+msgstr "%s - %ld dagen geleden gesynchroniseerd"
+
+#. TRANSLATORS: Action button in info bar in main view. Shown with e.g.
+#. * "You've just restored a backup. The changes have not been "
+#. * "synced with %s yet"
+#: ../src/gtk-ui/sync-ui.c:604
+#: ../src/gtk-ui/sync-ui.c:719
+msgid "Sync now"
+msgstr "Synchroniseer nu"
+
+#. TRANSLATORS: Action button in info bar in main view. Shown with e.g.
+#. * "A normal sync is not possible at this time..." message.
+#. * "Other options" will open Emergency view
+#: ../src/gtk-ui/sync-ui.c:610
+#: ../src/gtk-ui/ui.glade.h:37
+msgid "Slow sync"
+msgstr "Synchronisatie"
+
+#: ../src/gtk-ui/sync-ui.c:611
+msgid "Other options..."
+msgstr "Andere opties..."
 
-#: ../src/gtk-ui/sync-ui.c:901
+#. TRANSLATORS: Action button in info bar in main view. Shown e.g.
+#. * when no service is selected. Will open configuration view
+#: ../src/gtk-ui/sync-ui.c:616
+msgid "Select sync service"
+msgstr "Selecteer synchronisatie service"
+
+#. TRANSLATORS: Action button in info bar in main view. Shown e.g.
+#. * login to service fails. Will open configuration view for this service
+#: ../src/gtk-ui/sync-ui.c:621
+msgid "Edit service settings"
+msgstr "Bewerk service instellingen"
+
+#: ../src/gtk-ui/sync-ui.c:670
+msgid "You haven't selected a sync service or device yet. Sync services let you synchronize your data between your netbook and a web service. You can also sync directly with some devices."
+msgstr "Je hebt geen synchronisatie service of apparaat geselecteerd. Synchronisatie service laten je synchroniseren tussen je netbook en een web service."
+
+#: ../src/gtk-ui/sync-ui.c:717
 msgid "Sync again"
 msgstr "Synchroniseer opnieuw"
 
-#: ../src/gtk-ui/sync-ui.c:903 ../src/gtk-ui/ui.glade.h:29
-msgid "Sync now"
-msgstr "Synchroniseer nu"
+#: ../src/gtk-ui/sync-ui.c:730
+msgid "Restoring"
+msgstr "Herstellen"
 
-#: ../src/gtk-ui/sync-ui.c:912
+#: ../src/gtk-ui/sync-ui.c:732
 msgid "Syncing"
 msgstr "Synchronisatie bezig"
 
-#: ../src/gtk-ui/sync-ui.c:918
+#. TRANSLATORS: This is for the button in main view, right side.
+#. Keep line length below ~20 characters, use two lines if needed
+#: ../src/gtk-ui/sync-ui.c:743
+#: ../src/gtk-ui/sync-ui.c:3358
 msgid "Cancel sync"
 msgstr "Synchronisatie afbreken"
 
-#. TRANSLATORS: placeholder is a source name, shown with checkboxes in main window
-#: ../src/gtk-ui/sync-ui.c:1265
+#: ../src/gtk-ui/sync-ui.c:908
+msgid "Back to sync"
+msgstr "Terug naar synchronisatie"
+
+#. TRANSLATORS: label for checkbutton/toggle in main view.
+#. * Please stick to similar length strings or break the line with
+#. * "\n" if absolutely needed
+#: ../src/gtk-ui/sync-ui.c:1209
+msgid "Automatic sync"
+msgstr "Automatische synchronisatie"
+
+#. This is the expander label in emergency view. It summarizes the
+#. * currently selected data sources. First placeholder is service/device
+#. * name, second a comma separeted list of sources.
+#. * E.g. "Affected data: Google Contacts, Appointments"
+#: ../src/gtk-ui/sync-ui.c:1480
+#, c-format
+msgid "Affected data: %s %s"
+msgstr "Betroffen gegevens: %s %s"
+
+#: ../src/gtk-ui/sync-ui.c:1485
 #, c-format
-msgid "%s (not supported by this service)"
-msgstr "%s (niet ondersteund door deze service)"
+msgid "Affected data: none"
+msgstr "Betroffen gegevens: geen"
 
-#: ../src/gtk-ui/sync-ui.c:1298
+#. TRANSLATORS: confirmation for restoring a backup. placeholder is the
+#. * backup time string defined below
+#: ../src/gtk-ui/sync-ui.c:1563
+#, c-format
+msgid "Do you want to restore the backup from %s? All changes you have made since then will be lost."
+msgstr "Wilt u de backup terugzetten van % s? Alle wijzigingen die u sindsdien hebt gemaakt gaan verloren."
+
+#: ../src/gtk-ui/sync-ui.c:1566
+msgid "Yes, restore"
+msgstr "Ja, herstellen"
+
+#. TRANSLATORS: date/time for strftime(), used in emergency view backup
+#. * label. Any time format that shows date and time is good.
+#: ../src/gtk-ui/sync-ui.c:1598
+#, c-format
+msgid "%x %X"
+msgstr "%x %X"
+
+#. TRANSLATORS: label for a backup in emergency view. Placeholder is
+#. * service or device name
+#: ../src/gtk-ui/sync-ui.c:1617
+#, c-format
+msgid "Backed up before syncing with %s"
+msgstr "Gebackupt vóór synchroniseren met %s"
+
+#: ../src/gtk-ui/sync-ui.c:1634
+msgid "Restore"
+msgstr "Herstellen"
+
+#. TRANSLATORS: this is an explanation in Emergency view.
+#. * Placeholder is a service/device name
+#: ../src/gtk-ui/sync-ui.c:1741
+#, c-format
+msgid "A normal sync with %s is not possible at this time. You can do a slow two-way sync or start from scratch. You can also restore a backup, but a slow sync or starting from scratch will still be required before normal sync is possible."
+msgstr "Een normale synchronisatie met %s is niet mogelijk op dit moment. U kunt een langzame twee-weg synchronisatie uitvoeren of weer starten vanaf het begin. U kunt ook een back-up terugzetten, maar een langzame twee-weg synchronisatie of starten vanaf het begin is nog steeds noodzakelijk voordat een normale synchronisatie mogelijk is."
+
+#: ../src/gtk-ui/sync-ui.c:1751
+#, c-format
+msgid "If something has gone horribly wrong, you can try a slow sync, start from scratch or restore from backup."
+msgstr "Als iets verschrikkelijk mis is gegaan, kunt u een langzame synchronisatie proberen, starten vanaf het begin of herstellen vanaf een backup."
+
+#. TRANSLATORS: These are a buttons in Emergency view. Placeholder is a
+#. * service/device name. Please don't use too long lines, but feel free to
+#. * use several lines.
+#: ../src/gtk-ui/sync-ui.c:1760
+#, c-format
+msgid ""
+"Delete all your local\n"
+"data and replace with\n"
+"data from %s"
+msgstr ""
+"Verwijder al uw lokale\n"
+"data en vervang het\n"
+"met data van %s"
+
+#: ../src/gtk-ui/sync-ui.c:1766
+#, c-format
+msgid ""
+"Delete all data on\n"
+"%s and replace\n"
+"with your local data"
+msgstr ""
+"Verwijder alle data op\n"
+"%s en vervang het\n"
+"met uw lokale data"
+
+#: ../src/gtk-ui/sync-ui.c:2226
+msgid "Failed to get list of supported services from SyncEvolution"
+msgstr "Fout bij het verkrijgen van ondersteunde services uit SyncEvolution"
+
+#: ../src/gtk-ui/sync-ui.c:2280
+msgid "There was a problem communicating with the sync process. Please try again later."
+msgstr "Er was een probleem met de synchronisatie communicatie. Probeer het later nog eens."
+
+#: ../src/gtk-ui/sync-ui.c:2339
+msgid "Restore failed"
+msgstr "Herstellen mislukt"
+
+#: ../src/gtk-ui/sync-ui.c:2342
+#: ../src/gtk-ui/sync-ui.c:3227
+msgid "Sync failed"
+msgstr "Synchronisatie mislukt"
+
+#: ../src/gtk-ui/sync-ui.c:2348
+msgid "Restore complete"
+msgstr "Herstellen afgerond"
+
+#: ../src/gtk-ui/sync-ui.c:2351
+msgid "Sync complete"
+msgstr "Synchronisatie afgerond"
+
+#: ../src/gtk-ui/sync-ui.c:2443
+#, c-format
+msgid "Preparing '%s'"
+msgstr "'%s' voorbereiden"
+
+#: ../src/gtk-ui/sync-ui.c:2446
+#, c-format
+msgid "Receiving '%s'"
+msgstr "'%s' ontvangen"
+
+#: ../src/gtk-ui/sync-ui.c:2449
+#, c-format
+msgid "Sending '%s'"
+msgstr "'%s' versturen"
+
+#: ../src/gtk-ui/sync-ui.c:2570
 #, c-format
 msgid "There was one remote rejection."
-msgid_plural "There were %d remote rejections."
-msgstr[0] "Er was een remote verwerping."
-msgstr[1] "Er waren %d remote verwerpingen."
+msgid_plural "There were %ld remote rejections."
+msgstr[0] "Er waren %ld externe afwijzingen."
+msgstr[1] "Er waren %ld externe verwerpingen."
 
-#: ../src/gtk-ui/sync-ui.c:1303
+#: ../src/gtk-ui/sync-ui.c:2575
 #, c-format
 msgid "There was one local rejection."
-msgid_plural "There were %d local rejections."
-msgstr[0] "Er was een lokale verwerping."
-msgstr[1] "Er waren %d lokale verwerpingen."
+msgid_plural "There were %ld local rejections."
+msgstr[0] "Er was een lokale afwijzing."
+msgstr[1] "Er waren %ld lokale afwijzingen."
 
-#: ../src/gtk-ui/sync-ui.c:1308
+#: ../src/gtk-ui/sync-ui.c:2580
 #, c-format
-msgid "There were %d local rejections and %d remote rejections."
-msgstr "Er waren %d lokale en %d externe verwerpingen"
+msgid "There were %ld local rejections and %ld remote rejections."
+msgstr "Er waren %ld lokale en %ld externe afwijzingen."
 
-#: ../src/gtk-ui/sync-ui.c:1313
+#: ../src/gtk-ui/sync-ui.c:2585
 #, c-format
 msgid "Last time: No changes."
 msgstr "Laatste keer: geen veranderingen."
 
-#: ../src/gtk-ui/sync-ui.c:1315
+#: ../src/gtk-ui/sync-ui.c:2587
 #, c-format
 msgid "Last time: Sent one change."
-msgid_plural "Last time: Sent %d changes."
-msgstr[0] "Laatste keer: %d Verandering verstuurd."
-msgstr[1] "Laatste keer: %d veranderingen verstuurd."
+msgid_plural "Last time: Sent %ld changes."
+msgstr[0] "Laatste keer: één verandering verstuurd."
+msgstr[1] "Laatste keer: %ld veranderingen verstuurd."
 
 #. This is about changes made to the local data. Not all of these
 #. changes were requested by the remote server, so "applied"
 #. is a better word than "received" (bug #5185).
-#: ../src/gtk-ui/sync-ui.c:1323
+#: ../src/gtk-ui/sync-ui.c:2595
 #, c-format
 msgid "Last time: Applied one change."
-msgid_plural "Last time: Applied %d changes."
-msgstr[0] "Laatste keer: Een verandering uitgevoerd."
-msgstr[1] "Laatste keer: %d Veranderingen uitgevoerd."
+msgid_plural "Last time: Applied %ld changes."
+msgstr[0] "Laatste keer: één verandering uitgevoerd."
+msgstr[1] "Laatste keer: %ld veranderingen uitgevoerd."
 
-#: ../src/gtk-ui/sync-ui.c:1328
+#: ../src/gtk-ui/sync-ui.c:2600
 #, c-format
-msgid "Last time: Applied %d changes and sent %d changes."
-msgstr "Laatste keer: %d wijzigingen uitgevoerd, %d verzonden"
-
-#: ../src/gtk-ui/sync-ui.c:1420
-msgid "Failed to get server configuration from SyncEvolution"
-msgstr "Fout bij inlezen server configuratie uit SyncEvolution"
+msgid "Last time: Applied %ld changes and sent %ld changes."
+msgstr "Laatste keer: %ld wijzigingen uitgevoerd, %ld verzonden."
 
-#: ../src/gtk-ui/sync-ui.c:1472
-msgid ""
-"ScheduleWorld enables you to keep your contacts, events, tasks, and notes in "
-"sync."
-msgstr ""
-"ScheduleWorld kan je contacten, gebeurtenissen, taken en notities "
-"synchroniseren."
-
-#: ../src/gtk-ui/sync-ui.c:1475
-msgid ""
-"Google Sync can backup and synchronize your Address Book with your Gmail "
-"contacts."
-msgstr ""
-"Google Sync kan je adres boek en Gmail contacten synchroniseren en er "
-"backups van maken."
-
-#. TRANSLATORS: Please include the word "demo" (or the equivalent in
-#. your language): Funambol is going to be a 90 day demo service
-#. in the future
-#: ../src/gtk-ui/sync-ui.c:1481
+#. TRANSLATORS: the placeholder is a error message (hopefully)
+#. * explaining the problem
+#: ../src/gtk-ui/sync-ui.c:2807
+#, c-format
 msgid ""
-"Backup your contacts and calendar. Sync with a singleclick, anytime, "
-"anywhere (DEMO)."
+"There was a problem with last sync:\n"
+"%s"
 msgstr ""
-"Backup je contacten en kalender. Synchroniseer met een muisklik, elk moment, "
-"overal (DEMO)."
-
-#: ../src/gtk-ui/sync-ui.c:1509
-msgid "New service"
-msgstr "Nieuwe service"
-
-#: ../src/gtk-ui/sync-ui.c:1556
-msgid "Server URL"
-msgstr "Server URL"
+"Er was een probleem met de laatste synchonisatie:\n"
+"%s"
 
-#. TRANSLATORS: placeholder is a source name in settings window
-#: ../src/gtk-ui/sync-ui.c:1578
+#: ../src/gtk-ui/sync-ui.c:2817
 #, c-format
-msgid "%s URI"
-msgstr "%s URI"
+msgid "You've just restored a backup. The changes have not been synced with %s yet"
+msgstr "Je hebt zojuist hersteld van een backup. De veranderingen zijn nog niet met %s gesynchroniseerd"
 
-#: ../src/gtk-ui/sync-ui.c:1715 ../src/gtk-ui/ui.glade.h:17
-msgid "Launch website"
-msgstr "Start website"
+#: ../src/gtk-ui/sync-ui.c:3105
+msgid "Waiting for current operation to finish..."
+msgstr "Wachten op het voltooien van de huidige operatie..."
 
-#: ../src/gtk-ui/sync-ui.c:1719
-msgid "Setup and use"
-msgstr "Configureer en gebruik"
+#. TRANSLATORS: next strings are error messages.
+#: ../src/gtk-ui/sync-ui.c:3139
+msgid "A normal sync is not possible at this time. The server suggests a slow sync, but this might not always be what you want if both ends already have data."
+msgstr "Een normale synchronisatie is niet mogelijk op dit moment."
 
-#: ../src/gtk-ui/sync-ui.c:1765
-msgid "Failed to get list of manually setup services from SyncEvolution"
-msgstr ""
-"Fout bij verkrijgen van handmatige opgezette services uit SyncEvolution"
+#: ../src/gtk-ui/sync-ui.c:3143
+msgid "The sync process died unexpectedly."
+msgstr "De synchronisatie service hing onverwachts op"
 
-#: ../src/gtk-ui/sync-ui.c:1806
-msgid "Failed to get list of supported services from SyncEvolution"
-msgstr "Fout bij het verkrijgen van ondersteunde services uit SyncEvolution"
+#: ../src/gtk-ui/sync-ui.c:3148
+msgid "Password request was not answered. You can save the password in the settings to prevent the request."
+msgstr "Wachtwoord was niet beantwoord. Je kunt het wachtwoord in de instellingen opslaan om dit probleem te voorkomen."
 
-#. TODO: this is a hack... SyncEnd should be a signal of it's own,
-#. not just hacked on top of the syncevolution error codes
-#: ../src/gtk-ui/sync-ui.c:1967
-msgid "Service configuration not found"
-msgstr "Service configuratie niet gevonden"
+#. TODO use the service device name here, this is a remote problem
+#: ../src/gtk-ui/sync-ui.c:3152
+msgid "There was a problem processing sync request. Trying again may help."
+msgstr "Er is een probleem met de synchronisatie. Opnieuw proberen kan wellicht helpen."
 
-#: ../src/gtk-ui/sync-ui.c:1973
-msgid "Not authorized"
-msgstr "Niet toegestaan"
+#: ../src/gtk-ui/sync-ui.c:3158
+msgid "Failed to login. Could there be a problem with your username or password?"
+msgstr "Inloggen Mislukt. Is er een probleem met uw gebruikersnaam of wachtwoord?"
 
-#: ../src/gtk-ui/sync-ui.c:1975
+#: ../src/gtk-ui/sync-ui.c:3161
 msgid "Forbidden"
 msgstr "Verboden"
 
-#: ../src/gtk-ui/sync-ui.c:1977
-msgid "Not found"
-msgstr "Niet gevonden"
+#. TRANSLATORS: data source means e.g. calendar or addressbook
+#: ../src/gtk-ui/sync-ui.c:3167
+msgid "A data source could not be found. Could there be a problem with the settings?"
+msgstr "De bron kon niet worden gevonden. Is er een probleem met de serverinstellingen?"
 
-#: ../src/gtk-ui/sync-ui.c:1979
-msgid "Fatal database error"
-msgstr "Fatale database fout"
+#: ../src/gtk-ui/sync-ui.c:3171
+msgid "Remote database error"
+msgstr "Service database fout"
 
-#: ../src/gtk-ui/sync-ui.c:1981
-msgid "Database error"
-msgstr "Database fout"
+#. This can happen when EDS is borked, restart it may help...
+#: ../src/gtk-ui/sync-ui.c:3174
+msgid "There is a problem with the local database. Syncing again or rebooting may help."
+msgstr "Er is een probleem met de lokale database. Opnieuw synchroniseren of herstarten kan helpen."
 
-#: ../src/gtk-ui/sync-ui.c:1983
-msgid "No space left"
-msgstr "Geen ruimte beschikbaar"
+#: ../src/gtk-ui/sync-ui.c:3177
+msgid "No space on disk"
+msgstr "Geen schijf ruimte beschikbaar"
 
-#. TODO identify problem item somehow ?
-#: ../src/gtk-ui/sync-ui.c:1986
+#: ../src/gtk-ui/sync-ui.c:3179
 msgid "Failed to process SyncML"
 msgstr "Fout bij verwerken van SyncML"
 
-#: ../src/gtk-ui/sync-ui.c:1988
+#: ../src/gtk-ui/sync-ui.c:3181
 msgid "Server authorization failed"
 msgstr "Server authorisatie mislukt"
 
-#: ../src/gtk-ui/sync-ui.c:1990
+#: ../src/gtk-ui/sync-ui.c:3183
 msgid "Failed to parse configuration file"
 msgstr "Fout bij verwerken van configuratie bestand"
 
-#: ../src/gtk-ui/sync-ui.c:1992
+#: ../src/gtk-ui/sync-ui.c:3185
 msgid "Failed to read configuration file"
 msgstr "Fout bij lezen van configuratie bestand"
 
-#: ../src/gtk-ui/sync-ui.c:1994
+#: ../src/gtk-ui/sync-ui.c:3187
 msgid "No configuration found"
 msgstr "Geen configuratie gevonden"
 
-#: ../src/gtk-ui/sync-ui.c:1996
+#: ../src/gtk-ui/sync-ui.c:3189
 msgid "No configuration file found"
 msgstr "Geen configuratie bestand gevonden"
 
-#: ../src/gtk-ui/sync-ui.c:1998
+#: ../src/gtk-ui/sync-ui.c:3191
 msgid "Server sent bad content"
 msgstr "Server verstuurde foute gegevens"
 
-#: ../src/gtk-ui/sync-ui.c:2000
-msgid "Transport failure (no connection?)"
-msgstr "Transport fout (geen verbinding?)"
-
-#: ../src/gtk-ui/sync-ui.c:2002
-msgid "Connection timed out"
-msgstr "Verbinding verlopen"
-
-#: ../src/gtk-ui/sync-ui.c:2004
+#: ../src/gtk-ui/sync-ui.c:3193
 msgid "Connection certificate has expired"
 msgstr "Verbindingscertificaat is verlopen"
 
-#: ../src/gtk-ui/sync-ui.c:2006
+#: ../src/gtk-ui/sync-ui.c:3195
 msgid "Connection certificate is invalid"
 msgstr "Verbindingscertificaat is ongeldig"
 
-#: ../src/gtk-ui/sync-ui.c:2009
-msgid "Connection failed"
-msgstr "Verbindingsfout"
+#: ../src/gtk-ui/sync-ui.c:3203
+msgid "We were unable to connect to the server. The problem could be temporary or there could be something wrong with the settings."
+msgstr "We waren niet in staat om verbinding te maken met de server. Het probleem kan tijdelijk zijn of er kan iets mis zijn met de serverinstellingen."
 
-#: ../src/gtk-ui/sync-ui.c:2011
-msgid "URL is bad"
-msgstr "URL is niet geldig"
+#: ../src/gtk-ui/sync-ui.c:3210
+msgid "The server URL is bad"
+msgstr "De server URL is niet geldig"
 
-#: ../src/gtk-ui/sync-ui.c:2013
-msgid "Server not found"
+#: ../src/gtk-ui/sync-ui.c:3215
+msgid "The server was not found"
 msgstr "Server niet gevonden"
 
-#: ../src/gtk-ui/sync-ui.c:2015
+#: ../src/gtk-ui/sync-ui.c:3217
 #, c-format
 msgid "Error %d"
 msgstr "Fout %d"
 
-#: ../src/gtk-ui/sync-ui.c:2025
-msgid "Sync D-Bus service exited unexpectedly"
-msgstr "Synchronisatie D-Bus service hing onverwachts op"
+#. TRANSLATORS: password request dialog contents: title, cancel button
+#. * and ok button
+#: ../src/gtk-ui/sync-ui.c:3355
+msgid "Password is required for sync"
+msgstr "Een wachtwoord is vereist voor synchronisatie"
 
-#: ../src/gtk-ui/sync-ui.c:2028 ../src/gtk-ui/sync-ui.c:2079
-msgid "Sync Failed"
-msgstr "Synchronisatie mislukt"
-
-#: ../src/gtk-ui/sync-ui.c:2071
-msgid "Sync complete"
-msgstr "Synchronisatie afgerond"
-
-#: ../src/gtk-ui/sync-ui.c:2076
-msgid "Sync canceled"
-msgstr "Synchronisatie afgebroken"
+#: ../src/gtk-ui/sync-ui.c:3359
+msgid "Sync with password"
+msgstr "Synchroniseer met een wachtwoord"
 
-#. NOTE extra1 can be error here
-#: ../src/gtk-ui/sync-ui.c:2094
-msgid "Ending sync"
-msgstr "Beindigen synchronisatie"
-
-#. TRANSLATORS: placeholder is a source name (e.g. 'Calendar') in a progress text
-#: ../src/gtk-ui/sync-ui.c:2118
+#. TRANSLATORS: password request dialog message, placeholder is service name
+#: ../src/gtk-ui/sync-ui.c:3369
 #, c-format
-msgid "Preparing '%s'"
-msgstr "'%s' voorbereiden"
-
-#. TRANSLATORS: placeholder is a source name in a progress text
-#: ../src/gtk-ui/sync-ui.c:2130
-#, c-format
-msgid "Sending '%s'"
-msgstr "'%s' versturen"
-
-#. TRANSLATORS: placeholder is a source name in a progress text
-#: ../src/gtk-ui/sync-ui.c:2142
-#, c-format
-msgid "Receiving '%s'"
-msgstr "'%s' ontvangen"
-
-#: ../src/gtk-ui/ui.glade.h:1
-msgid "<b>Data</b>"
-msgstr "<b>Gegevens</b>"
+msgid "Please enter password for syncing with %s:"
+msgstr "Voer een wachtwoord in voor synchroniseren met %s:"
 
+#. title for the buttons on the right side of main view
 #: ../src/gtk-ui/ui.glade.h:2
-msgid "<b>No sync service in use</b>"
-msgstr "<b>Geen synchronisatie service in gebruik</b>"
-
-#: ../src/gtk-ui/ui.glade.h:3
-msgid "<b>Sync failure</b>"
-msgstr "<b>Synchronisatie mislukt</b>"
+msgid "<b>Actions</b>"
+msgstr "<b>Acties</b>"
 
+#. text between the two "start from scratch" buttons in emergency view
 #: ../src/gtk-ui/ui.glade.h:4
-msgid "<b>Type of Sync</b>"
-msgstr "<b>Type synchronisatie</b>"
+msgid "<b>or</b>"
+msgstr "<b>of</b>"
 
 #: ../src/gtk-ui/ui.glade.h:5
-msgid "<big>Manual setup</big>"
-msgstr "<big>Handleiding opzetten</big>"
+msgid "<big>Direct sync</big>"
+msgstr "<big>Direct synchroniseren</big>"
 
 #: ../src/gtk-ui/ui.glade.h:6
-msgid "<big>Supported services</big>"
-msgstr "<big>Ondersteunde services</big>"
-
-#: ../src/gtk-ui/ui.glade.h:7
-msgid "Add new service"
-msgstr "Voeg nieuwe service toe"
+msgid "<big>Network sync</big>"
+msgstr "<b>Netwerk synchronisatie</b>"
 
+#. a title in emergency view
 #: ../src/gtk-ui/ui.glade.h:8
-msgid "Back to sync"
-msgstr "Terug naar synchronisatie"
-
-#: ../src/gtk-ui/ui.glade.h:9
-msgid ""
-"Change sync\n"
-"service"
-msgstr ""
-"Wijzig synchronisatie\n"
-"service"
+msgid "<big>Restore from backup</big>"
+msgstr "<big>Herstel vanaf backup</big>"
 
-#: ../src/gtk-ui/ui.glade.h:11
-msgid "Delete all local data and replace it with remote data"
-msgstr "Verwijder alle lokale data en vervang het met externe data"
+#. a title in emergency view
+#: ../src/gtk-ui/ui.glade.h:10
+msgid "<big>Slow sync</big>"
+msgstr "<big>Langzame synchronisatie</big>"
 
+#. a title in emergency view
 #: ../src/gtk-ui/ui.glade.h:12
-msgid "Delete all remote data and replace it with local data"
-msgstr "Verwijder alle externe data en vervang het met lokale data"
+msgid "<big>Start from scratch</big>"
+msgstr "<big>Starten vanaf het begin</big>"
 
 #: ../src/gtk-ui/ui.glade.h:13
-msgid "Delete this service"
-msgstr "Verwijder deze service"
-
-#: ../src/gtk-ui/ui.glade.h:14
-msgid "Edit service settings"
-msgstr "Bewerk service instellingen"
-
-#: ../src/gtk-ui/ui.glade.h:15
 msgid ""
-"If you don't see your service above but know that your sync provider uses "
-"SyncML\n"
-"you can setup a service manually."
+"A slow sync compares items from both sides and tries to merge them. \n"
+"This may fail in some cases, leading to duplicates or lost information."
 msgstr ""
-"Als je niet hierboven je service ziet maar je weet dat je service provider "
-"SyncML gebruikt,\n"
-"kun je handmatig een service opzetten."
+"Een langzame synchronisatie vergelijkt items van beide kanten en\n"
+"probeert ze samen te voegen. Soms mislukt dit, en dit kan leiden tot\n"
+"duplicaten of verloren gegevens."
 
+#: ../src/gtk-ui/ui.glade.h:15
+msgid "Add new device"
+msgstr "Nieuw apparaat toevoegen"
+
+#: ../src/gtk-ui/ui.glade.h:16
+msgid "Add new service"
+msgstr "Voeg nieuwe service toe"
+
+#. explanation of "Restore backup" function
 #: ../src/gtk-ui/ui.glade.h:18
-msgid "Merge local and remote data (recommended)"
-msgstr "Voeg lokale en externe data samen (aanbevolen)"
+msgid "Backups are made before every time we Sync. Choose a backup to restore. Any changes you have made since then will be lost."
+msgstr "Backups worden gemaakt vóór elke synchronisatie. Kies een backup om te herstellen. Eventuele wijzigingen die u hebt gemaakt sindsdien zullen verloren gaan."
 
 #: ../src/gtk-ui/ui.glade.h:19
-msgid "Password"
-msgstr "Wachtwoord"
-
-#: ../src/gtk-ui/ui.glade.h:20
-msgid "Reset original server settings"
-msgstr "Herstel originele server installingen"
+msgid "Calendar"
+msgstr "Kalender"
 
+#. Button in main view, right side. Keep to below 20 chars per line, feel free to use two lines
 #: ../src/gtk-ui/ui.glade.h:21
-msgid "Save and use this service"
-msgstr "Bewaar en gebruik deze service"
-
-#: ../src/gtk-ui/ui.glade.h:22
-msgid "Select sync service"
-msgstr "Selecteer synchronisatie service"
-
-#: ../src/gtk-ui/ui.glade.h:23
-msgid "Server settings"
-msgstr "Server installingen"
+msgid ""
+"Change or edit\n"
+"sync service"
+msgstr ""
+"Wijzig of bewerk\n"
+"synchronisatie\n"
+"service"
 
+#. close button for settings window
 #: ../src/gtk-ui/ui.glade.h:24
-msgid "Service name"
-msgstr "Service naam"
+msgid "Close"
+msgstr "Sluiten"
 
 #: ../src/gtk-ui/ui.glade.h:25
 msgid ""
-"Sorry, you need an internet\n"
-"connection to sync."
+"Delete all data on Zyb \n"
+"and replace with your\n"
+"local information"
 msgstr ""
-"Sorry, je hebt een internet\n"
-"verbinding nodig on te synchroniseren."
+"Verwijder alle data op\n"
+"Zyb en vervang het\n"
+"met lokale data"
 
-#: ../src/gtk-ui/ui.glade.h:27
-msgid "Stop using this service"
-msgstr "Stop deze service te gebruiken"
+#: ../src/gtk-ui/ui.glade.h:28
+msgid ""
+"Delete all your local\n"
+"information and replace\n"
+"with data from Zyb"
+msgstr ""
+"Verwijder alle lokale\n"
+"data en vervang het\n"
+"met data van Zyb"
 
-#: ../src/gtk-ui/ui.glade.h:30
+#. button in main view, right side. Keep length to 20 characters or so, use two lines if needed
+#: ../src/gtk-ui/ui.glade.h:32
 msgid ""
-"Synchronization is not available (D-Bus service does not answer), sorry."
+"Fix a sync\n"
+"emergency"
 msgstr ""
-"Synchronisatie is niet beschikbaar (D-Bus service niet beschikbaar), sorry."
+"Los een synchroni-\n"
+"satie noodgeval op"
 
-#: ../src/gtk-ui/ui.glade.h:31
+#: ../src/gtk-ui/ui.glade.h:34
 msgid ""
-"To sync you'll need a network connection and an account with a sync "
-"service.\n"
-"We support the following services: "
+"If you don't see your service above but know that your sync provider uses SyncML\n"
+"you can setup a service manually."
 msgstr ""
-"Om te synchroniseren moet je een netwerkverbinding hebben en een account met "
-"een\n"
-"synchronisatie service. De volgende services zijn ondersteund:"
+"Als je niet hierboven je service ziet maar je weet dat je service provider SyncML gebruikt,\n"
+"kun je handmatig een service opzetten."
 
-#: ../src/gtk-ui/ui.glade.h:33
-msgid "Username"
-msgstr "gebruikersnaam"
+#: ../src/gtk-ui/ui.glade.h:36
+msgid "Settings"
+msgstr "Instellingen"
 
-#: ../src/gtk-ui/ui.glade.h:34
+#: ../src/gtk-ui/ui.glade.h:39
+msgid "Sync Emergency"
+msgstr "Synchronisatie noodgeval"
+
+#: ../src/gtk-ui/ui.glade.h:41
 msgid ""
-"You haven't selected a sync service yet. Sync services let you \n"
-"synchronize your data between your netbook and a web service."
+"To sync you'll need a network connection and an account with a sync service.\n"
+"We support the following services: "
 msgstr ""
-"Je hebt geen synchronisatie service geselecteerd. Zulke services laten je\n"
-"synchroniseren tussen je netbook en een web service."
+"Om te synchroniseren moet je een netwerkverbinding hebben en een account met een\n"
+"synchronisatie service. De volgende services zijn ondersteund:"
+
+#: ../src/gtk-ui/ui.glade.h:43
+msgid "Use Bluetooth to Sync your data from one device to another."
+msgstr "Gebruik Bluetooth voor het synchroniseren van gegevens van het ene apparaat naar het andere."
+
+#: ../src/gtk-ui/ui.glade.h:44
+msgid "You will need to add Bluetooth devices before they can be synced."
+msgstr "U moet Bluetooth-apparaten toevoegen voordat ze kunnen worden gesynchroniseerd."
 
-#: ../src/gtk-ui/sync.desktop.in.h:2 ../src/gtk-ui/sync-gtk.desktop.in.h:2
+#: ../src/gtk-ui/sync.desktop.in.h:2
+#: ../src/gtk-ui/sync-gtk.desktop.in.h:2
 msgid "Up to date"
 msgstr "Niet veroudert"
 
 #: ../src/gtk-ui/sync-gtk.desktop.in.h:1
 msgid "Sync (GTK)"
 msgstr "Sync (GTK)"
+
+#: ../src/gtk-ui/sync-config-widget.c:74
+msgid "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in sync."
+msgstr "ScheduleWorld kan je contacten, gebeurtenissen, taken en notities synchroniseren."
+
+#: ../src/gtk-ui/sync-config-widget.c:77
+msgid "Google Sync can backup and synchronize your contacts with your Gmail contacts."
+msgstr "Google Sync kan je adresboek en Gmail contacten synchroniseren en er backups van maken."
+
+#. TRANSLATORS: Please include the word "demo" (or the equivalent in
+#. your language): Funambol is going to be a 90 day demo service
+#. in the future
+#: ../src/gtk-ui/sync-config-widget.c:83
+msgid "Backup your contacts and calendar. Sync with a single click, anytime, anywhere (DEMO)."
+msgstr "Backup je adresboek en kalender. Synchroniseer met een muisklik, elk moment, overal (DEMO)."
+
+#: ../src/gtk-ui/sync-config-widget.c:86
+msgid "Mobical Backup and Restore service allows you to securely backup your personal mobile data for free."
+msgstr "Met Mobical Backup and Herstel service kunt u uw persoonlijke mobiele data veilig en gratis backuppen."
+
+#: ../src/gtk-ui/sync-config-widget.c:89
+msgid "ZYB is a simple way for people to store and share mobile information online."
+msgstr "Met ZYB kan men eenvoudige mobiele informatie online opslaan en delen."
+
+#: ../src/gtk-ui/sync-config-widget.c:92
+msgid "Memotoo lets you access your personal data from any computer connected to the Internet."
+msgstr "Met Memotoo kunt u toegang krijgen tot uw persoonlijke gegevens vanaf elke computer die aangesloten is op het internet."
+
+#: ../src/gtk-ui/sync-config-widget.c:188
+msgid "Sorry, failed to save the configuration"
+msgstr "Fout bij het opslaan van het configuratie bestand"
+
+#: ../src/gtk-ui/sync-config-widget.c:377
+msgid "Service must have a name and server URL"
+msgstr "Service moet een naam en server URL hebben"
+
+#: ../src/gtk-ui/sync-config-widget.c:418
+#, c-format
+msgid "Do you want to reset the settings for %s? This will not remove any synced information on either end."
+msgstr "Wilt u de instellingen voor %s resetten? Data dat al gesynchroniseerde is zal niet worden verwijderd."
+
+#. TRANSLATORS: buttons in reset-service warning dialog
+#: ../src/gtk-ui/sync-config-widget.c:422
+msgid "Yes, reset"
+msgstr "Ja, reset"
+
+#: ../src/gtk-ui/sync-config-widget.c:423
+#: ../src/gtk-ui/sync-config-widget.c:434
+msgid "No, keep settings"
+msgstr "Nee, behoud de instellingen"
+
+#: ../src/gtk-ui/sync-config-widget.c:428
+#, c-format
+msgid "Do you want to delete the settings for %s? This will not remove any synced information on either end but it will remove these settings."
+msgstr "Wilt u de instellingen voor %s verwijderen? Data dat al gesynchroniseerde is zal niet worden verwijderd, alleen deze service configuratie zal worden verwijdert."
+
+#. TRANSLATORS: buttons in delete-service warning dialog
+#: ../src/gtk-ui/sync-config-widget.c:433
+msgid "Yes, delete"
+msgstr "Ja, verwijderen"
+
+#: ../src/gtk-ui/sync-config-widget.c:463
+msgid "Reset settings"
+msgstr "Instellingen wissen"
+
+#: ../src/gtk-ui/sync-config-widget.c:466
+msgid "Delete settings"
+msgstr "Verwijder instellingen"
+
+#: ../src/gtk-ui/sync-config-widget.c:476
+msgid "Save and use"
+msgstr "Opslaan en gebruik"
+
+#: ../src/gtk-ui/sync-config-widget.c:479
+msgid ""
+"Save and replace\n"
+"current service"
+msgstr ""
+"Opslaan en vervang\n"
+"de huidige service"
+
+#: ../src/gtk-ui/sync-config-widget.c:489
+msgid "Stop using device"
+msgstr "Stop apparaat gebruik"
+
+#: ../src/gtk-ui/sync-config-widget.c:492
+msgid "Stop using service"
+msgstr "Stop service gebruik"
+
+#. TRANSLATORS: label for an entry in service configuration form.
+#. * Placeholder is a source  name.
+#. * Example: "Appointments URI"
+#: ../src/gtk-ui/sync-config-widget.c:675
+#, c-format
+msgid "%s URI"
+msgstr "%s URI"
+
+#. TRANSLATORS: toggles in service configuration form, placeholder is service
+#. * or device name
+#: ../src/gtk-ui/sync-config-widget.c:850
+#, c-format
+msgid "Send changes to %s"
+msgstr "Stuur wijzigingen naar '%s'"
+
+#: ../src/gtk-ui/sync-config-widget.c:855
+#, c-format
+msgid "Receive changes from %s"
+msgstr "Ontvang veranderingen van %s"
+
+#: ../src/gtk-ui/sync-config-widget.c:871
+msgid "<b>Sync</b>"
+msgstr "<b>Synchronisatie</b>"
+
+#. TRANSLATORS: label of a entry in service configuration
+#: ../src/gtk-ui/sync-config-widget.c:887
+msgid "Server address"
+msgstr "Server adres"
+
+#. TRANSLATORS: explanation before a device template combobox.
+#. * Placeholder is a device name like 'Nokia N85' or 'Syncevolution
+#. * Client'
+#: ../src/gtk-ui/sync-config-widget.c:963
+#, c-format
+msgid "This device looks like it might be a '%s'. If this is not correct, please take a look at the list of supported devices and pick yours if it is listed"
+msgstr "Dit apparaat ziet eruit als een '%s'. Als dit niet correct is, kijk dan in de lijst met ondersteunde apparaten en kies de juiste."
+
+#: ../src/gtk-ui/sync-config-widget.c:969
+msgid "We don't know what this device is exactly. Please take a look at the list of supported devices and pick yours if it is listed"
+msgstr "We kunnen niet zien wat voor apparaat dit is. Kijk naar de lijst van ondersteunde apparaten en kies de juiste."
+
+#: ../src/gtk-ui/sync-config-widget.c:1122
+#, c-format
+msgid "%s - Bluetooth device"
+msgstr "%s - Bluetooth-apparaat"
+
+#. TRANSLATORS: service title for services that are not based on a
+#. * template in service list, the placeholder is the name of the service
+#: ../src/gtk-ui/sync-config-widget.c:1128
+#, c-format
+msgid "%s - manually setup"
+msgstr "%s - handmatig instellen"
+
+#. TRANSLATORS: link button in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1803
+msgid "Launch website"
+msgstr "Start website"
+
+#. TRANSLATORS: button in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1812
+msgid "Setup now"
+msgstr "Nu instellen"
+
+#. TRANSLATORS: labels of entries in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1908
+msgid "Username"
+msgstr "gebruikersnaam"
+
+#: ../src/gtk-ui/sync-config-widget.c:1923
+msgid "Password"
+msgstr "Wachtwoord"
+
+#. TRANSLATORS: warning in service configuration form for people
+#. who have modified the configuration via other means.
+#: ../src/gtk-ui/sync-config-widget.c:1946
+msgid "Current configuration is more complex than what can be shown here. Changes to sync mode or synced data types will overwrite that configuration."
+msgstr "De huidige configuratie is complexer dan wat hier kan worden weergegeven. Wijzigingen aan de synchronisatie modus of aan de gesynchroniseerd data types overschrijft de configuratie."
+
+#. TRANSLATORS: this is the epander label for server settings
+#. in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1965
+msgid "Hide server settings"
+msgstr "Server instellingen verbergen"
+
+#. TRANSLATORS: this is the epander label for server settings
+#. in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1985
+msgid "Show server settings"
+msgstr "Server instellingen weergeven"
+
+#: ../src/gnome-bluetooth/syncevolution.c:110
+msgid "Sync in the Sync application"
+msgstr "Synchroniseer in de synchronisatie toepassing"
+
+#: ../src/syncevo-dbus-server.cpp:5622
+#, c-format
+msgid "%s is syncing"
+msgstr "%s synchronisatie bezig"
+
+#: ../src/syncevo-dbus-server.cpp:5623
+#, c-format
+msgid "We have just started to sync your computer with the %s sync service."
+msgstr "We hebben de synchronisatie met service %s en je computer gestart."
+
+#. if sync is successfully started and done
+#: ../src/syncevo-dbus-server.cpp:5637
+#, c-format
+msgid "%s sync complete"
+msgstr "%s synchronisatie afgerond"
+
+#: ../src/syncevo-dbus-server.cpp:5638
+#, c-format
+msgid "We have just finished syncing your computer with the %s sync service."
+msgstr "Synchronisatie met service %s en je computer is voltooid."
+
+#. if sync is successfully started and has errors, or not started successful with a fatal problem
+#: ../src/syncevo-dbus-server.cpp:5643
+msgid "Sync problem."
+msgstr "Synchronisatie probleem."
+
+#: ../src/syncevo-dbus-server.cpp:5644
+msgid "Sorry, there's a problem with your sync that you need to attend to."
+msgstr "Sorry, er is een probleem met de synchronisatie dat naar ingekeken moet worden."
+
+#: ../src/syncevo-dbus-server.cpp:5717
+msgid "View"
+msgstr "Bekijk"
+
+#: ../src/syncevo-dbus-server.cpp:5718
+msgid "Dismiss"
+msgstr "Gezien"
+
+#~ msgid "Database error"
+#~ msgstr "Database fout"
+
+#~ msgid ""
+#~ "Do you want to replace %s with %s? This will not remove any synced "
+#~ "information on either end but you will no longer be able to sync with %s."
+#~ msgstr ""
+#~ "Wilt u %s met %s vervangen? Data dat al gesynchroniseerde is zal niet "
+#~ "worden verwijdert, maar u zal niet langer in staat zijn om met %s te "
+#~ "synchroniseren."
+
+#~ msgid "Yes, use %s"
+#~ msgstr "Ja, gebruik %s"
+
+#~ msgid "No, use %s"
+#~ msgstr "Nee, gebruik %s"
+
+#~ msgid "Reset service"
+#~ msgstr "Reset service"
+
+#~ msgid "Addressbook"
+#~ msgstr "Adresboek"
+
+#~ msgid "Todo"
+#~ msgstr "Te doen"
+
+#~ msgid "Memo"
+#~ msgstr "Memo"
+
+#~ msgid "Failed to save current service in GConf configuration system"
+#~ msgstr "Fout bij wegschrijven huidige service in GConf configuratie systeem"
+
+#~ msgid "Failed to save service configuration to SyncEvolution"
+#~ msgstr "Fout bij wegschrijven service configuratie naar SyncEvolution"
+
+#~ msgid "Failed to get service configuration from SyncEvolution"
+#~ msgstr "Fout bij inlezen service configuratie uit SyncEvolution"
+
+#~ msgid "Failed to remove service configuration from SyncEvolution"
+#~ msgstr "Fout bij verwijderen service configuratie uit SyncEvolution"
+
+#~ msgid "Failed to cancel: sync was no longer in progress"
+#~ msgstr "Afbreken mislukt: syncrhonisatie was niet langer bezig"
+
+#~ msgid "Failed to cancel sync"
+#~ msgstr "Afbreken synchronisatie mislukt"
+
+#~ msgid "Canceling sync"
+#~ msgstr "Afbreken synchronisatie"
+
+#~ msgid "No sources are enabled, not syncing"
+#~ msgstr "Geen bronnen zijn actief, synchronisatie niet gestart"
+
+#~ msgid "A sync is already in progress"
+#~ msgstr "Synchronisatie is al bezig"
+
+#~ msgid "Failed to start sync"
+#~ msgstr "Fout bij opstarten synchronisatie"
+
+#~ msgid "%s (not supported by this service)"
+#~ msgstr "%s (niet ondersteund door deze service)"
+
+#~ msgid "Failed to get server configuration from SyncEvolution"
+#~ msgstr "Fout bij inlezen server configuratie uit SyncEvolution"
+
+#~ msgid "Server URL"
+#~ msgstr "Server URL"
+
+#~ msgid "Failed to get list of manually setup services from SyncEvolution"
+#~ msgstr ""
+#~ "Fout bij verkrijgen van handmatige opgezette services uit SyncEvolution"
+
+#~ msgid "Service configuration not found"
+#~ msgstr "Service configuratie niet gevonden"
+
+#~ msgid "Not authorized"
+#~ msgstr "Niet toegestaan"
+
+#~ msgid "Not found"
+#~ msgstr "Niet gevonden"
+
+#~ msgid "Transport failure (no connection?)"
+#~ msgstr "Transport fout (geen verbinding?)"
+
+#~ msgid "Connection timed out"
+#~ msgstr "Verbinding verlopen"
+
+#~ msgid "Sync canceled"
+#~ msgstr "Synchronisatie afgebroken"
+
+#~ msgid "Ending sync"
+#~ msgstr "Beindigen synchronisatie"
+
+#~ msgid "<b>No sync service in use</b>"
+#~ msgstr "<b>Geen synchronisatie service in gebruik</b>"
+
+#~ msgid "<big>Manual setup</big>"
+#~ msgstr "<big>Handleiding opzetten</big>"
+
+#~ msgid "Merge local and remote data (recommended)"
+#~ msgstr "Voeg lokale en externe data samen (aanbevolen)"
+
+#~ msgid "Reset original server settings"
+#~ msgstr "Herstel originele server installingen"
+
+#~ msgid "Service name"
+#~ msgstr "Service naam"
+
+#~ msgid ""
+#~ "Sorry, you need an internet\n"
+#~ "connection to sync."
+#~ msgstr ""
+#~ "Sorry, je hebt een internet\n"
+#~ "verbinding nodig on te synchroniseren."
+
+#~ msgid ""
+#~ "Synchronization is not available (D-Bus service does not answer), sorry."
+#~ msgstr ""
+#~ "Synchronisatie is niet beschikbaar (D-Bus service niet beschikbaar), "
+#~ "sorry."
index e82e49a..4d05c81 100644 (file)
--- a/po/pl.po
+++ b/po/pl.po
 # This file is distributed under the same license as the syncevolution package.
 # Andrzej Zaborowski <andrew.zaborowski@intel.com>, 2009.
 #
-#: ../src/gtk-ui/sync-ui.c:764
 msgid ""
 msgstr ""
 "Project-Id-Version: Moblin\n"
 "Report-Msgid-Bugs-To: http://moblin.org/projects/syncevolution\n"
-"POT-Creation-Date: 2009-10-01 19:27+0000\n"
+"POT-Creation-Date: 2010-04-05 09:22+0000\n"
 "PO-Revision-Date: \n"
-"Last-Translator: Michał Sawicz <michal@sawicz.net>\n"
+"Last-Translator: Romuald Pawlikowski <r.pawlikowski@gmail.com>\n"
 "Language-Team: Moblin\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
-"|| n%100>=20) ? 1 : 2);\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
 "X-Poedit-Language: Polish\n"
 "X-Poedit-SourceCharset: utf-8\n"
 "X-Poedit-Bookmarks: -1,37,-1,-1,-1,-1,-1,-1,-1,-1\n"
 
 #. TRANSLATORS: this is the application name that may be used by e.g.
 #. the windowmanager
-#: ../src/gtk-ui/main.c:31 ../src/gtk-ui/ui.glade.h:28
+#: ../src/gtk-ui/main.c:40
+#: ../src/gtk-ui/ui.glade.h:38
 #: ../src/gtk-ui/sync.desktop.in.h:1
+#: ../src/gnome-bluetooth/syncevolution.c:112
 msgid "Sync"
 msgstr "Synchronizuj"
 
-#: ../src/gtk-ui/sync-ui.c:259
-msgid "Addressbook"
-msgstr "Książka adresowa"
+#: ../src/gtk-ui/sync-ui.c:260
+msgid "Contacts"
+msgstr "Kontakty"
 
-#: ../src/gtk-ui/sync-ui.c:261
-msgid "Calendar"
-msgstr "Kalendarz"
-
-# <to do>
-#: ../src/gtk-ui/sync-ui.c:263
-msgid "Todo"
-msgstr "Do zrobiena"
-
-# Note
-#: ../src/gtk-ui/sync-ui.c:265
-msgid "Memo"
-msgstr "Notatka"
-
-# Error while saving the current service into the configuration system GConf
-#: ../src/gtk-ui/sync-ui.c:320
-msgid "Failed to save current service in GConf configuration system"
-msgstr "Błąd przy zapisie aktualnej usługi w systemie konfiguracji GConf"
-
-# Error while saving the configuration of the service in SyncEvolution
-#: ../src/gtk-ui/sync-ui.c:331
-msgid "Failed to save service configuration to SyncEvolution"
-msgstr "Błąd przy zapisie konfiguracji usługi w SyncEvolution"
-
-# Error while saving the current service into the configuration system GConf
-#: ../src/gtk-ui/sync-ui.c:416
-msgid "Failed to get service configuration from SyncEvolution"
-msgstr "Błąd przy pobieraniu konfiguracji usługi z SynEvolution"
-
-# Error while deleting the configuration of the service from SyncEvolution
-#: ../src/gtk-ui/sync-ui.c:479
-msgid "Failed to remove service configuration from SyncEvolution"
-msgstr "Błąd przy usuwaniu konfiguracji usługi z SynEvolution"
-
-#: ../src/gtk-ui/sync-ui.c:599
-msgid "Service must have a name and server URL"
-msgstr "Usługa musi mieć nazwę i URL serwera"
+#: ../src/gtk-ui/sync-ui.c:262
+msgid "Appointments"
+msgstr "Spotkania"
 
-#. sync is no longer in progress for some reason
-#: ../src/gtk-ui/sync-ui.c:675
-msgid "Failed to cancel: sync was no longer in progress"
-msgstr "Błąd przy anulowaniu: synchronizacja już się zakończyła"
+#: ../src/gtk-ui/sync-ui.c:264
+#: ../src/gtk-ui/ui.glade.h:40
+msgid "Tasks"
+msgstr "Zadania"
 
-# Error during the cancellation of the synchronization
-#: ../src/gtk-ui/sync-ui.c:679
-msgid "Failed to cancel sync"
-msgstr "Błąd przy anulowaniu synchronizacji"
+#: ../src/gtk-ui/sync-ui.c:266
+msgid "Notes"
+msgstr "Notatki"
 
-# The synchronization is being cancelled
-#: ../src/gtk-ui/sync-ui.c:683
-msgid "Canceling sync"
-msgstr "Anulowanie synchronizacji"
+#. TRANSLATORS: This is a "combination source" for syncing with devices
+#. * that combine appointments and tasks. the name should match the ones
+#. * used for calendar and todo above
+#: ../src/gtk-ui/sync-ui.c:271
+msgid "Appointments & Tasks"
+msgstr "Spotkania i zadania"
 
-# We are trying  to cancel the synchronization
-#: ../src/gtk-ui/sync-ui.c:697
-msgid "Trying to cancel sync"
-msgstr "Trwa próba anulowania synchronizacji"
+#: ../src/gtk-ui/sync-ui.c:343
+msgid "Starting sync"
+msgstr "Rozpoczynanie synchronizacji"
 
-#: ../src/gtk-ui/sync-ui.c:704
+#. TRANSLATORS: slow sync confirmation dialog message. Placeholder
+#. * is service/device name
+#: ../src/gtk-ui/sync-ui.c:381
 #, c-format
-msgid ""
-"Do you want to delete all local data and replace it with data from %s? This "
-"is not usually advised."
-msgstr ""
-"Czy chcesz usunąć wszystkie lokalne dane i zastąpić je danymi z %s? Nie jest "
-"to zwykle zalecane."
+msgid "Do you want to slow sync with %s?"
+msgstr "Czy chcesz dokonać wolnej synchronizacji z %s?"
 
-#: ../src/gtk-ui/sync-ui.c:709
-#, c-format
-msgid ""
-"Do you want to delete all data in %s and replace it with your local data? "
-"This is not usually advised."
-msgstr ""
-"Czy chcesz usunąć wszystkie dane w %s i zastąpić je danymi lokalnymi? Nie "
-"jest to zwykle zalecane."
+#: ../src/gtk-ui/sync-ui.c:385
+msgid "Yes, do slow sync"
+msgstr "Tak, wykonaj wolną synchronizację"
 
-#: ../src/gtk-ui/sync-ui.c:726
+#: ../src/gtk-ui/sync-ui.c:385
 msgid "No, cancel sync"
 msgstr "Nie, anuluj synchronizację"
 
-#: ../src/gtk-ui/sync-ui.c:727
+#. TRANSLATORS: confirmation dialog for refresh-from-server. Placeholder
+#. * is service/device name
+#: ../src/gtk-ui/sync-ui.c:418
+#, c-format
+msgid "Do you want to delete all local data and replace it with data from %s? This is not usually advised."
+msgstr "Czy chcesz usunąć wszystkie lokalne dane i zastąpić je danymi z %s? Nie jest to zwykle zalecane."
+
+#: ../src/gtk-ui/sync-ui.c:423
+#: ../src/gtk-ui/sync-ui.c:454
 msgid "Yes, delete and replace"
 msgstr "Tak, usuń i zastąp"
 
-# Synchronization won't take place because it has not been set with what it will be compared to
-#: ../src/gtk-ui/sync-ui.c:749
-msgid "No sources are enabled, not syncing"
-msgstr ""
-"Synchronizacja nie może zostać wykonana ponieważ nie podano źródła do "
-"porównania"
+#: ../src/gtk-ui/sync-ui.c:423
+#: ../src/gtk-ui/sync-ui.c:454
+#: ../src/gtk-ui/sync-ui.c:1566
+msgid "No"
+msgstr "Nie"
 
-# A synchronization is already being processed
-#: ../src/gtk-ui/sync-ui.c:766
-msgid "A sync is already in progress"
-msgstr "Synchronizacja jest już w trakcie"
+#. TRANSLATORS: confirmation dialog for refresh-from-client. Placeholder
+#. * is service/device name
+#: ../src/gtk-ui/sync-ui.c:449
+#, c-format
+msgid "Do you want to delete all data in %s and replace it with your local data? This is not usually advised."
+msgstr "Czy chcesz usunąć wszystkie dane w %s i zastąpić je danymi lokalnymi? Nie jest to zwykle zalecane."
 
-#: ../src/gtk-ui/sync-ui.c:768
-msgid "Failed to start sync"
-msgstr "Błąd przy inicjalizacji synchronizacji"
+# We are trying  to cancel the synchronization
+#: ../src/gtk-ui/sync-ui.c:481
+msgid "Trying to cancel sync"
+msgstr "Trwa próba anulowania synchronizacji"
 
-#: ../src/gtk-ui/sync-ui.c:773
-msgid "Starting sync"
-msgstr "Rozpoczynanie synchronizacji"
+# There is no space left
+#: ../src/gtk-ui/sync-ui.c:521
+msgid "No service or device selected"
+msgstr "Nie wybrano usługi lub urządzenia"
 
 # Last synchronization happened a few seconds ago
-#: ../src/gtk-ui/sync-ui.c:798
-msgid "Last synced just seconds ago"
-msgstr "Ostatnio synchronizowano przed paroma sekundami"
+#. TRANSLATORS: This is the title on main view. Placeholder is
+#. * the service name. Example: "Google - synced just now"
+#: ../src/gtk-ui/sync-ui.c:529
+#, c-format
+msgid "%s - synced just now"
+msgstr "%s - właśnie zsynchronizowano"
 
 # Last synchronization happened one minute ago
-#: ../src/gtk-ui/sync-ui.c:801
-msgid "Last synced a minute ago"
-msgstr "Ostatnio synchronizowano minutę temu"
+#: ../src/gtk-ui/sync-ui.c:533
+#, c-format
+msgid "%s - synced a minute ago"
+msgstr "%s - zsynchronizowano minutę temu"
 
 # Last synchronization happened %ld minutes ago
-#: ../src/gtk-ui/sync-ui.c:804
+#: ../src/gtk-ui/sync-ui.c:537
 #, c-format
-msgid "Last synced %ld minutes ago"
-msgstr "Ostatnio synchronizowano %ld minut temu"
+msgid "%s - synced %ld minutes ago"
+msgstr "%s - zsynchronizowano %ld minut temu"
 
 # Last synchronization happened one hour ago
-#: ../src/gtk-ui/sync-ui.c:807
-msgid "Last synced an hour ago"
-msgstr "Ostatnio synchronizowano godzinę temu"
+#: ../src/gtk-ui/sync-ui.c:542
+#, c-format
+msgid "%s - synced an hour ago"
+msgstr "%s - zsynchronizowano godzinę temu"
 
 # Last synchronization happened %ld hours ago
-#: ../src/gtk-ui/sync-ui.c:810
+#: ../src/gtk-ui/sync-ui.c:546
 #, c-format
-msgid "Last synced %ld hours ago"
-msgstr "Ostatnio synchronizowano %ld godzin temu"
+msgid "%s - synced %ld hours ago"
+msgstr "%s - zsynchronizowano %ld godzin temu"
 
 # Last synchronization happened one day ago
-#: ../src/gtk-ui/sync-ui.c:813
-msgid "Last synced a day ago"
-msgstr "Ostatnio synchronizowano wczoraj"
+#: ../src/gtk-ui/sync-ui.c:551
+#, c-format
+msgid "%s - synced a day ago"
+msgstr "%s - zsynchronizowano wczoraj"
 
 # Last synchronization happened %ld days ago
-#: ../src/gtk-ui/sync-ui.c:816
+#: ../src/gtk-ui/sync-ui.c:555
 #, c-format
-msgid "Last synced %ld days ago"
-msgstr "Ostatnio synchronizowano %ld dni temu"
+msgid "%s - synced %ld days ago"
+msgstr "%s - zsynchronizowano %ld dni temu"
+
+#. TRANSLATORS: Action button in info bar in main view. Shown with e.g.
+#. * "You've just restored a backup. The changes have not been "
+#. * "synced with %s yet"
+#: ../src/gtk-ui/sync-ui.c:604
+#: ../src/gtk-ui/sync-ui.c:719
+msgid "Sync now"
+msgstr "Synchronizuj teraz"
+
+#. TRANSLATORS: Action button in info bar in main view. Shown with e.g.
+#. * "A normal sync is not possible at this time..." message.
+#. * "Other options" will open Emergency view
+#: ../src/gtk-ui/sync-ui.c:610
+#: ../src/gtk-ui/ui.glade.h:37
+msgid "Slow sync"
+msgstr "Wolna synchronizacja"
+
+#: ../src/gtk-ui/sync-ui.c:611
+msgid "Other options..."
+msgstr "Inne opcje..."
 
-#: ../src/gtk-ui/sync-ui.c:901
+# Configuration of the synchronization service
+#. TRANSLATORS: Action button in info bar in main view. Shown e.g.
+#. * when no service is selected. Will open configuration view
+#: ../src/gtk-ui/sync-ui.c:616
+msgid "Select sync service"
+msgstr "Wybierz usługę synchronizacji"
+
+# Edit the configuration of the service
+#. TRANSLATORS: Action button in info bar in main view. Shown e.g.
+#. * login to service fails. Will open configuration view for this service
+#: ../src/gtk-ui/sync-ui.c:621
+msgid "Edit service settings"
+msgstr "Edycja ustawień usługi"
+
+# There's no sync service yet between the netbook and a web service.
+#: ../src/gtk-ui/sync-ui.c:670
+msgid "You haven't selected a sync service or device yet. Sync services let you synchronize your data between your netbook and a web service. You can also sync directly with some devices."
+msgstr "Nie wybrałeś jeszcze usługi synchronizacji lub urządzenia. Usługi synchronizacji pozwalają na synchronizowanie danych pomiędzy netbookiem a usługą internetową. Można również synchronizować bezpośrednio z niektórymi urządzeniami."
+
+#: ../src/gtk-ui/sync-ui.c:717
 msgid "Sync again"
 msgstr "Synchronizuj jeszcze raz"
 
-#: ../src/gtk-ui/sync-ui.c:903 ../src/gtk-ui/ui.glade.h:29
-msgid "Sync now"
-msgstr "Synchronizuj teraz"
+#: ../src/gtk-ui/sync-ui.c:730
+msgid "Restoring"
+msgstr "Przywracanie"
 
 # Synchronization is taking place
-#: ../src/gtk-ui/sync-ui.c:912
+#: ../src/gtk-ui/sync-ui.c:732
 msgid "Syncing"
 msgstr "Synchronizowanie"
 
-#: ../src/gtk-ui/sync-ui.c:918
+#. TRANSLATORS: This is for the button in main view, right side.
+#. Keep line length below ~20 characters, use two lines if needed
+#: ../src/gtk-ui/sync-ui.c:743
+#: ../src/gtk-ui/sync-ui.c:3358
 msgid "Cancel sync"
 msgstr "Anuluj synchronizację"
 
-# %s (not compatible with this service)
-#. TRANSLATORS: placeholder is a source name, shown with checkboxes in main window
-#: ../src/gtk-ui/sync-ui.c:1265
+#: ../src/gtk-ui/sync-ui.c:908
+msgid "Back to sync"
+msgstr "Powrót do synchronizacji"
+
+#. TRANSLATORS: label for checkbutton/toggle in main view.
+#. * Please stick to similar length strings or break the line with
+#. * "\n" if absolutely needed
+#: ../src/gtk-ui/sync-ui.c:1209
+msgid "Automatic sync"
+msgstr ""
+"Automatyczna\n"
+"synchronizacja"
+
+#. This is the expander label in emergency view. It summarizes the
+#. * currently selected data sources. First placeholder is service/device
+#. * name, second a comma separeted list of sources.
+#. * E.g. "Affected data: Google Contacts, Appointments"
+#: ../src/gtk-ui/sync-ui.c:1480
+#, c-format
+msgid "Affected data: %s %s"
+msgstr "Dane, na które ma to wpływ: %s %s"
+
+#: ../src/gtk-ui/sync-ui.c:1485
+#, c-format
+msgid "Affected data: none"
+msgstr "Dane, na które ma to wpływ: brak"
+
+#. TRANSLATORS: confirmation for restoring a backup. placeholder is the
+#. * backup time string defined below
+#: ../src/gtk-ui/sync-ui.c:1563
+#, c-format
+msgid "Do you want to restore the backup from %s? All changes you have made since then will be lost."
+msgstr "Czy chcesz przywrócić kopię zapasową z %s? Wszystkie wprowadzone od tamtego czasu zmiany zostaną utracone."
+
+#: ../src/gtk-ui/sync-ui.c:1566
+msgid "Yes, restore"
+msgstr "Tak, przywróć"
+
+#. TRANSLATORS: date/time for strftime(), used in emergency view backup
+#. * label. Any time format that shows date and time is good.
+#: ../src/gtk-ui/sync-ui.c:1598
+#, c-format
+msgid "%x %X"
+msgstr "%x %X"
+
+#. TRANSLATORS: label for a backup in emergency view. Placeholder is
+#. * service or device name
+#: ../src/gtk-ui/sync-ui.c:1617
+#, c-format
+msgid "Backed up before syncing with %s"
+msgstr "Wykonano kopie zapasową przed synchronizacją z %s"
+
+#: ../src/gtk-ui/sync-ui.c:1634
+msgid "Restore"
+msgstr "Przywróć"
+
+#. TRANSLATORS: this is an explanation in Emergency view.
+#. * Placeholder is a service/device name
+#: ../src/gtk-ui/sync-ui.c:1741
+#, c-format
+msgid "A normal sync with %s is not possible at this time. You can do a slow two-way sync or start from scratch. You can also restore a backup, but a slow sync or starting from scratch will still be required before normal sync is possible."
+msgstr "Normalna synchronizacja z %s nie jest teraz możliwa. Można wykonać wolną, dwukierunkową synchronizację, lub zacząć od początku. Można również przywrócić kopię zapasową, ale wykonanie wolnej synchronizacji lub rozpoczęcie od początku wciąż będzie wymagane, zanim normalna synchronizacja będzie możliwa."
+
+#: ../src/gtk-ui/sync-ui.c:1751
+#, c-format
+msgid "If something has gone horribly wrong, you can try a slow sync, start from scratch or restore from backup."
+msgstr "W przypadku poważnych problemów można spróbować wykonać wolną synchronizację, zacząć od początku lub przywrócić z kopii zapasowej."
+
+#. TRANSLATORS: These are a buttons in Emergency view. Placeholder is a
+#. * service/device name. Please don't use too long lines, but feel free to
+#. * use several lines.
+#: ../src/gtk-ui/sync-ui.c:1760
 #, c-format
-msgid "%s (not supported by this service)"
-msgstr "%s (nie kompatybilne z tą usługą)"
+msgid ""
+"Delete all your local\n"
+"data and replace with\n"
+"data from %s"
+msgstr ""
+"Skasuj wszystkie lokalne\n"
+"dane i zastąp je\n"
+"zdalnymi z %s"
 
-#: ../src/gtk-ui/sync-ui.c:1298
+#: ../src/gtk-ui/sync-ui.c:1766
+#, c-format
+msgid ""
+"Delete all data on\n"
+"%s and replace\n"
+"with your local data"
+msgstr ""
+"Skasuj wszystkie dane\n"
+"na %s i zastąp je\n"
+"lokalnymi"
+
+#: ../src/gtk-ui/sync-ui.c:2226
+msgid "Failed to get list of supported services from SyncEvolution"
+msgstr "Błąd przy pobieraniu listy kompatybilnych usług z SyncEvolution"
+
+#: ../src/gtk-ui/sync-ui.c:2280
+msgid "There was a problem communicating with the sync process. Please try again later."
+msgstr "Wystąpił problem podczas komunikacji z procesem synchronizacji. Spróbuj ponownie później."
+
+#: ../src/gtk-ui/sync-ui.c:2339
+msgid "Restore failed"
+msgstr "Przywracanie nie powiodło się"
+
+#: ../src/gtk-ui/sync-ui.c:2342
+#: ../src/gtk-ui/sync-ui.c:3227
+msgid "Sync failed"
+msgstr "Synchronizacja nie powiodła się"
+
+#: ../src/gtk-ui/sync-ui.c:2348
+msgid "Restore complete"
+msgstr "Przywracanie zakończone"
+
+#: ../src/gtk-ui/sync-ui.c:2351
+msgid "Sync complete"
+msgstr "Synchronizacja zakończona"
+
+#: ../src/gtk-ui/sync-ui.c:2443
+#, c-format
+msgid "Preparing '%s'"
+msgstr "Przygotowywanie '%s'"
+
+#: ../src/gtk-ui/sync-ui.c:2446
+#, c-format
+msgid "Receiving '%s'"
+msgstr "Odbieranie '%s'"
+
+#: ../src/gtk-ui/sync-ui.c:2449
+#, c-format
+msgid "Sending '%s'"
+msgstr "Wysyłanie '%s'"
+
+#: ../src/gtk-ui/sync-ui.c:2570
 #, c-format
 msgid "There was one remote rejection."
-msgid_plural "There were %d remote rejections."
-msgstr[0] "Druga strona odrzuciła jeden z elementów"
-msgstr[1] "Druga strona odrzuciła %d elementy"
-msgstr[2] "Druga strona odrzuciła %d elementów"
+msgid_plural "There were %ld remote rejections."
+msgstr[0] "Druga strona odrzuciła jeden z elementów."
+msgstr[1] "Druga strona odrzuciła %ld elementy."
+msgstr[2] "Druga strona odrzuciła %ld elementów."
 
-#: ../src/gtk-ui/sync-ui.c:1303
+#: ../src/gtk-ui/sync-ui.c:2575
 #, c-format
 msgid "There was one local rejection."
-msgid_plural "There were %d local rejections."
-msgstr[0] "Odrzucono jeden z elementów"
-msgstr[1] "Odrzucono %d elementy"
-msgstr[2] "Odrzucono %d elementów"
+msgid_plural "There were %ld local rejections."
+msgstr[0] "Odrzucono lokalnie jeden element."
+msgstr[1] "Odrzucono lokalnie %ld elementy."
+msgstr[2] "Odrzucono lokalnie %ld elementów."
 
-#: ../src/gtk-ui/sync-ui.c:1308
+#: ../src/gtk-ui/sync-ui.c:2580
 #, c-format
-msgid "There were %d local rejections and %d remote rejections."
-msgstr ""
-"Odrzucono %d elementów podczas gdy druga strona odrzuciła %d elementów."
+msgid "There were %ld local rejections and %ld remote rejections."
+msgstr "Odrzucono lokalnie %ld elementów podczas gdy druga strona odrzuciła %ld elementów."
 
-#: ../src/gtk-ui/sync-ui.c:1313
+#: ../src/gtk-ui/sync-ui.c:2585
 #, c-format
 msgid "Last time: No changes."
 msgstr "Ostatnio: brak zmian."
 
-#: ../src/gtk-ui/sync-ui.c:1315
+#: ../src/gtk-ui/sync-ui.c:2587
 #, c-format
 msgid "Last time: Sent one change."
-msgid_plural "Last time: Sent %d changes."
+msgid_plural "Last time: Sent %ld changes."
 msgstr[0] "Ostatnio: wysłano jedną zmianę."
-msgstr[1] "Ostatnio: wysłano %d zmiany."
-msgstr[2] "Ostatnio: wysłano %d zmian."
+msgstr[1] "Ostatnio: wysłano %ld zmiany."
+msgstr[2] "Ostatnio: wysłano %ld zmian."
 
 #. This is about changes made to the local data. Not all of these
 #. changes were requested by the remote server, so "applied"
 #. is a better word than "received" (bug #5185).
-#: ../src/gtk-ui/sync-ui.c:1323
+#: ../src/gtk-ui/sync-ui.c:2595
 #, c-format
 msgid "Last time: Applied one change."
-msgid_plural "Last time: Applied %d changes."
-msgstr[0] "Ostatnio: pobrano jedną zmianę."
-msgstr[1] "Ostatnio: pobrano %d zmiany."
-msgstr[2] "Ostatnio: pobrano %d zmian."
+msgid_plural "Last time: Applied %ld changes."
+msgstr[0] "Ostatnio: zastosowano jedną zmianę."
+msgstr[1] "Ostatnio: zastosowano %ld zmiany."
+msgstr[2] "Ostatnio: zastosowano %ld zmian."
 
-#: ../src/gtk-ui/sync-ui.c:1328
+#: ../src/gtk-ui/sync-ui.c:2600
 #, c-format
-msgid "Last time: Applied %d changes and sent %d changes."
-msgstr "Ostatnio: pobrano %d zmian i wysłano %d zmian."
-
-#: ../src/gtk-ui/sync-ui.c:1420
-msgid "Failed to get server configuration from SyncEvolution"
-msgstr "Błąd przy pobieraniu konfiguracji serwera z SyncEvolution"
-
-#: ../src/gtk-ui/sync-ui.c:1472
-msgid ""
-"ScheduleWorld enables you to keep your contacts, events, tasks, and notes in "
-"sync."
-msgstr ""
-"ScheduleWorld pozwala na synchronizowanie kontaktów, spotkań, zadań i "
-"notatek."
+msgid "Last time: Applied %ld changes and sent %ld changes."
+msgstr "Ostatnio: zastosowano %ld zmian i wysłano %ld zmian."
 
-#: ../src/gtk-ui/sync-ui.c:1475
-msgid ""
-"Google Sync can backup and synchronize your Address Book with your Gmail "
-"contacts."
-msgstr ""
-"Google Sync może zapisywać i synchronizować kopię twojej książki adresowej z "
-"kontaktami Gmail."
-
-#. TRANSLATORS: Please include the word "demo" (or the equivalent in
-#. your language): Funambol is going to be a 90 day demo service
-#. in the future
-#: ../src/gtk-ui/sync-ui.c:1481
+#. TRANSLATORS: the placeholder is a error message (hopefully)
+#. * explaining the problem
+#: ../src/gtk-ui/sync-ui.c:2807
+#, c-format
 msgid ""
-"Backup your contacts and calendar. Sync with a singleclick, anytime, "
-"anywhere (DEMO)."
+"There was a problem with last sync:\n"
+"%s"
 msgstr ""
-"Zrób kopię zapasową swoich kontaktów i kalendarza. Synchronizuj jednym "
-"kliknięciem, kiedykolwiek i gdziekolwiek (DEMO)."
-
-# New service
-#: ../src/gtk-ui/sync-ui.c:1509
-msgid "New service"
-msgstr "Nowa usługa"
+"Wystąpił problem z ostatnią synchronizacją:\n"
+"%s"
 
-# URL of the server
-#: ../src/gtk-ui/sync-ui.c:1556
-msgid "Server URL"
-msgstr "URL serwera"
-
-# URI of %s
-#. TRANSLATORS: placeholder is a source name in settings window
-#: ../src/gtk-ui/sync-ui.c:1578
+#: ../src/gtk-ui/sync-ui.c:2817
 #, c-format
-msgid "%s URI"
-msgstr "URI %s"
+msgid "You've just restored a backup. The changes have not been synced with %s yet"
+msgstr "Właśnie przywrócono kopię zapasową. Zmiany nie zostały jeszcze zsynchronizowane z %s"
 
-# Open the website
-#: ../src/gtk-ui/sync-ui.c:1715 ../src/gtk-ui/ui.glade.h:17
-msgid "Launch website"
-msgstr "Otworzyć stronę www"
+#: ../src/gtk-ui/sync-ui.c:3105
+msgid "Waiting for current operation to finish..."
+msgstr "Oczekiwanie na zakończenie bieżącej operacji..."
 
-# Configuring and using
-#: ../src/gtk-ui/sync-ui.c:1719
-msgid "Setup and use"
-msgstr "Skonfiguruj i użyj"
+#. TRANSLATORS: next strings are error messages.
+#: ../src/gtk-ui/sync-ui.c:3139
+msgid "A normal sync is not possible at this time. The server suggests a slow sync, but this might not always be what you want if both ends already have data."
+msgstr "Wykonanie normalnej synchronizacji nie jest teraz możliwe. Serwer sugeruje wykonanie wolnej synchronizacji, ale może to nie być pożądana czynność w przypadku, gdy po obu stronach znajdują się już dane."
 
-# Error while obtaining the list of services configured manually from SyncEvolution
-#: ../src/gtk-ui/sync-ui.c:1765
-msgid "Failed to get list of manually setup services from SyncEvolution"
-msgstr "Błąd przy pobieraniu listy ręcznie ustawionych usług z SyncEvolution"
+#: ../src/gtk-ui/sync-ui.c:3143
+msgid "The sync process died unexpectedly."
+msgstr "Proces synchronizacji został nieoczekiwanie zakończony."
 
-#: ../src/gtk-ui/sync-ui.c:1806
-msgid "Failed to get list of supported services from SyncEvolution"
-msgstr "Błąd przy pobieraniu listy kompatybilnych usług z SyncEvolution"
+#: ../src/gtk-ui/sync-ui.c:3148
+msgid "Password request was not answered. You can save the password in the settings to prevent the request."
+msgstr "Nie uzyskano odpowiedzi na żądanie o hasło. Hasło można zapisać w ustawieniach, aby uniknąć wysyłania żądania."
 
-# The configuration service has not been found
-#. TODO: this is a hack... SyncEnd should be a signal of it's own,
-#. not just hacked on top of the syncevolution error codes
-#: ../src/gtk-ui/sync-ui.c:1967
-msgid "Service configuration not found"
-msgstr "Nie znaleziono konfiguracji usługi"
+#. TODO use the service device name here, this is a remote problem
+#: ../src/gtk-ui/sync-ui.c:3152
+msgid "There was a problem processing sync request. Trying again may help."
+msgstr "Wystąpił problem z przetwarzaniem żądania synchronizacji. Ponowna próba może pomóc."
 
-#: ../src/gtk-ui/sync-ui.c:1973
-msgid "Not authorized"
-msgstr "Brak autoryzacji"
+#: ../src/gtk-ui/sync-ui.c:3158
+msgid "Failed to login. Could there be a problem with your username or password?"
+msgstr "Logowanie nie powiodło się. Czy może to być problem z nazwą użytkownika lub hasłem?"
 
-#: ../src/gtk-ui/sync-ui.c:1975
+#: ../src/gtk-ui/sync-ui.c:3161
 msgid "Forbidden"
 msgstr "Nie dozwolone"
 
-# has not been found
-#: ../src/gtk-ui/sync-ui.c:1977
-msgid "Not found"
-msgstr "Nie znaleziono"
+#. TRANSLATORS: data source means e.g. calendar or addressbook
+#: ../src/gtk-ui/sync-ui.c:3167
+msgid "A data source could not be found. Could there be a problem with the settings?"
+msgstr "Nie można odnaleźć źródła danych. Czy może być to problem z ustawieniami?"
 
 # Fatal error in the database
-#: ../src/gtk-ui/sync-ui.c:1979
-msgid "Fatal database error"
-msgstr "Krytyczny błąd bazy danych"
+#: ../src/gtk-ui/sync-ui.c:3171
+msgid "Remote database error"
+msgstr "Błąd zdalnej bazy danych"
 
-#: ../src/gtk-ui/sync-ui.c:1981
-msgid "Database error"
-msgstr "Błąd bazy danych"
+#. This can happen when EDS is borked, restart it may help...
+#: ../src/gtk-ui/sync-ui.c:3174
+msgid "There is a problem with the local database. Syncing again or rebooting may help."
+msgstr "Wystąpił problem z lokalną bazą danych. Ponowna synchronizacja lub uruchomienie komputera mogą pomóc."
 
 # There is no space left
-#: ../src/gtk-ui/sync-ui.c:1983
-msgid "No space left"
-msgstr "Nie ma już miejsca"
+#: ../src/gtk-ui/sync-ui.c:3177
+msgid "No space on disk"
+msgstr "Brak miejsca na dysku"
 
-#. TODO identify problem item somehow ?
-#: ../src/gtk-ui/sync-ui.c:1986
+#: ../src/gtk-ui/sync-ui.c:3179
 msgid "Failed to process SyncML"
 msgstr "Błąd przetwarzania SyncML"
 
 # the server didn't accept the authorization
-#: ../src/gtk-ui/sync-ui.c:1988
+#: ../src/gtk-ui/sync-ui.c:3181
 msgid "Server authorization failed"
 msgstr "Serwer nie zaakceptował autoryzacji"
 
 # Error while analysing the syntax of the configuration file
-#: ../src/gtk-ui/sync-ui.c:1990
+#: ../src/gtk-ui/sync-ui.c:3183
 msgid "Failed to parse configuration file"
 msgstr "Błąd składniowy w pliku konfiguracyjnym"
 
 # Error while reading the configuration file
-#: ../src/gtk-ui/sync-ui.c:1992
+#: ../src/gtk-ui/sync-ui.c:3185
 msgid "Failed to read configuration file"
 msgstr "Błąd odczytu pliku konfiguracyjnego"
 
 # The configuration has not been found
-#: ../src/gtk-ui/sync-ui.c:1994
+#: ../src/gtk-ui/sync-ui.c:3187
 msgid "No configuration found"
 msgstr "Nie znaleziono konfiguracji"
 
 # The configuration file has not been found
-#: ../src/gtk-ui/sync-ui.c:1996
+#: ../src/gtk-ui/sync-ui.c:3189
 msgid "No configuration file found"
 msgstr "Nie znaleziono pliku konfiguracyjnego"
 
 # The server sent an an invalid content
-#: ../src/gtk-ui/sync-ui.c:1998
+#: ../src/gtk-ui/sync-ui.c:3191
 msgid "Server sent bad content"
 msgstr "Serwer przysłał nie prawidłowe dane"
 
-# Error during transport (is there no connection?)
-#: ../src/gtk-ui/sync-ui.c:2000
-msgid "Transport failure (no connection?)"
-msgstr "Błąd transportu (brak polączenia?)"
-
-# Connection went over the waiting time
-#: ../src/gtk-ui/sync-ui.c:2002
-msgid "Connection timed out"
-msgstr "Połączenie przekroczyło czas oczekiwania"
-
-#: ../src/gtk-ui/sync-ui.c:2004
+#: ../src/gtk-ui/sync-ui.c:3193
 msgid "Connection certificate has expired"
 msgstr "Wygasł certyfikat połączenia"
 
 # The connection certificate is not valid
-#: ../src/gtk-ui/sync-ui.c:2006
+#: ../src/gtk-ui/sync-ui.c:3195
 msgid "Connection certificate is invalid"
 msgstr "Niewłaściwy certyfikat połączenia"
 
-#: ../src/gtk-ui/sync-ui.c:2009
-msgid "Connection failed"
-msgstr "Błąd połączenia"
+#: ../src/gtk-ui/sync-ui.c:3203
+msgid "We were unable to connect to the server. The problem could be temporary or there could be something wrong with the settings."
+msgstr "Nie można połączyć się z serwerem. Problem może być tymczasowy, lub ustawienia mogą być błędne."
 
 # The URL is incorrect
-#: ../src/gtk-ui/sync-ui.c:2011
-msgid "URL is bad"
-msgstr "Nieprawidłowy URL"
+#: ../src/gtk-ui/sync-ui.c:3210
+msgid "The server URL is bad"
+msgstr "Nieprawidłowy adres URL serwera"
 
-#: ../src/gtk-ui/sync-ui.c:2013
-msgid "Server not found"
+#: ../src/gtk-ui/sync-ui.c:3215
+msgid "The server was not found"
 msgstr "Nie znaleziono serwera"
 
-#: ../src/gtk-ui/sync-ui.c:2015
+#: ../src/gtk-ui/sync-ui.c:3217
 #, c-format
 msgid "Error %d"
 msgstr "Błąd %d"
 
-# the syncronization service D-Bus closed unexpectedly
-#: ../src/gtk-ui/sync-ui.c:2025
-msgid "Sync D-Bus service exited unexpectedly"
-msgstr "Usługa D-Bus synchronizacji zakończyła nieoczekiwanie"
-
-#: ../src/gtk-ui/sync-ui.c:2028 ../src/gtk-ui/sync-ui.c:2079
-msgid "Sync Failed"
-msgstr "Nie powiodło się"
-
-#: ../src/gtk-ui/sync-ui.c:2071
-msgid "Sync complete"
-msgstr "Synchronizacja zakończona"
-
-#: ../src/gtk-ui/sync-ui.c:2076
-msgid "Sync canceled"
-msgstr "Synchronizacja anulowana"
+#. TRANSLATORS: password request dialog contents: title, cancel button
+#. * and ok button
+#: ../src/gtk-ui/sync-ui.c:3355
+msgid "Password is required for sync"
+msgstr "Synchronizacja wymaga hasła"
 
-#. NOTE extra1 can be error here
-#: ../src/gtk-ui/sync-ui.c:2094
-msgid "Ending sync"
-msgstr "Zamykanie synchronizacji"
-
-#. TRANSLATORS: placeholder is a source name (e.g. 'Calendar') in a progress text
-#: ../src/gtk-ui/sync-ui.c:2118
-#, c-format
-msgid "Preparing '%s'"
-msgstr "Przygotowywanie '%s'"
-
-#. TRANSLATORS: placeholder is a source name in a progress text
-#: ../src/gtk-ui/sync-ui.c:2130
-#, c-format
-msgid "Sending '%s'"
-msgstr "Wysyłanie '%s'"
+#: ../src/gtk-ui/sync-ui.c:3359
+msgid "Sync with password"
+msgstr "Synchronizacja z hasłem"
 
-#. TRANSLATORS: placeholder is a source name in a progress text
-#: ../src/gtk-ui/sync-ui.c:2142
+#. TRANSLATORS: password request dialog message, placeholder is service name
+#: ../src/gtk-ui/sync-ui.c:3369
 #, c-format
-msgid "Receiving '%s'"
-msgstr "Odbieranie '%s'"
-
-#: ../src/gtk-ui/ui.glade.h:1
-msgid "<b>Data</b>"
-msgstr "<b>Dane</b>"
+msgid "Please enter password for syncing with %s:"
+msgstr "Podaj hasło do synchronizacji z %s:"
 
-# there's no synchronization service in use
+#. title for the buttons on the right side of main view
 #: ../src/gtk-ui/ui.glade.h:2
-msgid "<b>No sync service in use</b>"
-msgstr "<b>Brak usług synchronizacji w użyciu</b>"
-
-#: ../src/gtk-ui/ui.glade.h:3
-msgid "<b>Sync failure</b>"
-msgstr "<b>Błąd synchronizacji</b>"
+msgid "<b>Actions</b>"
+msgstr "<b>Czynności</b>"
 
+#. text between the two "start from scratch" buttons in emergency view
 #: ../src/gtk-ui/ui.glade.h:4
-msgid "<b>Type of Sync</b>"
-msgstr "<b>Typ synchronizacji</b>"
+msgid "<b>or</b>"
+msgstr "<b>lub</b>"
 
 #: ../src/gtk-ui/ui.glade.h:5
-msgid "<big>Manual setup</big>"
-msgstr "<big>Manualna konfiguracja</big>"
+msgid "<big>Direct sync</big>"
+msgstr "<big>Synchronizacja bezpośrednia</big>"
 
-# compatible services
 #: ../src/gtk-ui/ui.glade.h:6
-msgid "<big>Supported services</big>"
-msgstr "<big>Kompatybilne usługi</big>"
-
-#: ../src/gtk-ui/ui.glade.h:7
-msgid "Add new service"
-msgstr "Dodaj nową usługę"
+msgid "<big>Network sync</big>"
+msgstr "<b>Synchronizacja sieciowa</b>"
 
+#. a title in emergency view
 #: ../src/gtk-ui/ui.glade.h:8
-msgid "Back to sync"
-msgstr "Powrót do synchronizacji"
+msgid "<big>Restore from backup</big>"
+msgstr "<big>Przywracanie z kopii zapasowej</big>"
 
-#: ../src/gtk-ui/ui.glade.h:9
-msgid ""
-"Change sync\n"
-"service"
-msgstr ""
-"Zmień usługę\n"
-"synchronizacji"
-
-#: ../src/gtk-ui/ui.glade.h:11
-msgid "Delete all local data and replace it with remote data"
-msgstr "Skasuj wszystkie lokalne dane i zastąp je zdalnymi"
+#. a title in emergency view
+#: ../src/gtk-ui/ui.glade.h:10
+msgid "<big>Slow sync</big>"
+msgstr "<big>Wolna synchronizacja</big>"
 
+#. a title in emergency view
 #: ../src/gtk-ui/ui.glade.h:12
-msgid "Delete all remote data and replace it with local data"
-msgstr "Skasuj wszystkie zdalne dane i zastąp je lokalnymi"
+msgid "<big>Start from scratch</big>"
+msgstr "<big>Zacznij od początku</big>"
 
 #: ../src/gtk-ui/ui.glade.h:13
-msgid "Delete this service"
-msgstr "Skasuj tę usługę"
-
-# Edit the configuration of the service
-#: ../src/gtk-ui/ui.glade.h:14
-msgid "Edit service settings"
-msgstr "Edycja ustawień usługi"
-
-#: ../src/gtk-ui/ui.glade.h:15
 msgid ""
-"If you don't see your service above but know that your sync provider uses "
-"SyncML\n"
-"you can setup a service manually."
+"A slow sync compares items from both sides and tries to merge them. \n"
+"This may fail in some cases, leading to duplicates or lost information."
 msgstr ""
-"Jeśli Twoja usługa nie jest widoczna powyżej a wiesz że dostawca używa "
-"SyncML\n"
-"możesz ustawić usługę ręcznie."
+"Powolna synchronizacja porównuje elementu po obu stronach i próbuje je połączyć. \n"
+"W niektórych przypadkach może się to nie powieść, prowadząc do zduplikowania lub utraty informacji."
+
+#: ../src/gtk-ui/ui.glade.h:15
+msgid "Add new device"
+msgstr "Dodaj nowe urządzenie"
+
+#: ../src/gtk-ui/ui.glade.h:16
+msgid "Add new service"
+msgstr "Dodaj nową usługę"
 
+#. explanation of "Restore backup" function
 #: ../src/gtk-ui/ui.glade.h:18
-msgid "Merge local and remote data (recommended)"
-msgstr "Połącz dane lokalne i zdalne (zalecane)"
+msgid "Backups are made before every time we Sync. Choose a backup to restore. Any changes you have made since then will be lost."
+msgstr "Kopie zapasowe są wykonywane przy każdej synchronizacji. Wybierz kopię zapasową, z której przywrócić. Wszelkie zmiany wprowadzone od tamtego czasu zostaną utracone."
 
 #: ../src/gtk-ui/ui.glade.h:19
-msgid "Password"
-msgstr "Hasło"
-
-# Go back to the original configuration of the server
-#: ../src/gtk-ui/ui.glade.h:20
-msgid "Reset original server settings"
-msgstr "Przywróć oryginalne ustawienia serwera"
+msgid "Calendar"
+msgstr "Kalendarz"
 
+#. Button in main view, right side. Keep to below 20 chars per line, feel free to use two lines
 #: ../src/gtk-ui/ui.glade.h:21
-msgid "Save and use this service"
-msgstr "Zapisz i użyj tej usługi"
-
-# Configuration of the synchronization service
-#: ../src/gtk-ui/ui.glade.h:22
-msgid "Select sync service"
-msgstr "Wybierz usługę synchronizacji"
-
-#: ../src/gtk-ui/ui.glade.h:23
-msgid "Server settings"
-msgstr "Ustawienia usługi"
+msgid ""
+"Change or edit\n"
+"sync service"
+msgstr ""
+"Zmień lub edytuj\n"
+"usługę synchronizacji"
 
+#. close button for settings window
 #: ../src/gtk-ui/ui.glade.h:24
-msgid "Service name"
-msgstr "Nazwa usługi"
+msgid "Close"
+msgstr "Zamknij"
 
-# Synchronization needs an Internet connection.
 #: ../src/gtk-ui/ui.glade.h:25
 msgid ""
-"Sorry, you need an internet\n"
-"connection to sync."
+"Delete all data on Zyb \n"
+"and replace with your\n"
+"local information"
 msgstr ""
-"Niestety potrzebne jest połączenie\n"
-"z internetem aby zsynchronizować."
+"Skasuj wszystkie dane\n"
+"z usługi Zyb i zastąp\n"
+"je lokalnymi"
 
-#: ../src/gtk-ui/ui.glade.h:27
-msgid "Stop using this service"
-msgstr "Zaprzestań używania usługi"
+#: ../src/gtk-ui/ui.glade.h:28
+msgid ""
+"Delete all your local\n"
+"information and replace\n"
+"with data from Zyb"
+msgstr ""
+"Skasuj wszystkie lokalne\n"
+"dane i zastąp je zdalnymi\n"
+"z usługi Zyb"
 
-#: ../src/gtk-ui/ui.glade.h:30
+#. button in main view, right side. Keep length to 20 characters or so, use two lines if needed
+#: ../src/gtk-ui/ui.glade.h:32
 msgid ""
-"Synchronization is not available (D-Bus service does not answer), sorry."
-msgstr "Niestety synchronizacja jest niedostępna (usługa D-Bus nie odpowiada)."
+"Fix a sync\n"
+"emergency"
+msgstr ""
+"Napraw awarię\n"
+"synchronizacji"
 
-#: ../src/gtk-ui/ui.glade.h:31
+#: ../src/gtk-ui/ui.glade.h:34
 msgid ""
-"To sync you'll need a network connection and an account with a sync "
-"service.\n"
-"We support the following services: "
+"If you don't see your service above but know that your sync provider uses SyncML\n"
+"you can setup a service manually."
 msgstr ""
-"Aby móc synchronizować potrzebne są połączenie z siecią oraz konto dla "
-"usługi\n"
-"synchronizacji. Następujące usługi są kompatybilne:"
+"Jeśli Twoja usługa nie jest widoczna powyżej a wiesz że dostawca używa SyncML\n"
+"możesz ustawić usługę ręcznie."
 
-#: ../src/gtk-ui/ui.glade.h:33
-msgid "Username"
-msgstr "Nazwa użytkownika"
+#: ../src/gtk-ui/ui.glade.h:36
+msgid "Settings"
+msgstr "Ustawienia"
 
-# There's no sync service yet between the netbook and a web service.
-#: ../src/gtk-ui/ui.glade.h:34
+#: ../src/gtk-ui/ui.glade.h:39
+msgid "Sync Emergency"
+msgstr "Awaria synchronizacji"
+
+#: ../src/gtk-ui/ui.glade.h:41
 msgid ""
-"You haven't selected a sync service yet. Sync services let you \n"
-"synchronize your data between your netbook and a web service."
+"To sync you'll need a network connection and an account with a sync service.\n"
+"We support the following services: "
 msgstr ""
-"Nie wybrałeś jeszcze usługi synchronizacji. Usługi synchronizacji \n"
-"pozwalają na synchronizowanie danych pomiędzy netbookiem a \n"
-"usługą internetową."
+"Aby móc synchronizować potrzebne są połączenie z siecią oraz konto dla usługi\n"
+"synchronizacji. Następujące usługi są kompatybilne:"
+
+#: ../src/gtk-ui/ui.glade.h:43
+msgid "Use Bluetooth to Sync your data from one device to another."
+msgstr "Użyj interfejsu Bluetooth lub zsynchronizuj dane z jednego urządzenia z innym."
+
+#: ../src/gtk-ui/ui.glade.h:44
+msgid "You will need to add Bluetooth devices before they can be synced."
+msgstr "Konieczne będzie dodanie urządzeń Bluetooth, zanim będą one synchronizowane."
 
-#: ../src/gtk-ui/sync.desktop.in.h:2 ../src/gtk-ui/sync-gtk.desktop.in.h:2
+#: ../src/gtk-ui/sync.desktop.in.h:2
+#: ../src/gtk-ui/sync-gtk.desktop.in.h:2
 msgid "Up to date"
 msgstr "Aktualny"
 
@@ -611,23 +677,245 @@ msgstr "Aktualny"
 msgid "Sync (GTK)"
 msgstr "Synchronizacja (GTK)"
 
-#~ msgid "Last time: Received one change."
-#~ msgid_plural "Last time: Received %d changes."
-#~ msgstr[0] "Ostatnio: przyjęto jedną zmianę."
-#~ msgstr[1] "Ostatnio: przyjęto %d zmiany."
-#~ msgstr[2] "Ostatnio: przyjęto %d zmian."
+#: ../src/gtk-ui/sync-config-widget.c:74
+msgid "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in sync."
+msgstr "ScheduleWorld pozwala na synchronizowanie kontaktów, spotkań, zadań i notatek."
 
-#~ msgid "Last time: Received %d changes and sent %d changes."
-#~ msgstr "Ostatnio: przyjęto %d zmian i wysłano %d zmian."
+#: ../src/gtk-ui/sync-config-widget.c:77
+msgid "Google Sync can backup and synchronize your contacts with your Gmail contacts."
+msgstr "Google Sync może zapisywać i synchronizować kopię twojej książki adresowej z kontaktami Gmail."
 
-# Configuration of the synchronization service
-#~ msgid "Setup sync service"
-#~ msgstr "Ustaw usługę synchronizacji"
+#. TRANSLATORS: Please include the word "demo" (or the equivalent in
+#. your language): Funambol is going to be a 90 day demo service
+#. in the future
+#: ../src/gtk-ui/sync-config-widget.c:83
+msgid "Backup your contacts and calendar. Sync with a single click, anytime, anywhere (DEMO)."
+msgstr "Zrób kopię zapasową swoich kontaktów i kalendarza. Synchronizuj jednym kliknięciem, kiedykolwiek i gdziekolwiek (DEMO)."
+
+#: ../src/gtk-ui/sync-config-widget.c:86
+msgid "Mobical Backup and Restore service allows you to securely backup your personal mobile data for free."
+msgstr "Usługa kopii zapasowej i przywracania Mobical umożliwia za darmo wykonanie bezpiecznej kopii zapasowej osobistych danych mobilnych."
+
+#: ../src/gtk-ui/sync-config-widget.c:89
+msgid "ZYB is a simple way for people to store and share mobile information online."
+msgstr "ZYB to prosty sposób na przechowywanie i udostępnianie informacji mobilnych w trybie online."
+
+#: ../src/gtk-ui/sync-config-widget.c:92
+msgid "Memotoo lets you access your personal data from any computer connected to the Internet."
+msgstr "Memotoo umożliwia dostęp do informacji osobistych z dowolnego komputera podłączonego do sieci Internet."
+
+# Error while analysing the syntax of the configuration file
+#: ../src/gtk-ui/sync-config-widget.c:188
+msgid "Sorry, failed to save the configuration"
+msgstr "Przepraszamy, zapis pliku konfiguracyjnego nie powiódł się"
+
+#: ../src/gtk-ui/sync-config-widget.c:377
+msgid "Service must have a name and server URL"
+msgstr "Usługa musi mieć nazwę i URL serwera"
+
+#: ../src/gtk-ui/sync-config-widget.c:418
+#, c-format
+msgid "Do you want to reset the settings for %s? This will not remove any synced information on either end."
+msgstr "Czy chcesz zresetować ustawienia dla %s? Nie spowoduje to usunięcia jakichkolwiek informacji zsynchronizowanych na żadnym z urządzeń."
+
+#. TRANSLATORS: buttons in reset-service warning dialog
+#: ../src/gtk-ui/sync-config-widget.c:422
+msgid "Yes, reset"
+msgstr "Tak, zresetuj"
+
+#: ../src/gtk-ui/sync-config-widget.c:423
+#: ../src/gtk-ui/sync-config-widget.c:434
+msgid "No, keep settings"
+msgstr "Nie, zachowaj ustawienia"
+
+#: ../src/gtk-ui/sync-config-widget.c:428
+#, c-format
+msgid "Do you want to delete the settings for %s? This will not remove any synced information on either end but it will remove these settings."
+msgstr "Czy chcesz usunąć ustawienia dla %s? Nie spowoduje to usunięcia jakichkolwiek informacji zsynchronizowanych na żadnym z urządzeń, ale spowoduje usunięcie ustawień."
+
+#. TRANSLATORS: buttons in delete-service warning dialog
+#: ../src/gtk-ui/sync-config-widget.c:433
+msgid "Yes, delete"
+msgstr "Tak, usuń"
+
+#: ../src/gtk-ui/sync-config-widget.c:463
+msgid "Reset settings"
+msgstr "Resetuj ustawienia"
+
+#: ../src/gtk-ui/sync-config-widget.c:466
+msgid "Delete settings"
+msgstr "Usuń ustawienia"
+
+#: ../src/gtk-ui/sync-config-widget.c:476
+msgid "Save and use"
+msgstr "Zapisz i użyj"
+
+#: ../src/gtk-ui/sync-config-widget.c:479
+msgid ""
+"Save and replace\n"
+"current service"
+msgstr ""
+"Zapisz i zastąp\n"
+"bieżącą usługę"
+
+#: ../src/gtk-ui/sync-config-widget.c:489
+msgid "Stop using device"
+msgstr "Zaprzestań używania urządzenia"
+
+#: ../src/gtk-ui/sync-config-widget.c:492
+msgid "Stop using service"
+msgstr "Zaprzestań używania usługi"
+
+# URI of %s
+#. TRANSLATORS: label for an entry in service configuration form.
+#. * Placeholder is a source  name.
+#. * Example: "Appointments URI"
+#: ../src/gtk-ui/sync-config-widget.c:675
+#, c-format
+msgid "%s URI"
+msgstr "URI %s"
+
+#. TRANSLATORS: toggles in service configuration form, placeholder is service
+#. * or device name
+#: ../src/gtk-ui/sync-config-widget.c:850
+#, c-format
+msgid "Send changes to %s"
+msgstr "Wyślij zmiany do %s"
+
+#: ../src/gtk-ui/sync-config-widget.c:855
+#, c-format
+msgid "Receive changes from %s"
+msgstr "Odbierz zmiany od %s"
+
+#: ../src/gtk-ui/sync-config-widget.c:871
+msgid "<b>Sync</b>"
+msgstr "<b>Synchronizacja</b>"
+
+#. TRANSLATORS: label of a entry in service configuration
+#: ../src/gtk-ui/sync-config-widget.c:887
+msgid "Server address"
+msgstr "Adres serwera"
+
+#. TRANSLATORS: explanation before a device template combobox.
+#. * Placeholder is a device name like 'Nokia N85' or 'Syncevolution
+#. * Client'
+#: ../src/gtk-ui/sync-config-widget.c:963
+#, c-format
+msgid "This device looks like it might be a '%s'. If this is not correct, please take a look at the list of supported devices and pick yours if it is listed"
+msgstr "Najprawdopodobniej do urządzenie to „%s”. Jeśli tak nie jest, przejrzyj listę obsługiwanych urządzeń i wybierz posiadane, jeśli się na niej znajduje."
+
+#: ../src/gtk-ui/sync-config-widget.c:969
+msgid "We don't know what this device is exactly. Please take a look at the list of supported devices and pick yours if it is listed"
+msgstr "Nie można dokładnie zidentyfikować urządzenia. Przejrzyj listę obsługiwanych urządzeń i wybierz posiadane, jeśli się na niej znajduje."
+
+#: ../src/gtk-ui/sync-config-widget.c:1122
+#, c-format
+msgid "%s - Bluetooth device"
+msgstr "%s - Urządzenie Bluetooth"
+
+#. TRANSLATORS: service title for services that are not based on a
+#. * template in service list, the placeholder is the name of the service
+#: ../src/gtk-ui/sync-config-widget.c:1128
+#, c-format
+msgid "%s - manually setup"
+msgstr "%s - konfiguracja ręczna"
+
+# Open the website
+#. TRANSLATORS: link button in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1803
+msgid "Launch website"
+msgstr "Otworzyć stronę www"
+
+#. TRANSLATORS: button in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1812
+msgid "Setup now"
+msgstr "Skonfiguruj teraz"
+
+#. TRANSLATORS: labels of entries in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1908
+msgid "Username"
+msgstr "Nazwa użytkownika"
+
+#: ../src/gtk-ui/sync-config-widget.c:1923
+msgid "Password"
+msgstr "Hasło"
+
+#. TRANSLATORS: warning in service configuration form for people
+#. who have modified the configuration via other means.
+#: ../src/gtk-ui/sync-config-widget.c:1946
+msgid "Current configuration is more complex than what can be shown here. Changes to sync mode or synced data types will overwrite that configuration."
+msgstr "Bieżąca konfiguracja usługi jest bardziej skomplikowana niż to, co można tu pokazać. Zmiany trybu synchronizacji lub synchronizowanych typów danych nadpiszą tę konfigurację."
+
+#. TRANSLATORS: this is the epander label for server settings
+#. in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1965
+msgid "Hide server settings"
+msgstr "Ukryj ustawienia serwera"
+
+#. TRANSLATORS: this is the epander label for server settings
+#. in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1985
+msgid "Show server settings"
+msgstr "Pokaż ustawienia serwera"
+
+#: ../src/gnome-bluetooth/syncevolution.c:110
+msgid "Sync in the Sync application"
+msgstr "Synchronizuj w aplikacji do synchronizacji"
+
+# Synchronization is taking place
+#: ../src/syncevo-dbus-server.cpp:5622
+#, c-format
+msgid "%s is syncing"
+msgstr "Synchronizowanie %s"
+
+#: ../src/syncevo-dbus-server.cpp:5623
+#, c-format
+msgid "We have just started to sync your computer with the %s sync service."
+msgstr "Właśnie rozpoczęto synchronizację komputera z usługą synchronizacji %s."
+
+#. if sync is successfully started and done
+#: ../src/syncevo-dbus-server.cpp:5637
+#, c-format
+msgid "%s sync complete"
+msgstr "Synchronizacja %s zakończona"
+
+#: ../src/syncevo-dbus-server.cpp:5638
+#, c-format
+msgid "We have just finished syncing your computer with the %s sync service."
+msgstr "Właśnie zakończono synchronizację komputera z usługą synchronizacji %s."
+
+#. if sync is successfully started and has errors, or not started successful with a fatal problem
+#: ../src/syncevo-dbus-server.cpp:5643
+msgid "Sync problem."
+msgstr "Problem z synchronizacją."
+
+#: ../src/syncevo-dbus-server.cpp:5644
+msgid "Sorry, there's a problem with your sync that you need to attend to."
+msgstr "Przepraszamy, wystąpił problem z synchronizacją wymagający interwencji użytkownika."
+
+#: ../src/syncevo-dbus-server.cpp:5717
+msgid "View"
+msgstr "Pokaż"
+
+#: ../src/syncevo-dbus-server.cpp:5718
+msgid "Dismiss"
+msgstr "Odrzuć"
 
-# There's no sync service yet between the netbook and a web service.
 #~ msgid ""
-#~ "You haven't set up a sync service yet. Sync services let you \n"
-#~ "synchronize your data between your netbook and a web service."
+#~ "Do you want to replace %s with %s? This will not remove any synced "
+#~ "information on either end but you will no longer be able to sync with %s."
 #~ msgstr ""
-#~ "Nie ustawiłeś jeszcze usługi synchronizacji pomiędzy netbookiem\n"
-#~ "a web-serwisem."
+#~ "Czy chcesz zastąpić %s poprzez %s? Nie spowoduje to usunięcia "
+#~ "jakichkolwiek informacji zsynchronizowanych na żadnym z urządzeń, ale nie "
+#~ "będzie już można dokonać synchronizacji z %s."
+#~ msgid "Yes, use %s"
+#~ msgstr "Tak, użyj %s"
+#~ msgid "No, use %s"
+#~ msgstr "Nie, użyj %s"
+#~ msgid "Database error"
+#~ msgstr "Błąd bazy danych"
+#~ msgid "Reset service"
+#~ msgstr "Zresetuj usługę"
+#~ msgid "Addressbook"
+#~ msgstr "Książka adresowa"
+
index 43a4557..3122444 100644 (file)
@@ -2,9 +2,9 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: http://moblin.org/projects/syncevolution\n"
-"POT-Creation-Date: 2009-11-19 18:24+0000\n"
+"POT-Creation-Date: 2010-04-05 09:22+0000\n"
 "PO-Revision-Date: \n"
-"Last-Translator: Tomás Galicia <tomas.galicia@intel.com>\n"
+"Last-Translator: GLSPTB_Gabor <bechtg@gmail.com>\n"
 "Language-Team: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -15,490 +15,609 @@ msgstr ""
 
 #. TRANSLATORS: this is the application name that may be used by e.g.
 #. the windowmanager
-#: ../src/gtk-ui/main.c:31
-#: ../src/gtk-ui/ui.glade.h:28
+#: ../src/gtk-ui/main.c:40
+#: ../src/gtk-ui/ui.glade.h:38
 #: ../src/gtk-ui/sync.desktop.in.h:1
+#: ../src/gnome-bluetooth/syncevolution.c:112
 msgid "Sync"
 msgstr "Sincronização"
 
-#: ../src/gtk-ui/sync-ui.c:259
-msgid "Addressbook"
-msgstr "Endereços"
+#: ../src/gtk-ui/sync-ui.c:260
+msgid "Contacts"
+msgstr "Contatos"
 
-#: ../src/gtk-ui/sync-ui.c:261
-msgid "Calendar"
-msgstr "Calendário"
+#: ../src/gtk-ui/sync-ui.c:262
+msgid "Appointments"
+msgstr "Compromissos"
 
-#: ../src/gtk-ui/sync-ui.c:263
-msgid "Todo"
+#: ../src/gtk-ui/sync-ui.c:264
+#: ../src/gtk-ui/ui.glade.h:40
+msgid "Tasks"
 msgstr "Tarefas"
 
-#: ../src/gtk-ui/sync-ui.c:265
-msgid "Memo"
-msgstr "Anotação"
-
-#: ../src/gtk-ui/sync-ui.c:320
-msgid "Failed to save current service in GConf configuration system"
-msgstr "Falha ao salvar o serviço atual no sistema de configuração do GConf"
+#: ../src/gtk-ui/sync-ui.c:266
+msgid "Notes"
+msgstr "Notas"
 
-#: ../src/gtk-ui/sync-ui.c:331
-msgid "Failed to save service configuration to SyncEvolution"
-msgstr "Falha ao salvar a configuração de serviço ao SyncEvolution"
-
-#: ../src/gtk-ui/sync-ui.c:416
-msgid "Failed to get service configuration from SyncEvolution"
-msgstr "Falha ao buscar a configuração de serviço do SyncEvolution"
-
-#: ../src/gtk-ui/sync-ui.c:480
-msgid "Failed to remove service configuration from SyncEvolution"
-msgstr "Falha ao remover a configuração de serviço do SyncEvolution"
-
-#: ../src/gtk-ui/sync-ui.c:600
-msgid "Service must have a name and server URL"
-msgstr "Serviço tem que ter um nome e um URL de servidor"
+#. TRANSLATORS: This is a "combination source" for syncing with devices
+#. * that combine appointments and tasks. the name should match the ones
+#. * used for calendar and todo above
+#: ../src/gtk-ui/sync-ui.c:271
+msgid "Appointments & Tasks"
+msgstr "Compromissos e tarefas"
 
-#. sync is no longer in progress for some reason
-#: ../src/gtk-ui/sync-ui.c:676
-msgid "Failed to cancel: sync was no longer in progress"
-msgstr "Falhou ao cancelar: sincronização não estava em andamento"
+#: ../src/gtk-ui/sync-ui.c:343
+msgid "Starting sync"
+msgstr "Iniciando sincronização"
 
-#: ../src/gtk-ui/sync-ui.c:680
-msgid "Failed to cancel sync"
-msgstr "Falha ao cancelar sincronização"
+#. TRANSLATORS: slow sync confirmation dialog message. Placeholder
+#. * is service/device name
+#: ../src/gtk-ui/sync-ui.c:381
+#, c-format
+msgid "Do you want to slow sync with %s?"
+msgstr "Você quer fazer sincronização lenta com %s?"
 
-#: ../src/gtk-ui/sync-ui.c:684
-msgid "Canceling sync"
-msgstr "Cancelando sincronização"
+#: ../src/gtk-ui/sync-ui.c:385
+msgid "Yes, do slow sync"
+msgstr "Sim, faça sincronização lenta"
 
-#: ../src/gtk-ui/sync-ui.c:698
-msgid "Trying to cancel sync"
-msgstr "Tentando cancelar sincronização"
+#: ../src/gtk-ui/sync-ui.c:385
+msgid "No, cancel sync"
+msgstr "Não, cancele a sincronização"
 
-#: ../src/gtk-ui/sync-ui.c:705
+#. TRANSLATORS: confirmation dialog for refresh-from-server. Placeholder
+#. * is service/device name
+#: ../src/gtk-ui/sync-ui.c:418
 #, c-format
 msgid "Do you want to delete all local data and replace it with data from %s? This is not usually advised."
 msgstr "Você quer excluir todos os dados locais e substituir por dados de: %s? Isso não é aconselhável."
 
-#: ../src/gtk-ui/sync-ui.c:710
-#, c-format
-msgid "Do you want to delete all data in %s and replace it with your local data? This is not usually advised."
-msgstr "Você quer excluir todos os dados em: %s e substituir por seus dados locais? Isso não é aconselhável."
-
-#: ../src/gtk-ui/sync-ui.c:727
-msgid "No, cancel sync"
-msgstr "Não, cancele a sincronização"
-
-#: ../src/gtk-ui/sync-ui.c:728
+#: ../src/gtk-ui/sync-ui.c:423
+#: ../src/gtk-ui/sync-ui.c:454
 msgid "Yes, delete and replace"
 msgstr "Sim, excluir e substituir"
 
-#: ../src/gtk-ui/sync-ui.c:750
-msgid "No sources are enabled, not syncing"
-msgstr "Nenhuma fonte habilitada, não sincronizando."
+#: ../src/gtk-ui/sync-ui.c:423
+#: ../src/gtk-ui/sync-ui.c:454
+#: ../src/gtk-ui/sync-ui.c:1566
+msgid "No"
+msgstr "Não"
 
-#: ../src/gtk-ui/sync-ui.c:767
-msgid "A sync is already in progress"
-msgstr "Sincronização já em andamento"
+#. TRANSLATORS: confirmation dialog for refresh-from-client. Placeholder
+#. * is service/device name
+#: ../src/gtk-ui/sync-ui.c:449
+#, c-format
+msgid "Do you want to delete all data in %s and replace it with your local data? This is not usually advised."
+msgstr "Você quer excluir todos os dados em: %s e substituir por seus dados locais? Isso não é aconselhável."
 
-#: ../src/gtk-ui/sync-ui.c:769
-msgid "Failed to start sync"
-msgstr "Falha no início da sincronização"
+#: ../src/gtk-ui/sync-ui.c:481
+msgid "Trying to cancel sync"
+msgstr "Tentando cancelar sincronização"
 
-#: ../src/gtk-ui/sync-ui.c:774
-msgid "Starting sync"
-msgstr "Iniciando sincronização"
+#: ../src/gtk-ui/sync-ui.c:521
+msgid "No service or device selected"
+msgstr "Nenhum serviço ou dispositivo selecionado"
 
-#: ../src/gtk-ui/sync-ui.c:799
-msgid "Last synced just seconds ago"
-msgstr "Ultima sincronização há segundos atrás"
+#. TRANSLATORS: This is the title on main view. Placeholder is
+#. * the service name. Example: "Google - synced just now"
+#: ../src/gtk-ui/sync-ui.c:529
+#, c-format
+msgid "%s - synced just now"
+msgstr "%s - fez sincronização agora mesmo"
 
-#: ../src/gtk-ui/sync-ui.c:802
-msgid "Last synced a minute ago"
-msgstr "Ultima sincronização há um minuto atrás"
+#: ../src/gtk-ui/sync-ui.c:533
+#, c-format
+msgid "%s - synced a minute ago"
+msgstr "%s - fez sincronização há um minuto atrás"
 
-#: ../src/gtk-ui/sync-ui.c:805
+#: ../src/gtk-ui/sync-ui.c:537
 #, c-format
-msgid "Last synced %ld minutes ago"
-msgstr "Ultima sincronização há: %ld minutos atrás"
+msgid "%s - synced %ld minutes ago"
+msgstr "%s - fez sincronização há: %ld minutos atrás"
 
-#: ../src/gtk-ui/sync-ui.c:808
-msgid "Last synced an hour ago"
-msgstr "Ultima sincronização há uma hora atrás"
+#: ../src/gtk-ui/sync-ui.c:542
+#, c-format
+msgid "%s - synced an hour ago"
+msgstr "%s - fez sincronização há uma hora atrás"
 
-#: ../src/gtk-ui/sync-ui.c:811
+#: ../src/gtk-ui/sync-ui.c:546
 #, c-format
-msgid "Last synced %ld hours ago"
-msgstr "Ultima sincronização há: %ld horas atrás"
+msgid "%s - synced %ld hours ago"
+msgstr "%s - fez sincronização há: %ld horas atrás"
 
-#: ../src/gtk-ui/sync-ui.c:814
-msgid "Last synced a day ago"
-msgstr "Ultima sincronização há um dia atrás"
+#: ../src/gtk-ui/sync-ui.c:551
+#, c-format
+msgid "%s - synced a day ago"
+msgstr "%s - sincronização há um dia atrás"
 
-#: ../src/gtk-ui/sync-ui.c:817
+#: ../src/gtk-ui/sync-ui.c:555
 #, c-format
-msgid "Last synced %ld days ago"
-msgstr "Ultima sincronização há: %ld dias atrás"
+msgid "%s - synced %ld days ago"
+msgstr "%s - sincronização há %ld dias atrás"
+
+#. TRANSLATORS: Action button in info bar in main view. Shown with e.g.
+#. * "You've just restored a backup. The changes have not been "
+#. * "synced with %s yet"
+#: ../src/gtk-ui/sync-ui.c:604
+#: ../src/gtk-ui/sync-ui.c:719
+msgid "Sync now"
+msgstr "Sincronize agora"
+
+#. TRANSLATORS: Action button in info bar in main view. Shown with e.g.
+#. * "A normal sync is not possible at this time..." message.
+#. * "Other options" will open Emergency view
+#: ../src/gtk-ui/sync-ui.c:610
+#: ../src/gtk-ui/ui.glade.h:37
+msgid "Slow sync"
+msgstr "Sincronização lenta"
+
+#: ../src/gtk-ui/sync-ui.c:611
+msgid "Other options..."
+msgstr "Outras opções"
+
+#. TRANSLATORS: Action button in info bar in main view. Shown e.g.
+#. * when no service is selected. Will open configuration view
+#: ../src/gtk-ui/sync-ui.c:616
+msgid "Select sync service"
+msgstr "Selecione serviço de sincronização"
+
+#. TRANSLATORS: Action button in info bar in main view. Shown e.g.
+#. * login to service fails. Will open configuration view for this service
+#: ../src/gtk-ui/sync-ui.c:621
+msgid "Edit service settings"
+msgstr "Editar configurações de serviço"
 
-#: ../src/gtk-ui/sync-ui.c:902
+#: ../src/gtk-ui/sync-ui.c:670
+msgid "You haven't selected a sync service or device yet. Sync services let you synchronize your data between your netbook and a web service. You can also sync directly with some devices."
+msgstr "Você ainda não selecionou um serviço de sincronização ou dispositivo.  Serviços de sincronização permitem a sincronização de dados entre seu netbook e um serviço na web. Você também pode sincronizar diretamente com alguns dispositivos."
+
+#: ../src/gtk-ui/sync-ui.c:717
 msgid "Sync again"
 msgstr "Sincronize de novo"
 
-#: ../src/gtk-ui/sync-ui.c:904
-#: ../src/gtk-ui/ui.glade.h:29
-msgid "Sync now"
-msgstr "Sincronize agora"
+#: ../src/gtk-ui/sync-ui.c:730
+msgid "Restoring"
+msgstr "Restaurando"
 
-#: ../src/gtk-ui/sync-ui.c:913
+#: ../src/gtk-ui/sync-ui.c:732
 msgid "Syncing"
 msgstr "Sincronizando"
 
-#: ../src/gtk-ui/sync-ui.c:919
+#. TRANSLATORS: This is for the button in main view, right side.
+#. Keep line length below ~20 characters, use two lines if needed
+#: ../src/gtk-ui/sync-ui.c:743
+#: ../src/gtk-ui/sync-ui.c:3358
 msgid "Cancel sync"
 msgstr "Cancelar sincronização"
 
-#. TRANSLATORS: placeholder is a source name, shown with checkboxes in main window
-#: ../src/gtk-ui/sync-ui.c:1266
+#: ../src/gtk-ui/sync-ui.c:908
+msgid "Back to sync"
+msgstr "Voltar à sincronização"
+
+#. TRANSLATORS: label for checkbutton/toggle in main view.
+#. * Please stick to similar length strings or break the line with
+#. * "\n" if absolutely needed
+#: ../src/gtk-ui/sync-ui.c:1209
+msgid "Automatic sync"
+msgstr "Sincronização automática"
+
+#. This is the expander label in emergency view. It summarizes the
+#. * currently selected data sources. First placeholder is service/device
+#. * name, second a comma separeted list of sources.
+#. * E.g. "Affected data: Google Contacts, Appointments"
+#: ../src/gtk-ui/sync-ui.c:1480
+#, c-format
+msgid "Affected data: %s %s"
+msgstr "Dados afetados: %s %s"
+
+#: ../src/gtk-ui/sync-ui.c:1485
+#, c-format
+msgid "Affected data: none"
+msgstr "Dados afetados: nenhum"
+
+#. TRANSLATORS: confirmation for restoring a backup. placeholder is the
+#. * backup time string defined below
+#: ../src/gtk-ui/sync-ui.c:1563
+#, c-format
+msgid "Do you want to restore the backup from %s? All changes you have made since then will be lost."
+msgstr "Você quer restaurar o backup do %s? Todas as modificações que você fez depois serão perdidas."
+
+#: ../src/gtk-ui/sync-ui.c:1566
+msgid "Yes, restore"
+msgstr "Sim, restaurar"
+
+#. TRANSLATORS: date/time for strftime(), used in emergency view backup
+#. * label. Any time format that shows date and time is good.
+#: ../src/gtk-ui/sync-ui.c:1598
+#, c-format
+msgid "%x %X"
+msgstr "%x %X"
+
+#. TRANSLATORS: label for a backup in emergency view. Placeholder is
+#. * service or device name
+#: ../src/gtk-ui/sync-ui.c:1617
+#, c-format
+msgid "Backed up before syncing with %s"
+msgstr "Fez backup antes de sincronização com %s"
+
+#: ../src/gtk-ui/sync-ui.c:1634
+msgid "Restore"
+msgstr "Restaurar"
+
+#. TRANSLATORS: this is an explanation in Emergency view.
+#. * Placeholder is a service/device name
+#: ../src/gtk-ui/sync-ui.c:1741
+#, c-format
+msgid "A normal sync with %s is not possible at this time. You can do a slow two-way sync or start from scratch. You can also restore a backup, but a slow sync or starting from scratch will still be required before normal sync is possible."
+msgstr "Uma sincronização normal com %s não é possível agora. Você poderá fazer uma sincronização lenta bidirecional ou iniciar do começo. Você também poderá restaurar um backup, mas uma sincronização lenta ou começando do início ainda será necessária antes de uma sincronização normal."
+
+#: ../src/gtk-ui/sync-ui.c:1751
+#, c-format
+msgid "If something has gone horribly wrong, you can try a slow sync, start from scratch or restore from backup."
+msgstr "Se algo está terrivelmente errado, você ainda pode tentar uma sincronização lenta, começar tudo de novo ou restaruar do backup."
+
+#. TRANSLATORS: These are a buttons in Emergency view. Placeholder is a
+#. * service/device name. Please don't use too long lines, but feel free to
+#. * use several lines.
+#: ../src/gtk-ui/sync-ui.c:1760
+#, c-format
+msgid ""
+"Delete all your local\n"
+"data and replace with\n"
+"data from %s"
+msgstr ""
+"Excluir todos os dados\n"
+"locais e substitua com\n"
+"dados de %s"
+
+#: ../src/gtk-ui/sync-ui.c:1766
+#, c-format
+msgid ""
+"Delete all data on\n"
+"%s and replace\n"
+"with your local data"
+msgstr ""
+"Excluir todos os dados no\n"
+"%s e substituir\n"
+"com seus dados locais"
+
+#: ../src/gtk-ui/sync-ui.c:2226
+msgid "Failed to get list of supported services from SyncEvolution"
+msgstr "Não conseguiu a lista de serviços suportados do SyncEvolution"
+
+#: ../src/gtk-ui/sync-ui.c:2280
+msgid "There was a problem communicating with the sync process. Please try again later."
+msgstr "Houve um problema comunicando com o processo de sincronização. Favor tente de novo mais tarde."
+
+#: ../src/gtk-ui/sync-ui.c:2339
+msgid "Restore failed"
+msgstr "Restauração falhou"
+
+#: ../src/gtk-ui/sync-ui.c:2342
+#: ../src/gtk-ui/sync-ui.c:3227
+msgid "Sync failed"
+msgstr "Sincronização falhou"
+
+#: ../src/gtk-ui/sync-ui.c:2348
+msgid "Restore complete"
+msgstr "Restauração completada"
+
+#: ../src/gtk-ui/sync-ui.c:2351
+msgid "Sync complete"
+msgstr "Sincronização completada"
+
+#: ../src/gtk-ui/sync-ui.c:2443
 #, c-format
-msgid "%s (not supported by this service)"
-msgstr "%s: (não suportado por este serviço)"
+msgid "Preparing '%s'"
+msgstr "Preparando: '%s'"
+
+#: ../src/gtk-ui/sync-ui.c:2446
+#, c-format
+msgid "Receiving '%s'"
+msgstr "Recebendo: '%s'"
+
+#: ../src/gtk-ui/sync-ui.c:2449
+#, c-format
+msgid "Sending '%s'"
+msgstr "Enviando: '%s"
 
-#: ../src/gtk-ui/sync-ui.c:1299
+#: ../src/gtk-ui/sync-ui.c:2570
 #, c-format
 msgid "There was one remote rejection."
-msgid_plural "There were %d remote rejections."
+msgid_plural "There were %ld remote rejections."
 msgstr[0] "Houve uma rejeição remota."
-msgstr[1] "Houve %d rejeições remotas."
+msgstr[1] "Houve %ld rejeições remotas."
 
-#: ../src/gtk-ui/sync-ui.c:1304
+#: ../src/gtk-ui/sync-ui.c:2575
 #, c-format
 msgid "There was one local rejection."
-msgid_plural "There were %d local rejections."
+msgid_plural "There were %ld local rejections."
 msgstr[0] "Houve uma rejeição local."
-msgstr[1] "Houve %d rejeições locais."
+msgstr[1] "Houve %ld rejeições locais."
 
-#: ../src/gtk-ui/sync-ui.c:1309
+#: ../src/gtk-ui/sync-ui.c:2580
 #, c-format
-msgid "There were %d local rejections and %d remote rejections."
-msgstr "Houve %d rejeições locais e %d rejeições remotas."
+msgid "There were %ld local rejections and %ld remote rejections."
+msgstr "Houve %ld rejeições locais e %ld rejeições remotas."
 
-#: ../src/gtk-ui/sync-ui.c:1314
+#: ../src/gtk-ui/sync-ui.c:2585
 #, c-format
 msgid "Last time: No changes."
 msgstr "Ultima vez: sem mudanças."
 
-#: ../src/gtk-ui/sync-ui.c:1316
+#: ../src/gtk-ui/sync-ui.c:2587
 #, c-format
 msgid "Last time: Sent one change."
-msgid_plural "Last time: Sent %d changes."
+msgid_plural "Last time: Sent %ld changes."
 msgstr[0] "Ultima vez: Enviou uma mudança."
-msgstr[1] "Ultima vez: Enviou %d mudanças."
+msgstr[1] "Ultima vez: Enviou %ld mudanças."
 
 #. This is about changes made to the local data. Not all of these
 #. changes were requested by the remote server, so "applied"
 #. is a better word than "received" (bug #5185).
-#: ../src/gtk-ui/sync-ui.c:1324
+#: ../src/gtk-ui/sync-ui.c:2595
 #, c-format
 msgid "Last time: Applied one change."
-msgid_plural "Last time: Applied %d changes."
+msgid_plural "Last time: Applied %ld changes."
 msgstr[0] "Ultima vez: Efetuou uma mudança."
-msgstr[1] "Ultima vez: Efetuou %d mudanças."
+msgstr[1] "Ultima vez: Efetuou %ld mudanças."
 
-#: ../src/gtk-ui/sync-ui.c:1329
+#: ../src/gtk-ui/sync-ui.c:2600
 #, c-format
-msgid "Last time: Applied %d changes and sent %d changes."
-msgstr "Ultima vez: Efetuou %d mudanças e enviou %d mudanças."
-
-#: ../src/gtk-ui/sync-ui.c:1421
-msgid "Failed to get server configuration from SyncEvolution"
-msgstr "Não conseguiu a configuração do servidor do SyncEvolution"
-
-#: ../src/gtk-ui/sync-ui.c:1473
-msgid "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in sync."
-msgstr "ScheduleWorld possibilita manter sincronizados seus contatos, eventos, tarefas e anotações."
-
-#: ../src/gtk-ui/sync-ui.c:1476
-msgid "Google Sync can backup and synchronize your Address Book with your Gmail contacts."
-msgstr "Google Sync pode fazer backup e sincronizar seus endereços com seus contatos Gmail."
-
-#. TRANSLATORS: Please include the word "demo" (or the equivalent in
-#. your language): Funambol is going to be a 90 day demo service
-#. in the future
-#: ../src/gtk-ui/sync-ui.c:1482
-msgid "Backup your contacts and calendar. Sync with a singleclick, anytime, anywhere (DEMO)."
-msgstr "Faça backup de seus contatos e calendário. Sincronize com um só clique, a qualquer hora em qualquer lugar (DEMO)."
+msgid "Last time: Applied %ld changes and sent %ld changes."
+msgstr "Ultima vez: Efetuou %ld  mudanças e enviou %ld mudanças."
 
-#: ../src/gtk-ui/sync-ui.c:1510
-msgid "New service"
-msgstr "Serviço novo"
-
-#: ../src/gtk-ui/sync-ui.c:1557
-msgid "Server URL"
-msgstr "URL de servidor"
+#. TRANSLATORS: the placeholder is a error message (hopefully)
+#. * explaining the problem
+#: ../src/gtk-ui/sync-ui.c:2807
+#, c-format
+msgid ""
+"There was a problem with last sync:\n"
+"%s"
+msgstr ""
+"Houve um problema com a ultima sincronização:\n"
+"%s"
 
-#. TRANSLATORS: placeholder is a source name in settings window
-#: ../src/gtk-ui/sync-ui.c:1579
+#: ../src/gtk-ui/sync-ui.c:2817
 #, c-format
-msgid "%s URI"
-msgstr "URI: %s"
+msgid "You've just restored a backup. The changes have not been synced with %s yet"
+msgstr "Você acabou de restaurar um backup. As modificações não foram sincronizadas com %s ainda"
 
-#: ../src/gtk-ui/sync-ui.c:1716
-#: ../src/gtk-ui/ui.glade.h:17
-msgid "Launch website"
-msgstr "Iniciar o site na web"
+#: ../src/gtk-ui/sync-ui.c:3105
+msgid "Waiting for current operation to finish..."
+msgstr "Aguardando a conclusão da atual operação..."
 
-#: ../src/gtk-ui/sync-ui.c:1720
-msgid "Setup and use"
-msgstr "Configure e use"
+#. TRANSLATORS: next strings are error messages.
+#: ../src/gtk-ui/sync-ui.c:3139
+msgid "A normal sync is not possible at this time. The server suggests a slow sync, but this might not always be what you want if both ends already have data."
+msgstr "Uma sincronização normal não é possível agora. O servidor sugere uma sincronização normal, mas isto não é sempre aquilo que você deseja se ambos os lados têm dados."
 
-#: ../src/gtk-ui/sync-ui.c:1766
-msgid "Failed to get list of manually setup services from SyncEvolution"
-msgstr "Não conseguiu a lista de serviços configurados manualmente do SyncEvolution"
+#: ../src/gtk-ui/sync-ui.c:3143
+msgid "The sync process died unexpectedly."
+msgstr "Saída inesperada do serviço de sincronização."
 
-#: ../src/gtk-ui/sync-ui.c:1807
-msgid "Failed to get list of supported services from SyncEvolution"
-msgstr "Não conseguiu a lista de serviços suportados do SyncEvolution"
+#: ../src/gtk-ui/sync-ui.c:3148
+msgid "Password request was not answered. You can save the password in the settings to prevent the request."
+msgstr "O pedido de senha não teve resposta. Você pode salvar a senha nas configurações para prevenir o pedido."
 
-#. TODO: this is a hack... SyncEnd should be a signal of it's own,
-#. not just hacked on top of the syncevolution error codes
-#: ../src/gtk-ui/sync-ui.c:1968
-msgid "Service configuration not found"
-msgstr "Configuração de serviço não localizado"
+#. TODO use the service device name here, this is a remote problem
+#: ../src/gtk-ui/sync-ui.c:3152
+msgid "There was a problem processing sync request. Trying again may help."
+msgstr "Houve um problema com o processamento do pedido de sincronização. Tentar de novo poderá ajudar. "
 
-#: ../src/gtk-ui/sync-ui.c:1974
-msgid "Not authorized"
-msgstr "Não autorizado"
+#: ../src/gtk-ui/sync-ui.c:3158
+msgid "Failed to login. Could there be a problem with your username or password?"
+msgstr "Falha do login. Existe um problema com seu nome de usuário ou senha?"
 
-#: ../src/gtk-ui/sync-ui.c:1976
+#: ../src/gtk-ui/sync-ui.c:3161
 msgid "Forbidden"
-msgstr "Proibído"
+msgstr "Proibido"
 
-#: ../src/gtk-ui/sync-ui.c:1978
-msgid "Not found"
-msgstr "Não localizado"
+#. TRANSLATORS: data source means e.g. calendar or addressbook
+#: ../src/gtk-ui/sync-ui.c:3167
+msgid "A data source could not be found. Could there be a problem with the settings?"
+msgstr "Uma fonte de dados não pôde ser encontrada. Existe um problema com as configurações?"
 
-#: ../src/gtk-ui/sync-ui.c:1980
-msgid "Fatal database error"
-msgstr "Erro fatal no banco de dados"
+#: ../src/gtk-ui/sync-ui.c:3171
+msgid "Remote database error"
+msgstr "Erro no banco de dados remoto"
 
-#: ../src/gtk-ui/sync-ui.c:1982
-msgid "Database error"
-msgstr "Erro de banco de dados"
+#. This can happen when EDS is borked, restart it may help...
+#: ../src/gtk-ui/sync-ui.c:3174
+msgid "There is a problem with the local database. Syncing again or rebooting may help."
+msgstr "Existe um problema com o banco de dados local. Nova sincronização ou reinicialização poderá ajudar. "
 
-#: ../src/gtk-ui/sync-ui.c:1984
-msgid "No space left"
-msgstr "Não há mais espaço"
+#: ../src/gtk-ui/sync-ui.c:3177
+msgid "No space on disk"
+msgstr "Não há espaço no disco"
 
-#. TODO identify problem item somehow ?
-#: ../src/gtk-ui/sync-ui.c:1987
+#: ../src/gtk-ui/sync-ui.c:3179
 msgid "Failed to process SyncML"
 msgstr "Falhou o processo de SyncML"
 
-#: ../src/gtk-ui/sync-ui.c:1989
+#: ../src/gtk-ui/sync-ui.c:3181
 msgid "Server authorization failed"
 msgstr "Autorização do servidor falhou"
 
-#: ../src/gtk-ui/sync-ui.c:1991
+#: ../src/gtk-ui/sync-ui.c:3183
 msgid "Failed to parse configuration file"
 msgstr "Falha na triagem do arquivo de configuração"
 
-#: ../src/gtk-ui/sync-ui.c:1993
+#: ../src/gtk-ui/sync-ui.c:3185
 msgid "Failed to read configuration file"
 msgstr "Falha na leitura do arquivo de configuração"
 
-#: ../src/gtk-ui/sync-ui.c:1995
+#: ../src/gtk-ui/sync-ui.c:3187
 msgid "No configuration found"
 msgstr "Nenhuma configuração encontrada"
 
-#: ../src/gtk-ui/sync-ui.c:1997
+#: ../src/gtk-ui/sync-ui.c:3189
 msgid "No configuration file found"
 msgstr "Nenhum arquivo de configuração encontrado"
 
-#: ../src/gtk-ui/sync-ui.c:1999
+#: ../src/gtk-ui/sync-ui.c:3191
 msgid "Server sent bad content"
 msgstr "Servidor enviou conteúdo ruim"
 
-#: ../src/gtk-ui/sync-ui.c:2001
-msgid "Transport failure (no connection?)"
-msgstr "Falha de transporte (sem conexão?)"
-
-#: ../src/gtk-ui/sync-ui.c:2003
-msgid "Connection timed out"
-msgstr "Conexão expirou"
-
-#: ../src/gtk-ui/sync-ui.c:2005
+#: ../src/gtk-ui/sync-ui.c:3193
 msgid "Connection certificate has expired"
 msgstr "Certificado de conexão vencido"
 
-#: ../src/gtk-ui/sync-ui.c:2007
+#: ../src/gtk-ui/sync-ui.c:3195
 msgid "Connection certificate is invalid"
 msgstr "Certificado de conexão inválido"
 
-#: ../src/gtk-ui/sync-ui.c:2010
-msgid "Connection failed"
-msgstr "Conexão falhou"
+#: ../src/gtk-ui/sync-ui.c:3203
+msgid "We were unable to connect to the server. The problem could be temporary or there could be something wrong with the settings."
+msgstr "Não foi possível conectar com o servidor. O problema pode ser temporário ou talvez exista um problema com as configurações."
 
-#: ../src/gtk-ui/sync-ui.c:2012
-msgid "URL is bad"
-msgstr "URL está ruim"
+#: ../src/gtk-ui/sync-ui.c:3210
+msgid "The server URL is bad"
+msgstr "O URL do servidor está ruim"
 
-#: ../src/gtk-ui/sync-ui.c:2014
-msgid "Server not found"
+#: ../src/gtk-ui/sync-ui.c:3215
+msgid "The server was not found"
 msgstr "Servidor não localizado"
 
-#: ../src/gtk-ui/sync-ui.c:2016
+#: ../src/gtk-ui/sync-ui.c:3217
 #, c-format
 msgid "Error %d"
 msgstr "Erro: %d"
 
-#: ../src/gtk-ui/sync-ui.c:2026
-msgid "Sync D-Bus service exited unexpectedly"
-msgstr "Saída inesperada do serviço Sync D-Bus"
-
-#: ../src/gtk-ui/sync-ui.c:2029
-#: ../src/gtk-ui/sync-ui.c:2080
-msgid "Sync Failed"
-msgstr "Sinc. falhou"
-
-#: ../src/gtk-ui/sync-ui.c:2072
-msgid "Sync complete"
-msgstr "Sinc. completado"
-
-#: ../src/gtk-ui/sync-ui.c:2077
-msgid "Sync canceled"
-msgstr "Sinc. cancelado"
-
-#. NOTE extra1 can be error here
-#: ../src/gtk-ui/sync-ui.c:2095
-msgid "Ending sync"
-msgstr "Terminando sinc."
-
-#. TRANSLATORS: placeholder is a source name (e.g. 'Calendar') in a progress text
-#: ../src/gtk-ui/sync-ui.c:2119
-#, c-format
-msgid "Preparing '%s'"
-msgstr "Preparando: '%s'"
+#. TRANSLATORS: password request dialog contents: title, cancel button
+#. * and ok button
+#: ../src/gtk-ui/sync-ui.c:3355
+msgid "Password is required for sync"
+msgstr "Senha é necessária para sincronização "
 
-#. TRANSLATORS: placeholder is a source name in a progress text
-#: ../src/gtk-ui/sync-ui.c:2131
-#, c-format
-msgid "Sending '%s'"
-msgstr "Enviando: '%s"
+#: ../src/gtk-ui/sync-ui.c:3359
+msgid "Sync with password"
+msgstr "Sincronização com senha"
 
-#. TRANSLATORS: placeholder is a source name in a progress text
-#: ../src/gtk-ui/sync-ui.c:2143
+#. TRANSLATORS: password request dialog message, placeholder is service name
+#: ../src/gtk-ui/sync-ui.c:3369
 #, c-format
-msgid "Receiving '%s'"
-msgstr "Recebendo: '%s'"
-
-#: ../src/gtk-ui/ui.glade.h:1
-msgid "<b>Data</b>"
-msgstr "<b>Dados</b>"
+msgid "Please enter password for syncing with %s:"
+msgstr "Favor introduzir a senha para sincronização com %s:"
 
+#. title for the buttons on the right side of main view
 #: ../src/gtk-ui/ui.glade.h:2
-msgid "<b>No sync service in use</b>"
-msgstr "<b>Nenhum serviço de sincronização em uso</b>"
-
-#: ../src/gtk-ui/ui.glade.h:3
-msgid "<b>Sync failure</b>"
-msgstr "<b>Falha de sincronização</b>"
+msgid "<b>Actions</b>"
+msgstr "<b>Ações</b>"
 
+#. text between the two "start from scratch" buttons in emergency view
 #: ../src/gtk-ui/ui.glade.h:4
-msgid "<b>Type of Sync</b>"
-msgstr "<b>Tipo de sincronização</b>"
+msgid "<b>or</b>"
+msgstr "<b>ou</b>"
 
 #: ../src/gtk-ui/ui.glade.h:5
-msgid "<big>Manual setup</big>"
-msgstr "<big>Configuração manual</big>"
+msgid "<big>Direct sync</big>"
+msgstr "<big>Sincronização direta</big>"
 
 #: ../src/gtk-ui/ui.glade.h:6
-msgid "<big>Supported services</big>"
-msgstr "<big>Serviços suportados</big>"
-
-#: ../src/gtk-ui/ui.glade.h:7
-msgid "Add new service"
-msgstr "Adicionar serviço"
+msgid "<big>Network sync</big>"
+msgstr "<b>Sincronização de rede</b>"
 
+#. a title in emergency view
 #: ../src/gtk-ui/ui.glade.h:8
-msgid "Back to sync"
-msgstr "Voltar a sincronização"
-
-#: ../src/gtk-ui/ui.glade.h:9
-msgid ""
-"Change sync\n"
-"service"
-msgstr ""
-"Modificar serviço\n"
-"de sincronização"
+msgid "<big>Restore from backup</big>"
+msgstr "<big>Restaurar do backup</big>"
 
-#: ../src/gtk-ui/ui.glade.h:11
-msgid "Delete all local data and replace it with remote data"
-msgstr "Excluir todos os dados locais e substituir com por remotos."
+#. a title in emergency view
+#: ../src/gtk-ui/ui.glade.h:10
+msgid "<big>Slow sync</big>"
+msgstr "<big>Sincronização lenta</big>"
 
+#. a title in emergency view
 #: ../src/gtk-ui/ui.glade.h:12
-msgid "Delete all remote data and replace it with local data"
-msgstr "Excluir todos os dados remotos e substituir por dados locais"
+msgid "<big>Start from scratch</big>"
+msgstr "<big>Começar do início</big>"
 
 #: ../src/gtk-ui/ui.glade.h:13
-msgid "Delete this service"
-msgstr "Excluir este serviço"
-
-#: ../src/gtk-ui/ui.glade.h:14
-msgid "Edit service settings"
-msgstr "Editar configurações de serviço"
-
-#: ../src/gtk-ui/ui.glade.h:15
 msgid ""
-"If you don't see your service above but know that your sync provider uses SyncML\n"
-"you can setup a service manually."
+"A slow sync compares items from both sides and tries to merge them. \n"
+"This may fail in some cases, leading to duplicates or lost information."
 msgstr ""
-"Se não ver seu serviço acima, porém sabe que seu provedor de sinc. usa SyncML\n"
-"você poderá configurá-la manualmente."
+"Uma sincronização lenta compara itens dos dois lados e tenta intercalá-los.\n"
+"Isto poderá falhar em alguns casos, resultando em duplicatas ou informações perdidas."
+
+#: ../src/gtk-ui/ui.glade.h:15
+msgid "Add new device"
+msgstr "Adicionar novo dispositivo"
+
+#: ../src/gtk-ui/ui.glade.h:16
+msgid "Add new service"
+msgstr "Adicionar serviço"
 
+#. explanation of "Restore backup" function
 #: ../src/gtk-ui/ui.glade.h:18
-msgid "Merge local and remote data (recommended)"
-msgstr "Intercalar dados locais e remotos (recomendado)"
+msgid "Backups are made before every time we Sync. Choose a backup to restore. Any changes you have made since then will be lost."
+msgstr "Backups são feitos antes de cada sincronização . Selecione um backup para restaurar. Quaisquer modificações que você fez depois serão perdidas."
 
 #: ../src/gtk-ui/ui.glade.h:19
-msgid "Password"
-msgstr "Senha"
-
-#: ../src/gtk-ui/ui.glade.h:20
-msgid "Reset original server settings"
-msgstr "Reinicializar configurações originais do servidor"
+msgid "Calendar"
+msgstr "Calendário"
 
+#. Button in main view, right side. Keep to below 20 chars per line, feel free to use two lines
 #: ../src/gtk-ui/ui.glade.h:21
-msgid "Save and use this service"
-msgstr "Salvar e usar este serviço"
-
-#: ../src/gtk-ui/ui.glade.h:22
-msgid "Select sync service"
-msgstr "Selecione serviço de sincronização"
-
-#: ../src/gtk-ui/ui.glade.h:23
-msgid "Server settings"
-msgstr "Configurações de servidor"
+msgid ""
+"Change or edit\n"
+"sync service"
+msgstr ""
+"Modificar ou editar\n"
+"serviço de sincronização"
 
+#. close button for settings window
 #: ../src/gtk-ui/ui.glade.h:24
-msgid "Service name"
-msgstr "Nome do serviço"
+msgid "Close"
+msgstr "Fechar"
 
 #: ../src/gtk-ui/ui.glade.h:25
 msgid ""
-"Sorry, you need an internet\n"
-"connection to sync."
+"Delete all data on Zyb \n"
+"and replace with your\n"
+"local information"
+msgstr ""
+"Excluir todos os dados no Zyb \n"
+"e substituir por suas\n"
+"informações locais"
+
+#: ../src/gtk-ui/ui.glade.h:28
+msgid ""
+"Delete all your local\n"
+"information and replace\n"
+"with data from Zyb"
+msgstr ""
+"Excluir todos as\n"
+"informações locais e\n"
+"substituir por dados de Zyb"
+
+#. button in main view, right side. Keep length to 20 characters or so, use two lines if needed
+#: ../src/gtk-ui/ui.glade.h:32
+msgid ""
+"Fix a sync\n"
+"emergency"
 msgstr ""
-"Sinto muito, você precisa de\n"
-"conexão internet para sincronizar."
+"Conserta uma sincronização \n"
+"emergência"
+
+#: ../src/gtk-ui/ui.glade.h:34
+msgid ""
+"If you don't see your service above but know that your sync provider uses SyncML\n"
+"you can setup a service manually."
+msgstr ""
+"Se não ver seu serviço acima, porém sabe que seu provedor de sinc. usa SyncML\n"
+"você poderá configurá-la manualmente."
 
-#: ../src/gtk-ui/ui.glade.h:27
-msgid "Stop using this service"
-msgstr "Pare de usar este serviço"
+#: ../src/gtk-ui/ui.glade.h:36
+msgid "Settings"
+msgstr "Configurações "
 
-#: ../src/gtk-ui/ui.glade.h:30
-msgid "Synchronization is not available (D-Bus service does not answer), sorry."
-msgstr "Sincronização não disponível (Serviço D-Bus não responde), sinto muito."
+#: ../src/gtk-ui/ui.glade.h:39
+msgid "Sync Emergency"
+msgstr "Emergência sincronização "
 
-#: ../src/gtk-ui/ui.glade.h:31
+#: ../src/gtk-ui/ui.glade.h:41
 msgid ""
 "To sync you'll need a network connection and an account with a sync service.\n"
 "We support the following services: "
@@ -506,17 +625,13 @@ msgstr ""
 "Para sincronizar você precisa de conexão de rede e uma conta com serviço\n"
 "de sincronização. Nós suportamos os seguintes serviços:"
 
-#: ../src/gtk-ui/ui.glade.h:33
-msgid "Username"
-msgstr "Nome do usuário"
+#: ../src/gtk-ui/ui.glade.h:43
+msgid "Use Bluetooth to Sync your data from one device to another."
+msgstr "Use Bluetooth para sincronização de dados de um dispositivo para outro."
 
-#: ../src/gtk-ui/ui.glade.h:34
-msgid ""
-"You haven't selected a sync service yet. Sync services let you \n"
-"synchronize your data between your netbook and a web service."
-msgstr ""
-"Você ainda não selecionou seu serviço de sincronização.  Serviços de sinc permitem a você \n"
-"sincronizar seus dados entre netbook e um serviço da web."
+#: ../src/gtk-ui/ui.glade.h:44
+msgid "You will need to add Bluetooth devices before they can be synced."
+msgstr "Você precisará adicionar dispositivos Bluetooth antes que eles possam fazer sincronização."
 
 #: ../src/gtk-ui/sync.desktop.in.h:2
 #: ../src/gtk-ui/sync-gtk.desktop.in.h:2
@@ -527,6 +642,311 @@ msgstr "Atualizado"
 msgid "Sync (GTK)"
 msgstr "Sincronizar (GTK)"
 
+#: ../src/gtk-ui/sync-config-widget.c:74
+msgid "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in sync."
+msgstr "ScheduleWorld possibilita manter sincronizados seus contatos, eventos, tarefas e anotações."
+
+#: ../src/gtk-ui/sync-config-widget.c:77
+msgid "Google Sync can backup and synchronize your contacts with your Gmail contacts."
+msgstr "Google Sync pode fazer backup e sincronizar seus contatos com seus contatos Gmail."
+
+#. TRANSLATORS: Please include the word "demo" (or the equivalent in
+#. your language): Funambol is going to be a 90 day demo service
+#. in the future
+#: ../src/gtk-ui/sync-config-widget.c:83
+msgid "Backup your contacts and calendar. Sync with a single click, anytime, anywhere (DEMO)."
+msgstr "Faça backup de seus contatos e calendário. Sincronize com um só clique, a qualquer hora em qualquer lugar (DEMO)."
+
+#: ../src/gtk-ui/sync-config-widget.c:86
+msgid "Mobical Backup and Restore service allows you to securely backup your personal mobile data for free."
+msgstr "O serviço Backup e Restauração Mobical permite o backup seguro de seus dados móveis pessoais de graça."
+
+#: ../src/gtk-ui/sync-config-widget.c:89
+msgid "ZYB is a simple way for people to store and share mobile information online."
+msgstr "ZYB é uma maneira simples para as pessoas armazenarem e compartilharem informações móveis online."
+
+#: ../src/gtk-ui/sync-config-widget.c:92
+msgid "Memotoo lets you access your personal data from any computer connected to the Internet."
+msgstr "Memotoo permite a você acessar seus dados pessoais de qualquer computador conectado a Internet."
+
+#: ../src/gtk-ui/sync-config-widget.c:188
+msgid "Sorry, failed to save the configuration"
+msgstr "Sinto muito, falha ao salvar a configuração"
+
+#: ../src/gtk-ui/sync-config-widget.c:377
+msgid "Service must have a name and server URL"
+msgstr "Serviço tem que ter um nome e um URL de servidor"
+
+#: ../src/gtk-ui/sync-config-widget.c:418
+#, c-format
+msgid "Do you want to reset the settings for %s? This will not remove any synced information on either end."
+msgstr "Você quer restaurar as configurações para %s? Isto não removerá qualquer informação sincronizada em cada lado."
+
+#. TRANSLATORS: buttons in reset-service warning dialog
+#: ../src/gtk-ui/sync-config-widget.c:422
+msgid "Yes, reset"
+msgstr "Sim, redefinir"
+
+#: ../src/gtk-ui/sync-config-widget.c:423
+#: ../src/gtk-ui/sync-config-widget.c:434
+msgid "No, keep settings"
+msgstr "Não, manter configurações  "
+
+#: ../src/gtk-ui/sync-config-widget.c:428
+#, c-format
+msgid "Do you want to delete the settings for %s? This will not remove any synced information on either end but it will remove these settings."
+msgstr "Você quer excluir as configurações para %s? Isto não removerá qualquer informação sincronizada de cada lado, mas removerá essas configurações."
+
+#. TRANSLATORS: buttons in delete-service warning dialog
+#: ../src/gtk-ui/sync-config-widget.c:433
+msgid "Yes, delete"
+msgstr "Sim, excluir  "
+
+#: ../src/gtk-ui/sync-config-widget.c:463
+msgid "Reset settings"
+msgstr "Redefinir configurações  "
+
+#: ../src/gtk-ui/sync-config-widget.c:466
+msgid "Delete settings"
+msgstr "Excluir configurações"
+
+#: ../src/gtk-ui/sync-config-widget.c:476
+msgid "Save and use"
+msgstr "Salvar e usar"
+
+#: ../src/gtk-ui/sync-config-widget.c:479
+msgid ""
+"Save and replace\n"
+"current service"
+msgstr ""
+"Salvar e substituir\n"
+"serviço atual"
+
+#: ../src/gtk-ui/sync-config-widget.c:489
+msgid "Stop using device"
+msgstr "Parar de usar o dispositivo"
+
+#: ../src/gtk-ui/sync-config-widget.c:492
+msgid "Stop using service"
+msgstr "Pare de usar o serviço"
+
+#. TRANSLATORS: label for an entry in service configuration form.
+#. * Placeholder is a source  name.
+#. * Example: "Appointments URI"
+#: ../src/gtk-ui/sync-config-widget.c:675
+#, c-format
+msgid "%s URI"
+msgstr "URI: %s"
+
+#. TRANSLATORS: toggles in service configuration form, placeholder is service
+#. * or device name
+#: ../src/gtk-ui/sync-config-widget.c:850
+#, c-format
+msgid "Send changes to %s"
+msgstr "Enviar mudanças para %s"
+
+#: ../src/gtk-ui/sync-config-widget.c:855
+#, c-format
+msgid "Receive changes from %s"
+msgstr "Receber modificações de %s"
+
+#: ../src/gtk-ui/sync-config-widget.c:871
+msgid "<b>Sync</b>"
+msgstr "<b>Sincronização</b>"
+
+#. TRANSLATORS: label of a entry in service configuration
+#: ../src/gtk-ui/sync-config-widget.c:887
+msgid "Server address"
+msgstr "Endereço de servidor"
+
+#. TRANSLATORS: explanation before a device template combobox.
+#. * Placeholder is a device name like 'Nokia N85' or 'Syncevolution
+#. * Client'
+#: ../src/gtk-ui/sync-config-widget.c:963
+#, c-format
+msgid "This device looks like it might be a '%s'. If this is not correct, please take a look at the list of supported devices and pick yours if it is listed"
+msgstr "Este dispositivo parece ser um '%s'. Se isto não for o caso, favor verificar a lista de dispositivos suportados e selecione o seu se constar da lista"
+
+#: ../src/gtk-ui/sync-config-widget.c:969
+msgid "We don't know what this device is exactly. Please take a look at the list of supported devices and pick yours if it is listed"
+msgstr "Não sabemos que dispositivo isto é exatamente. Favor verificar a lista de dispositivos suportados e selecione o seu se constar da lista"
+
+#: ../src/gtk-ui/sync-config-widget.c:1122
+#, c-format
+msgid "%s - Bluetooth device"
+msgstr "%s - dispositivo Bluetooth "
+
+#. TRANSLATORS: service title for services that are not based on a
+#. * template in service list, the placeholder is the name of the service
+#: ../src/gtk-ui/sync-config-widget.c:1128
+#, c-format
+msgid "%s - manually setup"
+msgstr "%s - configurar manualmente"
+
+#. TRANSLATORS: link button in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1803
+msgid "Launch website"
+msgstr "Iniciar o site na web"
+
+#. TRANSLATORS: button in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1812
+msgid "Setup now"
+msgstr "Configure agora"
+
+#. TRANSLATORS: labels of entries in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1908
+msgid "Username"
+msgstr "Nome do usuário"
+
+#: ../src/gtk-ui/sync-config-widget.c:1923
+msgid "Password"
+msgstr "Senha"
+
+#. TRANSLATORS: warning in service configuration form for people
+#. who have modified the configuration via other means.
+#: ../src/gtk-ui/sync-config-widget.c:1946
+msgid "Current configuration is more complex than what can be shown here. Changes to sync mode or synced data types will overwrite that configuration."
+msgstr "Atual configuração é complexa demais para ser mostrada aqui. As modificações ao modo sincronização ou tipos de dados sincronizados substituirão aquela configuração,"
+
+#. TRANSLATORS: this is the epander label for server settings
+#. in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1965
+msgid "Hide server settings"
+msgstr "Ocultar configurações de servidor"
+
+#. TRANSLATORS: this is the epander label for server settings
+#. in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1985
+msgid "Show server settings"
+msgstr "Mostrar configurações de servidor"
+
+#: ../src/gnome-bluetooth/syncevolution.c:110
+msgid "Sync in the Sync application"
+msgstr "Sincronização no aplicativo Sync"
+
+#: ../src/syncevo-dbus-server.cpp:5622
+#, c-format
+msgid "%s is syncing"
+msgstr "%s está sincronizando"
+
+#: ../src/syncevo-dbus-server.cpp:5623
+#, c-format
+msgid "We have just started to sync your computer with the %s sync service."
+msgstr "Começamos a sincronização de seu computador com o serviço de sincronização %s."
+
+#. if sync is successfully started and done
+#: ../src/syncevo-dbus-server.cpp:5637
+#, c-format
+msgid "%s sync complete"
+msgstr "%s Sincronização completada"
+
+#: ../src/syncevo-dbus-server.cpp:5638
+#, c-format
+msgid "We have just finished syncing your computer with the %s sync service."
+msgstr "Completamos a sincronização de seu computador com o serviço de sincronização %s."
+
+#. if sync is successfully started and has errors, or not started successful with a fatal problem
+#: ../src/syncevo-dbus-server.cpp:5643
+msgid "Sync problem."
+msgstr "Problema com sincronização. "
+
+#: ../src/syncevo-dbus-server.cpp:5644
+msgid "Sorry, there's a problem with your sync that you need to attend to."
+msgstr "Sinto muito, existe um problema com sua sincronização e necessita a sua atenção."
+
+#: ../src/syncevo-dbus-server.cpp:5717
+msgid "View"
+msgstr "Visualizar"
+
+#: ../src/syncevo-dbus-server.cpp:5718
+msgid "Dismiss"
+msgstr "Ignorar"
+
+#~ msgid "Database error"
+#~ msgstr "Erro de banco de dados"
+#~ msgid ""
+#~ "Do you want to replace %s with %s? This will not remove any synced "
+#~ "information on either end but you will no longer be able to sync with %s."
+#~ msgstr ""
+#~ "Você quer substituir %s com %s? Isto não removerá qualquer informação de "
+#~ "sincronização nos dois lados porém não poderá mais fazer sincronização "
+#~ "vom %s."
+#~ msgid "Yes, use %s"
+#~ msgstr "Sim, use %s"
+#~ msgid "No, use %s"
+#~ msgstr "Não, use %s"
+#~ msgid "Reset service"
+#~ msgstr "Redefinir serviço"
+#~ msgid "Addressbook"
+#~ msgstr "Endereços"
+#~ msgid "Todo"
+#~ msgstr "Tarefas"
+#~ msgid "Memo"
+#~ msgstr "Anotação"
+#~ msgid "Failed to save current service in GConf configuration system"
+#~ msgstr "Falha ao salvar o serviço atual no sistema de configuração do GConf"
+#~ msgid "Failed to save service configuration to SyncEvolution"
+#~ msgstr "Falha ao salvar a configuração de serviço ao SyncEvolution"
+#~ msgid "Failed to get service configuration from SyncEvolution"
+#~ msgstr "Falha ao buscar a configuração de serviço do SyncEvolution"
+#~ msgid "Failed to remove service configuration from SyncEvolution"
+#~ msgstr "Falha ao remover a configuração de serviço do SyncEvolution"
+#~ msgid "Failed to cancel: sync was no longer in progress"
+#~ msgstr "Falhou ao cancelar: sincronização não estava em andamento"
+#~ msgid "Failed to cancel sync"
+#~ msgstr "Falha ao cancelar sincronização"
+#~ msgid "Canceling sync"
+#~ msgstr "Cancelando sincronização"
+#~ msgid "No sources are enabled, not syncing"
+#~ msgstr "Nenhuma fonte habilitada, não sincronizando."
+#~ msgid "A sync is already in progress"
+#~ msgstr "Sincronização já em andamento"
+#~ msgid "Failed to start sync"
+#~ msgstr "Falha no início da sincronização"
+#~ msgid "%s (not supported by this service)"
+#~ msgstr "%s: (não suportado por este serviço)"
+#~ msgid "Failed to get server configuration from SyncEvolution"
+#~ msgstr "Não conseguiu a configuração do servidor do SyncEvolution"
+#~ msgid "Server URL"
+#~ msgstr "URL de servidor"
+#~ msgid "Failed to get list of manually setup services from SyncEvolution"
+#~ msgstr ""
+#~ "Não conseguiu a lista de serviços configurados manualmente do "
+#~ "SyncEvolution"
+#~ msgid "Service configuration not found"
+#~ msgstr "Configuração de serviço não localizado"
+#~ msgid "Not authorized"
+#~ msgstr "Não autorizado"
+#~ msgid "Not found"
+#~ msgstr "Não localizado"
+#~ msgid "Transport failure (no connection?)"
+#~ msgstr "Falha de transporte (sem conexão?)"
+#~ msgid "Connection timed out"
+#~ msgstr "Conexão expirou"
+#~ msgid "Sync canceled"
+#~ msgstr "Sinc. cancelado"
+#~ msgid "Ending sync"
+#~ msgstr "Terminando sinc."
+#~ msgid "<b>No sync service in use</b>"
+#~ msgstr "<b>Nenhum serviço de sincronização em uso</b>"
+#~ msgid "<big>Manual setup</big>"
+#~ msgstr "<big>Configuração manual</big>"
+#~ msgid "Merge local and remote data (recommended)"
+#~ msgstr "Intercalar dados locais e remotos (recomendado)"
+#~ msgid "Reset original server settings"
+#~ msgstr "Reinicializar configurações originais do servidor"
+#~ msgid "Service name"
+#~ msgstr "Nome do serviço"
+#~ msgid ""
+#~ "Sorry, you need an internet\n"
+#~ "connection to sync."
+#~ msgstr ""
+#~ "Sinto muito, você precisa de\n"
+#~ "conexão internet para sincronizar."
+#~ msgid ""
+#~ "Synchronization is not available (D-Bus service does not answer), sorry."
+#~ msgstr ""
+#~ "Sincronização não disponível (Serviço D-Bus não responde), sinto muito."
 #~ msgid "Last time: Received one change."
 #~ msgid_plural "Last time: Received %d changes."
 #~ msgstr[0] "Ultima vez: Recebeu uma mudança."
diff --git a/po/ru.po b/po/ru.po
new file mode 100644 (file)
index 0000000..5fb2a93
--- /dev/null
+++ b/po/ru.po
@@ -0,0 +1,888 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: http://moblin.org/projects/syncevolution\n"
+"POT-Creation-Date: 2010-04-05 09:22+0000\n"
+"PO-Revision-Date: 2010-04-06 16:52+0200\n"
+"Last-Translator: Yuri Nazarenko <yuri.nazarenko@gmail.com>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n!=1;\n"
+"X-Poedit-Language: Russian\n"
+"X-Poedit-SourceCharset: utf-8\n"
+
+#. TRANSLATORS: this is the application name that may be used by e.g.
+#. the windowmanager
+#: ../src/gtk-ui/main.c:40
+#: ../src/gtk-ui/ui.glade.h:38
+#: ../src/gtk-ui/sync.desktop.in.h:1
+#: ../src/gnome-bluetooth/syncevolution.c:112
+msgid "Sync"
+msgstr "Sync"
+
+#: ../src/gtk-ui/sync-ui.c:260
+msgid "Contacts"
+msgstr "Контакты"
+
+#: ../src/gtk-ui/sync-ui.c:262
+msgid "Appointments"
+msgstr "Встречи"
+
+#: ../src/gtk-ui/sync-ui.c:264
+#: ../src/gtk-ui/ui.glade.h:40
+msgid "Tasks"
+msgstr "Задания"
+
+#: ../src/gtk-ui/sync-ui.c:266
+msgid "Notes"
+msgstr "Примечания"
+
+#. TRANSLATORS: This is a "combination source" for syncing with devices
+#. * that combine appointments and tasks. the name should match the ones
+#. * used for calendar and todo above
+#: ../src/gtk-ui/sync-ui.c:271
+msgid "Appointments & Tasks"
+msgstr "Встречи и задания"
+
+#: ../src/gtk-ui/sync-ui.c:343
+msgid "Starting sync"
+msgstr "Начало синхронизации"
+
+#. TRANSLATORS: slow sync confirmation dialog message. Placeholder
+#. * is service/device name
+#: ../src/gtk-ui/sync-ui.c:381
+#, c-format
+msgid "Do you want to slow sync with %s?"
+msgstr "Замедлить синхронизацию с %s?"
+
+#: ../src/gtk-ui/sync-ui.c:385
+msgid "Yes, do slow sync"
+msgstr "Да, замедлить синхронизацию"
+
+#: ../src/gtk-ui/sync-ui.c:385
+msgid "No, cancel sync"
+msgstr "Нет, отменить синхронизацию"
+
+#. TRANSLATORS: confirmation dialog for refresh-from-server. Placeholder
+#. * is service/device name
+#: ../src/gtk-ui/sync-ui.c:418
+#, c-format
+msgid "Do you want to delete all local data and replace it with data from %s? This is not usually advised."
+msgstr "Удалить все локальные данные и заменить их на %s? Обычно это не рекомендуется."
+
+#: ../src/gtk-ui/sync-ui.c:423
+#: ../src/gtk-ui/sync-ui.c:454
+msgid "Yes, delete and replace"
+msgstr "Да, удалить и заменить"
+
+#: ../src/gtk-ui/sync-ui.c:423
+#: ../src/gtk-ui/sync-ui.c:454
+#: ../src/gtk-ui/sync-ui.c:1566
+msgid "No"
+msgstr "Нет"
+
+#. TRANSLATORS: confirmation dialog for refresh-from-client. Placeholder
+#. * is service/device name
+#: ../src/gtk-ui/sync-ui.c:449
+#, c-format
+msgid "Do you want to delete all data in %s and replace it with your local data? This is not usually advised."
+msgstr "Хотите удалить все данные в %s и заменить на ваши локальные данные? Обычно это не рекомендуется."
+
+#: ../src/gtk-ui/sync-ui.c:481
+msgid "Trying to cancel sync"
+msgstr "Попытка отменить синхронизацию"
+
+#: ../src/gtk-ui/sync-ui.c:521
+msgid "No service or device selected"
+msgstr "Служба или устройство не выбраны"
+
+#. TRANSLATORS: This is the title on main view. Placeholder is
+#. * the service name. Example: "Google - synced just now"
+#: ../src/gtk-ui/sync-ui.c:529
+#, c-format
+msgid "%s - synced just now"
+msgstr "%s - синхронизировано сейчас"
+
+#: ../src/gtk-ui/sync-ui.c:533
+#, c-format
+msgid "%s - synced a minute ago"
+msgstr "%s - синхронизировано минуту назад"
+
+#: ../src/gtk-ui/sync-ui.c:537
+#, c-format
+msgid "%s - synced %ld minutes ago"
+msgstr "%s - синхронизировано %ld минут назад"
+
+#: ../src/gtk-ui/sync-ui.c:542
+#, c-format
+msgid "%s - synced an hour ago"
+msgstr "%s - синхронизировано час назад"
+
+#: ../src/gtk-ui/sync-ui.c:546
+#, c-format
+msgid "%s - synced %ld hours ago"
+msgstr "%s - синхронизировано %ld часов назад"
+
+#: ../src/gtk-ui/sync-ui.c:551
+#, c-format
+msgid "%s - synced a day ago"
+msgstr "%s - синхронизировано день назад"
+
+#: ../src/gtk-ui/sync-ui.c:555
+#, c-format
+msgid "%s - synced %ld days ago"
+msgstr "%s - синхронизировано %ld дней назад"
+
+#. TRANSLATORS: Action button in info bar in main view. Shown with e.g.
+#. * "You've just restored a backup. The changes have not been "
+#. * "synced with %s yet"
+#: ../src/gtk-ui/sync-ui.c:604
+#: ../src/gtk-ui/sync-ui.c:719
+msgid "Sync now"
+msgstr "Синхронизировать сейчас"
+
+#. TRANSLATORS: Action button in info bar in main view. Shown with e.g.
+#. * "A normal sync is not possible at this time..." message.
+#. * "Other options" will open Emergency view
+#: ../src/gtk-ui/sync-ui.c:610
+#: ../src/gtk-ui/ui.glade.h:37
+msgid "Slow sync"
+msgstr "Медленная синхронизация"
+
+#: ../src/gtk-ui/sync-ui.c:611
+msgid "Other options..."
+msgstr "Другие варианты..."
+
+#. TRANSLATORS: Action button in info bar in main view. Shown e.g.
+#. * when no service is selected. Will open configuration view
+#: ../src/gtk-ui/sync-ui.c:616
+msgid "Select sync service"
+msgstr "Выбрать службу синхронизации"
+
+#. TRANSLATORS: Action button in info bar in main view. Shown e.g.
+#. * login to service fails. Will open configuration view for this service
+#: ../src/gtk-ui/sync-ui.c:621
+msgid "Edit service settings"
+msgstr "Редактировать настройки службы"
+
+#: ../src/gtk-ui/sync-ui.c:670
+msgid "You haven't selected a sync service or device yet. Sync services let you synchronize your data between your netbook and a web service. You can also sync directly with some devices."
+msgstr "Служба синхронизации или устройство еще не выбраны. Службы синхронизации позволяют синхронизировать данные между нетбуком и веб-службой. Кроме того, вы можете выполнить синхронизацию непосредственно с некоторыми устройствами."
+
+#: ../src/gtk-ui/sync-ui.c:717
+msgid "Sync again"
+msgstr "Синхронизировать повторно"
+
+#: ../src/gtk-ui/sync-ui.c:730
+msgid "Restoring"
+msgstr "Восстановление"
+
+#: ../src/gtk-ui/sync-ui.c:732
+msgid "Syncing"
+msgstr "Синхронизация"
+
+#. TRANSLATORS: This is for the button in main view, right side.
+#. Keep line length below ~20 characters, use two lines if needed
+#: ../src/gtk-ui/sync-ui.c:743
+#: ../src/gtk-ui/sync-ui.c:3358
+msgid "Cancel sync"
+msgstr "Отменить синхронизацию"
+
+#: ../src/gtk-ui/sync-ui.c:908
+msgid "Back to sync"
+msgstr "Вернуться к синхронизации"
+
+#. TRANSLATORS: label for checkbutton/toggle in main view.
+#. * Please stick to similar length strings or break the line with
+#. * "\n" if absolutely needed
+#: ../src/gtk-ui/sync-ui.c:1209
+msgid "Automatic sync"
+msgstr "Автоматическая синхронизация"
+
+#. This is the expander label in emergency view. It summarizes the
+#. * currently selected data sources. First placeholder is service/device
+#. * name, second a comma separeted list of sources.
+#. * E.g. "Affected data: Google Contacts, Appointments"
+#: ../src/gtk-ui/sync-ui.c:1480
+#, c-format
+msgid "Affected data: %s %s"
+msgstr "Поврежденные данные: %s %s"
+
+#: ../src/gtk-ui/sync-ui.c:1485
+#, c-format
+msgid "Affected data: none"
+msgstr "Поврежденные данные: нет"
+
+#. TRANSLATORS: confirmation for restoring a backup. placeholder is the
+#. * backup time string defined below
+#: ../src/gtk-ui/sync-ui.c:1563
+#, c-format
+msgid "Do you want to restore the backup from %s? All changes you have made since then will be lost."
+msgstr "Восстановить резервные файлы из %s? Все внесенные изменения будут утрачены."
+
+#: ../src/gtk-ui/sync-ui.c:1566
+msgid "Yes, restore"
+msgstr "Да, восстановить"
+
+#. TRANSLATORS: date/time for strftime(), used in emergency view backup
+#. * label. Any time format that shows date and time is good.
+#: ../src/gtk-ui/sync-ui.c:1598
+#, c-format
+msgid "%x %X"
+msgstr "%x %X"
+
+#. TRANSLATORS: label for a backup in emergency view. Placeholder is
+#. * service or device name
+#: ../src/gtk-ui/sync-ui.c:1617
+#, c-format
+msgid "Backed up before syncing with %s"
+msgstr "Создана резервная копия перед синхронизацией с %s"
+
+#: ../src/gtk-ui/sync-ui.c:1634
+msgid "Restore"
+msgstr "Восстановить"
+
+#. TRANSLATORS: this is an explanation in Emergency view.
+#. * Placeholder is a service/device name
+#: ../src/gtk-ui/sync-ui.c:1741
+#, c-format
+msgid "A normal sync with %s is not possible at this time. You can do a slow two-way sync or start from scratch. You can also restore a backup, but a slow sync or starting from scratch will still be required before normal sync is possible."
+msgstr "В настоящий момент стандартная синхронизация с %s невозможна. Вы можете выполнить медленную двустороннюю синхронизацию или начать с черновой версии. Вы также можете восстановить резервную копию, но медленная синхронизация или черновая вресия все еще будут необходимы до того, как стандартная синхронизация станет возможной."
+
+#: ../src/gtk-ui/sync-ui.c:1751
+#, c-format
+msgid "If something has gone horribly wrong, you can try a slow sync, start from scratch or restore from backup."
+msgstr "При наличии серьезных сбоев можно попробовать выполнить медленную синхронизацию, запуск с черновой версии или восстановление резервной копии."
+
+#. TRANSLATORS: These are a buttons in Emergency view. Placeholder is a
+#. * service/device name. Please don't use too long lines, but feel free to
+#. * use several lines.
+#: ../src/gtk-ui/sync-ui.c:1760
+#, c-format
+msgid ""
+"Delete all your local\n"
+"data and replace with\n"
+"data from %s"
+msgstr ""
+"Удалите все свои локальные\n"
+"данные и замените на\n"
+"данные из %s"
+
+#: ../src/gtk-ui/sync-ui.c:1766
+#, c-format
+msgid ""
+"Delete all data on\n"
+"%s and replace\n"
+"with your local data"
+msgstr ""
+"Удалите все данные на\n"
+"%s и замените\n"
+"на свои локальные данные"
+
+#: ../src/gtk-ui/sync-ui.c:2226
+msgid "Failed to get list of supported services from SyncEvolution"
+msgstr "Не удалось получить список поддерживаемых служб от SyncEvolution"
+
+#: ../src/gtk-ui/sync-ui.c:2280
+msgid "There was a problem communicating with the sync process. Please try again later."
+msgstr "проблема установки связи с процессом синхронизации. Повторите попытку позже."
+
+#: ../src/gtk-ui/sync-ui.c:2339
+msgid "Restore failed"
+msgstr "Восстановление не удалось"
+
+#: ../src/gtk-ui/sync-ui.c:2342
+#: ../src/gtk-ui/sync-ui.c:3227
+msgid "Sync failed"
+msgstr "Синхронизация не удалась"
+
+#: ../src/gtk-ui/sync-ui.c:2348
+msgid "Restore complete"
+msgstr "Восстановление завершено"
+
+#: ../src/gtk-ui/sync-ui.c:2351
+msgid "Sync complete"
+msgstr "Синхронизация завершена"
+
+#: ../src/gtk-ui/sync-ui.c:2443
+#, c-format
+msgid "Preparing '%s'"
+msgstr "Подготовка '%s'"
+
+#: ../src/gtk-ui/sync-ui.c:2446
+#, c-format
+msgid "Receiving '%s'"
+msgstr "Получение '%s'"
+
+#: ../src/gtk-ui/sync-ui.c:2449
+#, c-format
+msgid "Sending '%s'"
+msgstr "Отправка '%s'"
+
+#: ../src/gtk-ui/sync-ui.c:2570
+#, c-format
+msgid "There was one remote rejection."
+msgid_plural "There were %ld remote rejections."
+msgstr[0] "Был один удаленный отказ."
+msgstr[1] "Было %ld удаленных отказов."
+
+#: ../src/gtk-ui/sync-ui.c:2575
+#, c-format
+msgid "There was one local rejection."
+msgid_plural "There were %ld local rejections."
+msgstr[0] "Был один локальный отказ."
+msgstr[1] "Было %ld локальных отказов."
+
+#: ../src/gtk-ui/sync-ui.c:2580
+#, c-format
+msgid "There were %ld local rejections and %ld remote rejections."
+msgstr "Было %ld локальных и %ld удаленных отказов."
+
+#: ../src/gtk-ui/sync-ui.c:2585
+#, c-format
+msgid "Last time: No changes."
+msgstr "Прошлый раз: без изменений."
+
+#: ../src/gtk-ui/sync-ui.c:2587
+#, c-format
+msgid "Last time: Sent one change."
+msgid_plural "Last time: Sent %ld changes."
+msgstr[0] "Прошлый раз: отправлено одно изменение."
+msgstr[1] "Прошлый раз: отправлено %ld изменений."
+
+#. This is about changes made to the local data. Not all of these
+#. changes were requested by the remote server, so "applied"
+#. is a better word than "received" (bug #5185).
+#: ../src/gtk-ui/sync-ui.c:2595
+#, c-format
+msgid "Last time: Applied one change."
+msgid_plural "Last time: Applied %ld changes."
+msgstr[0] "Прошлый раз: применено одно изменение."
+msgstr[1] "Прошлый раз: применено %ld изменений."
+
+#: ../src/gtk-ui/sync-ui.c:2600
+#, c-format
+msgid "Last time: Applied %ld changes and sent %ld changes."
+msgstr "Прошлый раз: применено %ld и отправлено %ld изменений."
+
+#. TRANSLATORS: the placeholder is a error message (hopefully)
+#. * explaining the problem
+#: ../src/gtk-ui/sync-ui.c:2807
+#, c-format
+msgid ""
+"There was a problem with last sync:\n"
+"%s"
+msgstr ""
+"Ошибка во время последней синхронизации:\n"
+"%s"
+
+#: ../src/gtk-ui/sync-ui.c:2817
+#, c-format
+msgid "You've just restored a backup. The changes have not been synced with %s yet"
+msgstr "Вы только что восстановили резервную копию. Изменения еще не синхронизированы с %s"
+
+#: ../src/gtk-ui/sync-ui.c:3105
+msgid "Waiting for current operation to finish..."
+msgstr "Ожидание окончания текущей операции..."
+
+#. TRANSLATORS: next strings are error messages.
+#: ../src/gtk-ui/sync-ui.c:3139
+msgid "A normal sync is not possible at this time. The server suggests a slow sync, but this might not always be what you want if both ends already have data."
+msgstr "В настоящий момент стандартная синхронизация невозможна. Сервер предлагает медленную синхронизацию, но это не всегда приводит к желаемому результату, если на обеих сторонах уже имеются данные."
+
+#: ../src/gtk-ui/sync-ui.c:3143
+msgid "The sync process died unexpectedly."
+msgstr "Неожиданный сбой процесса синхронизации."
+
+#: ../src/gtk-ui/sync-ui.c:3148
+msgid "Password request was not answered. You can save the password in the settings to prevent the request."
+msgstr "Запрос пароля остался без ответа. Вы можете сохранить пароль в настройках для предупреждения запроса."
+
+#. TODO use the service device name here, this is a remote problem
+#: ../src/gtk-ui/sync-ui.c:3152
+msgid "There was a problem processing sync request. Trying again may help."
+msgstr "Проблема обработки запроса синхронизации. Возможно, повторная попытка может помочь."
+
+#: ../src/gtk-ui/sync-ui.c:3158
+msgid "Failed to login. Could there be a problem with your username or password?"
+msgstr "Не удалось войти в систему. Возможно, неправильное имя пользователя или пароль?"
+
+#: ../src/gtk-ui/sync-ui.c:3161
+msgid "Forbidden"
+msgstr "Запрещено"
+
+#. TRANSLATORS: data source means e.g. calendar or addressbook
+#: ../src/gtk-ui/sync-ui.c:3167
+msgid "A data source could not be found. Could there be a problem with the settings?"
+msgstr "Источник найти не удалось. Возможно, неправильные настройки."
+
+#: ../src/gtk-ui/sync-ui.c:3171
+msgid "Remote database error"
+msgstr "Ошибка удаленной базы данных"
+
+#. This can happen when EDS is borked, restart it may help...
+#: ../src/gtk-ui/sync-ui.c:3174
+msgid "There is a problem with the local database. Syncing again or rebooting may help."
+msgstr "Проблема локальной базы данных. Возможно, повторная синхронизация или перезагрузка могут помочь."
+
+#: ../src/gtk-ui/sync-ui.c:3177
+msgid "No space on disk"
+msgstr "Недостаточно свободного места на диске"
+
+#: ../src/gtk-ui/sync-ui.c:3179
+msgid "Failed to process SyncML"
+msgstr "Не удалось обработать SyncML"
+
+#: ../src/gtk-ui/sync-ui.c:3181
+msgid "Server authorization failed"
+msgstr "Авторизация сервера не удалась"
+
+#: ../src/gtk-ui/sync-ui.c:3183
+msgid "Failed to parse configuration file"
+msgstr "Преобразование файла конфигурации не удалось"
+
+#: ../src/gtk-ui/sync-ui.c:3185
+msgid "Failed to read configuration file"
+msgstr "Не удалось прочитать файл конфигурации"
+
+#: ../src/gtk-ui/sync-ui.c:3187
+msgid "No configuration found"
+msgstr "Конфигурация не найдена"
+
+#: ../src/gtk-ui/sync-ui.c:3189
+msgid "No configuration file found"
+msgstr "Файл конфигурации не найден"
+
+#: ../src/gtk-ui/sync-ui.c:3191
+msgid "Server sent bad content"
+msgstr "Сервер отправил недействительную информацию"
+
+#: ../src/gtk-ui/sync-ui.c:3193
+msgid "Connection certificate has expired"
+msgstr "Срок действия сертификата подключения истек"
+
+#: ../src/gtk-ui/sync-ui.c:3195
+msgid "Connection certificate is invalid"
+msgstr "Сертификат подключения недействителен"
+
+#: ../src/gtk-ui/sync-ui.c:3203
+msgid "We were unable to connect to the server. The problem could be temporary or there could be something wrong with the settings."
+msgstr "Не удалось подключиться к серверу. Проблема может быть временной, либо неправильно указаны настройки."
+
+#: ../src/gtk-ui/sync-ui.c:3210
+msgid "The server URL is bad"
+msgstr "Неверный URL-адрес сервера"
+
+#: ../src/gtk-ui/sync-ui.c:3215
+msgid "The server was not found"
+msgstr "Сервер найти не удалось"
+
+#: ../src/gtk-ui/sync-ui.c:3217
+#, c-format
+msgid "Error %d"
+msgstr "Ошибка %d"
+
+#. TRANSLATORS: password request dialog contents: title, cancel button
+#. * and ok button
+#: ../src/gtk-ui/sync-ui.c:3355
+msgid "Password is required for sync"
+msgstr "Для синхронизации требуется пароль"
+
+#: ../src/gtk-ui/sync-ui.c:3359
+msgid "Sync with password"
+msgstr "Синхронизация с паролем"
+
+#. TRANSLATORS: password request dialog message, placeholder is service name
+#: ../src/gtk-ui/sync-ui.c:3369
+#, c-format
+msgid "Please enter password for syncing with %s:"
+msgstr "Введите пароль для синхронизации с %s:"
+
+#. title for the buttons on the right side of main view
+#: ../src/gtk-ui/ui.glade.h:2
+msgid "<b>Actions</b>"
+msgstr "<b>Действия</b>"
+
+#. text between the two "start from scratch" buttons in emergency view
+#: ../src/gtk-ui/ui.glade.h:4
+msgid "<b>or</b>"
+msgstr "<b>или</b>"
+
+#: ../src/gtk-ui/ui.glade.h:5
+msgid "<big>Direct sync</big>"
+msgstr "<big>Прямая синхронизация</big>"
+
+#: ../src/gtk-ui/ui.glade.h:6
+msgid "<big>Network sync</big>"
+msgstr "<big>Сетевая синхронизация</big>"
+
+#. a title in emergency view
+#: ../src/gtk-ui/ui.glade.h:8
+msgid "<big>Restore from backup</big>"
+msgstr "<big>Восстановить из резервной копии</big>"
+
+#. a title in emergency view
+#: ../src/gtk-ui/ui.glade.h:10
+msgid "<big>Slow sync</big>"
+msgstr "<big>Медленная синхронизация</big>"
+
+#. a title in emergency view
+#: ../src/gtk-ui/ui.glade.h:12
+msgid "<big>Start from scratch</big>"
+msgstr "<big>Запуск из черновой версии</big>"
+
+#: ../src/gtk-ui/ui.glade.h:13
+msgid ""
+"A slow sync compares items from both sides and tries to merge them. \n"
+"This may fail in some cases, leading to duplicates or lost information."
+msgstr ""
+"При медленной синхронизации сравниваются элементы с обеих сторон и выполняется попытка их объединения. \n"
+"В некоторых случаях это может закончиться сбоем и стать причиной появлений копий данных или их утраты. "
+
+#: ../src/gtk-ui/ui.glade.h:15
+msgid "Add new device"
+msgstr "Добавить новое устройство"
+
+#: ../src/gtk-ui/ui.glade.h:16
+msgid "Add new service"
+msgstr "Добавить новую службу"
+
+#. explanation of "Restore backup" function
+#: ../src/gtk-ui/ui.glade.h:18
+msgid "Backups are made before every time we Sync. Choose a backup to restore. Any changes you have made since then will be lost."
+msgstr "Резервные копии создаются перед каждой синхронизацией. Выберите одну из них для восстановления. Все изменения, внесенные после этого, будут утрачены."
+
+#: ../src/gtk-ui/ui.glade.h:19
+msgid "Calendar"
+msgstr "Календарь"
+
+#. Button in main view, right side. Keep to below 20 chars per line, feel free to use two lines
+#: ../src/gtk-ui/ui.glade.h:21
+msgid ""
+"Change or edit\n"
+"sync service"
+msgstr ""
+"Изменить или редактировать\n"
+"службу синхронизации"
+
+#. close button for settings window
+#: ../src/gtk-ui/ui.glade.h:24
+msgid "Close"
+msgstr "Закрыть"
+
+#: ../src/gtk-ui/ui.glade.h:25
+msgid ""
+"Delete all data on Zyb \n"
+"and replace with your\n"
+"local information"
+msgstr ""
+"Удалите все данные на Zyb \n"
+"и замените на свою\n"
+"локальную информацию"
+
+#: ../src/gtk-ui/ui.glade.h:28
+msgid ""
+"Delete all your local\n"
+"information and replace\n"
+"with data from Zyb"
+msgstr ""
+"Удалите всю свою локальную\n"
+"информацию и замените\n"
+"на данные из Zyb"
+
+#. button in main view, right side. Keep length to 20 characters or so, use two lines if needed
+#: ../src/gtk-ui/ui.glade.h:32
+msgid ""
+"Fix a sync\n"
+"emergency"
+msgstr ""
+"Исправить экстренную\n"
+"синхронизацию"
+
+#: ../src/gtk-ui/ui.glade.h:34
+msgid ""
+"If you don't see your service above but know that your sync provider uses SyncML\n"
+"you can setup a service manually."
+msgstr ""
+"Если служба не отображается вверху, но известно, что провайдер использует Sync,ML\n"
+"службу можно настроить вручную."
+
+#: ../src/gtk-ui/ui.glade.h:36
+msgid "Settings"
+msgstr "Настройки"
+
+#: ../src/gtk-ui/ui.glade.h:39
+msgid "Sync Emergency"
+msgstr "Экстренная синхронизация"
+
+#: ../src/gtk-ui/ui.glade.h:41
+msgid ""
+"To sync you'll need a network connection and an account with a sync service.\n"
+"We support the following services: "
+msgstr ""
+"Для синхронизации вам потребуется сетевое подключение и учетная запись со службой синхронизации.\n"
+"Поддерживаются следующие службы: "
+
+#: ../src/gtk-ui/ui.glade.h:43
+msgid "Use Bluetooth to Sync your data from one device to another."
+msgstr "Используйте bluetooth для синхронизации своих данных между устройствами."
+
+#: ../src/gtk-ui/ui.glade.h:44
+msgid "You will need to add Bluetooth devices before they can be synced."
+msgstr "Перед синхронизацией вам необходимо добавить устройства с поддержкой Bluetooth."
+
+#: ../src/gtk-ui/sync.desktop.in.h:2
+#: ../src/gtk-ui/sync-gtk.desktop.in.h:2
+msgid "Up to date"
+msgstr "Обновлено"
+
+#: ../src/gtk-ui/sync-gtk.desktop.in.h:1
+msgid "Sync (GTK)"
+msgstr "Sync (GTK)"
+
+#: ../src/gtk-ui/sync-config-widget.c:74
+msgid "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in sync."
+msgstr "ScheduleWorld позволяет хранить ваши контакты, информацию о событиях, задания и заметки в синхронном режиме."
+
+#: ../src/gtk-ui/sync-config-widget.c:77
+msgid "Google Sync can backup and synchronize your contacts with your Gmail contacts."
+msgstr "Google Sync может создавать резервные копии и синхронизировать ваши контакты с контактами в Gmail."
+
+#. TRANSLATORS: Please include the word "demo" (or the equivalent in
+#. your language): Funambol is going to be a 90 day demo service
+#. in the future
+#: ../src/gtk-ui/sync-config-widget.c:83
+msgid "Backup your contacts and calendar. Sync with a single click, anytime, anywhere (DEMO)."
+msgstr "Создайте резервные копии своих контактов и календаря. Выполните синхронизацию одним щелчком мыши в любое время и в любом месте (ДЕМО)."
+
+#: ../src/gtk-ui/sync-config-widget.c:86
+msgid "Mobical Backup and Restore service allows you to securely backup your personal mobile data for free."
+msgstr "Служба резервного копирования и восстановления данных Mobical позволяет вам безопасно и бесплатно создавать копии своих персональных мобильных данных."
+
+#: ../src/gtk-ui/sync-config-widget.c:89
+msgid "ZYB is a simple way for people to store and share mobile information online."
+msgstr "ZYB - это простой способ хранения и передачи мобильной информации в режиме онлайн."
+
+#: ../src/gtk-ui/sync-config-widget.c:92
+msgid "Memotoo lets you access your personal data from any computer connected to the Internet."
+msgstr "Memotoo позволяет вам получить доступ к своим персональным данным с любого компьютера, подключенного к Интернету."
+
+#: ../src/gtk-ui/sync-config-widget.c:188
+msgid "Sorry, failed to save the configuration"
+msgstr "Не удалось сохранить файл конфигурации"
+
+#: ../src/gtk-ui/sync-config-widget.c:377
+msgid "Service must have a name and server URL"
+msgstr "У службы должно быть имя и URL-адрес сервера"
+
+#: ../src/gtk-ui/sync-config-widget.c:418
+#, c-format
+msgid "Do you want to reset the settings for %s? This will not remove any synced information on either end."
+msgstr "Сбросить настройки для %s? Это не приведет к удалению какой-либо синхронизированной информации на любой из сторон."
+
+#. TRANSLATORS: buttons in reset-service warning dialog
+#: ../src/gtk-ui/sync-config-widget.c:422
+msgid "Yes, reset"
+msgstr "Да, сбросить"
+
+#: ../src/gtk-ui/sync-config-widget.c:423
+#: ../src/gtk-ui/sync-config-widget.c:434
+msgid "No, keep settings"
+msgstr "Нет, сохранить настройки"
+
+#: ../src/gtk-ui/sync-config-widget.c:428
+#, c-format
+msgid "Do you want to delete the settings for %s? This will not remove any synced information on either end but it will remove these settings."
+msgstr "Удалить настройки для %s? Это не приведет к удалению какой-либо синхронизированной информации на любой стороне, но при этом эти настройки будут удалены."
+
+#. TRANSLATORS: buttons in delete-service warning dialog
+#: ../src/gtk-ui/sync-config-widget.c:433
+msgid "Yes, delete"
+msgstr "Да, удалить"
+
+#: ../src/gtk-ui/sync-config-widget.c:463
+msgid "Reset settings"
+msgstr "Сбросить настройки"
+
+#: ../src/gtk-ui/sync-config-widget.c:466
+msgid "Delete settings"
+msgstr "Удалить настройки"
+
+#: ../src/gtk-ui/sync-config-widget.c:476
+msgid "Save and use"
+msgstr "Сохранить и использовать"
+
+#: ../src/gtk-ui/sync-config-widget.c:479
+msgid ""
+"Save and replace\n"
+"current service"
+msgstr ""
+"Сохранить и заменить\n"
+"текущую службу"
+
+#: ../src/gtk-ui/sync-config-widget.c:489
+msgid "Stop using device"
+msgstr "Прекратить использование устройства"
+
+#: ../src/gtk-ui/sync-config-widget.c:492
+msgid "Stop using service"
+msgstr "Прекратить использование сервера"
+
+#. TRANSLATORS: label for an entry in service configuration form.
+#. * Placeholder is a source  name.
+#. * Example: "Appointments URI"
+#: ../src/gtk-ui/sync-config-widget.c:675
+#, c-format
+msgid "%s URI"
+msgstr "URL-адрес %s"
+
+#. TRANSLATORS: toggles in service configuration form, placeholder is service
+#. * or device name
+#: ../src/gtk-ui/sync-config-widget.c:850
+#, c-format
+msgid "Send changes to %s"
+msgstr "Отправить изменения в %s"
+
+#: ../src/gtk-ui/sync-config-widget.c:855
+#, c-format
+msgid "Receive changes from %s"
+msgstr "Получить изменения от %s"
+
+#: ../src/gtk-ui/sync-config-widget.c:871
+msgid "<b>Sync</b>"
+msgstr "<b>Sync</b>"
+
+#. TRANSLATORS: label of a entry in service configuration
+#: ../src/gtk-ui/sync-config-widget.c:887
+msgid "Server address"
+msgstr "Адрес сервера"
+
+#. TRANSLATORS: explanation before a device template combobox.
+#. * Placeholder is a device name like 'Nokia N85' or 'Syncevolution
+#. * Client'
+#: ../src/gtk-ui/sync-config-widget.c:963
+#, c-format
+msgid "This device looks like it might be a '%s'. If this is not correct, please take a look at the list of supported devices and pick yours if it is listed"
+msgstr "Возможно, это устройство - '%s'. Если это неверно, просмотрите список поддерживаемых устройств и выберите свое, если оно указано"
+
+#: ../src/gtk-ui/sync-config-widget.c:969
+msgid "We don't know what this device is exactly. Please take a look at the list of supported devices and pick yours if it is listed"
+msgstr "Невозможно точно установить тип устройства. Просмотрите список поддерживаемых устройств и выберите свое, если оно указано"
+
+#: ../src/gtk-ui/sync-config-widget.c:1122
+#, c-format
+msgid "%s - Bluetooth device"
+msgstr "%s - Bluetooth-устройство"
+
+#. TRANSLATORS: service title for services that are not based on a
+#. * template in service list, the placeholder is the name of the service
+#: ../src/gtk-ui/sync-config-widget.c:1128
+#, c-format
+msgid "%s - manually setup"
+msgstr "%s - ручная настройка"
+
+#. TRANSLATORS: link button in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1803
+msgid "Launch website"
+msgstr "Открыть веб-сайт"
+
+#. TRANSLATORS: button in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1812
+msgid "Setup now"
+msgstr "Настроить сейчас"
+
+#. TRANSLATORS: labels of entries in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1908
+msgid "Username"
+msgstr "Имя пользователя"
+
+#: ../src/gtk-ui/sync-config-widget.c:1923
+msgid "Password"
+msgstr "Пароль"
+
+#. TRANSLATORS: warning in service configuration form for people
+#. who have modified the configuration via other means.
+#: ../src/gtk-ui/sync-config-widget.c:1946
+msgid "Current configuration is more complex than what can be shown here. Changes to sync mode or synced data types will overwrite that configuration."
+msgstr "Текущая конфигурация сервера более сложная, чем та, которую можно отобразить здесь. Изменения режима синхронизации или синхронизированных типов данных перезапишут эту конфигурацию."
+
+#. TRANSLATORS: this is the epander label for server settings
+#. in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1965
+msgid "Hide server settings"
+msgstr "Скрыть настройки сервера"
+
+#. TRANSLATORS: this is the epander label for server settings
+#. in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1985
+msgid "Show server settings"
+msgstr "Отобразить настройки сервера"
+
+#: ../src/gnome-bluetooth/syncevolution.c:110
+msgid "Sync in the Sync application"
+msgstr "Синхронизировать в приложении Sync"
+
+#: ../src/syncevo-dbus-server.cpp:5622
+#, c-format
+msgid "%s is syncing"
+msgstr "Синхронизация %s"
+
+#: ../src/syncevo-dbus-server.cpp:5623
+#, c-format
+msgid "We have just started to sync your computer with the %s sync service."
+msgstr "Синхронизация вашего компьютера со службой синхронизации %s только что началась."
+
+#. if sync is successfully started and done
+#: ../src/syncevo-dbus-server.cpp:5637
+#, c-format
+msgid "%s sync complete"
+msgstr "Синхронизация %s завершена"
+
+#: ../src/syncevo-dbus-server.cpp:5638
+#, c-format
+msgid "We have just finished syncing your computer with the %s sync service."
+msgstr "Синхронизация вашего компьютера со службой синхронизации %s только что завершилась."
+
+#. if sync is successfully started and has errors, or not started successful with a fatal problem
+#: ../src/syncevo-dbus-server.cpp:5643
+msgid "Sync problem."
+msgstr "Ошибка синхронизации"
+
+#: ../src/syncevo-dbus-server.cpp:5644
+msgid "Sorry, there's a problem with your sync that you need to attend to."
+msgstr "Во время синхронизации возникла проблема, на которую вам следует обратить внимание."
+
+#: ../src/syncevo-dbus-server.cpp:5717
+msgid "View"
+msgstr "Просмотреть"
+
+#: ../src/syncevo-dbus-server.cpp:5718
+msgid "Dismiss"
+msgstr "Отклонить"
+
+#~ msgid "Database error"
+#~ msgstr "Ошибка базы данных"
+
+#~ msgid ""
+#~ "Do you want to replace %s with %s? This will not remove any synced "
+#~ "information on either end but you will no longer be able to sync with %s."
+#~ msgstr ""
+#~ "Заменить %s на %s? Это не приведет к удалению какой-либо "
+#~ "синхронизированной информации на любой стороне, но синхронизация с %s "
+#~ "будет невозможной."
+
+#~ msgid "Yes, use %s"
+#~ msgstr "Да, использовать %s"
+
+#~ msgid "No, use %s"
+#~ msgstr "Нет, использовать %s"
+
+#~ msgid "Reset service"
+#~ msgstr "Сбросить настройки службы"
index bd43b28..eb72200 100644 (file)
--- a/po/sv.po
+++ b/po/sv.po
@@ -1,11 +1,10 @@
-#: ../src/gtk-ui/sync-ui.c:764
 msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: http://moblin.org/projects/syncevolution\n"
-"POT-Creation-Date: 2009-10-01 19:27+0000\n"
+"POT-Creation-Date: 2010-04-07 09:29+0000\n"
 "PO-Revision-Date: \n"
-"Last-Translator: GLSSVE_GMartinson <gmartinson@gmail.com>\n"
+"Last-Translator: Annika <AnnikaNbpt@gmail.com>\n"
 "Language-Team: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -16,531 +15,626 @@ msgstr ""
 
 #. TRANSLATORS: this is the application name that may be used by e.g.
 #. the windowmanager
-#: ../src/gtk-ui/main.c:31 ../src/gtk-ui/ui.glade.h:28
+#: ../src/gtk-ui/main.c:40
+#: ../src/gtk-ui/ui.glade.h:38
 #: ../src/gtk-ui/sync.desktop.in.h:1
+#: ../src/gnome-bluetooth/syncevolution.c:112
 msgid "Sync"
 msgstr "Synkronisering "
 
-#: ../src/gtk-ui/sync-ui.c:259
-msgid "Addressbook"
-msgstr "Addressbok"
+#: ../src/gtk-ui/sync-ui.c:260
+msgid "Contacts"
+msgstr "Kontakter"
 
-#: ../src/gtk-ui/sync-ui.c:261
-msgid "Calendar"
-msgstr "Kalender"
-
-#: ../src/gtk-ui/sync-ui.c:263
-msgid "Todo"
-msgstr "Att göra"
-
-#: ../src/gtk-ui/sync-ui.c:265
-msgid "Memo"
-msgstr "Memo"
-
-#: ../src/gtk-ui/sync-ui.c:320
-msgid "Failed to save current service in GConf configuration system"
-msgstr "Misslyckades att spara nuvarande tjänst i GConf konfiguration"
-
-#: ../src/gtk-ui/sync-ui.c:331
-msgid "Failed to save service configuration to SyncEvolution"
-msgstr "Misslyckades att spara tjänstekonfigurationen i SyncEvolution"
-
-#: ../src/gtk-ui/sync-ui.c:416
-msgid "Failed to get service configuration from SyncEvolution"
-msgstr "Misslyckades med att hämta tjänstkonfiguration från SyncEvolution"
-
-#: ../src/gtk-ui/sync-ui.c:479
-msgid "Failed to remove service configuration from SyncEvolution"
-msgstr "Misslyckades att radera tjänstekonfigurationen från SyncEvolution"
-
-#: ../src/gtk-ui/sync-ui.c:599
-msgid "Service must have a name and server URL"
-msgstr "Du måste ange ett namn på tjänsten och URL till servern"
+#: ../src/gtk-ui/sync-ui.c:262
+msgid "Appointments"
+msgstr "Möten"
 
-#. sync is no longer in progress for some reason
-#: ../src/gtk-ui/sync-ui.c:675
-msgid "Failed to cancel: sync was no longer in progress"
-msgstr "Misslyckades att avbryta: synkronisationen var inte igång"
+#: ../src/gtk-ui/sync-ui.c:264
+#: ../src/gtk-ui/ui.glade.h:40
+msgid "Tasks"
+msgstr "Uppgifter"
 
-#: ../src/gtk-ui/sync-ui.c:679
-msgid "Failed to cancel sync"
-msgstr "Misslyckades med att avbryta synkronisering"
+#: ../src/gtk-ui/sync-ui.c:266
+msgid "Notes"
+msgstr "Anteckningar"
 
-#: ../src/gtk-ui/sync-ui.c:683
-msgid "Canceling sync"
-msgstr "Avbryter synkronisering"
+#. TRANSLATORS: This is a "combination source" for syncing with devices
+#. * that combine appointments and tasks. the name should match the ones
+#. * used for calendar and todo above
+#: ../src/gtk-ui/sync-ui.c:271
+msgid "Appointments & Tasks"
+msgstr "Möten och uppgifter"
 
-#: ../src/gtk-ui/sync-ui.c:697
-msgid "Trying to cancel sync"
-msgstr "Försöker att avbryta synkronisering"
+#: ../src/gtk-ui/sync-ui.c:343
+msgid "Starting sync"
+msgstr "Startar synkronisering"
 
-#: ../src/gtk-ui/sync-ui.c:704
+#. TRANSLATORS: slow sync confirmation dialog message. Placeholder
+#. * is service/device name
+#: ../src/gtk-ui/sync-ui.c:381
 #, c-format
-msgid ""
-"Do you want to delete all local data and replace it with data from %s? This "
-"is not usually advised."
-msgstr ""
-"Vill du radera all lokal data och ersätta den med data från %s? Detta "
-"rekommenderas ej vanligtvis."
+msgid "Do you want to slow sync with %s?"
+msgstr "Vill du sakta ner synkronisering med %s?"
 
-#: ../src/gtk-ui/sync-ui.c:709
-#, c-format
-msgid ""
-"Do you want to delete all data in %s and replace it with your local data? "
-"This is not usually advised."
-msgstr ""
-"Vill du radera all data på %s och ersätta den med lokal data? Detta "
-"rekommenderas vanligtvis inte."
+#: ../src/gtk-ui/sync-ui.c:385
+msgid "Yes, do slow sync"
+msgstr "Ja, sakta ner synk"
 
-#: ../src/gtk-ui/sync-ui.c:726
+#: ../src/gtk-ui/sync-ui.c:385
 msgid "No, cancel sync"
 msgstr "Nej, avbryt synkronisering "
 
-#: ../src/gtk-ui/sync-ui.c:727
+#. TRANSLATORS: confirmation dialog for refresh-from-server. Placeholder
+#. * is service/device name
+#: ../src/gtk-ui/sync-ui.c:418
+#, c-format
+msgid "Do you want to delete all local data and replace it with data from %s? This is not usually advised."
+msgstr "Vill du radera alla lokala data och ersätta dem med data från %s? Detta rekommenderas vanligtvis inte."
+
+#: ../src/gtk-ui/sync-ui.c:423
+#: ../src/gtk-ui/sync-ui.c:454
 msgid "Yes, delete and replace"
 msgstr "Ja, radera och ersätt filer"
 
-#: ../src/gtk-ui/sync-ui.c:749
-msgid "No sources are enabled, not syncing"
-msgstr "Inga datakällor är anslutna, synkroniserar inte"
+#: ../src/gtk-ui/sync-ui.c:423
+#: ../src/gtk-ui/sync-ui.c:454
+#: ../src/gtk-ui/sync-ui.c:1566
+msgid "No"
+msgstr "Nej"
 
-#: ../src/gtk-ui/sync-ui.c:766
-msgid "A sync is already in progress"
-msgstr "En synkronisering pågår redan"
+#. TRANSLATORS: confirmation dialog for refresh-from-client. Placeholder
+#. * is service/device name
+#: ../src/gtk-ui/sync-ui.c:449
+#, c-format
+msgid "Do you want to delete all data in %s and replace it with your local data? This is not usually advised."
+msgstr "Vill du radera alla data på %s och ersätta dem med lokala data? Detta rekommenderas vanligtvis inte."
 
-#: ../src/gtk-ui/sync-ui.c:768
-msgid "Failed to start sync"
-msgstr "Misslyckades med att starta synkronisering"
+#: ../src/gtk-ui/sync-ui.c:481
+msgid "Trying to cancel sync"
+msgstr "Försöker att avbryta synkronisering"
 
-#: ../src/gtk-ui/sync-ui.c:773
-msgid "Starting sync"
-msgstr "Startar synkronisering"
+#: ../src/gtk-ui/sync-ui.c:521
+msgid "No service or device selected"
+msgstr "Ingen markerad tjänst eller enhet"
 
-#: ../src/gtk-ui/sync-ui.c:798
-msgid "Last synced just seconds ago"
-msgstr "Senast synkroniserad endast för några sekunder sedan"
+#. TRANSLATORS: This is the title on main view. Placeholder is
+#. * the service name. Example: "Google - synced just now"
+#: ../src/gtk-ui/sync-ui.c:529
+#, c-format
+msgid "%s - synced just now"
+msgstr "%s - synkroniserat just nu"
 
-#: ../src/gtk-ui/sync-ui.c:801
-msgid "Last synced a minute ago"
-msgstr "Senaste synkronisering för en minut sedan"
+#: ../src/gtk-ui/sync-ui.c:533
+#, c-format
+msgid "%s - synced a minute ago"
+msgstr "%s - synkroniserat en minut sedan"
 
-#: ../src/gtk-ui/sync-ui.c:804
+#: ../src/gtk-ui/sync-ui.c:537
 #, c-format
-msgid "Last synced %ld minutes ago"
-msgstr "Senaste synk %ld minuter sedan"
+msgid "%s - synced %ld minutes ago"
+msgstr "%s - synkroniserat %ld minuter sedan"
 
-#: ../src/gtk-ui/sync-ui.c:807
-msgid "Last synced an hour ago"
-msgstr "Senaste synkronisering för en timme sedan"
+#: ../src/gtk-ui/sync-ui.c:542
+#, c-format
+msgid "%s - synced an hour ago"
+msgstr "%s - synkroniserat en timme sedan"
 
-#: ../src/gtk-ui/sync-ui.c:810
+#: ../src/gtk-ui/sync-ui.c:546
 #, c-format
-msgid "Last synced %ld hours ago"
-msgstr "Senaste synk %ld timmar sedan"
+msgid "%s - synced %ld hours ago"
+msgstr "%s - synkroniserat %ld timmar sedan"
 
-#: ../src/gtk-ui/sync-ui.c:813
-msgid "Last synced a day ago"
-msgstr "Senast synkroniserad igår"
+#: ../src/gtk-ui/sync-ui.c:551
+#, c-format
+msgid "%s - synced a day ago"
+msgstr "%s - synkroniserat en dag sedan"
 
-#: ../src/gtk-ui/sync-ui.c:816
+#: ../src/gtk-ui/sync-ui.c:555
 #, c-format
-msgid "Last synced %ld days ago"
-msgstr "Senaste synk %ld dagar sedan"
+msgid "%s - synced %ld days ago"
+msgstr "%s - synkroniserat %ld dagar sedan"
+
+#. TRANSLATORS: Action button in info bar in main view. Shown with e.g.
+#. * "You've just restored a backup. The changes have not been "
+#. * "synced with %s yet"
+#: ../src/gtk-ui/sync-ui.c:604
+#: ../src/gtk-ui/sync-ui.c:719
+msgid "Sync now"
+msgstr "Synkronisera nu"
+
+#. TRANSLATORS: Action button in info bar in main view. Shown with e.g.
+#. * "A normal sync is not possible at this time..." message.
+#. * "Other options" will open Emergency view
+#: ../src/gtk-ui/sync-ui.c:610
+#: ../src/gtk-ui/ui.glade.h:37
+msgid "Slow sync"
+msgstr "Långsam synkronisering "
+
+#: ../src/gtk-ui/sync-ui.c:611
+msgid "Other options..."
+msgstr "Andra alternativ"
+
+#. TRANSLATORS: Action button in info bar in main view. Shown e.g.
+#. * when no service is selected. Will open configuration view
+#: ../src/gtk-ui/sync-ui.c:616
+msgid "Select sync service"
+msgstr "Välj synkroniseringstjänst"
 
-#: ../src/gtk-ui/sync-ui.c:901
+#. TRANSLATORS: Action button in info bar in main view. Shown e.g.
+#. * login to service fails. Will open configuration view for this service
+#: ../src/gtk-ui/sync-ui.c:621
+msgid "Edit service settings"
+msgstr "Ändra tjänsteinställningar "
+
+#: ../src/gtk-ui/sync-ui.c:670
+msgid "You haven't selected a sync service or device yet. Sync services let you synchronize your data between your netbook and a web service. You can also sync directly with some devices."
+msgstr "Du har inte valt synktjänst eller -enhet än. Med synktjänster kan du synka dina data mellan din netbook och en webbtjänst. Du kan också synka direkt med vissa enheter."
+
+#: ../src/gtk-ui/sync-ui.c:717
 msgid "Sync again"
 msgstr "Synkronisera igen"
 
-#: ../src/gtk-ui/sync-ui.c:903 ../src/gtk-ui/ui.glade.h:29
-msgid "Sync now"
-msgstr "Synkronisera nu"
+#: ../src/gtk-ui/sync-ui.c:730
+msgid "Restoring"
+msgstr "Återställer"
 
-#: ../src/gtk-ui/sync-ui.c:912
+#: ../src/gtk-ui/sync-ui.c:732
 msgid "Syncing"
 msgstr "Synkroniserar "
 
-#: ../src/gtk-ui/sync-ui.c:918
+#. TRANSLATORS: This is for the button in main view, right side.
+#. Keep line length below ~20 characters, use two lines if needed
+#: ../src/gtk-ui/sync-ui.c:743
+#: ../src/gtk-ui/sync-ui.c:3358
 msgid "Cancel sync"
 msgstr "Avbryt synkronisering"
 
-#. TRANSLATORS: placeholder is a source name, shown with checkboxes in main window
-#: ../src/gtk-ui/sync-ui.c:1265
+#: ../src/gtk-ui/sync-ui.c:908
+msgid "Back to sync"
+msgstr "Tillbaka till synkronisering"
+
+#. TRANSLATORS: label for checkbutton/toggle in main view.
+#. * Please stick to similar length strings or break the line with
+#. * "\n" if absolutely needed
+#: ../src/gtk-ui/sync-ui.c:1209
+msgid "Automatic sync"
+msgstr "Automatisk synkronisering"
+
+#. This is the expander label in emergency view. It summarizes the
+#. * currently selected data sources. First placeholder is service/device
+#. * name, second a comma separeted list of sources.
+#. * E.g. "Affected data: Google Contacts, Appointments"
+#: ../src/gtk-ui/sync-ui.c:1480
+#, c-format
+msgid "Affected data: %s %s"
+msgstr "Data som påverkas: %s %s"
+
+#: ../src/gtk-ui/sync-ui.c:1485
+#, c-format
+msgid "Affected data: none"
+msgstr "Data som påverkas: inga"
+
+#. TRANSLATORS: confirmation for restoring a backup. placeholder is the
+#. * backup time string defined below
+#: ../src/gtk-ui/sync-ui.c:1563
+#, c-format
+msgid "Do you want to restore the backup from %s? All changes you have made since then will be lost."
+msgstr "Vill du återställa säkerhetskopian från %s? Då förlorar du alla ändringar du har gjort sedan dess."
+
+#: ../src/gtk-ui/sync-ui.c:1566
+msgid "Yes, restore"
+msgstr "Ja, återställ"
+
+#. TRANSLATORS: date/time for strftime(), used in emergency view backup
+#. * label. Any time format that shows date and time is good.
+#: ../src/gtk-ui/sync-ui.c:1598
+#, c-format
+msgid "%x %X"
+msgstr "%x %X"
+
+#. TRANSLATORS: label for a backup in emergency view. Placeholder is
+#. * service or device name
+#: ../src/gtk-ui/sync-ui.c:1617
+#, c-format
+msgid "Backed up before syncing with %s"
+msgstr "Säkerhetskopierades före synkronisering med %s"
+
+#: ../src/gtk-ui/sync-ui.c:1634
+msgid "Restore"
+msgstr "Återställ"
+
+#. TRANSLATORS: this is an explanation in Emergency view.
+#. * Placeholder is a service/device name
+#: ../src/gtk-ui/sync-ui.c:1741
+#, c-format
+msgid "A normal sync with %s is not possible at this time. You can do a slow two-way sync or start from scratch. You can also restore a backup, but a slow sync or starting from scratch will still be required before normal sync is possible."
+msgstr "En normal synkronisering med %s är inte möjlig just nu. Du kan göra en långsam tvävägssynk eller börja från början. Du kan också återställa en säkerhetskopia, men en långsam synk eller att börja från början krävs ändå innan normal synk blir möjlig."
+
+#: ../src/gtk-ui/sync-ui.c:1751
+#, c-format
+msgid "If something has gone horribly wrong, you can try a slow sync, start from scratch or restore from backup."
+msgstr "Om något har gått verkligt fel kan du prova en långsam synk, börja från början eller återställa från säkerhetskopian."
+
+#. TRANSLATORS: These are a buttons in Emergency view. Placeholder is a
+#. * service/device name. Please don't use too long lines, but feel free to
+#. * use several lines.
+#: ../src/gtk-ui/sync-ui.c:1760
+#, c-format
+msgid ""
+"Delete all your local\n"
+"data and replace with\n"
+"data from %s"
+msgstr ""
+"Radera alla lokala\n"
+"data och ersätt med\n"
+"data från %s"
+
+#: ../src/gtk-ui/sync-ui.c:1766
+#, c-format
+msgid ""
+"Delete all data on\n"
+"%s and replace\n"
+"with your local data"
+msgstr ""
+"Radera alla data på\n"
+"%s och ersätt med\n"
+"dina lokala data"
+
+#: ../src/gtk-ui/sync-ui.c:2226
+msgid "Failed to get list of supported services from SyncEvolution"
+msgstr "Kunde inte få en lista med tjänster som stöds från SyncEvolution"
+
+#: ../src/gtk-ui/sync-ui.c:2280
+msgid "There was a problem communicating with the sync process. Please try again later."
+msgstr "Det uppstod problem vid kommunikation med synkprocessen. Försök igen senare."
+
+#: ../src/gtk-ui/sync-ui.c:2339
+msgid "Restore failed"
+msgstr "Återställning misslyckades"
+
+#: ../src/gtk-ui/sync-ui.c:2342
+#: ../src/gtk-ui/sync-ui.c:3227
+msgid "Sync failed"
+msgstr "Synk misslyckades"
+
+#: ../src/gtk-ui/sync-ui.c:2348
+msgid "Restore complete"
+msgstr "Återställning färdig"
+
+#: ../src/gtk-ui/sync-ui.c:2351
+msgid "Sync complete"
+msgstr "Synk färdig"
+
+#: ../src/gtk-ui/sync-ui.c:2443
+#, c-format
+msgid "Preparing '%s'"
+msgstr "Förbereder '%s'"
+
+#: ../src/gtk-ui/sync-ui.c:2446
 #, c-format
-msgid "%s (not supported by this service)"
-msgstr "%s (stöds inte av denna tjänst)"
+msgid "Receiving '%s'"
+msgstr "Tas emot från '%s'"
 
-#: ../src/gtk-ui/sync-ui.c:1298
+#: ../src/gtk-ui/sync-ui.c:2449
+#, c-format
+msgid "Sending '%s'"
+msgstr "Skickas till '%s'"
+
+#: ../src/gtk-ui/sync-ui.c:2570
 #, c-format
 msgid "There was one remote rejection."
-msgid_plural "There were %d remote rejections."
-msgstr[0] "Det finns en fjärr refusering"
-msgstr[1] "Det finns %d fjärr refuseringar"
+msgid_plural "There were %ld remote rejections."
+msgstr[0] "Det finns en fjärr-refusering."
+msgstr[1] "Det finns %ld fjärr-refuseringar."
 
-#: ../src/gtk-ui/sync-ui.c:1303
+#: ../src/gtk-ui/sync-ui.c:2575
 #, c-format
 msgid "There was one local rejection."
-msgid_plural "There were %d local rejections."
-msgstr[0] "Det finns en lokal refusering"
-msgstr[1] "Det finns %d lokala refuseringar"
+msgid_plural "There were %ld local rejections."
+msgstr[0] "Det finns en lokal refusering."
+msgstr[1] "Det finns %ld lokala refuseringar."
 
-#: ../src/gtk-ui/sync-ui.c:1308
+#: ../src/gtk-ui/sync-ui.c:2580
 #, c-format
-msgid "There were %d local rejections and %d remote rejections."
-msgstr "Det finns %d lokala refuseringar och %d fjärr refuseringar"
+msgid "There were %ld local rejections and %ld remote rejections."
+msgstr "Det fanns %ld lokala refuseringar och %ld fjärr-refuseringar."
 
-#: ../src/gtk-ui/sync-ui.c:1313
+#: ../src/gtk-ui/sync-ui.c:2585
 #, c-format
 msgid "Last time: No changes."
 msgstr "Senast: Inga ändringar."
 
-#: ../src/gtk-ui/sync-ui.c:1315
+#: ../src/gtk-ui/sync-ui.c:2587
 #, c-format
 msgid "Last time: Sent one change."
-msgid_plural "Last time: Sent %d changes."
-msgstr[0] "Senast: Skickade en ändring"
-msgstr[1] "Senast: Skickade %d ändringar"
+msgid_plural "Last time: Sent %ld changes."
+msgstr[0] "Senast: Skickade en ändring."
+msgstr[1] "Senast: Skickade %ld ändringar."
 
 #. This is about changes made to the local data. Not all of these
 #. changes were requested by the remote server, so "applied"
 #. is a better word than "received" (bug #5185).
-#: ../src/gtk-ui/sync-ui.c:1323
+#: ../src/gtk-ui/sync-ui.c:2595
 #, c-format
 msgid "Last time: Applied one change."
-msgid_plural "Last time: Applied %d changes."
-msgstr[0] "Senast: Utförde en ändring"
-msgstr[1] "Senast: Utförde %d ändringar"
+msgid_plural "Last time: Applied %ld changes."
+msgstr[0] "Senast: Utförde en ändring."
+msgstr[1] "Senast: Utförde %ld ändringar."
 
-#: ../src/gtk-ui/sync-ui.c:1328
+#: ../src/gtk-ui/sync-ui.c:2600
 #, c-format
-msgid "Last time: Applied %d changes and sent %d changes."
-msgstr "Senast: Utförde %d ändringar och skickade %d ändringar"
-
-#: ../src/gtk-ui/sync-ui.c:1420
-msgid "Failed to get server configuration from SyncEvolution"
-msgstr "Misslyckades med att hämta serverkonfiguration från SyncEvolution"
+msgid "Last time: Applied %ld changes and sent %ld changes."
+msgstr "Senast: Utförde %ld ändringar och skickade %ld ändringar."
 
-#: ../src/gtk-ui/sync-ui.c:1472
-msgid ""
-"ScheduleWorld enables you to keep your contacts, events, tasks, and notes in "
-"sync."
-msgstr ""
-"ScheduleWorld låter dig hålla kontakter, aktiviteter, uppgifter och "
-"meddelanden uppdaterade."
-
-#: ../src/gtk-ui/sync-ui.c:1475
-msgid ""
-"Google Sync can backup and synchronize your Address Book with your Gmail "
-"contacts."
-msgstr ""
-"Google Sync kan synka och säkerhetskopiera din addressbok med dina "
-"Gmailkontakter."
-
-#. TRANSLATORS: Please include the word "demo" (or the equivalent in
-#. your language): Funambol is going to be a 90 day demo service
-#. in the future
-#: ../src/gtk-ui/sync-ui.c:1481
+#. TRANSLATORS: the placeholder is a error message (hopefully)
+#. * explaining the problem
+#: ../src/gtk-ui/sync-ui.c:2807
+#, c-format
 msgid ""
-"Backup your contacts and calendar. Sync with a singleclick, anytime, "
-"anywhere (DEMO)."
+"There was a problem with last sync:\n"
+"%s"
 msgstr ""
-"Säkerhetskopiera dina kontakter och kalender. Synka med ett enkelklick, "
-"närsomhelst, varsomhelst (DEMO)."
-
-#: ../src/gtk-ui/sync-ui.c:1509
-msgid "New service"
-msgstr "Ny tjänst"
-
-#: ../src/gtk-ui/sync-ui.c:1556
-msgid "Server URL"
-msgstr "URL server"
+"Problem med senaste synkronisering:\n"
+"%s"
 
-#. TRANSLATORS: placeholder is a source name in settings window
-#: ../src/gtk-ui/sync-ui.c:1578
+#: ../src/gtk-ui/sync-ui.c:2817
 #, c-format
-msgid "%s URI"
-msgstr "%s URI"
+msgid "You've just restored a backup. The changes have not been synced with %s yet"
+msgstr "Du har just återställt en säkerhetskopia. Ändringarna har ännu inte synkroniserats med %s"
 
-#: ../src/gtk-ui/sync-ui.c:1715 ../src/gtk-ui/ui.glade.h:17
-msgid "Launch website"
-msgstr "Öppna webbplatsen "
+#: ../src/gtk-ui/sync-ui.c:3105
+msgid "Waiting for current operation to finish..."
+msgstr "Väntar på att nuvarande åtgärd ska bli klar..."
 
-#: ../src/gtk-ui/sync-ui.c:1719
-msgid "Setup and use"
-msgstr "Inställningar"
+#. TRANSLATORS: next strings are error messages.
+#: ../src/gtk-ui/sync-ui.c:3139
+msgid "A normal sync is not possible at this time. The server suggests a slow sync, but this might not always be what you want if both ends already have data."
+msgstr "En normal synk är inte möjlig just nu. Servern föreslår en långsam synk men detta kanke inte alltid är vad du vill ha om båda ändar redan har data."
 
-#: ../src/gtk-ui/sync-ui.c:1765
-msgid "Failed to get list of manually setup services from SyncEvolution"
-msgstr ""
-"Misslyckades att få en lista av manuella inställningstjänster från "
-"SyncEvolution"
+#: ../src/gtk-ui/sync-ui.c:3143
+msgid "The sync process died unexpectedly."
+msgstr "Synkprocessen avslutades oväntat."
 
-#: ../src/gtk-ui/sync-ui.c:1806
-msgid "Failed to get list of supported services from SyncEvolution"
-msgstr "Misslyckades att få en lista med tjänster som stöds från SyncEvolution"
+#: ../src/gtk-ui/sync-ui.c:3148
+msgid "Password request was not answered. You can save the password in the settings to prevent the request."
+msgstr "Lösenordsförfrågan besvarades inte. Förhindra förfrågan genom att spara lösenordet i inställningarna."
 
-#. TODO: this is a hack... SyncEnd should be a signal of it's own,
-#. not just hacked on top of the syncevolution error codes
-#: ../src/gtk-ui/sync-ui.c:1967
-msgid "Service configuration not found"
-msgstr "Konfigurationsfilen hittades inte"
+#. TODO use the service device name here, this is a remote problem
+#: ../src/gtk-ui/sync-ui.c:3152
+msgid "There was a problem processing sync request. Trying again may help."
+msgstr "Problem med behandling av synkbegäran. Det kan vara en bra idé att försöka igen."
 
-#: ../src/gtk-ui/sync-ui.c:1973
-msgid "Not authorized"
-msgstr "Inte tillåten"
+#: ../src/gtk-ui/sync-ui.c:3158
+msgid "Failed to login. Could there be a problem with your username or password?"
+msgstr "Kunde inte logg in. Kan det finnas  problem med ditt användarnamn eller lösenord?"
 
-#: ../src/gtk-ui/sync-ui.c:1975
+#: ../src/gtk-ui/sync-ui.c:3161
 msgid "Forbidden"
 msgstr "Förbjuden"
 
-#: ../src/gtk-ui/sync-ui.c:1977
-msgid "Not found"
-msgstr "Hittades inte"
+#. TRANSLATORS: data source means e.g. calendar or addressbook
+#: ../src/gtk-ui/sync-ui.c:3167
+msgid "A data source could not be found. Could there be a problem with the settings?"
+msgstr "Hittade inte en datakälla. Kan det finnas problem i inställningarna?"
 
-#: ../src/gtk-ui/sync-ui.c:1979
-msgid "Fatal database error"
-msgstr "Ödesdigert fel: databasfel"
+#: ../src/gtk-ui/sync-ui.c:3171
+msgid "Remote database error"
+msgstr "Fjärrdatabasfel"
 
-#: ../src/gtk-ui/sync-ui.c:1981
-msgid "Database error"
-msgstr "Databasfel"
+#. This can happen when EDS is borked, restart it may help...
+#: ../src/gtk-ui/sync-ui.c:3174
+msgid "There is a problem with the local database. Syncing again or rebooting may help."
+msgstr "Det finns problem i den lokala databasen. Det kan vara en bra idé att synkronisera eller starta upp igen."
 
-#: ../src/gtk-ui/sync-ui.c:1983
-msgid "No space left"
-msgstr "inte tillräckligt med diskutrymme"
+#: ../src/gtk-ui/sync-ui.c:3177
+msgid "No space on disk"
+msgstr "Inget diskutrymme"
 
-#. TODO identify problem item somehow ?
-#: ../src/gtk-ui/sync-ui.c:1986
+#: ../src/gtk-ui/sync-ui.c:3179
 msgid "Failed to process SyncML"
-msgstr "Misslyckades att hantera SyncML"
+msgstr "Kunde inte hantera SyncML"
 
-#: ../src/gtk-ui/sync-ui.c:1988
+#: ../src/gtk-ui/sync-ui.c:3181
 msgid "Server authorization failed"
-msgstr "Misslyckades att ansluta till server"
+msgstr "Kunde inte ansluta till server"
 
-#: ../src/gtk-ui/sync-ui.c:1990
+#: ../src/gtk-ui/sync-ui.c:3183
 msgid "Failed to parse configuration file"
-msgstr "Misslyckades med att analysera konfigurationsfilen "
+msgstr "Kunde inte analysera konfigurationsfilen "
 
-#: ../src/gtk-ui/sync-ui.c:1992
+#: ../src/gtk-ui/sync-ui.c:3185
 msgid "Failed to read configuration file"
-msgstr "Misslyckades med att öppna konfigurationsfilen"
+msgstr "Kunde inte öppna konfigurationsfilen"
 
-#: ../src/gtk-ui/sync-ui.c:1994
+#: ../src/gtk-ui/sync-ui.c:3187
 msgid "No configuration found"
 msgstr "Konfiurationen hittades inte"
 
-#: ../src/gtk-ui/sync-ui.c:1996
+#: ../src/gtk-ui/sync-ui.c:3189
 msgid "No configuration file found"
 msgstr "Konfigurationsfilen hittades inte"
 
-#: ../src/gtk-ui/sync-ui.c:1998
+#: ../src/gtk-ui/sync-ui.c:3191
 msgid "Server sent bad content"
 msgstr "Server skickade felaktigt innehåll"
 
-#: ../src/gtk-ui/sync-ui.c:2000
-msgid "Transport failure (no connection?)"
-msgstr "Överföringsfel (ingen anslutning)?"
-
-#: ../src/gtk-ui/sync-ui.c:2002
-msgid "Connection timed out"
-msgstr "Anslutningstiden överskreds"
-
-#: ../src/gtk-ui/sync-ui.c:2004
+#: ../src/gtk-ui/sync-ui.c:3193
 msgid "Connection certificate has expired"
 msgstr "Utfärdat certifikat har gått ut"
 
-#: ../src/gtk-ui/sync-ui.c:2006
+#: ../src/gtk-ui/sync-ui.c:3195
 msgid "Connection certificate is invalid"
 msgstr "Anslutningscertifikatet är ogiltig."
 
-#: ../src/gtk-ui/sync-ui.c:2009
-msgid "Connection failed"
-msgstr "Anslutningen misslyckades"
+#: ../src/gtk-ui/sync-ui.c:3203
+msgid "We were unable to connect to the server. The problem could be temporary or there could be something wrong with the settings."
+msgstr "Vi kunde inte ansluta till servern. Problemet kan vara temporärt eller så kan det finnas fel i inställningarna."
 
-#: ../src/gtk-ui/sync-ui.c:2011
-msgid "URL is bad"
-msgstr "Felaktig URL"
+#: ../src/gtk-ui/sync-ui.c:3210
+msgid "The server URL is bad"
+msgstr "Ogiltig server-URL"
 
-#: ../src/gtk-ui/sync-ui.c:2013
-msgid "Server not found"
-msgstr "Server kunde inte hittas"
+#: ../src/gtk-ui/sync-ui.c:3215
+msgid "The server was not found"
+msgstr "Hittade inte servern"
 
-#: ../src/gtk-ui/sync-ui.c:2015
+#: ../src/gtk-ui/sync-ui.c:3217
 #, c-format
 msgid "Error %d"
 msgstr "Fel %d"
 
-#: ../src/gtk-ui/sync-ui.c:2025
-msgid "Sync D-Bus service exited unexpectedly"
-msgstr "Synktjänsten D-Bus avslutades"
-
-#: ../src/gtk-ui/sync-ui.c:2028 ../src/gtk-ui/sync-ui.c:2079
-msgid "Sync Failed"
-msgstr "Synk misslyckades"
-
-#: ../src/gtk-ui/sync-ui.c:2071
-msgid "Sync complete"
-msgstr "Synk färdig"
-
-#: ../src/gtk-ui/sync-ui.c:2076
-msgid "Sync canceled"
-msgstr "Synk avbruten"
-
-#. NOTE extra1 can be error here
-#: ../src/gtk-ui/sync-ui.c:2094
-msgid "Ending sync"
-msgstr "Avslutar synk"
+#. TRANSLATORS: password request dialog contents: title, cancel button
+#. * and ok button
+#: ../src/gtk-ui/sync-ui.c:3355
+msgid "Password is required for sync"
+msgstr "Lösenord krävs för synkronisering"
 
-#. TRANSLATORS: placeholder is a source name (e.g. 'Calendar') in a progress text
-#: ../src/gtk-ui/sync-ui.c:2118
-#, c-format
-msgid "Preparing '%s'"
-msgstr "Förbereder '%s'"
-
-#. TRANSLATORS: placeholder is a source name in a progress text
-#: ../src/gtk-ui/sync-ui.c:2130
-#, c-format
-msgid "Sending '%s'"
-msgstr "Skickas till '%s'"
+#: ../src/gtk-ui/sync-ui.c:3359
+msgid "Sync with password"
+msgstr "Synkronisera med lösenord"
 
-#. TRANSLATORS: placeholder is a source name in a progress text
-#: ../src/gtk-ui/sync-ui.c:2142
+#. TRANSLATORS: password request dialog message, placeholder is service name
+#: ../src/gtk-ui/sync-ui.c:3369
 #, c-format
-msgid "Receiving '%s'"
-msgstr "Tas emot från '%s'"
-
-#: ../src/gtk-ui/ui.glade.h:1
-msgid "<b>Data</b>"
-msgstr "<b>Data</b>"
+msgid "Please enter password for syncing with %s:"
+msgstr "Ange lösenord för synkronisering med %s:"
 
+#. title for the buttons on the right side of main view
 #: ../src/gtk-ui/ui.glade.h:2
-msgid "<b>No sync service in use</b>"
-msgstr "<b>Ingen synktjänst används</b>"
-
-#: ../src/gtk-ui/ui.glade.h:3
-msgid "<b>Sync failure</b>"
-msgstr "<b>Synkroniseringsfel</b>"
+msgid "<b>Actions</b>"
+msgstr "<b>Åtgärder</b>"
 
+#. text between the two "start from scratch" buttons in emergency view
 #: ../src/gtk-ui/ui.glade.h:4
-msgid "<b>Type of Sync</b>"
-msgstr "<b>Synkroniseringstyp</b>"
+msgid "<b>or</b>"
+msgstr "<b>eller</b>"
 
 #: ../src/gtk-ui/ui.glade.h:5
-msgid "<big>Manual setup</big>"
-msgstr "<big>Manuell inställning</big>"
+msgid "<big>Direct sync</big>"
+msgstr "<big>Direktsynk</big>"
 
 #: ../src/gtk-ui/ui.glade.h:6
-msgid "<big>Supported services</big>"
-msgstr "<big>Tjänster som stöds</big>"
-
-#: ../src/gtk-ui/ui.glade.h:7
-msgid "Add new service"
-msgstr "Lägg till ny tjänst"
+msgid "<big>Network sync</big>"
+msgstr "<b>Nätverkssynk</b>"
 
+#. a title in emergency view
 #: ../src/gtk-ui/ui.glade.h:8
-msgid "Back to sync"
-msgstr "Tillbaka till synkronisering"
+msgid "<big>Restore from backup</big>"
+msgstr "<big>Återställ från säkerhetskopia</big>"
 
-#: ../src/gtk-ui/ui.glade.h:9
-msgid ""
-"Change sync\n"
-"service"
-msgstr ""
-"Ändra synk\n"
-"tjänst"
-
-#: ../src/gtk-ui/ui.glade.h:11
-msgid "Delete all local data and replace it with remote data"
-msgstr "Radera all lokal data och ersätt med fjärrdata"
+#. a title in emergency view
+#: ../src/gtk-ui/ui.glade.h:10
+msgid "<big>Slow sync</big>"
+msgstr "<big>Långsam synk</big>"
 
+#. a title in emergency view
 #: ../src/gtk-ui/ui.glade.h:12
-msgid "Delete all remote data and replace it with local data"
-msgstr "Radera all fjärrdata och ersätt med lokal data"
+msgid "<big>Start from scratch</big>"
+msgstr "<big>Börja från början</big>"
 
 #: ../src/gtk-ui/ui.glade.h:13
-msgid "Delete this service"
-msgstr "Ta bort denna tjänst"
-
-#: ../src/gtk-ui/ui.glade.h:14
-msgid "Edit service settings"
-msgstr "Ändra tjänsteinställningar "
-
-#: ../src/gtk-ui/ui.glade.h:15
 msgid ""
-"If you don't see your service above but know that your sync provider uses "
-"SyncML\n"
-"you can setup a service manually."
+"A slow sync compares items from both sides and tries to merge them. \n"
+"This may fail in some cases, leading to duplicates or lost information."
 msgstr ""
-"Om du inte ser din tjänst ovan men vet att ditt synkföretag använder SyncML\n"
-"kan du manuellt göra inställningarna."
+"Långsam synkronisering jämför objekt från båda sidor och försöker kombinera dem. \n"
+"Detta kan misslyckas i vissa fall och leda till duplikat eller förlorad information."
 
+#: ../src/gtk-ui/ui.glade.h:15
+msgid "Add new device"
+msgstr "Lägg till ny enhet"
+
+#: ../src/gtk-ui/ui.glade.h:16
+msgid "Add new service"
+msgstr "Lägg till ny tjänst"
+
+#. explanation of "Restore backup" function
 #: ../src/gtk-ui/ui.glade.h:18
-msgid "Merge local and remote data (recommended)"
-msgstr "Sammanför lokal och fjärrdata (rekommenderas)"
+msgid "Backups are made before every time we Sync. Choose a backup to restore. Any changes you have made since then will be lost."
+msgstr "Säkerhetskopieringar görs före varje synkronisering. Välj en säkerhetskopia att återställa. Alla ändringar som du gjort sedan dess förloras."
 
 #: ../src/gtk-ui/ui.glade.h:19
-msgid "Password"
-msgstr "Lösenord"
-
-#: ../src/gtk-ui/ui.glade.h:20
-msgid "Reset original server settings"
-msgstr "Återgå till originalserverinställningar"
+msgid "Calendar"
+msgstr "Kalender"
 
+#. Button in main view, right side. Keep to below 20 chars per line, feel free to use two lines
 #: ../src/gtk-ui/ui.glade.h:21
-msgid "Save and use this service"
-msgstr "Spara och använd denna tjänst"
-
-#: ../src/gtk-ui/ui.glade.h:22
-msgid "Select sync service"
-msgstr "Välj synkroniseringstjänst"
-
-#: ../src/gtk-ui/ui.glade.h:23
-msgid "Server settings"
-msgstr "Grundläggande serverinställningar"
+msgid ""
+"Change or edit\n"
+"sync service"
+msgstr ""
+"Ändra eller redigera\n"
+"synktjänst"
 
+#. close button for settings window
 #: ../src/gtk-ui/ui.glade.h:24
-msgid "Service name"
-msgstr "Namn på tjänst"
+msgid "Close"
+msgstr "Stäng"
 
 #: ../src/gtk-ui/ui.glade.h:25
 msgid ""
-"Sorry, you need an internet\n"
-"connection to sync."
+"Delete all data on Zyb \n"
+"and replace with your\n"
+"local information"
 msgstr ""
-"Du behöver internet-\n"
-"anslutning för att synkronisera."
+"Radera alla data på Zyb \n"
+"och ersätt med din\n"
+"lokala information"
 
-#: ../src/gtk-ui/ui.glade.h:27
-msgid "Stop using this service"
-msgstr "Sluta använda denna tjänst"
+#: ../src/gtk-ui/ui.glade.h:28
+msgid ""
+"Delete all your local\n"
+"information and replace\n"
+"with data from Zyb"
+msgstr ""
+"Radera all lokal\n"
+"information och ersätt\n"
+"med data från Zyb"
 
-#: ../src/gtk-ui/ui.glade.h:30
+#. button in main view, right side. Keep length to 20 characters or so, use two lines if needed
+#: ../src/gtk-ui/ui.glade.h:32
 msgid ""
-"Synchronization is not available (D-Bus service does not answer), sorry."
-msgstr "Synkronisering är inte tillgänglig (D-Bustjänsten svarar ej), ursäkta."
+"Fix a sync\n"
+"emergency"
+msgstr ""
+"Fixa ett akut\n"
+"synkproblem"
 
-#: ../src/gtk-ui/ui.glade.h:31
+#: ../src/gtk-ui/ui.glade.h:34
 msgid ""
-"To sync you'll need a network connection and an account with a sync "
-"service.\n"
-"We support the following services: "
+"If you don't see your service above but know that your sync provider uses SyncML\n"
+"you can setup a service manually."
 msgstr ""
-"För att synkronisera behöver du en nätverksanslutning och ett konto med en \n"
-"synktjänst. Vi stöder följande tjänster:"
+"Om du inte ser din tjänst ovan men vet att ditt synkföretag använder SyncML\n"
+"kan du manuellt göra inställningarna."
 
-#: ../src/gtk-ui/ui.glade.h:33
-msgid "Username"
-msgstr "Användarnamn"
+#: ../src/gtk-ui/ui.glade.h:36
+msgid "Settings"
+msgstr "Inställningar"
 
-#: ../src/gtk-ui/ui.glade.h:34
+#: ../src/gtk-ui/ui.glade.h:39
+msgid "Sync Emergency"
+msgstr "Akut synkproblem"
+
+#: ../src/gtk-ui/ui.glade.h:41
 msgid ""
-"You haven't selected a sync service yet. Sync services let you \n"
-"synchronize your data between your netbook and a web service."
+"To sync you'll need a network connection and an account with a sync service.\n"
+"We support the following services: "
 msgstr ""
-"Du har inte valt synktjänst ännu. Synktjänster låter dig \n"
-"synka din data mellan din netbook och en webbtjänst."
+"Innan du kan synkronisera behöver du nätverksanslutning och ett konto med\n"
+"synktjänst. Vi stöder följande tjänster:"
+
+#: ../src/gtk-ui/ui.glade.h:43
+msgid "Use Bluetooth to Sync your data from one device to another."
+msgstr "Använd Bluetooth för att synkroisera dina data från en enhet till en annan."
+
+#: ../src/gtk-ui/ui.glade.h:44
+msgid "You will need to add Bluetooth devices before they can be synced."
+msgstr "Du måste lägga till Bluetooth-enheter innan du kan synkronisera dem."
 
-#: ../src/gtk-ui/sync.desktop.in.h:2 ../src/gtk-ui/sync-gtk.desktop.in.h:2
+#: ../src/gtk-ui/sync.desktop.in.h:2
+#: ../src/gtk-ui/sync-gtk.desktop.in.h:2
 msgid "Up to date"
 msgstr "Uppdaterad"
 
@@ -548,7 +642,350 @@ msgstr "Uppdaterad"
 msgid "Sync (GTK)"
 msgstr "Synk (GTK)"
 
+#: ../src/gtk-ui/sync-config-widget.c:74
+msgid "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in sync."
+msgstr "Med ScheduleWorld kan du hålla kontakter, aktiviteter, uppgifter och meddelanden uppdaterade."
+
+#: ../src/gtk-ui/sync-config-widget.c:77
+msgid "Google Sync can backup and synchronize your contacts with your Gmail contacts."
+msgstr "Google Sync kan säkerhetskopiera och synka dina kontakter med dina Gmail-kontakter."
+
+#. TRANSLATORS: Please include the word "demo" (or the equivalent in
+#. your language): Funambol is going to be a 90 day demo service
+#. in the future
+#: ../src/gtk-ui/sync-config-widget.c:83
+msgid "Backup your contacts and calendar. Sync with a single click, anytime, anywhere (DEMO)."
+msgstr "Säkerhetskopiera kontakter och kalender. Synka med ett enkelklick, när som helst, var som helst (DEMO)."
+
+#: ../src/gtk-ui/sync-config-widget.c:86
+msgid "Mobical Backup and Restore service allows you to securely backup your personal mobile data for free."
+msgstr "Med Mobical-tjänsten för säkerhetskopiering och återställning kan du säkert säkerhetskopia dina personliga mobila data gratis."
+
+#: ../src/gtk-ui/sync-config-widget.c:89
+msgid "ZYB is a simple way for people to store and share mobile information online."
+msgstr "ZYB är ett enkelt sätt för människor att lagra och dela mobilinformation online."
+
+#: ../src/gtk-ui/sync-config-widget.c:92
+msgid "Memotoo lets you access your personal data from any computer connected to the Internet."
+msgstr "Med Memotoo kan du nå dina personliga data från valfri dator ansluten till Internet."
+
+#: ../src/gtk-ui/sync-config-widget.c:188
+msgid "Sorry, failed to save the configuration"
+msgstr "Kunde inte spara konfigurationen "
+
+#: ../src/gtk-ui/sync-config-widget.c:377
+msgid "Service must have a name and server URL"
+msgstr "Du måste ange ett namn på tjänsten och URL till servern"
+
+#: ../src/gtk-ui/sync-config-widget.c:418
+#, c-format
+msgid "Do you want to reset the settings for %s? This will not remove any synced information on either end."
+msgstr "Vill du återställa inställningarna för %s? Detta tar inte bort någon synkroniserad information på någon ände."
+
+#. TRANSLATORS: buttons in reset-service warning dialog
+#: ../src/gtk-ui/sync-config-widget.c:422
+msgid "Yes, reset"
+msgstr "Ja, återställ"
+
+#: ../src/gtk-ui/sync-config-widget.c:423
+#: ../src/gtk-ui/sync-config-widget.c:434
+msgid "No, keep settings"
+msgstr "Nej, behåll inställningar"
+
+#: ../src/gtk-ui/sync-config-widget.c:428
+#, c-format
+msgid "Do you want to delete the settings for %s? This will not remove any synced information on either end but it will remove these settings."
+msgstr "Vill du ta bort inställningarna för %s? Detta tar inte bort någon synkroniserad information på någon ände men det tar bort dessa inställningar."
+
+#. TRANSLATORS: buttons in delete-service warning dialog
+#: ../src/gtk-ui/sync-config-widget.c:433
+msgid "Yes, delete"
+msgstr "Ja, radera"
+
+#: ../src/gtk-ui/sync-config-widget.c:463
+msgid "Reset settings"
+msgstr "Återställ inställningar"
+
+#: ../src/gtk-ui/sync-config-widget.c:466
+msgid "Delete settings"
+msgstr "Radera inställningar"
+
+#: ../src/gtk-ui/sync-config-widget.c:476
+msgid "Save and use"
+msgstr "Spara och använd"
+
+#: ../src/gtk-ui/sync-config-widget.c:479
+msgid ""
+"Save and replace\n"
+"current service"
+msgstr ""
+"Spara och ersätt\n"
+"nuvarande tjänst"
+
+#: ../src/gtk-ui/sync-config-widget.c:489
+msgid "Stop using device"
+msgstr "Sluta använda enhet"
+
+#: ../src/gtk-ui/sync-config-widget.c:492
+msgid "Stop using service"
+msgstr "Sluta använda tjänst"
+
+#. TRANSLATORS: label for an entry in service configuration form.
+#. * Placeholder is a source  name.
+#. * Example: "Appointments URI"
+#: ../src/gtk-ui/sync-config-widget.c:675
+#, c-format
+msgid "%s URI"
+msgstr "%s URI"
+
+#. TRANSLATORS: toggles in service configuration form, placeholder is service
+#. * or device name
+#: ../src/gtk-ui/sync-config-widget.c:850
+#, c-format
+msgid "Send changes to %s"
+msgstr "Skicka ändringar till %s"
+
+#: ../src/gtk-ui/sync-config-widget.c:855
+#, c-format
+msgid "Receive changes from %s"
+msgstr "Ta emot ändringar från %s"
+
+#: ../src/gtk-ui/sync-config-widget.c:871
+msgid "<b>Sync</b>"
+msgstr "<b>Synkronisera</b>"
+
+#. TRANSLATORS: label of a entry in service configuration
+#: ../src/gtk-ui/sync-config-widget.c:887
+msgid "Server address"
+msgstr "Serveradress"
+
+#. TRANSLATORS: explanation before a device template combobox.
+#. * Placeholder is a device name like 'Nokia N85' or 'Syncevolution
+#. * Client'
+#: ../src/gtk-ui/sync-config-widget.c:963
+#, c-format
+msgid "This device looks like it might be a '%s'. If this is not correct, please take a look at the list of supported devices and pick yours if it is listed"
+msgstr "Den här enheten ser ut som om den kan vara en %s. Om detta inte är korrekt, ta en titt på listan med enheter som stöds och välj din om den finns med på listan"
+
+#: ../src/gtk-ui/sync-config-widget.c:969
+msgid "We don't know what this device is exactly. Please take a look at the list of supported devices and pick yours if it is listed"
+msgstr "Vi kan inte identifiera den här enheten. Ta en titt på listan med enheter som stöds och välj din om den finns med på listan"
+
+#: ../src/gtk-ui/sync-config-widget.c:1122
+#, c-format
+msgid "%s - Bluetooth device"
+msgstr "%s - Bluetooth-enhet"
+
+#. TRANSLATORS: service title for services that are not based on a
+#. * template in service list, the placeholder is the name of the service
+#: ../src/gtk-ui/sync-config-widget.c:1128
+#, c-format
+msgid "%s - manually setup"
+msgstr "%s - konfigurera manuellt"
+
+#. TRANSLATORS: link button in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1803
+msgid "Launch website"
+msgstr "Öppna webbplatsen "
+
+#. TRANSLATORS: button in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1812
+msgid "Setup now"
+msgstr "Konfigurera nu"
+
+#. TRANSLATORS: labels of entries in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1908
+msgid "Username"
+msgstr "Användarnamn"
+
+#: ../src/gtk-ui/sync-config-widget.c:1923
+msgid "Password"
+msgstr "Lösenord"
+
+#. TRANSLATORS: warning in service configuration form for people
+#. who have modified the configuration via other means.
+#: ../src/gtk-ui/sync-config-widget.c:1946
+msgid "Current configuration is more complex than what can be shown here. Changes to sync mode or synced data types will overwrite that configuration."
+msgstr "Nuvarande konfiguration är mer komplex än vad som kan visas här. Ändringar i synkläge eller synkroniserade datatyper skriver över den konfigurationen."
+
+#. TRANSLATORS: this is the epander label for server settings
+#. in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1965
+msgid "Hide server settings"
+msgstr "Dölj serverinställningar"
+
+#. TRANSLATORS: this is the epander label for server settings
+#. in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1985
+msgid "Show server settings"
+msgstr "Visa serverinställningar"
+
+#: ../src/gnome-bluetooth/syncevolution.c:110
+msgid "Sync in the Sync application"
+msgstr "Synkronisera i programmet Sync"
+
+#: ../src/syncevo-dbus-server.cpp:5622
+#, c-format
+msgid "%s is syncing"
+msgstr "%s synkroniserar "
+
+#: ../src/syncevo-dbus-server.cpp:5623
+#, c-format
+msgid "We have just started to sync your computer with the %s sync service."
+msgstr "Vi har nyss börjat synkronisera din dator med synktjänsten %s."
+
+#. if sync is successfully started and done
+#: ../src/syncevo-dbus-server.cpp:5637
+#, c-format
+msgid "%s sync complete"
+msgstr "%s synk färdig"
+
+#: ../src/syncevo-dbus-server.cpp:5638
+#, c-format
+msgid "We have just finished syncing your computer with the %s sync service."
+msgstr "Vi har precis synkroniserat din dator med synktjänsten %s."
+
+#. if sync is successfully started and has errors, or not started successful with a fatal problem
+#: ../src/syncevo-dbus-server.cpp:5643
+msgid "Sync problem."
+msgstr "Synkproblem."
+
+#: ../src/syncevo-dbus-server.cpp:5644
+msgid "Sorry, there's a problem with your sync that you need to attend to."
+msgstr "Det finns ett problem i din synkronisering som du måste ta en titt på."
+
+#: ../src/syncevo-dbus-server.cpp:5717
+msgid "View"
+msgstr "Visa"
+
+#: ../src/syncevo-dbus-server.cpp:5718
+msgid "Dismiss"
+msgstr "Ignorera"
+
+#~ msgid ""
+#~ "Do you want to replace %s with %s? This will not remove any synced "
+#~ "information on either end but you will no longer be able to sync with %s."
+#~ msgstr ""
+#~ "Vill du ersätta %s med %s? Detta tar inte bort någon synkroniserad "
+#~ "information på någon ände men du kommer inte längre att kunna "
+#~ "synkronisera med %s."
+
+#~ msgid "Yes, use %s"
+#~ msgstr "Ja, använd %s"
+
+#~ msgid "No, use %s"
+#~ msgstr "Nej, använd %s"
+
+#~ msgid "Addressbook"
+#~ msgstr "Addressbok"
+
+#~ msgid "Todo"
+#~ msgstr "Att göra"
+
+#~ msgid "Memo"
+#~ msgstr "Memo"
+
+#~ msgid "Failed to save current service in GConf configuration system"
+#~ msgstr "Kunde inte spara nuvarande tjänst i GConf konfiguration"
+
+#~ msgid "Failed to save service configuration to SyncEvolution"
+#~ msgstr "Kunde inte spara tjänstekonfigurationen i SyncEvolution"
+
+#~ msgid "Failed to get service configuration from SyncEvolution"
+#~ msgstr "Kunde inte hämta tjänstkonfiguration från SyncEvolution"
+
+#~ msgid "Failed to remove service configuration from SyncEvolution"
+#~ msgstr "Kunde inte radera tjänstekonfigurationen från SyncEvolution"
+
+#~ msgid "Failed to cancel: sync was no longer in progress"
+#~ msgstr "Kunde inte avbryta: synkroniseringen var inte igång"
+
+#~ msgid "Failed to cancel sync"
+#~ msgstr "Kunde inte avbryta synkronisering"
+
+#~ msgid "Canceling sync"
+#~ msgstr "Avbryter synkronisering"
+
+#~ msgid "No sources are enabled, not syncing"
+#~ msgstr "Inga datakällor är anslutna, synkroniserar inte"
+
+#~ msgid "A sync is already in progress"
+#~ msgstr "Synkronisering pågår redan"
+
+#~ msgid "Failed to start sync"
+#~ msgstr "Kunde inte starta synkronisering"
+
+#~ msgid "%s (not supported by this service)"
+#~ msgstr "%s (stöds inte av denna tjänst)"
+
+#~ msgid "Failed to get server configuration from SyncEvolution"
+#~ msgstr "Kunde inte hämta serverkonfiguration från SyncEvolution"
+
+#~ msgid "New service"
+#~ msgstr "Ny tjänst"
+
+#~ msgid "Server URL"
+#~ msgstr "URL server"
+
+#~ msgid "Failed to get list of manually setup services from SyncEvolution"
+#~ msgstr ""
+#~ "Kunde inte få en lista av manuella inställningstjänster från SyncEvolution"
+
+#~ msgid "Service configuration not found"
+#~ msgstr "Konfigurationsfilen hittades inte"
+
+#~ msgid "Not authorized"
+#~ msgstr "Inte tillåten"
+
+#~ msgid "Not found"
+#~ msgstr "Hittades inte"
+
+#~ msgid "Database error"
+#~ msgstr "Databasfel"
+
+#~ msgid "Transport failure (no connection?)"
+#~ msgstr "Överföringsfel (ingen anslutning)?"
+
+#~ msgid "Connection timed out"
+#~ msgstr "Anslutningstiden överskreds"
+
+#~ msgid "Sync canceled"
+#~ msgstr "Synk avbruten"
+
+#~ msgid "Ending sync"
+#~ msgstr "Avslutar synk"
+
+#~ msgid "<b>No sync service in use</b>"
+#~ msgstr "<b>Ingen synktjänst används</b>"
+
+#~ msgid "<big>Manual setup</big>"
+#~ msgstr "<big>Manuell inställning</big>"
+
+#~ msgid "Delete this service"
+#~ msgstr "Ta bort denna tjänst"
+
+#~ msgid "Merge local and remote data (recommended)"
+#~ msgstr "Sammanför lokala och fjärrdata (rekommenderas)"
+
+#~ msgid "Reset original server settings"
+#~ msgstr "Återgå till originalserverinställningar"
+
+#~ msgid "Service name"
+#~ msgstr "Namn på tjänst"
+
+#~ msgid ""
+#~ "Sorry, you need an internet\n"
+#~ "connection to sync."
+#~ msgstr ""
+#~ "Du behöver internet-\n"
+#~ "anslutning för att synkronisera."
+
+#~ msgid ""
+#~ "Synchronization is not available (D-Bus service does not answer), sorry."
+#~ msgstr "Synkronisering är inte tillgänglig (D-Bustjänsten svarar ej)."
+
 #~ msgid "Last time: Received one change."
+
 #~ msgid_plural "Last time: Received %d changes."
 #~ msgstr[0] "Senast: Mottog en ändring"
 #~ msgstr[1] "Senast: Mottog %d ändringar"
index 25cf556..e819669 100644 (file)
@@ -3,14 +3,13 @@
 # This file is distributed under the same license as the PACKAGE package.
 # Zhu Yanhai <yanhai.zhu@intel.com>, 2009.
 #
-#: ../src/gtk-ui/sync-ui.c:765
 msgid ""
 msgstr ""
 "Project-Id-Version: syncevolution\n"
 "Report-Msgid-Bugs-To: http://moblin.org/projects/syncevolution\n"
-"POT-Creation-Date: 2009-10-16 11:24+0000\n"
-"PO-Revision-Date: 2009-10-09 18:03-0800\n"
-"Last-Translator: Yun Nie <yun.nie@ptiglobal.net>\n"
+"POT-Creation-Date: 2010-04-05 09:22+0000\n"
+"PO-Revision-Date: 2010-04-06 17:44-0800\n"
+"Last-Translator: \n"
 "Language-Team: zh_CN <yanhai.zhu@intel.com>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -19,515 +18,626 @@ msgstr ""
 
 #. TRANSLATORS: this is the application name that may be used by e.g.
 #. the windowmanager
-#: ../src/gtk-ui/main.c:31 ../src/gtk-ui/ui.glade.h:28
+#: ../src/gtk-ui/main.c:40
+#: ../src/gtk-ui/ui.glade.h:38
 #: ../src/gtk-ui/sync.desktop.in.h:1
+#: ../src/gnome-bluetooth/syncevolution.c:112
 msgid "Sync"
 msgstr "同步"
 
-#: ../src/gtk-ui/sync-ui.c:259
-msgid "Addressbook"
-msgstr "地址本"
+#: ../src/gtk-ui/sync-ui.c:260
+msgid "Contacts"
+msgstr "联系人"
 
-#: ../src/gtk-ui/sync-ui.c:261
-msgid "Calendar"
-msgstr "日历"
+#: ../src/gtk-ui/sync-ui.c:262
+msgid "Appointments"
+msgstr "约会"
 
-#: ../src/gtk-ui/sync-ui.c:263
-msgid "Todo"
+#: ../src/gtk-ui/sync-ui.c:264
+#: ../src/gtk-ui/ui.glade.h:40
+msgid "Tasks"
 msgstr "任务"
 
-#: ../src/gtk-ui/sync-ui.c:265
-msgid "Memo"
-msgstr "备忘录"
-
-#: ../src/gtk-ui/sync-ui.c:320
-msgid "Failed to save current service in GConf configuration system"
-msgstr "试图在 GConf 配置系统中保存当前服务时失败"
-
-#: ../src/gtk-ui/sync-ui.c:331
-msgid "Failed to save service configuration to SyncEvolution"
-msgstr "在向 SyncEvolution 中保存当前服务设置时失败"
-
-#: ../src/gtk-ui/sync-ui.c:416
-msgid "Failed to get service configuration from SyncEvolution"
-msgstr "试图从 SyncEvolution 中取得服务配置信息时失败"
-
-#: ../src/gtk-ui/sync-ui.c:480
-msgid "Failed to remove service configuration from SyncEvolution"
-msgstr "试图从 SyncEvolution 中删除服务配置信息时失败"
-
-#: ../src/gtk-ui/sync-ui.c:600
-msgid "Service must have a name and server URL"
-msgstr "需要给服务指定一个名字和服务器地址"
-
-#. sync is no longer in progress for some reason
-#: ../src/gtk-ui/sync-ui.c:676
-msgid "Failed to cancel: sync was no longer in progress"
-msgstr "不能取消: 同步已经停止"
-
-#: ../src/gtk-ui/sync-ui.c:680
-msgid "Failed to cancel sync"
-msgstr "取消同步失败"
+#: ../src/gtk-ui/sync-ui.c:266
+msgid "Notes"
+msgstr "便条"
 
-#: ../src/gtk-ui/sync-ui.c:684
-msgid "Canceling sync"
-msgstr "正在取消同步"
+#. TRANSLATORS: This is a "combination source" for syncing with devices
+#. * that combine appointments and tasks. the name should match the ones
+#. * used for calendar and todo above
+#: ../src/gtk-ui/sync-ui.c:271
+msgid "Appointments & Tasks"
+msgstr "约会和任务"
 
-#: ../src/gtk-ui/sync-ui.c:698
-msgid "Trying to cancel sync"
-msgstr "尝试取消同步"
+#: ../src/gtk-ui/sync-ui.c:343
+msgid "Starting sync"
+msgstr "正在开始同步"
 
-#: ../src/gtk-ui/sync-ui.c:705
+#. TRANSLATORS: slow sync confirmation dialog message. Placeholder
+#. * is service/device name
+#: ../src/gtk-ui/sync-ui.c:381
 #, c-format
-msgid ""
-"Do you want to delete all local data and replace it with data from %s? This "
-"is not usually advised."
-msgstr "您想删除所有本地数据并用来自%s的数据替代它们吗?通常我们不建议您这样做."
+msgid "Do you want to slow sync with %s?"
+msgstr "您想要和 %s 进行慢速同步吗?"
 
-#: ../src/gtk-ui/sync-ui.c:710
-#, c-format
-msgid ""
-"Do you want to delete all data in %s and replace it with your local data? "
-"This is not usually advised."
-msgstr ""
-"您想删除%s中的所有数据并用您的本地数据来替代它们吗?通常我们不建议您这样做"
+#: ../src/gtk-ui/sync-ui.c:385
+msgid "Yes, do slow sync"
+msgstr "好的,做慢速同步吧"
 
-#: ../src/gtk-ui/sync-ui.c:727
+#: ../src/gtk-ui/sync-ui.c:385
 msgid "No, cancel sync"
 msgstr "不,取消同步"
 
-#: ../src/gtk-ui/sync-ui.c:728
+#. TRANSLATORS: confirmation dialog for refresh-from-server. Placeholder
+#. * is service/device name
+#: ../src/gtk-ui/sync-ui.c:418
+#, c-format
+msgid "Do you want to delete all local data and replace it with data from %s? This is not usually advised."
+msgstr "您想删除所有本地数据并用来自%s的数据替代它们吗?通常我们不建议您这样做."
+
+#: ../src/gtk-ui/sync-ui.c:423
+#: ../src/gtk-ui/sync-ui.c:454
 msgid "Yes, delete and replace"
 msgstr "是的,删除然后替代"
 
-#: ../src/gtk-ui/sync-ui.c:750
-msgid "No sources are enabled, not syncing"
-msgstr "没有可用数据来源,同步未进行"
+#: ../src/gtk-ui/sync-ui.c:423
+#: ../src/gtk-ui/sync-ui.c:454
+#: ../src/gtk-ui/sync-ui.c:1566
+msgid "No"
+msgstr "我不要做慢速同步"
 
-#: ../src/gtk-ui/sync-ui.c:767
-msgid "A sync is already in progress"
-msgstr "同步操作已在进行中"
+#. TRANSLATORS: confirmation dialog for refresh-from-client. Placeholder
+#. * is service/device name
+#: ../src/gtk-ui/sync-ui.c:449
+#, c-format
+msgid "Do you want to delete all data in %s and replace it with your local data? This is not usually advised."
+msgstr "您想删除 %s 中的所有数据并用您的本地数据来替代它们吗?通常我们不建议您这样做"
 
-#: ../src/gtk-ui/sync-ui.c:769
-msgid "Failed to start sync"
-msgstr "不能开始同步"
+#: ../src/gtk-ui/sync-ui.c:481
+msgid "Trying to cancel sync"
+msgstr "尝试取消同步"
 
-#: ../src/gtk-ui/sync-ui.c:774
-msgid "Starting sync"
-msgstr "æ­£å\9c¨å¼\80å§\8bå\90\8cæ­¥"
+#: ../src/gtk-ui/sync-ui.c:521
+msgid "No service or device selected"
+msgstr "没æ\9c\89é\80\89æ\8b©æ\9c\8då\8a¡æ\88\96设å¤\87"
 
-#: ../src/gtk-ui/sync-ui.c:799
-msgid "Last synced just seconds ago"
-msgstr "最近一次同步操作已于几秒前执行"
+#. TRANSLATORS: This is the title on main view. Placeholder is
+#. * the service name. Example: "Google - synced just now"
+#: ../src/gtk-ui/sync-ui.c:529
+#, c-format
+msgid "%s - synced just now"
+msgstr "%s - 刚刚同步完"
 
-#: ../src/gtk-ui/sync-ui.c:802
-msgid "Last synced a minute ago"
-msgstr "最近一次同步操作于一分钟前执行"
+#: ../src/gtk-ui/sync-ui.c:533
+#, c-format
+msgid "%s - synced a minute ago"
+msgstr "%s - 一分钟前已同步"
 
-#: ../src/gtk-ui/sync-ui.c:805
+#: ../src/gtk-ui/sync-ui.c:537
 #, c-format
-msgid "Last synced %ld minutes ago"
-msgstr "最近一次同步操作于%ld分钟前执行"
+msgid "%s - synced %ld minutes ago"
+msgstr "%s - %ld 分钟前已同步"
 
-#: ../src/gtk-ui/sync-ui.c:808
-msgid "Last synced an hour ago"
-msgstr "最近一次同步操作于一小时前执行"
+#: ../src/gtk-ui/sync-ui.c:542
+#, c-format
+msgid "%s - synced an hour ago"
+msgstr "%s - 一小时前已同步"
 
-#: ../src/gtk-ui/sync-ui.c:811
+#: ../src/gtk-ui/sync-ui.c:546
 #, c-format
-msgid "Last synced %ld hours ago"
-msgstr "最近一次同步操作于%ld小时前执行"
+msgid "%s - synced %ld hours ago"
+msgstr "%s - %ld 小时前已同步"
 
-#: ../src/gtk-ui/sync-ui.c:814
-msgid "Last synced a day ago"
-msgstr "最近一次同步操作于一天前进行"
+#: ../src/gtk-ui/sync-ui.c:551
+#, c-format
+msgid "%s - synced a day ago"
+msgstr "%s - 一天之前已同步"
 
-#: ../src/gtk-ui/sync-ui.c:817
+#: ../src/gtk-ui/sync-ui.c:555
 #, c-format
-msgid "Last synced %ld days ago"
-msgstr "最近一次同步操作于%ld天前进行"
+msgid "%s - synced %ld days ago"
+msgstr "%s - %ld 天之前已同步"
+
+#. TRANSLATORS: Action button in info bar in main view. Shown with e.g.
+#. * "You've just restored a backup. The changes have not been "
+#. * "synced with %s yet"
+#: ../src/gtk-ui/sync-ui.c:604
+#: ../src/gtk-ui/sync-ui.c:719
+msgid "Sync now"
+msgstr "现在同步"
+
+#. TRANSLATORS: Action button in info bar in main view. Shown with e.g.
+#. * "A normal sync is not possible at this time..." message.
+#. * "Other options" will open Emergency view
+#: ../src/gtk-ui/sync-ui.c:610
+#: ../src/gtk-ui/ui.glade.h:37
+msgid "Slow sync"
+msgstr "慢速同步"
+
+#: ../src/gtk-ui/sync-ui.c:611
+msgid "Other options..."
+msgstr "其它选项"
+
+#. TRANSLATORS: Action button in info bar in main view. Shown e.g.
+#. * when no service is selected. Will open configuration view
+#: ../src/gtk-ui/sync-ui.c:616
+msgid "Select sync service"
+msgstr "选择同步服务"
+
+#. TRANSLATORS: Action button in info bar in main view. Shown e.g.
+#. * login to service fails. Will open configuration view for this service
+#: ../src/gtk-ui/sync-ui.c:621
+msgid "Edit service settings"
+msgstr "编辑服务设置"
+
+#: ../src/gtk-ui/sync-ui.c:670
+msgid "You haven't selected a sync service or device yet. Sync services let you synchronize your data between your netbook and a web service. You can also sync directly with some devices."
+msgstr "您尚未选择同步服务或设备。同步服务允许您在您的上网本和 Web 服务之间同步数据。您也可以直接与一些设备同步。"
 
-#: ../src/gtk-ui/sync-ui.c:902
+#: ../src/gtk-ui/sync-ui.c:717
 msgid "Sync again"
 msgstr "再次同步"
 
-#: ../src/gtk-ui/sync-ui.c:904 ../src/gtk-ui/ui.glade.h:29
-msgid "Sync now"
-msgstr "现在同步"
+#: ../src/gtk-ui/sync-ui.c:730
+msgid "Restoring"
+msgstr "恢复"
 
-#: ../src/gtk-ui/sync-ui.c:913
+#: ../src/gtk-ui/sync-ui.c:732
 msgid "Syncing"
 msgstr "正在同步"
 
-#: ../src/gtk-ui/sync-ui.c:919
+#. TRANSLATORS: This is for the button in main view, right side.
+#. Keep line length below ~20 characters, use two lines if needed
+#: ../src/gtk-ui/sync-ui.c:743
+#: ../src/gtk-ui/sync-ui.c:3358
 msgid "Cancel sync"
 msgstr "取消同步"
 
-#. TRANSLATORS: placeholder is a source name, shown with checkboxes in main window
-#: ../src/gtk-ui/sync-ui.c:1266
+#: ../src/gtk-ui/sync-ui.c:908
+msgid "Back to sync"
+msgstr "返回同步"
+
+#. TRANSLATORS: label for checkbutton/toggle in main view.
+#. * Please stick to similar length strings or break the line with
+#. * "\n" if absolutely needed
+#: ../src/gtk-ui/sync-ui.c:1209
+msgid "Automatic sync"
+msgstr "自动同步"
+
+#. This is the expander label in emergency view. It summarizes the
+#. * currently selected data sources. First placeholder is service/device
+#. * name, second a comma separeted list of sources.
+#. * E.g. "Affected data: Google Contacts, Appointments"
+#: ../src/gtk-ui/sync-ui.c:1480
+#, c-format
+msgid "Affected data: %s %s"
+msgstr "受影响的资料:%s %s"
+
+#: ../src/gtk-ui/sync-ui.c:1485
+#, c-format
+msgid "Affected data: none"
+msgstr "受影响的资料:没有"
+
+#. TRANSLATORS: confirmation for restoring a backup. placeholder is the
+#. * backup time string defined below
+#: ../src/gtk-ui/sync-ui.c:1563
+#, c-format
+msgid "Do you want to restore the backup from %s? All changes you have made since then will be lost."
+msgstr "您想要从 %s 恢复备份吗?您从那个时间"
+
+#: ../src/gtk-ui/sync-ui.c:1566
+msgid "Yes, restore"
+msgstr "是的,恢复备份"
+
+#. TRANSLATORS: date/time for strftime(), used in emergency view backup
+#. * label. Any time format that shows date and time is good.
+#: ../src/gtk-ui/sync-ui.c:1598
+#, c-format
+msgid "%x %X"
+msgstr "%x %X"
+
+#. TRANSLATORS: label for a backup in emergency view. Placeholder is
+#. * service or device name
+#: ../src/gtk-ui/sync-ui.c:1617
 #, c-format
-msgid "%s (not supported by this service)"
-msgstr "%s (不被当前服务所支持)"
+msgid "Backed up before syncing with %s"
+msgstr "在和 %s 同步前已备份"
+
+#: ../src/gtk-ui/sync-ui.c:1634
+msgid "Restore"
+msgstr "恢复"
+
+#. TRANSLATORS: this is an explanation in Emergency view.
+#. * Placeholder is a service/device name
+#: ../src/gtk-ui/sync-ui.c:1741
+#, c-format
+msgid "A normal sync with %s is not possible at this time. You can do a slow two-way sync or start from scratch. You can also restore a backup, but a slow sync or starting from scratch will still be required before normal sync is possible."
+msgstr "与 %s 的正常同步现在无法进行。您可以做慢速双向同步或从头开始。您也可以恢复一个备份,但是正常同步之前还是会需要慢速同步或从头开始。"
+
+#: ../src/gtk-ui/sync-ui.c:1751
+#, c-format
+msgid "If something has gone horribly wrong, you can try a slow sync, start from scratch or restore from backup."
+msgstr "如果发生严重错误,您可以尝试慢速同步,从头开始或者从备份恢复。"
+
+#. TRANSLATORS: These are a buttons in Emergency view. Placeholder is a
+#. * service/device name. Please don't use too long lines, but feel free to
+#. * use several lines.
+#: ../src/gtk-ui/sync-ui.c:1760
+#, c-format
+msgid ""
+"Delete all your local\n"
+"data and replace with\n"
+"data from %s"
+msgstr ""
+"删除所有本地\n"
+"数据并用 %s \n"
+"数据替代它们"
 
-#: ../src/gtk-ui/sync-ui.c:1299
+#: ../src/gtk-ui/sync-ui.c:1766
+#, c-format
+msgid ""
+"Delete all data on\n"
+"%s and replace\n"
+"with your local data"
+msgstr ""
+"删除所有 %s 上的\n"
+"数据并用本地数据\n"
+"替代它们"
+
+#: ../src/gtk-ui/sync-ui.c:2226
+msgid "Failed to get list of supported services from SyncEvolution"
+msgstr "未能从 SyncEvolution 得到支持的服务列表"
+
+#: ../src/gtk-ui/sync-ui.c:2280
+msgid "There was a problem communicating with the sync process. Please try again later."
+msgstr "与同步进程通信时发生问题。请稍后再试。"
+
+#: ../src/gtk-ui/sync-ui.c:2339
+msgid "Restore failed"
+msgstr "恢复失败"
+
+#: ../src/gtk-ui/sync-ui.c:2342
+#: ../src/gtk-ui/sync-ui.c:3227
+msgid "Sync failed"
+msgstr "同步失败"
+
+#: ../src/gtk-ui/sync-ui.c:2348
+msgid "Restore complete"
+msgstr "恢复完成"
+
+#: ../src/gtk-ui/sync-ui.c:2351
+msgid "Sync complete"
+msgstr "同步完成"
+
+#: ../src/gtk-ui/sync-ui.c:2443
+#, c-format
+msgid "Preparing '%s'"
+msgstr "正在准备 '%s'"
+
+#: ../src/gtk-ui/sync-ui.c:2446
+#, c-format
+msgid "Receiving '%s'"
+msgstr "正在接收 '%s'"
+
+#: ../src/gtk-ui/sync-ui.c:2449
+#, c-format
+msgid "Sending '%s'"
+msgstr "正在发送 '%s'"
+
+#: ../src/gtk-ui/sync-ui.c:2570
 #, c-format
 msgid "There was one remote rejection."
-msgid_plural "There were %d remote rejections."
-msgstr[0] "出现了一个远端拒绝"
-msgstr[1] "出现了%d个远端拒绝"
+msgid_plural "There were %ld remote rejections."
+msgstr[0] "出现了一个远端拒绝"
+msgstr[1] "出现了 %ld 个远端拒绝。"
 
-#: ../src/gtk-ui/sync-ui.c:1304
+#: ../src/gtk-ui/sync-ui.c:2575
 #, c-format
 msgid "There was one local rejection."
-msgid_plural "There were %d local rejections."
-msgstr[0] "出现了一个本地拒绝"
-msgstr[1] "出现了%d个本地拒绝"
+msgid_plural "There were %ld local rejections."
+msgstr[0] "出现了一个本地拒绝"
+msgstr[1] "出现了 %ld 个本地拒绝。"
 
-#: ../src/gtk-ui/sync-ui.c:1309
+#: ../src/gtk-ui/sync-ui.c:2580
 #, c-format
-msgid "There were %d local rejections and %d remote rejections."
-msgstr "一共出现了%d个本地拒绝和%d个远端拒绝"
+msgid "There were %ld local rejections and %ld remote rejections."
+msgstr "一共出现了 %ld 个本地拒绝和 %ld 个远端拒绝。"
 
-#: ../src/gtk-ui/sync-ui.c:1314
+#: ../src/gtk-ui/sync-ui.c:2585
 #, c-format
 msgid "Last time: No changes."
-msgstr "最近一次没有更改"
+msgstr "最近一次没有更改"
 
-#: ../src/gtk-ui/sync-ui.c:1316
+#: ../src/gtk-ui/sync-ui.c:2587
 #, c-format
 msgid "Last time: Sent one change."
-msgid_plural "Last time: Sent %d changes."
-msgstr[0] "最近一次: 发送了一个更改"
-msgstr[1] "最近一次: 发送了%d个更改"
+msgid_plural "Last time: Sent %ld changes."
+msgstr[0] "最近一次:发送了一个更改。"
+msgstr[1] "最近一次:发送了 %ld 个更改。"
 
 #. This is about changes made to the local data. Not all of these
 #. changes were requested by the remote server, so "applied"
 #. is a better word than "received" (bug #5185).
-#: ../src/gtk-ui/sync-ui.c:1324
+#: ../src/gtk-ui/sync-ui.c:2595
 #, c-format
 msgid "Last time: Applied one change."
-msgid_plural "Last time: Applied %d changes."
-msgstr[0] "最近一次: 应用了一个更改"
-msgstr[1] "最近一次: 应用了%d个更改"
+msgid_plural "Last time: Applied %ld changes."
+msgstr[0] "最近一次:应用了一个更改。"
+msgstr[1] "最近一次:应用了 %ld 个更改。"
 
-#: ../src/gtk-ui/sync-ui.c:1329
+#: ../src/gtk-ui/sync-ui.c:2600
 #, c-format
-msgid "Last time: Applied %d changes and sent %d changes."
-msgstr "最近一次: 应用了%d个更改并发送了%d个更改"
-
-#: ../src/gtk-ui/sync-ui.c:1421
-msgid "Failed to get server configuration from SyncEvolution"
-msgstr "未能从 SyncEvolution 处取得服务器配置信息"
+msgid "Last time: Applied %ld changes and sent %ld changes."
+msgstr "最近一次: 应用了 %ld 个更改并发送了 %ld 个更改。"
 
-#: ../src/gtk-ui/sync-ui.c:1473
-msgid ""
-"ScheduleWorld enables you to keep your contacts, events, tasks, and notes in "
-"sync."
-msgstr "ScheduleWorld 使您的联系人,事件,任务和便条保持同步。"
-
-#: ../src/gtk-ui/sync-ui.c:1476
-msgid ""
-"Google Sync can backup and synchronize your Address Book with your Gmail "
-"contacts."
-msgstr "Google Sync 可以把您的地址簿和 Gmail 联系人备份和同步。"
-
-#. TRANSLATORS: Please include the word "demo" (or the equivalent in
-#. your language): Funambol is going to be a 90 day demo service
-#. in the future
-#: ../src/gtk-ui/sync-ui.c:1482
+#. TRANSLATORS: the placeholder is a error message (hopefully)
+#. * explaining the problem
+#: ../src/gtk-ui/sync-ui.c:2807
+#, c-format
 msgid ""
-"Backup your contacts and calendar. Sync with a singleclick, anytime, "
-"anywhere (DEMO)."
-msgstr "备份您的联系人和日历。只需一键即可同步,随时、随地(演示)。"
-
-#: ../src/gtk-ui/sync-ui.c:1510
-msgid "New service"
-msgstr "新服务"
-
-#: ../src/gtk-ui/sync-ui.c:1557
-msgid "Server URL"
-msgstr "服务器的 URL"
+"There was a problem with last sync:\n"
+"%s"
+msgstr ""
+"上一个同步发生问题:\n"
+"%s"
 
-#. TRANSLATORS: placeholder is a source name in settings window
-#: ../src/gtk-ui/sync-ui.c:1579
+#: ../src/gtk-ui/sync-ui.c:2817
 #, c-format
-msgid "%s URI"
-msgstr "%s URI"
+msgid "You've just restored a backup. The changes have not been synced with %s yet"
+msgstr "您刚刚恢复了一个备份。这些修改还没有和 %s 同步"
 
-#: ../src/gtk-ui/sync-ui.c:1716 ../src/gtk-ui/ui.glade.h:17
-msgid "Launch website"
-msgstr "æ\89\93å¼\80ç«\99ç\82¹"
+#: ../src/gtk-ui/sync-ui.c:3105
+msgid "Waiting for current operation to finish..."
+msgstr "æ­£å\9c¨ç­\89å¾\85å½\93å\89\8dç\9a\84æ\93\8dä½\9cå®\8cæ\88\90ã\80\82ã\80\82ã\80\82"
 
-#: ../src/gtk-ui/sync-ui.c:1720
-msgid "Setup and use"
-msgstr "配置并使用"
+#. TRANSLATORS: next strings are error messages.
+#: ../src/gtk-ui/sync-ui.c:3139
+msgid "A normal sync is not possible at this time. The server suggests a slow sync, but this might not always be what you want if both ends already have data."
+msgstr "现在无法进行正常同步。服务器建议您做慢速同步,但是如果同步双方已经都有数据,您可能并不想使用慢速同步。"
 
-#: ../src/gtk-ui/sync-ui.c:1766
-msgid "Failed to get list of manually setup services from SyncEvolution"
-msgstr "未能从SyncEvolution取得手动设置服务列表"
+#: ../src/gtk-ui/sync-ui.c:3143
+msgid "The sync process died unexpectedly."
+msgstr "同步服务异常退出。"
 
-#: ../src/gtk-ui/sync-ui.c:1807
-msgid "Failed to get list of supported services from SyncEvolution"
-msgstr "未能从 SyncEvolution 得到支持的服务列表"
+#: ../src/gtk-ui/sync-ui.c:3148
+msgid "Password request was not answered. You can save the password in the settings to prevent the request."
+msgstr "密码请求没有回复。您可以在设置中保存密码,以防止密码请求。"
 
-#. TODO: this is a hack... SyncEnd should be a signal of it's own,
-#. not just hacked on top of the syncevolution error codes
-#: ../src/gtk-ui/sync-ui.c:1968
-msgid "Service configuration not found"
-msgstr "服务配置没找到"
+#. TODO use the service device name here, this is a remote problem
+#: ../src/gtk-ui/sync-ui.c:3152
+msgid "There was a problem processing sync request. Trying again may help."
+msgstr "处理同步请求时发生问题。请再试一次。"
 
-#: ../src/gtk-ui/sync-ui.c:1974
-msgid "Not authorized"
-msgstr "未认证"
+#: ../src/gtk-ui/sync-ui.c:3158
+msgid "Failed to login. Could there be a problem with your username or password?"
+msgstr "登录失败。会不会是您的用户名或密码有问题?"
 
-#: ../src/gtk-ui/sync-ui.c:1976
+#: ../src/gtk-ui/sync-ui.c:3161
 msgid "Forbidden"
 msgstr "被禁止"
 
-#: ../src/gtk-ui/sync-ui.c:1978
-msgid "Not found"
-msgstr "没找到"
+#. TRANSLATORS: data source means e.g. calendar or addressbook
+#: ../src/gtk-ui/sync-ui.c:3167
+msgid "A data source could not be found. Could there be a problem with the settings?"
+msgstr "无法找到数据来源。会不会是设置有问题?"
 
-#: ../src/gtk-ui/sync-ui.c:1980
-msgid "Fatal database error"
-msgstr "严重的数据库错误"
+#: ../src/gtk-ui/sync-ui.c:3171
+msgid "Remote database error"
+msgstr "远程数据库错误"
 
-#: ../src/gtk-ui/sync-ui.c:1982
-msgid "Database error"
-msgstr "数据库错误"
+#. This can happen when EDS is borked, restart it may help...
+#: ../src/gtk-ui/sync-ui.c:3174
+msgid "There is a problem with the local database. Syncing again or rebooting may help."
+msgstr "本地资料库有问题。请重新同步或者重新启动可能会有帮助。"
 
-#: ../src/gtk-ui/sync-ui.c:1984
-msgid "No space left"
-msgstr "没有剩余空间"
+#: ../src/gtk-ui/sync-ui.c:3177
+msgid "No space on disk"
+msgstr "磁盘上没有剩余空间"
 
-#. TODO identify problem item somehow ?
-#: ../src/gtk-ui/sync-ui.c:1987
+#: ../src/gtk-ui/sync-ui.c:3179
 msgid "Failed to process SyncML"
 msgstr "处理 SyncML 失败"
 
-#: ../src/gtk-ui/sync-ui.c:1989
+#: ../src/gtk-ui/sync-ui.c:3181
 msgid "Server authorization failed"
 msgstr "服务器认证失败"
 
-#: ../src/gtk-ui/sync-ui.c:1991
+#: ../src/gtk-ui/sync-ui.c:3183
 msgid "Failed to parse configuration file"
 msgstr "解析配置文件出错"
 
-#: ../src/gtk-ui/sync-ui.c:1993
+#: ../src/gtk-ui/sync-ui.c:3185
 msgid "Failed to read configuration file"
 msgstr "读配置文件时出错"
 
-#: ../src/gtk-ui/sync-ui.c:1995
+#: ../src/gtk-ui/sync-ui.c:3187
 msgid "No configuration found"
 msgstr "未找到配置"
 
-#: ../src/gtk-ui/sync-ui.c:1997
+#: ../src/gtk-ui/sync-ui.c:3189
 msgid "No configuration file found"
 msgstr "未找到配置文件"
 
-#: ../src/gtk-ui/sync-ui.c:1999
+#: ../src/gtk-ui/sync-ui.c:3191
 msgid "Server sent bad content"
 msgstr "服务器发送的内容错误"
 
-#: ../src/gtk-ui/sync-ui.c:2001
-msgid "Transport failure (no connection?)"
-msgstr "传输错误(没建立连接?)"
-
-#: ../src/gtk-ui/sync-ui.c:2003
-msgid "Connection timed out"
-msgstr "连接超时"
-
-#: ../src/gtk-ui/sync-ui.c:2005
+#: ../src/gtk-ui/sync-ui.c:3193
 msgid "Connection certificate has expired"
 msgstr "该连接的认证已过期"
 
-#: ../src/gtk-ui/sync-ui.c:2007
+#: ../src/gtk-ui/sync-ui.c:3195
 msgid "Connection certificate is invalid"
 msgstr "连接认证不合法"
 
-#: ../src/gtk-ui/sync-ui.c:2010
-msgid "Connection failed"
-msgstr "连接失败"
+#: ../src/gtk-ui/sync-ui.c:3203
+msgid "We were unable to connect to the server. The problem could be temporary or there could be something wrong with the settings."
+msgstr "我们无法连接到服务器。问题可能是暂时的,也可能是设置有问题。"
 
-#: ../src/gtk-ui/sync-ui.c:2012
-msgid "URL is bad"
-msgstr "URL有误"
+#: ../src/gtk-ui/sync-ui.c:3210
+msgid "The server URL is bad"
+msgstr "服务器的 URL有错误"
 
-#: ../src/gtk-ui/sync-ui.c:2014
-msgid "Server not found"
-msgstr "没找到服务器"
+#: ../src/gtk-ui/sync-ui.c:3215
+msgid "The server was not found"
+msgstr "没æ\9c\89æ\89¾å\88°æ\9c\8då\8a¡å\99¨"
 
-#: ../src/gtk-ui/sync-ui.c:2016
+#: ../src/gtk-ui/sync-ui.c:3217
 #, c-format
 msgid "Error %d"
 msgstr "错误 %d"
 
-#: ../src/gtk-ui/sync-ui.c:2026
-msgid "Sync D-Bus service exited unexpectedly"
-msgstr "Sync 的 D-Bus 服务异常退出"
-
-#: ../src/gtk-ui/sync-ui.c:2029 ../src/gtk-ui/sync-ui.c:2080
-msgid "Sync Failed"
-msgstr "同步失败"
-
-#: ../src/gtk-ui/sync-ui.c:2072
-msgid "Sync complete"
-msgstr "同步完成"
+#. TRANSLATORS: password request dialog contents: title, cancel button
+#. * and ok button
+#: ../src/gtk-ui/sync-ui.c:3355
+msgid "Password is required for sync"
+msgstr "同步需要密码"
 
-#: ../src/gtk-ui/sync-ui.c:2077
-msgid "Sync canceled"
-msgstr "同步被取消"
+#: ../src/gtk-ui/sync-ui.c:3359
+msgid "Sync with password"
+msgstr "用密码同步"
 
-#. NOTE extra1 can be error here
-#: ../src/gtk-ui/sync-ui.c:2095
-msgid "Ending sync"
-msgstr "结束同步"
-
-#. TRANSLATORS: placeholder is a source name (e.g. 'Calendar') in a progress text
-#: ../src/gtk-ui/sync-ui.c:2119
+#. TRANSLATORS: password request dialog message, placeholder is service name
+#: ../src/gtk-ui/sync-ui.c:3369
 #, c-format
-msgid "Preparing '%s'"
-msgstr "正在准备 '%s'"
-
-#. TRANSLATORS: placeholder is a source name in a progress text
-#: ../src/gtk-ui/sync-ui.c:2131
-#, c-format
-msgid "Sending '%s'"
-msgstr "正在发送 '%s'"
-
-#. TRANSLATORS: placeholder is a source name in a progress text
-#: ../src/gtk-ui/sync-ui.c:2143
-#, c-format
-msgid "Receiving '%s'"
-msgstr "正在接收 '%s'"
-
-#: ../src/gtk-ui/ui.glade.h:1
-msgid "<b>Data</b>"
-msgstr "<b>数据</b>"
+msgid "Please enter password for syncing with %s:"
+msgstr "请输入与 %s 同步的密码:"
 
+#. title for the buttons on the right side of main view
 #: ../src/gtk-ui/ui.glade.h:2
-msgid "<b>No sync service in use</b>"
-msgstr "<b>没有正在使用中的同步服务</b>"
-
-#: ../src/gtk-ui/ui.glade.h:3
-msgid "<b>Sync failure</b>"
-msgstr "<b>同步失败</b>"
+msgid "<b>Actions</b>"
+msgstr "<b>动作</b>"
 
+#. text between the two "start from scratch" buttons in emergency view
 #: ../src/gtk-ui/ui.glade.h:4
-msgid "<b>Type of Sync</b>"
-msgstr "<b>同步类型</b>"
+msgid "<b>or</b>"
+msgstr "<b>或者</b>"
 
 #: ../src/gtk-ui/ui.glade.h:5
-msgid "<big>Manual setup</big>"
-msgstr "<big>手动设置</big>"
+msgid "<big>Direct sync</big>"
+msgstr "<big>直接同步</big>"
 
 #: ../src/gtk-ui/ui.glade.h:6
-msgid "<big>Supported services</big>"
-msgstr "<big>支持的服务</big>"
-
-#: ../src/gtk-ui/ui.glade.h:7
-msgid "Add new service"
-msgstr "添加新服务"
+msgid "<big>Network sync</big>"
+msgstr "<b>网络同步</b>"
 
+#. a title in emergency view
 #: ../src/gtk-ui/ui.glade.h:8
-msgid "Back to sync"
-msgstr "返回同步"
-
-#: ../src/gtk-ui/ui.glade.h:9
-msgid ""
-"Change sync\n"
-"service"
-msgstr "改变同步服务"
+msgid "<big>Restore from backup</big>"
+msgstr "<big>从备份恢复</big>"
 
-#: ../src/gtk-ui/ui.glade.h:11
-msgid "Delete all local data and replace it with remote data"
-msgstr "删除所有本地数据并用远程数据替代它们"
+#. a title in emergency view
+#: ../src/gtk-ui/ui.glade.h:10
+msgid "<big>Slow sync</big>"
+msgstr "<big>慢速同步</big>"
 
+#. a title in emergency view
 #: ../src/gtk-ui/ui.glade.h:12
-msgid "Delete all remote data and replace it with local data"
-msgstr "删除所有远程数据并用本地数据替代它们"
+msgid "<big>Start from scratch</big>"
+msgstr "<big>从头开始</big>"
 
 #: ../src/gtk-ui/ui.glade.h:13
-msgid "Delete this service"
-msgstr "删除此项服务"
-
-#: ../src/gtk-ui/ui.glade.h:14
-msgid "Edit service settings"
-msgstr "编辑服务设置"
-
-#: ../src/gtk-ui/ui.glade.h:15
 msgid ""
-"If you don't see your service above but know that your sync provider uses "
-"SyncML\n"
-"you can setup a service manually."
+"A slow sync compares items from both sides and tries to merge them. \n"
+"This may fail in some cases, leading to duplicates or lost information."
 msgstr ""
-"如果您没有在上边看见您的服务,但知道您的服务提供者使用了SyncML接口\n"
-"那么您可以手动设置服务"
+"慢速同步会比较同步双方的数据,并尝试合并它们。\n"
+"在某些情况下可能会失败,导致数据被重复或者丢失数据。"
+
+#: ../src/gtk-ui/ui.glade.h:15
+msgid "Add new device"
+msgstr "添加新设备"
+
+#: ../src/gtk-ui/ui.glade.h:16
+msgid "Add new service"
+msgstr "添加新服务"
 
+#. explanation of "Restore backup" function
 #: ../src/gtk-ui/ui.glade.h:18
-msgid "Merge local and remote data (recommended)"
-msgstr "å\90\88并æ\9c¬å\9c°å\92\8cè¿\9cç¨\8bæ\95°æ\8d®(æ\8e¨è\8d\90)"
+msgid "Backups are made before every time we Sync. Choose a backup to restore. Any changes you have made since then will be lost."
+msgstr "å\9c¨æ\88\91们æ¯\8f次å\90\8cæ­¥å\89\8dé\83½ä¼\9aè¿\9bè¡\8cå¤\87份ã\80\82请é\80\89æ\8b©è¦\81æ\81¢å¤\8dç\9a\84å¤\87份ã\80\82æ\89\80æ\9c\89æ\82¨ä»\8eå¤\87份æ\97¶é\97´å\90\8eå\81\9aç\9a\84æ\9b´æ\94¹é\83½å°\86丢失ã\80\82"
 
 #: ../src/gtk-ui/ui.glade.h:19
-msgid "Password"
-msgstr "密码"
-
-#: ../src/gtk-ui/ui.glade.h:20
-msgid "Reset original server settings"
-msgstr "恢复服务器原始设置"
+msgid "Calendar"
+msgstr "日历"
 
+#. Button in main view, right side. Keep to below 20 chars per line, feel free to use two lines
 #: ../src/gtk-ui/ui.glade.h:21
-msgid "Save and use this service"
-msgstr "保存并使用此服务"
-
-#: ../src/gtk-ui/ui.glade.h:22
-msgid "Select sync service"
-msgstr "选择同步服务"
-
-#: ../src/gtk-ui/ui.glade.h:23
-msgid "Server settings"
-msgstr "服务器设置"
+msgid ""
+"Change or edit\n"
+"sync service"
+msgstr ""
+"改变或编辑\n"
+"同步服务"
 
+#. close button for settings window
 #: ../src/gtk-ui/ui.glade.h:24
-msgid "Service name"
-msgstr "服务名字"
+msgid "Close"
+msgstr "关闭"
 
 #: ../src/gtk-ui/ui.glade.h:25
 msgid ""
-"Sorry, you need an internet\n"
-"connection to sync."
-msgstr "抱歉,您需要一个互联网连接来进行同步"
+"Delete all data on Zyb \n"
+"and replace with your\n"
+"local information"
+msgstr ""
+"删除所有 Zyb 上的数据 \n"
+"并用本地数据 \n"
+"替代它们"
 
-#: ../src/gtk-ui/ui.glade.h:27
-msgid "Stop using this service"
-msgstr "停止使用此服务"
+#: ../src/gtk-ui/ui.glade.h:28
+msgid ""
+"Delete all your local\n"
+"information and replace\n"
+"with data from Zyb"
+msgstr ""
+"删除所有本地数据\n"
+"并用 Zyb 上的数据\n"
+"替代它们"
+
+#. button in main view, right side. Keep length to 20 characters or so, use two lines if needed
+#: ../src/gtk-ui/ui.glade.h:32
+msgid ""
+"Fix a sync\n"
+"emergency"
+msgstr ""
+"修复同步\n"
+"紧急状况"
 
-#: ../src/gtk-ui/ui.glade.h:30
+#: ../src/gtk-ui/ui.glade.h:34
 msgid ""
-"Synchronization is not available (D-Bus service does not answer), sorry."
-msgstr "抱歉,同步操作不可用(D-Bus服务无应答)."
+"If you don't see your service above but know that your sync provider uses SyncML\n"
+"you can setup a service manually."
+msgstr ""
+"如果您没有在上边看见您的服务,但知道您的服务提供者使用了SyncML接口\n"
+"那么您可以手动设置服务"
+
+#: ../src/gtk-ui/ui.glade.h:36
+msgid "Settings"
+msgstr "设置"
 
-#: ../src/gtk-ui/ui.glade.h:31
+#: ../src/gtk-ui/ui.glade.h:39
+msgid "Sync Emergency"
+msgstr "同步紧急状况"
+
+#: ../src/gtk-ui/ui.glade.h:41
 msgid ""
-"To sync you'll need a network connection and an account with a sync "
-"service.\n"
+"To sync you'll need a network connection and an account with a sync service.\n"
 "We support the following services: "
 msgstr ""
 "要进行同步您需要一个网络连接和一个同步服务的账号.\n"
 "我们目前支持以下服务"
 
-#: ../src/gtk-ui/ui.glade.h:33
-msgid "Username"
-msgstr "用户名"
+#: ../src/gtk-ui/ui.glade.h:43
+msgid "Use Bluetooth to Sync your data from one device to another."
+msgstr "使用蓝牙将您的数据从一个设备同步到另一个设备。"
 
-#: ../src/gtk-ui/ui.glade.h:34
-msgid ""
-"You haven't selected a sync service yet. Sync services let you \n"
-"synchronize your data between your netbook and a web service."
-msgstr ""
-"您尚未选择同步服务。同步服务允许您在您的上网本和 Web 服务之间同步数据。"
+#: ../src/gtk-ui/ui.glade.h:44
+msgid "You will need to add Bluetooth devices before they can be synced."
+msgstr "同步前你需要添加蓝牙设备。"
 
-#: ../src/gtk-ui/sync.desktop.in.h:2 ../src/gtk-ui/sync-gtk.desktop.in.h:2
+#: ../src/gtk-ui/sync.desktop.in.h:2
+#: ../src/gtk-ui/sync-gtk.desktop.in.h:2
 msgid "Up to date"
 msgstr "同步数据"
 
@@ -535,6 +645,341 @@ msgstr "同步数据"
 msgid "Sync (GTK)"
 msgstr "同步 (GTK)"
 
+#: ../src/gtk-ui/sync-config-widget.c:74
+msgid "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in sync."
+msgstr "ScheduleWorld 使您的联系人,事件,任务和便条保持同步。"
+
+#: ../src/gtk-ui/sync-config-widget.c:77
+msgid "Google Sync can backup and synchronize your contacts with your Gmail contacts."
+msgstr "Google Sync 可以把您的联系人和 Gmail 联系人备份和同步。"
+
+#. TRANSLATORS: Please include the word "demo" (or the equivalent in
+#. your language): Funambol is going to be a 90 day demo service
+#. in the future
+#: ../src/gtk-ui/sync-config-widget.c:83
+msgid "Backup your contacts and calendar. Sync with a single click, anytime, anywhere (DEMO)."
+msgstr "备份您的联系人和日历。只需一键即可同步,随时、随地(演示)。"
+
+#: ../src/gtk-ui/sync-config-widget.c:86
+msgid "Mobical Backup and Restore service allows you to securely backup your personal mobile data for free."
+msgstr "Mobical 备份和恢复服务可以让您免费而且安全地备份您的个人行动数据。"
+
+#: ../src/gtk-ui/sync-config-widget.c:89
+msgid "ZYB is a simple way for people to store and share mobile information online."
+msgstr "ZYB 是让您网上存储和分享行动咨询的简单方法。"
+
+#: ../src/gtk-ui/sync-config-widget.c:92
+msgid "Memotoo lets you access your personal data from any computer connected to the Internet."
+msgstr "Memotoo 让您从连接到互联网的任何电脑中存取您的个人数据。"
+
+#: ../src/gtk-ui/sync-config-widget.c:188
+msgid "Sorry, failed to save the configuration"
+msgstr "对不起,保存配置失败"
+
+#: ../src/gtk-ui/sync-config-widget.c:377
+msgid "Service must have a name and server URL"
+msgstr "需要给服务指定一个名字和服务器地址"
+
+#: ../src/gtk-ui/sync-config-widget.c:418
+#, c-format
+msgid "Do you want to reset the settings for %s? This will not remove any synced information on either end."
+msgstr "您想要重置 %s 的设置吗?这不会移除任何同步双方已经同步的数据。"
+
+#. TRANSLATORS: buttons in reset-service warning dialog
+#: ../src/gtk-ui/sync-config-widget.c:422
+msgid "Yes, reset"
+msgstr "是,重置。"
+
+#: ../src/gtk-ui/sync-config-widget.c:423
+#: ../src/gtk-ui/sync-config-widget.c:434
+msgid "No, keep settings"
+msgstr "不,保留设置"
+
+#: ../src/gtk-ui/sync-config-widget.c:428
+#, c-format
+msgid "Do you want to delete the settings for %s? This will not remove any synced information on either end but it will remove these settings."
+msgstr "您想要删除 %s 的设置吗?这不会移除任何双方已同步的资料,但是会移除这些设置。"
+
+#. TRANSLATORS: buttons in delete-service warning dialog
+#: ../src/gtk-ui/sync-config-widget.c:433
+msgid "Yes, delete"
+msgstr "是的,删除"
+
+#: ../src/gtk-ui/sync-config-widget.c:463
+msgid "Reset settings"
+msgstr "重置设置"
+
+#: ../src/gtk-ui/sync-config-widget.c:466
+msgid "Delete settings"
+msgstr "删除设置"
+
+#: ../src/gtk-ui/sync-config-widget.c:476
+msgid "Save and use"
+msgstr "保存并使用"
+
+#: ../src/gtk-ui/sync-config-widget.c:479
+msgid ""
+"Save and replace\n"
+"current service"
+msgstr ""
+"保存并替换\n"
+"现有服务"
+
+#: ../src/gtk-ui/sync-config-widget.c:489
+msgid "Stop using device"
+msgstr "停止使用此设备"
+
+#: ../src/gtk-ui/sync-config-widget.c:492
+msgid "Stop using service"
+msgstr "停止使用此服务"
+
+#. TRANSLATORS: label for an entry in service configuration form.
+#. * Placeholder is a source  name.
+#. * Example: "Appointments URI"
+#: ../src/gtk-ui/sync-config-widget.c:675
+#, c-format
+msgid "%s URI"
+msgstr "%s URI"
+
+#. TRANSLATORS: toggles in service configuration form, placeholder is service
+#. * or device name
+#: ../src/gtk-ui/sync-config-widget.c:850
+#, c-format
+msgid "Send changes to %s"
+msgstr "发送更改到 '%s'"
+
+#: ../src/gtk-ui/sync-config-widget.c:855
+#, c-format
+msgid "Receive changes from %s"
+msgstr "接收来自 %s 的改动"
+
+#: ../src/gtk-ui/sync-config-widget.c:871
+msgid "<b>Sync</b>"
+msgstr "<b>同步</b>"
+
+#. TRANSLATORS: label of a entry in service configuration
+#: ../src/gtk-ui/sync-config-widget.c:887
+msgid "Server address"
+msgstr "服务器地址"
+
+#. TRANSLATORS: explanation before a device template combobox.
+#. * Placeholder is a device name like 'Nokia N85' or 'Syncevolution
+#. * Client'
+#: ../src/gtk-ui/sync-config-widget.c:963
+#, c-format
+msgid "This device looks like it might be a '%s'. If this is not correct, please take a look at the list of supported devices and pick yours if it is listed"
+msgstr "设备看起来像“%s”。如果不是,请看一下列表中支持的设备,并从中选择您的设备。"
+
+#: ../src/gtk-ui/sync-config-widget.c:969
+msgid "We don't know what this device is exactly. Please take a look at the list of supported devices and pick yours if it is listed"
+msgstr "我们不知道这到底是什么设备。请看一下列表中支持的设备,并从中选择您的设备。"
+
+#: ../src/gtk-ui/sync-config-widget.c:1122
+#, c-format
+msgid "%s - Bluetooth device"
+msgstr "%s - 蓝牙设备"
+
+#. TRANSLATORS: service title for services that are not based on a
+#. * template in service list, the placeholder is the name of the service
+#: ../src/gtk-ui/sync-config-widget.c:1128
+#, c-format
+msgid "%s - manually setup"
+msgstr "%s - 手动设置"
+
+#. TRANSLATORS: link button in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1803
+msgid "Launch website"
+msgstr "打开站点"
+
+#. TRANSLATORS: button in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1812
+msgid "Setup now"
+msgstr "现在设置"
+
+#. TRANSLATORS: labels of entries in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1908
+msgid "Username"
+msgstr "用户名"
+
+#: ../src/gtk-ui/sync-config-widget.c:1923
+msgid "Password"
+msgstr "密码"
+
+#. TRANSLATORS: warning in service configuration form for people
+#. who have modified the configuration via other means.
+#: ../src/gtk-ui/sync-config-widget.c:1946
+msgid "Current configuration is more complex than what can be shown here. Changes to sync mode or synced data types will overwrite that configuration."
+msgstr "目前的配置比当前显示的更复杂。同步模式或已同步数据类型的更改将会覆盖此配置。"
+
+#. TRANSLATORS: this is the epander label for server settings
+#. in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1965
+msgid "Hide server settings"
+msgstr "隐藏服务器设置"
+
+#. TRANSLATORS: this is the epander label for server settings
+#. in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1985
+msgid "Show server settings"
+msgstr "显示服务器设置"
+
+#: ../src/gnome-bluetooth/syncevolution.c:110
+msgid "Sync in the Sync application"
+msgstr "在同步应用中同步"
+
+#: ../src/syncevo-dbus-server.cpp:5622
+#, c-format
+msgid "%s is syncing"
+msgstr "%s 正在进行同步"
+
+#: ../src/syncevo-dbus-server.cpp:5623
+#, c-format
+msgid "We have just started to sync your computer with the %s sync service."
+msgstr "我们已经将您的电脑与 %s 开始同步。"
+
+#. if sync is successfully started and done
+#: ../src/syncevo-dbus-server.cpp:5637
+#, c-format
+msgid "%s sync complete"
+msgstr "%s 同步完成"
+
+#: ../src/syncevo-dbus-server.cpp:5638
+#, c-format
+msgid "We have just finished syncing your computer with the %s sync service."
+msgstr "我们已经完成您的电脑与 %s 的同步。"
+
+#. if sync is successfully started and has errors, or not started successful with a fatal problem
+#: ../src/syncevo-dbus-server.cpp:5643
+msgid "Sync problem."
+msgstr "同步出现问题。"
+
+#: ../src/syncevo-dbus-server.cpp:5644
+msgid "Sorry, there's a problem with your sync that you need to attend to."
+msgstr "抱歉,有一个同步需要您看一下。"
+
+#: ../src/syncevo-dbus-server.cpp:5717
+msgid "View"
+msgstr "查看"
+
+#: ../src/syncevo-dbus-server.cpp:5718
+msgid "Dismiss"
+msgstr "解除"
+
+#~ msgid "Database error"
+#~ msgstr "数据库错误"
+
+#~ msgid ""
+#~ "Do you want to replace %s with %s? This will not remove any synced "
+#~ "information on either end but you will no longer be able to sync with %s."
+#~ msgstr ""
+#~ "您想要用 %s 代替 %s 吗?这不会移除任何双方已同步的资料,但是您将无法再与 %"
+#~ "s 同步。"
+
+#~ msgid "Yes, use %s"
+#~ msgstr "是,使用 %s"
+
+#~ msgid "No, use %s"
+#~ msgstr "不,不使用 %s"
+
+#~ msgid "Reset service"
+#~ msgstr "重置此项服务"
+
+#~ msgid "Addressbook"
+#~ msgstr "地址本"
+
+#~ msgid "Todo"
+#~ msgstr "任务"
+
+#~ msgid "Memo"
+#~ msgstr "备忘录"
+
+#~ msgid "Failed to save current service in GConf configuration system"
+#~ msgstr "试图在 GConf 配置系统中保存当前服务时失败"
+
+#~ msgid "Failed to save service configuration to SyncEvolution"
+#~ msgstr "在向 SyncEvolution 中保存当前服务设置时失败"
+
+#~ msgid "Failed to get service configuration from SyncEvolution"
+#~ msgstr "试图从 SyncEvolution 中取得服务配置信息时失败"
+
+#~ msgid "Failed to remove service configuration from SyncEvolution"
+#~ msgstr "试图从 SyncEvolution 中删除服务配置信息时失败"
+
+#~ msgid "Failed to cancel: sync was no longer in progress"
+#~ msgstr "不能取消: 同步已经停止"
+
+#~ msgid "Failed to cancel sync"
+#~ msgstr "取消同步失败"
+
+#~ msgid "Canceling sync"
+#~ msgstr "正在取消同步"
+
+#~ msgid "No sources are enabled, not syncing"
+#~ msgstr "没有可用数据来源,同步未进行"
+
+#~ msgid "A sync is already in progress"
+#~ msgstr "同步操作已在进行中"
+
+#~ msgid "Failed to start sync"
+#~ msgstr "不能开始同步"
+
+#~ msgid "%s (not supported by this service)"
+#~ msgstr "%s (不被当前服务所支持)"
+
+#~ msgid "Failed to get server configuration from SyncEvolution"
+#~ msgstr "未能从 SyncEvolution 处取得服务器配置信息"
+
+#~ msgid "Server URL"
+#~ msgstr "服务器的 URL"
+
+#~ msgid "Failed to get list of manually setup services from SyncEvolution"
+#~ msgstr "未能从SyncEvolution取得手动设置服务列表"
+
+#~ msgid "Service configuration not found"
+#~ msgstr "服务配置没找到"
+
+#~ msgid "Not authorized"
+#~ msgstr "未认证"
+
+#~ msgid "Not found"
+#~ msgstr "没找到"
+
+#~ msgid "Transport failure (no connection?)"
+#~ msgstr "传输错误(没建立连接?)"
+
+#~ msgid "Connection timed out"
+#~ msgstr "连接超时"
+
+#~ msgid "Sync canceled"
+#~ msgstr "同步被取消"
+
+#~ msgid "Ending sync"
+#~ msgstr "结束同步"
+
+#~ msgid "<b>No sync service in use</b>"
+#~ msgstr "<b>没有正在使用中的同步服务</b>"
+
+#~ msgid "<big>Manual setup</big>"
+#~ msgstr "<big>手动设置</big>"
+
+#~ msgid "Merge local and remote data (recommended)"
+#~ msgstr "合并本地和远程数据(推荐)"
+
+#~ msgid "Reset original server settings"
+#~ msgstr "恢复服务器原始设置"
+
+#~ msgid "Service name"
+#~ msgstr "服务名字"
+
+#~ msgid ""
+#~ "Sorry, you need an internet\n"
+#~ "connection to sync."
+#~ msgstr "抱歉,您需要一个互联网连接来进行同步"
+
+#~ msgid ""
+#~ "Synchronization is not available (D-Bus service does not answer), sorry."
+#~ msgstr "抱歉,同步操作不可用(D-Bus服务无应答)."
+
 #~ msgid "Dummy string: This is not supposed to be seen at all."
 #~ msgstr "测试:这个应该被自动comment out"
 
index 158a0e7..5862c1d 100644 (file)
+# Cheng-Chia Tseng <pswo10680@gmail.com>, 2010.
 msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: http://moblin.org/projects/syncevolution\n"
-"POT-Creation-Date: 2010-02-12 00:01+0000\n"
-"PO-Revision-Date: \n"
+"POT-Creation-Date: 2010-04-05 09:22+0000\n"
+"PO-Revision-Date: 2010-04-05 22:53+0800\n"
 "Last-Translator: Cheng-Chia Tseng <pswo10680@gmail.com>\n"
-"Language-Team: \n"
+"Language-Team: 正體中文 <kde-i18n-doc@kde.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "X-Poedit-Language: Chinese\n"
 "X-Poedit-SourceCharset: utf-8\n"
 "Plural-Forms: nplurals=2; plural=n!=1;\n"
+"X-Generator: Lokalize 1.0\n"
 
 #. TRANSLATORS: this is the application name that may be used by e.g.
 #. the windowmanager
 #: ../src/gtk-ui/main.c:40
-#: ../src/gtk-ui/ui.glade.h:36
+#: ../src/gtk-ui/ui.glade.h:38
 #: ../src/gtk-ui/sync.desktop.in.h:1
 #: ../src/gnome-bluetooth/syncevolution.c:112
 msgid "Sync"
 msgstr "同步"
 
-#: ../src/gtk-ui/sync-ui.c:234
+#: ../src/gtk-ui/sync-ui.c:260
 msgid "Contacts"
 msgstr "連絡人"
 
-#: ../src/gtk-ui/sync-ui.c:236
+#: ../src/gtk-ui/sync-ui.c:262
 msgid "Appointments"
 msgstr "約會"
 
-#: ../src/gtk-ui/sync-ui.c:238
-#: ../src/gtk-ui/ui.glade.h:38
+#: ../src/gtk-ui/sync-ui.c:264
+#: ../src/gtk-ui/ui.glade.h:40
 msgid "Tasks"
 msgstr "工作"
 
-#: ../src/gtk-ui/sync-ui.c:240
+#: ../src/gtk-ui/sync-ui.c:266
 msgid "Notes"
-msgstr "註記"
+msgstr "備註"
 
 #. TRANSLATORS: This is a "combination source" for syncing with devices
 #. * that combine appointments and tasks. the name should match the ones
 #. * used for calendar and todo above
-#: ../src/gtk-ui/sync-ui.c:245
+#: ../src/gtk-ui/sync-ui.c:271
 msgid "Appointments & Tasks"
 msgstr "約會與工作"
 
-#: ../src/gtk-ui/sync-ui.c:317
+#: ../src/gtk-ui/sync-ui.c:343
 msgid "Starting sync"
 msgstr "正在開始同步"
 
 #. TRANSLATORS: slow sync confirmation dialog message. Placeholder
 #. * is service/device name
-#: ../src/gtk-ui/sync-ui.c:355
+#: ../src/gtk-ui/sync-ui.c:381
 #, c-format
 msgid "Do you want to slow sync with %s?"
-msgstr "想要與 %s 進行慢速同步嗎?"
+msgstr "想要與 %s 進行慢速同步嗎?"
 
-#: ../src/gtk-ui/sync-ui.c:359
+#: ../src/gtk-ui/sync-ui.c:385
 msgid "Yes, do slow sync"
 msgstr "是,執行慢速同步"
 
-#: ../src/gtk-ui/sync-ui.c:359
+#: ../src/gtk-ui/sync-ui.c:385
 msgid "No, cancel sync"
 msgstr "不,取消同步"
 
 #. TRANSLATORS: confirmation dialog for refresh-from-server. Placeholder
 #. * is service/device name
-#: ../src/gtk-ui/sync-ui.c:392
+#: ../src/gtk-ui/sync-ui.c:418
 #, c-format
 msgid "Do you want to delete all local data and replace it with data from %s? This is not usually advised."
-msgstr "要刪除所有本機資料,並使用 %s 上的資料取代它嗎?我們通常不建議這麼做。"
+msgstr "要刪除所有本機資料,並使用 %s 上的資料取代它嗎?我們通常不建議這麼做。"
 
-#: ../src/gtk-ui/sync-ui.c:397
-#: ../src/gtk-ui/sync-ui.c:428
+#: ../src/gtk-ui/sync-ui.c:423
+#: ../src/gtk-ui/sync-ui.c:454
 msgid "Yes, delete and replace"
 msgstr "是,刪除並取代"
 
-#: ../src/gtk-ui/sync-ui.c:397
-#: ../src/gtk-ui/sync-ui.c:428
-#: ../src/gtk-ui/sync-ui.c:1217
+#: ../src/gtk-ui/sync-ui.c:423
+#: ../src/gtk-ui/sync-ui.c:454
+#: ../src/gtk-ui/sync-ui.c:1566
 msgid "No"
 msgstr "否"
 
 #. TRANSLATORS: confirmation dialog for refresh-from-client. Placeholder
 #. * is service/device name
-#: ../src/gtk-ui/sync-ui.c:423
+#: ../src/gtk-ui/sync-ui.c:449
 #, c-format
 msgid "Do you want to delete all data in %s and replace it with your local data? This is not usually advised."
-msgstr "要刪除所有在 %s 上的資料,並且使用本機資料取代它嗎?我們通常不建議這麼做。"
+msgstr "要刪除所有在 %s 上的資料,並且使用本機資料取代它嗎?我們通常不建議這麼做。"
 
-#: ../src/gtk-ui/sync-ui.c:455
+#: ../src/gtk-ui/sync-ui.c:481
 msgid "Trying to cancel sync"
 msgstr "正在嘗試取消同步"
 
-#: ../src/gtk-ui/sync-ui.c:481
-msgid "No service selected"
-msgstr "未選取服務"
+#: ../src/gtk-ui/sync-ui.c:521
+msgid "No service or device selected"
+msgstr "未選取服務或裝置"
 
 #. TRANSLATORS: This is the title on main view. Placeholder is
 #. * the service name. Example: "Google - synced just now"
-#: ../src/gtk-ui/sync-ui.c:489
+#: ../src/gtk-ui/sync-ui.c:529
 #, c-format
 msgid "%s - synced just now"
 msgstr "%s - 剛才同步過"
 
-#: ../src/gtk-ui/sync-ui.c:493
+#: ../src/gtk-ui/sync-ui.c:533
 #, c-format
 msgid "%s - synced a minute ago"
 msgstr "%s - 一分鐘前同步過"
 
-#: ../src/gtk-ui/sync-ui.c:497
+#: ../src/gtk-ui/sync-ui.c:537
 #, c-format
 msgid "%s - synced %ld minutes ago"
 msgstr "%s - %ld 分鐘前同步過"
 
-#: ../src/gtk-ui/sync-ui.c:502
+#: ../src/gtk-ui/sync-ui.c:542
 #, c-format
 msgid "%s - synced an hour ago"
 msgstr "%s - 一小時前同步過"
 
-#: ../src/gtk-ui/sync-ui.c:506
+#: ../src/gtk-ui/sync-ui.c:546
 #, c-format
 msgid "%s - synced %ld hours ago"
 msgstr "%s - %ld 小時前同步過"
 
-#: ../src/gtk-ui/sync-ui.c:511
+#: ../src/gtk-ui/sync-ui.c:551
 #, c-format
 msgid "%s - synced a day ago"
 msgstr "%s - 一天前同步過"
 
-#: ../src/gtk-ui/sync-ui.c:515
+#: ../src/gtk-ui/sync-ui.c:555
 #, c-format
 msgid "%s - synced %ld days ago"
 msgstr "%s - %ld 天前同步過"
 
-#. TRANSLATORS: Action buttons in error/info bars in main view.
-#: ../src/gtk-ui/sync-ui.c:563
-#: ../src/gtk-ui/ui.glade.h:35
+#. TRANSLATORS: Action button in info bar in main view. Shown with e.g.
+#. * "You've just restored a backup. The changes have not been "
+#. * "synced with %s yet"
+#: ../src/gtk-ui/sync-ui.c:604
+#: ../src/gtk-ui/sync-ui.c:719
+msgid "Sync now"
+msgstr "現在同步"
+
+#. TRANSLATORS: Action button in info bar in main view. Shown with e.g.
+#. * "A normal sync is not possible at this time..." message.
+#. * "Other options" will open Emergency view
+#: ../src/gtk-ui/sync-ui.c:610
+#: ../src/gtk-ui/ui.glade.h:37
 msgid "Slow sync"
 msgstr "慢速同步"
 
-#: ../src/gtk-ui/sync-ui.c:564
+#: ../src/gtk-ui/sync-ui.c:611
 msgid "Other options..."
 msgstr "其他選項..."
 
-#: ../src/gtk-ui/sync-ui.c:567
+#. TRANSLATORS: Action button in info bar in main view. Shown e.g.
+#. * when no service is selected. Will open configuration view
+#: ../src/gtk-ui/sync-ui.c:616
 msgid "Select sync service"
 msgstr "選取同步服務"
 
-#: ../src/gtk-ui/sync-ui.c:570
+#. TRANSLATORS: Action button in info bar in main view. Shown e.g.
+#. * login to service fails. Will open configuration view for this service
+#: ../src/gtk-ui/sync-ui.c:621
 msgid "Edit service settings"
 msgstr "編輯服務設定"
 
-#: ../src/gtk-ui/sync-ui.c:618
-msgid "You haven't selected a sync service yet. Sync services let you synchronize your data between your netbook and a web service"
-msgstr "你尚未選取同步服務。同步服務讓你在你的網路筆電與網路服務間同步你的資料"
+#: ../src/gtk-ui/sync-ui.c:670
+msgid "You haven't selected a sync service or device yet. Sync services let you synchronize your data between your netbook and a web service. You can also sync directly with some devices."
+msgstr "您尚未選取同步服務或裝置。同步服務讓您在您的網路筆電與網路服務間同步您的資料。您也可以直接和一些裝置進行同步。"
 
-#: ../src/gtk-ui/sync-ui.c:662
+#: ../src/gtk-ui/sync-ui.c:717
 msgid "Sync again"
 msgstr "再次同步"
 
-#: ../src/gtk-ui/sync-ui.c:664
-msgid "Sync now"
-msgstr "現在同步"
+#: ../src/gtk-ui/sync-ui.c:730
+msgid "Restoring"
+msgstr "正在還原"
 
-#: ../src/gtk-ui/sync-ui.c:674
+#: ../src/gtk-ui/sync-ui.c:732
 msgid "Syncing"
 msgstr "正在同步中"
 
 #. TRANSLATORS: This is for the button in main view, right side.
 #. Keep line length below ~20 characters, use two lines if needed
-#: ../src/gtk-ui/sync-ui.c:683
+#: ../src/gtk-ui/sync-ui.c:743
+#: ../src/gtk-ui/sync-ui.c:3358
 msgid "Cancel sync"
 msgstr "取消同步"
 
-#. TRANSLATORS: button in the Moblin window title bar when main view is
-#. * not visible
-#: ../src/gtk-ui/sync-ui.c:763
+#: ../src/gtk-ui/sync-ui.c:908
 msgid "Back to sync"
 msgstr "返回同步"
 
+#. TRANSLATORS: label for checkbutton/toggle in main view.
+#. * Please stick to similar length strings or break the line with
+#. * "\n" if absolutely needed
+#: ../src/gtk-ui/sync-ui.c:1209
+msgid "Automatic sync"
+msgstr "自動同步"
+
 #. This is the expander label in emergency view. It summarizes the
 #. * currently selected data sources. First placeholder is service/device
 #. * name, second a comma separeted list of sources.
 #. * E.g. "Affected data: Google Contacts, Appointments"
-#: ../src/gtk-ui/sync-ui.c:1134
+#: ../src/gtk-ui/sync-ui.c:1480
 #, c-format
 msgid "Affected data: %s %s"
 msgstr "受影響的資料:%s %s"
 
-#: ../src/gtk-ui/sync-ui.c:1139
+#: ../src/gtk-ui/sync-ui.c:1485
 #, c-format
 msgid "Affected data: none"
 msgstr "受影響的資料:無"
 
 #. TRANSLATORS: confirmation for restoring a backup. placeholder is the
 #. * backup time string defined below
-#: ../src/gtk-ui/sync-ui.c:1214
+#: ../src/gtk-ui/sync-ui.c:1563
 #, c-format
 msgid "Do you want to restore the backup from %s? All changes you have made since then will be lost."
-msgstr "你想要還原來自 %s 的備份嗎?所有你從那時起的變更都會喪失。"
+msgstr "您想要還原來自 %s 的備份嗎?所有您從那時起的變更都會喪失。"
 
-#: ../src/gtk-ui/sync-ui.c:1217
+#: ../src/gtk-ui/sync-ui.c:1566
 msgid "Yes, restore"
 msgstr "是,還原"
 
-#: ../src/gtk-ui/sync-ui.c:1249
+#. TRANSLATORS: date/time for strftime(), used in emergency view backup
+#. * label. Any time format that shows date and time is good.
+#: ../src/gtk-ui/sync-ui.c:1598
 #, c-format
 msgid "%x %X"
 msgstr "%x %X"
 
 #. TRANSLATORS: label for a backup in emergency view. Placeholder is
 #. * service or device name
-#: ../src/gtk-ui/sync-ui.c:1268
+#: ../src/gtk-ui/sync-ui.c:1617
 #, c-format
 msgid "Backed up before syncing with %s"
 msgstr "在與 %s 同步前已備份"
 
-#: ../src/gtk-ui/sync-ui.c:1285
+#: ../src/gtk-ui/sync-ui.c:1634
 msgid "Restore"
 msgstr "還原"
 
 #. TRANSLATORS: this is an explanation in Emergency view.
 #. * Placeholder is a service/device name
-#: ../src/gtk-ui/sync-ui.c:1392
+#: ../src/gtk-ui/sync-ui.c:1741
 #, c-format
-msgid "A normal sync with %s is not possible at this time. You can do a slow two-way sync, start from scratch or restore from backup."
-msgstr "與 %s 的一般同步目前無法使用。你可以嘗試慢速雙方同步、從零開始或是從備份中還原。"
+msgid "A normal sync with %s is not possible at this time. You can do a slow two-way sync or start from scratch. You can also restore a backup, but a slow sync or starting from scratch will still be required before normal sync is possible."
+msgstr "與 %s 的一般同步目前無法使用。您可以執行慢速雙方同步,或是從零開始。您也可以從備份中還原,但是在一般同步可以使用之前,會需要慢速同步或從零開始。"
 
-#: ../src/gtk-ui/sync-ui.c:1400
+#: ../src/gtk-ui/sync-ui.c:1751
 #, c-format
 msgid "If something has gone horribly wrong, you can try a slow sync, start from scratch or restore from backup."
-msgstr "如果有東西發生可怕錯誤,可以嘗試慢速同步、從零開始或是從備份還原。"
+msgstr "如果有東西發生可怕錯誤,可以嘗試慢速同步、從零開始或是從備份還原。"
 
 #. TRANSLATORS: These are a buttons in Emergency view. Placeholder is a
 #. * service/device name. Please don't use too long lines, but feel free to
 #. * use several lines.
-#: ../src/gtk-ui/sync-ui.c:1409
+#: ../src/gtk-ui/sync-ui.c:1760
 #, c-format
 msgid ""
 "Delete all your local\n"
@@ -248,7 +272,7 @@ msgstr ""
 "資料並使用來自\n"
 "%s 的資料取代"
 
-#: ../src/gtk-ui/sync-ui.c:1415
+#: ../src/gtk-ui/sync-ui.c:1766
 #, c-format
 msgid ""
 "Delete all data on\n"
@@ -256,62 +280,74 @@ msgid ""
 "with your local data"
 msgstr ""
 "刪除所有 %s 上的\n"
-"資料並使用的本機\n"
+"資料並使用的本機\n"
 "資料取代"
 
-#: ../src/gtk-ui/sync-ui.c:1854
+#: ../src/gtk-ui/sync-ui.c:2226
 msgid "Failed to get list of supported services from SyncEvolution"
 msgstr "從 SyncEvolution 取得支援的服務清單時失敗"
 
-#: ../src/gtk-ui/sync-ui.c:1958
-#: ../src/gtk-ui/sync-ui.c:2854
+#: ../src/gtk-ui/sync-ui.c:2280
+msgid "There was a problem communicating with the sync process. Please try again later."
+msgstr "與同步程序溝通成有錯誤發生。請稍候重試。"
+
+#: ../src/gtk-ui/sync-ui.c:2339
+msgid "Restore failed"
+msgstr "還原失敗"
+
+#: ../src/gtk-ui/sync-ui.c:2342
+#: ../src/gtk-ui/sync-ui.c:3227
 msgid "Sync failed"
 msgstr "同步失敗"
 
-#: ../src/gtk-ui/sync-ui.c:1962
+#: ../src/gtk-ui/sync-ui.c:2348
+msgid "Restore complete"
+msgstr "還原完成"
+
+#: ../src/gtk-ui/sync-ui.c:2351
 msgid "Sync complete"
 msgstr "同步完成"
 
-#: ../src/gtk-ui/sync-ui.c:2053
+#: ../src/gtk-ui/sync-ui.c:2443
 #, c-format
 msgid "Preparing '%s'"
-msgstr "正在準備 '%s'"
+msgstr "正在準備「%s」"
 
-#: ../src/gtk-ui/sync-ui.c:2056
+#: ../src/gtk-ui/sync-ui.c:2446
 #, c-format
 msgid "Receiving '%s'"
-msgstr "正在接收 '%s'"
+msgstr "正在接收「%s」"
 
-#: ../src/gtk-ui/sync-ui.c:2059
+#: ../src/gtk-ui/sync-ui.c:2449
 #, c-format
 msgid "Sending '%s'"
 msgstr "正在傳送「%s」"
 
-#: ../src/gtk-ui/sync-ui.c:2180
+#: ../src/gtk-ui/sync-ui.c:2570
 #, c-format
 msgid "There was one remote rejection."
 msgid_plural "There were %ld remote rejections."
 msgstr[0] "有過一次遠端拒絕。"
 msgstr[1] "有過 %ld 次遠端拒絕。"
 
-#: ../src/gtk-ui/sync-ui.c:2185
+#: ../src/gtk-ui/sync-ui.c:2575
 #, c-format
 msgid "There was one local rejection."
 msgid_plural "There were %ld local rejections."
 msgstr[0] "有過一次本機拒絕。"
 msgstr[1] "有過 %ld 次本機拒絕。"
 
-#: ../src/gtk-ui/sync-ui.c:2190
+#: ../src/gtk-ui/sync-ui.c:2580
 #, c-format
 msgid "There were %ld local rejections and %ld remote rejections."
 msgstr "有過 %ld  次本機拒絕和 %ld  次遠端拒絕。"
 
-#: ../src/gtk-ui/sync-ui.c:2195
+#: ../src/gtk-ui/sync-ui.c:2585
 #, c-format
 msgid "Last time: No changes."
 msgstr "上次:沒有變更。"
 
-#: ../src/gtk-ui/sync-ui.c:2197
+#: ../src/gtk-ui/sync-ui.c:2587
 #, c-format
 msgid "Last time: Sent one change."
 msgid_plural "Last time: Sent %ld changes."
@@ -321,108 +357,151 @@ msgstr[1] "上次:傳送了 %ld 個變更。"
 #. This is about changes made to the local data. Not all of these
 #. changes were requested by the remote server, so "applied"
 #. is a better word than "received" (bug #5185).
-#: ../src/gtk-ui/sync-ui.c:2205
+#: ../src/gtk-ui/sync-ui.c:2595
 #, c-format
 msgid "Last time: Applied one change."
 msgid_plural "Last time: Applied %ld changes."
 msgstr[0] "上次:套用了一個變更。"
 msgstr[1] "上次:套用了 %ld 個變更。"
 
-#: ../src/gtk-ui/sync-ui.c:2210
+#: ../src/gtk-ui/sync-ui.c:2600
 #, c-format
 msgid "Last time: Applied %ld changes and sent %ld changes."
 msgstr "上次:套用了 %ld 個變更並傳送了 %ld 個變更。"
 
-#: ../src/gtk-ui/sync-ui.c:2711
+#. TRANSLATORS: the placeholder is a error message (hopefully)
+#. * explaining the problem
+#: ../src/gtk-ui/sync-ui.c:2807
+#, c-format
+msgid ""
+"There was a problem with last sync:\n"
+"%s"
+msgstr ""
+"上次同步有錯誤發生:\n"
+"%s"
+
+#: ../src/gtk-ui/sync-ui.c:2817
+#, c-format
+msgid "You've just restored a backup. The changes have not been synced with %s yet"
+msgstr "您剛才已經還原一份備份。這些變更尚未與 %s 同步"
+
+#: ../src/gtk-ui/sync-ui.c:3105
 msgid "Waiting for current operation to finish..."
 msgstr "正在等候目前的操作完成..."
 
-#: ../src/gtk-ui/sync-ui.c:2784
+#. TRANSLATORS: next strings are error messages.
+#: ../src/gtk-ui/sync-ui.c:3139
 msgid "A normal sync is not possible at this time. The server suggests a slow sync, but this might not always be what you want if both ends already have data."
-msgstr "一般同步目前無法使用。這台伺服器建議使用慢速同步,但這可能不總是你想要的,因為雙方可能都已經有資料。"
+msgstr "一般同步目前無法使用。這台伺服器建議使用慢速同步,但這可能不總是您想要的,因為雙方可能都已經有資料。"
+
+#: ../src/gtk-ui/sync-ui.c:3143
+msgid "The sync process died unexpectedly."
+msgstr "同步程序在沒有預期的情況下終止了。"
+
+#: ../src/gtk-ui/sync-ui.c:3148
+msgid "Password request was not answered. You can save the password in the settings to prevent the request."
+msgstr "密碼請求沒有回應。您可以在設定值內儲存密碼來略過請求。"
+
+#. TODO use the service device name here, this is a remote problem
+#: ../src/gtk-ui/sync-ui.c:3152
+msgid "There was a problem processing sync request. Trying again may help."
+msgstr "同步請發生問題。重試一次可能會有幫助。"
 
-#: ../src/gtk-ui/sync-ui.c:2791
+#: ../src/gtk-ui/sync-ui.c:3158
 msgid "Failed to login. Could there be a problem with your username or password?"
-msgstr "登入失敗。的使用者名稱或密碼是否有問題?"
+msgstr "登入失敗。的使用者名稱或密碼是否有問題?"
 
-#: ../src/gtk-ui/sync-ui.c:2794
+#: ../src/gtk-ui/sync-ui.c:3161
 msgid "Forbidden"
 msgstr "禁止"
 
-#: ../src/gtk-ui/sync-ui.c:2799
-msgid "The source could not be found. Could there be a problem with the server settings?"
-msgstr "無法找到來源。伺服器設定是否有問題?"
+#. TRANSLATORS: data source means e.g. calendar or addressbook
+#: ../src/gtk-ui/sync-ui.c:3167
+msgid "A data source could not be found. Could there be a problem with the settings?"
+msgstr "無法找到資料來源。設定值是否有問題?"
 
-#: ../src/gtk-ui/sync-ui.c:2802
-msgid "Fatal database error"
-msgstr "致命數據錯誤"
+#: ../src/gtk-ui/sync-ui.c:3171
+msgid "Remote database error"
+msgstr "遠端資料庫錯誤"
 
 #. This can happen when EDS is borked, restart it may help...
-#: ../src/gtk-ui/sync-ui.c:2805
+#: ../src/gtk-ui/sync-ui.c:3174
 msgid "There is a problem with the local database. Syncing again or rebooting may help."
 msgstr "本機資料庫有問題。再次同步或是重新開機可能會有所幫助。"
 
-#: ../src/gtk-ui/sync-ui.c:2808
-msgid "Database error"
-msgstr "數據錯誤"
+#: ../src/gtk-ui/sync-ui.c:3177
+msgid "No space on disk"
+msgstr "磁碟沒有空間"
 
-#: ../src/gtk-ui/sync-ui.c:2810
-msgid "No space left"
-msgstr "沒有空間"
-
-#: ../src/gtk-ui/sync-ui.c:2812
+#: ../src/gtk-ui/sync-ui.c:3179
 msgid "Failed to process SyncML"
 msgstr "進行 SyncML 動作失敗"
 
-#: ../src/gtk-ui/sync-ui.c:2814
+#: ../src/gtk-ui/sync-ui.c:3181
 msgid "Server authorization failed"
 msgstr "伺服器授權失敗"
 
-#: ../src/gtk-ui/sync-ui.c:2816
+#: ../src/gtk-ui/sync-ui.c:3183
 msgid "Failed to parse configuration file"
 msgstr "解析設置檔案動作失敗"
 
-#: ../src/gtk-ui/sync-ui.c:2818
+#: ../src/gtk-ui/sync-ui.c:3185
 msgid "Failed to read configuration file"
 msgstr "讀取設置檔案動作失敗"
 
-#: ../src/gtk-ui/sync-ui.c:2820
+#: ../src/gtk-ui/sync-ui.c:3187
 msgid "No configuration found"
 msgstr "未找到設置"
 
-#: ../src/gtk-ui/sync-ui.c:2822
+#: ../src/gtk-ui/sync-ui.c:3189
 msgid "No configuration file found"
 msgstr "未找到設置檔案"
 
-#: ../src/gtk-ui/sync-ui.c:2824
+#: ../src/gtk-ui/sync-ui.c:3191
 msgid "Server sent bad content"
 msgstr "伺服器傳送出壞的內容"
 
-#: ../src/gtk-ui/sync-ui.c:2826
+#: ../src/gtk-ui/sync-ui.c:3193
 msgid "Connection certificate has expired"
 msgstr "連線憑證己過期"
 
-#: ../src/gtk-ui/sync-ui.c:2828
+#: ../src/gtk-ui/sync-ui.c:3195
 msgid "Connection certificate is invalid"
 msgstr "連線憑證無效"
 
-#: ../src/gtk-ui/sync-ui.c:2836
-msgid "We were unable to connect to the server. The problem could be temporary or there could be something wrong with the server settings."
-msgstr "我們無法連接到伺服器。問題可能是暫時的,或是伺服器設定可能有問題。"
+#: ../src/gtk-ui/sync-ui.c:3203
+msgid "We were unable to connect to the server. The problem could be temporary or there could be something wrong with the settings."
+msgstr "我們無法連接到伺服器。問題可能是暫時的,或是伺服器的設定值可能有問題。"
 
-#: ../src/gtk-ui/sync-ui.c:2840
-msgid "URL is bad"
-msgstr "URL 不對"
+#: ../src/gtk-ui/sync-ui.c:3210
+msgid "The server URL is bad"
+msgstr "伺服器的 URL 不對"
 
-#: ../src/gtk-ui/sync-ui.c:2842
-msgid "Server not found"
+#: ../src/gtk-ui/sync-ui.c:3215
+msgid "The server was not found"
 msgstr "找不到伺服器"
 
-#: ../src/gtk-ui/sync-ui.c:2844
+#: ../src/gtk-ui/sync-ui.c:3217
 #, c-format
 msgid "Error %d"
 msgstr "錯誤 %d"
 
+#. TRANSLATORS: password request dialog contents: title, cancel button
+#. * and ok button
+#: ../src/gtk-ui/sync-ui.c:3355
+msgid "Password is required for sync"
+msgstr "同步需要密碼"
+
+#: ../src/gtk-ui/sync-ui.c:3359
+msgid "Sync with password"
+msgstr "使用密碼進行同步"
+
+#. TRANSLATORS: password request dialog message, placeholder is service name
+#: ../src/gtk-ui/sync-ui.c:3369
+#, c-format
+msgid "Please enter password for syncing with %s:"
+msgstr "請輸入使用 %s 進行同步的密碼:"
+
 #. title for the buttons on the right side of main view
 #: ../src/gtk-ui/ui.glade.h:2
 msgid "<b>Actions</b>"
@@ -475,7 +554,7 @@ msgstr "新增服務"
 #. explanation of "Restore backup" function
 #: ../src/gtk-ui/ui.glade.h:18
 msgid "Backups are made before every time we Sync. Choose a backup to restore. Any changes you have made since then will be lost."
-msgstr "在我們每次同步前都會進行備份。選擇要還原的備份。所有從那時起的變更都會喪失。"
+msgstr "在我們每次同步前都會進行備份。選擇要還原的備份。所有從那時起的變更都會喪失。"
 
 #: ../src/gtk-ui/ui.glade.h:19
 msgid "Calendar"
@@ -490,14 +569,19 @@ msgstr ""
 "變更或編輯\n"
 "同步服務"
 
-#: ../src/gtk-ui/ui.glade.h:23
+#. close button for settings window
+#: ../src/gtk-ui/ui.glade.h:24
+msgid "Close"
+msgstr "關閉"
+
+#: ../src/gtk-ui/ui.glade.h:25
 msgid ""
 "Delete all data on Zyb \n"
 "and replace with your\n"
 "local information"
 msgstr "刪除所有遠端資料,並使用本機資料取代"
 
-#: ../src/gtk-ui/ui.glade.h:26
+#: ../src/gtk-ui/ui.glade.h:28
 msgid ""
 "Delete all your local\n"
 "information and replace\n"
@@ -505,7 +589,7 @@ msgid ""
 msgstr "刪除所有本機資料,並使用遠端資料取代"
 
 #. button in main view, right side. Keep length to 20 characters or so, use two lines if needed
-#: ../src/gtk-ui/ui.glade.h:30
+#: ../src/gtk-ui/ui.glade.h:32
 msgid ""
 "Fix a sync\n"
 "emergency"
@@ -513,37 +597,37 @@ msgstr ""
 "修正同步\n"
 "緊急狀況"
 
-#: ../src/gtk-ui/ui.glade.h:32
+#: ../src/gtk-ui/ui.glade.h:34
 msgid ""
 "If you don't see your service above but know that your sync provider uses SyncML\n"
 "you can setup a service manually."
 msgstr ""
-"如果你在上方沒有看到你的服務,但是你知道你的同步功能供應廠商使用 SyncML 的話,\n"
-"可以手動設定服務。"
+"如果您在上方沒有看到您的服務,但是您知道您的同步功能供應廠商使用 SyncML 的話,\n"
+"可以手動設定服務。"
 
-#: ../src/gtk-ui/ui.glade.h:34
+#: ../src/gtk-ui/ui.glade.h:36
 msgid "Settings"
 msgstr "設定"
 
-#: ../src/gtk-ui/ui.glade.h:37
+#: ../src/gtk-ui/ui.glade.h:39
 msgid "Sync Emergency"
 msgstr "同步緊急狀況"
 
-#: ../src/gtk-ui/ui.glade.h:39
+#: ../src/gtk-ui/ui.glade.h:41
 msgid ""
 "To sync you'll need a network connection and an account with a sync service.\n"
 "We support the following services: "
 msgstr ""
-"若要同步,需要有網路連線以及使用同步服務的帳號。\n"
+"若要同步,需要有網路連線以及使用同步服務的帳號。\n"
 "我們支援下列服務:"
 
-#: ../src/gtk-ui/ui.glade.h:41
+#: ../src/gtk-ui/ui.glade.h:43
 msgid "Use Bluetooth to Sync your data from one device to another."
-msgstr "使用藍牙從某裝置同步的資料到另一個裝置去。"
+msgstr "使用藍牙從某裝置同步的資料到另一個裝置去。"
 
-#: ../src/gtk-ui/ui.glade.h:42
+#: ../src/gtk-ui/ui.glade.h:44
 msgid "You will need to add Bluetooth devices before they can be synced."
-msgstr "在它們能被同步前,需要先加入藍牙裝置。"
+msgstr "在它們能被同步前,需要先加入藍牙裝置。"
 
 #: ../src/gtk-ui/sync.desktop.in.h:2
 #: ../src/gtk-ui/sync-gtk.desktop.in.h:2
@@ -554,92 +638,79 @@ msgstr "已是最新"
 msgid "Sync (GTK)"
 msgstr "同步 (GTK)"
 
-#: ../src/gtk-ui/sync-config-widget.c:71
+#: ../src/gtk-ui/sync-config-widget.c:74
 msgid "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in sync."
-msgstr "ScheduleWorld 可以讓的連絡人、行事曆事項、工作、以及註記保持同步。"
+msgstr "ScheduleWorld 可以讓的連絡人、行事曆事項、工作、以及註記保持同步。"
 
-#: ../src/gtk-ui/sync-config-widget.c:74
+#: ../src/gtk-ui/sync-config-widget.c:77
 msgid "Google Sync can backup and synchronize your contacts with your Gmail contacts."
-msgstr "Google Sync 可以將的聯絡人和 Gmail 連絡人進行備份以及同步。"
+msgstr "Google Sync 可以將的聯絡人和 Gmail 連絡人進行備份以及同步。"
 
 #. TRANSLATORS: Please include the word "demo" (or the equivalent in
 #. your language): Funambol is going to be a 90 day demo service
 #. in the future
-#: ../src/gtk-ui/sync-config-widget.c:80
+#: ../src/gtk-ui/sync-config-widget.c:83
 msgid "Backup your contacts and calendar. Sync with a single click, anytime, anywhere (DEMO)."
-msgstr "備份的連絡人與行事曆。一個按鍵就同步,任何時間、任何地點(樣本)。"
+msgstr "備份的連絡人與行事曆。一個按鍵就同步,任何時間、任何地點(樣本)。"
 
-#: ../src/gtk-ui/sync-config-widget.c:83
+#: ../src/gtk-ui/sync-config-widget.c:86
 msgid "Mobical Backup and Restore service allows you to securely backup your personal mobile data for free."
-msgstr "Mobical 備份與還原服務讓可以安全地備份個人行動資料,而且免費。"
+msgstr "Mobical 備份與還原服務讓可以安全地備份個人行動資料,而且免費。"
 
-#: ../src/gtk-ui/sync-config-widget.c:86
+#: ../src/gtk-ui/sync-config-widget.c:89
 msgid "ZYB is a simple way for people to store and share mobile information online."
 msgstr "ZYB 是人們儲存與線上分享行動資訊的一種簡單方法。"
 
-#: ../src/gtk-ui/sync-config-widget.c:89
+#: ../src/gtk-ui/sync-config-widget.c:92
 msgid "Memotoo lets you access your personal data from any computer connected to the Internet."
-msgstr "Memotoo 能讓你從任何連接到網路的電腦存取你的個人資料。"
+msgstr "Memotoo 能讓您從任何連接到網路的電腦存取您的個人資料。"
 
-#: ../src/gtk-ui/sync-config-widget.c:255
-#, c-format
-msgid "Do you want to replace %s with %s? This will not remove any synced information on either end but you will no longer be able to sync with %s."
-msgstr "你想要把 %s 用 %s 取代掉嗎?這不會移除兩方任何同步過的資訊,但是你將無法再與 %s 進行同步。"
+#: ../src/gtk-ui/sync-config-widget.c:188
+msgid "Sorry, failed to save the configuration"
+msgstr "很抱歉,儲存設定檔失敗"
 
-#. TRANSLATORS: decline/accept buttons in warning dialog.
-#. Placeholder is service name
-#: ../src/gtk-ui/sync-config-widget.c:267
-#, c-format
-msgid "Yes, use %s"
-msgstr "是,使用 %s"
-
-#: ../src/gtk-ui/sync-config-widget.c:268
-#, c-format
-msgid "No, use %s"
-msgstr "是,使用 %s"
-
-#: ../src/gtk-ui/sync-config-widget.c:341
+#: ../src/gtk-ui/sync-config-widget.c:377
 msgid "Service must have a name and server URL"
 msgstr "服務項目必須要有一個名稱和伺服器網址"
 
-#: ../src/gtk-ui/sync-config-widget.c:381
+#: ../src/gtk-ui/sync-config-widget.c:418
 #, c-format
 msgid "Do you want to reset the settings for %s? This will not remove any synced information on either end."
-msgstr "想要為 %s 重設設定嗎?這不會移除任何兩方同步過的資訊。"
+msgstr "想要為 %s 重設設定嗎?這不會移除任何兩方同步過的資訊。"
 
 #. TRANSLATORS: buttons in reset-service warning dialog
-#: ../src/gtk-ui/sync-config-widget.c:385
+#: ../src/gtk-ui/sync-config-widget.c:422
 msgid "Yes, reset"
 msgstr "是,重設"
 
-#: ../src/gtk-ui/sync-config-widget.c:386
-#: ../src/gtk-ui/sync-config-widget.c:397
+#: ../src/gtk-ui/sync-config-widget.c:423
+#: ../src/gtk-ui/sync-config-widget.c:434
 msgid "No, keep settings"
 msgstr "不,維持設定"
 
-#: ../src/gtk-ui/sync-config-widget.c:391
+#: ../src/gtk-ui/sync-config-widget.c:428
 #, c-format
-msgid "Do you want to delete the settings for %s? This will not remove any synced information on either end but it will remove this service configuration."
-msgstr "你想要為 %s 刪除設定值嗎?這不會移除任何兩方同步過的資訊,但是它會移除本服務設定檔。"
+msgid "Do you want to delete the settings for %s? This will not remove any synced information on either end but it will remove these settings."
+msgstr "您想要為 %s 刪除設定值嗎?這不會移除任何兩端同步過的資訊,但是它會移除這些設定值。"
 
 #. TRANSLATORS: buttons in delete-service warning dialog
-#: ../src/gtk-ui/sync-config-widget.c:396
+#: ../src/gtk-ui/sync-config-widget.c:433
 msgid "Yes, delete"
 msgstr "是,刪除"
 
-#: ../src/gtk-ui/sync-config-widget.c:425
-msgid "Reset service"
-msgstr "重設服務"
+#: ../src/gtk-ui/sync-config-widget.c:463
+msgid "Reset settings"
+msgstr "重設設定值"
 
-#: ../src/gtk-ui/sync-config-widget.c:428
-msgid "Delete service"
-msgstr "刪除服務"
+#: ../src/gtk-ui/sync-config-widget.c:466
+msgid "Delete settings"
+msgstr "刪除設定值"
 
-#: ../src/gtk-ui/sync-config-widget.c:438
+#: ../src/gtk-ui/sync-config-widget.c:476
 msgid "Save and use"
 msgstr "儲存並使用"
 
-#: ../src/gtk-ui/sync-config-widget.c:441
+#: ../src/gtk-ui/sync-config-widget.c:479
 msgid ""
 "Save and replace\n"
 "current service"
@@ -647,10 +718,18 @@ msgstr ""
 "儲存並取代\n"
 "目前的服務"
 
+#: ../src/gtk-ui/sync-config-widget.c:489
+msgid "Stop using device"
+msgstr "停止使用裝置"
+
+#: ../src/gtk-ui/sync-config-widget.c:492
+msgid "Stop using service"
+msgstr "停止使用服務"
+
 #. TRANSLATORS: label for an entry in service configuration form.
 #. * Placeholder is a source  name.
 #. * Example: "Appointments URI"
-#: ../src/gtk-ui/sync-config-widget.c:672
+#: ../src/gtk-ui/sync-config-widget.c:675
 #, c-format
 msgid "%s URI"
 msgstr "%s URI"
@@ -662,78 +741,137 @@ msgstr "%s URI"
 msgid "Send changes to %s"
 msgstr "傳送變更到 %s"
 
-#: ../src/gtk-ui/sync-config-widget.c:854
+#: ../src/gtk-ui/sync-config-widget.c:855
 #, c-format
 msgid "Receive changes from %s"
 msgstr "接收來自 %s 的變更"
 
-#: ../src/gtk-ui/sync-config-widget.c:869
+#: ../src/gtk-ui/sync-config-widget.c:871
 msgid "<b>Sync</b>"
 msgstr "<b>同步</b>"
 
 #. TRANSLATORS: label of a entry in service configuration
-#: ../src/gtk-ui/sync-config-widget.c:885
+#: ../src/gtk-ui/sync-config-widget.c:887
 msgid "Server address"
 msgstr "伺服器位址"
 
-#: ../src/gtk-ui/sync-config-widget.c:1067
+#. TRANSLATORS: explanation before a device template combobox.
+#. * Placeholder is a device name like 'Nokia N85' or 'Syncevolution
+#. * Client'
+#: ../src/gtk-ui/sync-config-widget.c:963
+#, c-format
+msgid "This device looks like it might be a '%s'. If this is not correct, please take a look at the list of supported devices and pick yours if it is listed"
+msgstr "此裝置看起來可能是「%s」。如果不正確的話,請查看支援裝置的清單,如果它列於其中的話請選取您的裝置。"
+
+#: ../src/gtk-ui/sync-config-widget.c:969
+msgid "We don't know what this device is exactly. Please take a look at the list of supported devices and pick yours if it is listed"
+msgstr "我們不知道此裝置到底是什麼。請查看支援裝置的清單,如果它列於其中的話請選取您的裝置。"
+
+#: ../src/gtk-ui/sync-config-widget.c:1122
 #, c-format
 msgid "%s - Bluetooth device"
 msgstr "%s - 藍牙裝置"
 
 #. TRANSLATORS: service title for services that are not based on a
 #. * template in service list, the placeholder is the name of the service
-#: ../src/gtk-ui/sync-config-widget.c:1073
+#: ../src/gtk-ui/sync-config-widget.c:1128
 #, c-format
 msgid "%s - manually setup"
 msgstr "%s - 手動設置"
 
 #. TRANSLATORS: link button in service configuration form
-#: ../src/gtk-ui/sync-config-widget.c:1748
+#: ../src/gtk-ui/sync-config-widget.c:1803
 msgid "Launch website"
 msgstr "開啟網站"
 
 #. TRANSLATORS: button in service configuration form
-#: ../src/gtk-ui/sync-config-widget.c:1757
+#: ../src/gtk-ui/sync-config-widget.c:1812
 msgid "Setup now"
 msgstr "立刻設置"
 
 #. TRANSLATORS: labels of entries in service configuration form
-#: ../src/gtk-ui/sync-config-widget.c:1820
+#: ../src/gtk-ui/sync-config-widget.c:1908
 msgid "Username"
 msgstr "使用者名稱"
 
-#: ../src/gtk-ui/sync-config-widget.c:1835
+#: ../src/gtk-ui/sync-config-widget.c:1923
 msgid "Password"
 msgstr "密碼"
 
 #. TRANSLATORS: warning in service configuration form for people
 #. who have modified the configuration via other means.
-#: ../src/gtk-ui/sync-config-widget.c:1858
-msgid "Current service configuration is more complex than what can be shown here. Changes to sync mode or synced data types will overwrite that configuration."
-msgstr "目前的服務設定檔比這裡能夠顯示的還要複雜許多。變更為同步模式或是同步過的資料類型將會覆蓋寫入那份設定檔。"
+#: ../src/gtk-ui/sync-config-widget.c:1946
+msgid "Current configuration is more complex than what can be shown here. Changes to sync mode or synced data types will overwrite that configuration."
+msgstr "目前的設定檔比這裡能夠顯示的還要複雜許多。變更為同步模式或是同步過的資料類型將會覆蓋寫入那份設定檔。"
 
 #. TRANSLATORS: this is the epander label for server settings
 #. in service configuration form
-#: ../src/gtk-ui/sync-config-widget.c:1877
+#: ../src/gtk-ui/sync-config-widget.c:1965
 msgid "Hide server settings"
 msgstr "隱藏伺服器設定"
 
 #. TRANSLATORS: this is the epander label for server settings
 #. in service configuration form
-#: ../src/gtk-ui/sync-config-widget.c:1897
+#: ../src/gtk-ui/sync-config-widget.c:1985
 msgid "Show server settings"
 msgstr "顯示伺服器設定"
 
-#. TRANSLATORS: button in service configuration form
-#: ../src/gtk-ui/sync-config-widget.c:1910
-msgid "Stop using service"
-msgstr "停止使用服務"
-
 #: ../src/gnome-bluetooth/syncevolution.c:110
 msgid "Sync in the Sync application"
 msgstr "在「同步」應用程式內同步"
 
+#: ../src/syncevo-dbus-server.cpp:5622
+#, c-format
+msgid "%s is syncing"
+msgstr "%s 正在同步中"
+
+#: ../src/syncevo-dbus-server.cpp:5623
+#, c-format
+msgid "We have just started to sync your computer with the %s sync service."
+msgstr "我們剛開始將您的電腦同步到 %s 同步服務。"
+
+#. if sync is successfully started and done
+#: ../src/syncevo-dbus-server.cpp:5637
+#, c-format
+msgid "%s sync complete"
+msgstr "%s 同步完成"
+
+#: ../src/syncevo-dbus-server.cpp:5638
+#, c-format
+msgid "We have just finished syncing your computer with the %s sync service."
+msgstr "我們剛完成將您的電腦同步到 %s 同步服務。"
+
+#. if sync is successfully started and has errors, or not started successful with a fatal problem
+#: ../src/syncevo-dbus-server.cpp:5643
+msgid "Sync problem."
+msgstr "同步發生問題。"
+
+#: ../src/syncevo-dbus-server.cpp:5644
+msgid "Sorry, there's a problem with your sync that you need to attend to."
+msgstr "抱歉,您的同步有個問題是您需要關心的。"
+
+#: ../src/syncevo-dbus-server.cpp:5717
+msgid "View"
+msgstr "檢視"
+
+#: ../src/syncevo-dbus-server.cpp:5718
+msgid "Dismiss"
+msgstr "摒棄"
+
+#~ msgid ""
+#~ "Do you want to replace %s with %s? This will not remove any synced "
+#~ "information on either end but you will no longer be able to sync with %s."
+#~ msgstr ""
+#~ "您想要把 %s 用 %s 取代掉嗎?這不會移除兩方任何同步過的資訊,但是您將無法再"
+#~ "與 %s 進行同步。"
+#~ msgid "Yes, use %s"
+#~ msgstr "是,使用 %s"
+#~ msgid "No, use %s"
+#~ msgstr "是,使用 %s"
+#~ msgid "Database error"
+#~ msgstr "數據錯誤"
+#~ msgid "Reset service"
+#~ msgstr "重設服務"
 #~ msgid "Todo"
 #~ msgstr "要做的事"
 #~ msgid "Memo"
@@ -756,8 +894,6 @@ msgstr "在「同步」應用程式內同步"
 #~ msgstr "連線時間已過"
 #~ msgid "Connection failed"
 #~ msgstr "連線失敗"
-#~ msgid "Syncevolution.Server D-Bus service exited unexpectedly"
-#~ msgstr "Syncevlolution.Server 的 D-Bus 服務在沒有預料的情況下離開了"
 #~ msgid "<b>No sync service in use</b>"
 #~ msgstr "<b>沒有使用中的同步服務</b>"
 #~ msgid "<big>Manual setup</big>"
@@ -768,7 +904,7 @@ msgstr "在「同步」應用程式內同步"
 #~ "Sorry, you need an internet\n"
 #~ "connection to sync."
 #~ msgstr ""
-#~ "抱歉,需要有網際網路連線\n"
+#~ "抱歉,需要有網際網路連線\n"
 #~ "才能同步。"
 #~ msgid ""
 #~ "Synchronization is not available (D-Bus service does not answer), sorry."
@@ -808,5 +944,5 @@ msgstr "在「同步」應用程式內同步"
 #~ msgid "Reset original server settings"
 #~ msgstr "重置為原始的伺服器設定"
 #~ msgid "Bring your data with you"
-#~ msgstr "請帶攜的數據"
+#~ msgstr "請帶攜的數據"
 
index 7018a7c..701e159 100644 (file)
@@ -1,57 +1,86 @@
 BACKENDS = @BACKENDS@
 
+# start with building nothing and add more targets below
+SUBDIRS =
+EXTRA_PROGRAMS =
+TESTS =
+bin_PROGRAMS =
+bin_SCRIPTS =
+nodist_bin_SCRIPTS =
+libexec_PROGRAMS =
+libexec_SCRIPTS =
+nobase_dist_template_DATA =
+DISTCLEANFILES =
+CLEANFILES =
+BUILT_SOURCES =
+
 service_in_files = org.syncevolution.service.in
 if COND_DBUS
 servicedir = $(DBUS_SERVICES_DIR)
 service_DATA = $(service_in_files:.service.in=.service)
 $(service_DATA): $(service_in_files) Makefile
        @sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@
-
-DBUS_DIRS = gdbus dbus
-else
-if COND_GUI
-# jump into interface directory directly instead of going through dbus
-DBUS_DIRS = dbus/interfaces
-endif
+SUBDIRS += gdbus
 endif
-
-if COND_GUI
-GUI_DIR = gtk-ui
-endif
-
-SUBDIRS = $(SYNTHESIS_SUBDIR) $(DBUS_DIRS) syncevo $(BACKENDS) $(GUI_DIR)
 if ENABLE_GNOME_BLUETOOTH_PANEL
 SUBDIRS += gnome-bluetooth
 endif
-DIST_SUBDIRS = gdbus dbus syncevo $(BACKENDS) gtk-ui gnome-bluetooth
-BUILT_SOURCES =
+if COND_CORE
+SUBDIRS += $(SYNTHESIS_SUBDIR) syncevo $(BACKENDS)
+bin_PROGRAMS += syncevolution
+bin_SCRIPTS += synccompare
+nobase_dist_template_DATA += $(TEMPLATE_FILES)
+else
+SUBDIRS += $(SYNTHESIS_SUBDIR_INCLUDES)
+endif
+if COND_GUI
+SUBDIRS += dbus gtk-ui
+endif
+DIST_SUBDIRS = gdbus dbus syncevo $(BACKENDS) gtk-ui gnome-bluetooth synthesis-includes
 
 AM_CPPFLAGS = $(SUBDIRS:%=-I$(srcdir)/%) -I$(srcdir)/../test -I$(top_srcdir) $(BACKEND_CPPFLAGS)
 
-EXTRA_PROGRAMS =
-TESTS =
-bin_PROGRAMS = syncevolution
+DISTCLEANFILES += synccompare
+CLEANFILES += libstdc++.a client-test $(CLIENT_LIB_TEST_FILES) \
+       org.syncevolution.service \
+    $(SYNCEVO_DBUS_SERVER_DESKTOP) $(SYNCEVO_DBUS_SERVER_SCRIPT)
+
+SYNCEVO_DBUS_SERVER_SCRIPT = syncevo-dbus-server-startup.sh
+SYNCEVO_DBUS_SERVER_SCRIPT_IN = $(SYNCEVO_DBUS_SERVER_SCRIPT).in
+
+autostartdir = $(sysconfdir)/xdg/autostart
+SYNCEVO_DBUS_SERVER_DESKTOP = syncevo-dbus-server.desktop
+SYNCEVO_DBUS_SERVER_DESKTOP_IN = $(SYNCEVO_DBUS_SERVER_DESKTOP).in
+
 if COND_DBUS
-libexec_PROGRAMS = syncevo-dbus-server
+libexec_PROGRAMS += syncevo-dbus-server
+nodist_bin_SCRIPTS += syncevo-http-server
+libexec_SCRIPTS += $(SYNCEVO_DBUS_SERVER_SCRIPT)
+$(libexec_SCRIPTS): $(SYNCEVO_DBUS_SERVER_SCRIPT_IN) Makefile
+       @sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@
+autostart_DATA = $(SYNCEVO_DBUS_SERVER_DESKTOP)
+$(autostart_DATA): $(SYNCEVO_DBUS_SERVER_DESKTOP_IN) Makefile
+       @sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@
 endif
+syncevo-http-server: $(srcdir)/../test/syncevo-http-server.py
+       cp $< $@
+CLEANFILES += syncevo-http-server
+
+nodist_bin_SCRIPTS += syncevo-phone-config
+syncevo-phone-config: $(srcdir)/../test/syncevo-phone-config.py
+       cp $< $@
+CLEANFILES += syncevo-phone-config
 
-bin_SCRIPTS = synccompare
 SYNCEVOLUTION_DEP =
 if ENABLE_MODULES
 else
 SYNCEVOLUTION_LDADD += $(SYNCSOURCES)
 SYNCEVOLUTION_DEP += $(SYNCSOURCES)
 endif
-EXTRA_DIST = shlibs.local Makefile-gen.am $(service_in_files)
+EXTRA_DIST = shlibs.local Makefile-gen.am $(service_in_files) $(SYNCEVO_DBUS_SERVER_SCRIPT_IN) $(SYNCEVO_DBUS_SERVER_DESKTOP_IN)
 
 TEMPLATE_FILES = @TEMPLATE_FILES@
 templatedir = $(datadir)/syncevolution/
-nobase_dist_template_DATA = $(TEMPLATE_FILES)
-
-DISTCLEANFILES = synccompare
-MAINTAINERCLEANFILES = Makefile.in
-CLEANFILES = libstdc++.a client-test $(CLIENT_LIB_TEST_FILES) \
-       org.syncevolution.service
 
 # synccompare is created by replacing its 'import Algorithm::Diff;'
 # with a simplified copy of Diff.pm.
@@ -99,8 +128,11 @@ endif
 # if linking statically against them, empty otherwise;
 # either way this does not lead to a dependency on those libs - done explicitly
 syncevolution_LDADD = $(CORE_LDADD) $(KEYRING_LIBS)
-syncevolution_LDFLAGS = $(CORE_LD_FLAGS)
-syncevolution_CXXFLAGS = $(SYNCEVOLUTION_CXXFLAGS) $(CORE_CXXFLAGS) $(KEYRING_CFLAGS)
+if COND_DBUS
+syncevolution_LDADD += gdbus/libgdbus.la
+endif
+syncevolution_LDFLAGS = $(CORE_LD_FLAGS) $(DBUS_LIBS)
+syncevolution_CXXFLAGS = $(SYNCEVOLUTION_CXXFLAGS) $(CORE_CXXFLAGS) $(KEYRING_CFLAGS) -I$(srcdir)/gdbus $(DBUS_CFLAGS)
 syncevolution_DEPENDENCIES = $(EXTRA_LTLIBRARIES) $(CORE_DEP) # $(SYNTHESIS_DEP)
 
 # rule which is only relevant when compiling Synthesis in subdirectory
@@ -152,9 +184,9 @@ if ENABLE_UNIT_TESTS
 nodist_syncevo_dbus_server_SOURCES = ../test/test.cpp
 endif
 
-syncevo_dbus_server_LDADD = gdbus/libgdbus.la $(CORE_LDADD) $(KEYRING_LIBS)
-syncevo_dbus_server_CPPFLAGS = -DHAVE_CONFIG_H -I$(srcdir)/gdbus $(AM_CPPFLAGS)
-syncevo_dbus_server_CXXFLAGS = $(SYNCEVOLUTION_CXXFLAGS) $(CORE_CXXFLAGS) $(GLIB_CFLAGS) $(DBUS_CFLAGS) $(LIBSOUP_CFLAGS) $(KEYRING_CFLAGS)
+syncevo_dbus_server_LDADD = gdbus/libgdbus.la $(CORE_LDADD) $(KEYRING_LIBS) $(LIBNOTIFY_LIBS)
+syncevo_dbus_server_CPPFLAGS = -DHAVE_CONFIG_H -I$(srcdir)/gdbus $(AM_CPPFLAGS) -DSYNCEVOLUTION_LOCALEDIR=\"${SYNCEVOLUTION_LOCALEDIR}\"
+syncevo_dbus_server_CXXFLAGS = $(SYNCEVOLUTION_CXXFLAGS) $(CORE_CXXFLAGS) $(GLIB_CFLAGS) $(DBUS_CFLAGS) $(LIBSOUP_CFLAGS) $(KEYRING_CFLAGS) $(LIBNOTIFY_CFLAGS)
 syncevo_dbus_server_LDFLAGS = $(CORE_LD_FLAGS) $(LIBSOUP_LIBS)
 syncevo_dbus_server_DEPENDENCIES = gdbus/libgdbus.la $(EXTRA_LTLIBRARIES) $(CORE_DEP) $(SYNTHESIS_DEP)
 endif
@@ -165,6 +197,7 @@ endif
 # link line.
 client_test_SOURCES = \
        client-test-app.cpp \
+       CmdlineSyncClient.cpp \
        ../test/ClientTest.cpp \
        ../test/ClientTest.h \
        ../test/client-test-main.cpp \
@@ -179,7 +212,6 @@ nodist_client_test_SOURCES = ../test/test.cpp
 CLIENT_LIB_TEST_FILES = \
        testcases/lcs/file1.txt \
        testcases/lcs/file2.txt \
-       testcases/templates/clients/default/template.ini \
        testcases/templates/clients/SyncEvolution/sources/addressbook/config.ini \
        testcases/templates/clients/SyncEvolution/sources/memo/config.ini \
        testcases/templates/clients/SyncEvolution/sources/todo/config.ini \
@@ -209,8 +241,8 @@ TEST_FILES_PATCHED = $(wildcard testcases/*.tem)
 CLIENT_LIB_TEST_FILES += $(TEST_FILES_GENERATED)
 
 client_test_CPPFLAGS = -DHAVE_CONFIG_H -DENABLE_INTEGRATION_TESTS -DENABLE_UNIT_TESTS $(AM_CPPFLAGS)
-client_test_CXXFLAGS = `cppunit-config --cflags` $(SYNCEVOLUTION_CXXFLAGS) $(CORE_CXXFLAGS)
-client_test_LDFLAGS = `cppunit-config --libs` `nm syncevo/.libs/libsyncevolution.a | grep funambolAutoRegisterRegistry | sed -e 's/.* /-u /'` $(CORE_LD_FLAGS)
+client_test_CXXFLAGS = `cppunit-config --cflags` $(SYNCEVOLUTION_CXXFLAGS) $(CORE_CXXFLAGS) $(KEYRING_CFLAGS)
+client_test_LDFLAGS = `cppunit-config --libs` `nm syncevo/.libs/libsyncevolution.a | grep funambolAutoRegisterRegistry | sed -e 's/.* /-u /'` $(CORE_LD_FLAGS) $(KEYRING_LIBS)
 client_test_LDADD = $(CORE_LDADD) $(SYNTHESIS_ENGINE)
 # These dependencies are intentionally a bit too broad:
 # they ensure that all files are in place to *run* client-test.
index cf26b55..c85e2d0 100644 (file)
@@ -1,57 +1,86 @@
 BACKENDS =  backends/addressbook backends/evolution backends/file backends/maemo backends/sqlite backends/xmlrpc
 
+# start with building nothing and add more targets below
+SUBDIRS =
+EXTRA_PROGRAMS =
+TESTS =
+bin_PROGRAMS =
+bin_SCRIPTS =
+nodist_bin_SCRIPTS =
+libexec_PROGRAMS =
+libexec_SCRIPTS =
+nobase_dist_template_DATA =
+DISTCLEANFILES =
+CLEANFILES =
+BUILT_SOURCES =
+
 service_in_files = org.syncevolution.service.in
 if COND_DBUS
 servicedir = $(DBUS_SERVICES_DIR)
 service_DATA = $(service_in_files:.service.in=.service)
 $(service_DATA): $(service_in_files) Makefile
        @sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@
-
-DBUS_DIRS = gdbus dbus
-else
-if COND_GUI
-# jump into interface directory directly instead of going through dbus
-DBUS_DIRS = dbus/interfaces
-endif
+SUBDIRS += gdbus
 endif
-
-if COND_GUI
-GUI_DIR = gtk-ui
-endif
-
-SUBDIRS = $(SYNTHESIS_SUBDIR) $(DBUS_DIRS) syncevo $(BACKENDS) $(GUI_DIR)
 if ENABLE_GNOME_BLUETOOTH_PANEL
 SUBDIRS += gnome-bluetooth
 endif
-DIST_SUBDIRS = gdbus dbus syncevo $(BACKENDS) gtk-ui gnome-bluetooth
-BUILT_SOURCES =
+if COND_CORE
+SUBDIRS += $(SYNTHESIS_SUBDIR) syncevo $(BACKENDS)
+bin_PROGRAMS += syncevolution
+bin_SCRIPTS += synccompare
+nobase_dist_template_DATA += $(TEMPLATE_FILES)
+else
+SUBDIRS += $(SYNTHESIS_SUBDIR_INCLUDES)
+endif
+if COND_GUI
+SUBDIRS += dbus gtk-ui
+endif
+DIST_SUBDIRS = gdbus dbus syncevo $(BACKENDS) gtk-ui gnome-bluetooth synthesis-includes
 
 AM_CPPFLAGS = $(SUBDIRS:%=-I$(srcdir)/%) -I$(srcdir)/../test -I$(top_srcdir) $(BACKEND_CPPFLAGS)
 
-EXTRA_PROGRAMS =
-TESTS =
-bin_PROGRAMS = syncevolution
+DISTCLEANFILES += synccompare
+CLEANFILES += libstdc++.a client-test $(CLIENT_LIB_TEST_FILES) \
+       org.syncevolution.service \
+    $(SYNCEVO_DBUS_SERVER_DESKTOP) $(SYNCEVO_DBUS_SERVER_SCRIPT)
+
+SYNCEVO_DBUS_SERVER_SCRIPT = syncevo-dbus-server-startup.sh
+SYNCEVO_DBUS_SERVER_SCRIPT_IN = $(SYNCEVO_DBUS_SERVER_SCRIPT).in
+
+autostartdir = $(sysconfdir)/xdg/autostart
+SYNCEVO_DBUS_SERVER_DESKTOP = syncevo-dbus-server.desktop
+SYNCEVO_DBUS_SERVER_DESKTOP_IN = $(SYNCEVO_DBUS_SERVER_DESKTOP).in
+
 if COND_DBUS
-libexec_PROGRAMS = syncevo-dbus-server
+libexec_PROGRAMS += syncevo-dbus-server
+nodist_bin_SCRIPTS += syncevo-http-server
+libexec_SCRIPTS += $(SYNCEVO_DBUS_SERVER_SCRIPT)
+$(libexec_SCRIPTS): $(SYNCEVO_DBUS_SERVER_SCRIPT_IN) Makefile
+       @sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@
+autostart_DATA = $(SYNCEVO_DBUS_SERVER_DESKTOP)
+$(autostart_DATA): $(SYNCEVO_DBUS_SERVER_DESKTOP_IN) Makefile
+       @sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@
 endif
+syncevo-http-server: $(srcdir)/../test/syncevo-http-server.py
+       cp $< $@
+CLEANFILES += syncevo-http-server
+
+nodist_bin_SCRIPTS += syncevo-phone-config
+syncevo-phone-config: $(srcdir)/../test/syncevo-phone-config.py
+       cp $< $@
+CLEANFILES += syncevo-phone-config
 
-bin_SCRIPTS = synccompare
 SYNCEVOLUTION_DEP =
 if ENABLE_MODULES
 else
 SYNCEVOLUTION_LDADD += $(SYNCSOURCES)
 SYNCEVOLUTION_DEP += $(SYNCSOURCES)
 endif
-EXTRA_DIST = shlibs.local Makefile-gen.am $(service_in_files)
+EXTRA_DIST = shlibs.local Makefile-gen.am $(service_in_files) $(SYNCEVO_DBUS_SERVER_SCRIPT_IN) $(SYNCEVO_DBUS_SERVER_DESKTOP_IN)
 
-TEMPLATE_FILES = templates/README templates/servers/Funambol/config.ini templates/servers/Funambol/template.ini templates/servers/Funambol/sources/calendar/config.ini templates/servers/Funambol/sources/todo/config.ini templates/servers/Funambol/sources/addressbook/config.ini templates/servers/Funambol/sources/memo/config.ini templates/servers/ScheduleWorld/config.ini templates/servers/ScheduleWorld/template.ini templates/servers/ScheduleWorld/sources/calendar/config.ini templates/servers/ScheduleWorld/sources/todo/config.ini templates/servers/ScheduleWorld/sources/addressbook/config.ini templates/servers/ScheduleWorld/sources/memo/config.ini templates/clients/phone/nokia/S40/7210c/config.ini templates/clients/phone/nokia/S40/7210c/template.ini templates/clients/phone/nokia/S40/7210c/sources/calendar/config.ini templates/clients/phone/nokia/S40/7210c/sources/calendar+todo/config.ini templates/clients/phone/nokia/S40/7210c/sources/todo/config.ini templates/clients/phone/nokia/S40/7210c/sources/addressbook/config.ini templates/clients/phone/nokia/S40/7210c/sources/memo/config.ini templates/clients/default/template.ini templates/clients/SyncEvolution/config.ini templates/clients/SyncEvolution/template.ini templates/clients/SyncEvolution/sources/calendar/config.ini templates/clients/SyncEvolution/sources/todo/config.ini templates/clients/SyncEvolution/sources/addressbook/config.ini templates/clients/SyncEvolution/sources/memo/config.ini
+TEMPLATE_FILES = templates/README templates/servers/Funambol/config.ini templates/servers/Funambol/template.ini templates/servers/Funambol/sources/calendar/config.ini templates/servers/Funambol/sources/todo/config.ini templates/servers/Funambol/sources/addressbook/config.ini templates/servers/Funambol/sources/memo/config.ini templates/servers/ScheduleWorld/config.ini templates/servers/ScheduleWorld/template.ini templates/servers/ScheduleWorld/sources/calendar/config.ini templates/servers/ScheduleWorld/sources/todo/config.ini templates/servers/ScheduleWorld/sources/addressbook/config.ini templates/servers/ScheduleWorld/sources/memo/config.ini templates/clients/phone/nokia/S60/N85/config.ini templates/clients/phone/nokia/S60/N85/template.ini templates/clients/phone/nokia/S60/N85/sources/calendar/config.ini templates/clients/phone/nokia/S60/N85/sources/calendar+todo/config.ini templates/clients/phone/nokia/S60/N85/sources/todo/config.ini templates/clients/phone/nokia/S60/N85/sources/addressbook/config.ini templates/clients/phone/nokia/S60/N85/sources/memo/config.ini templates/clients/phone/nokia/maemo/n900/config.ini templates/clients/phone/nokia/maemo/n900/template.ini templates/clients/phone/nokia/maemo/n900/sources/calendar/config.ini templates/clients/phone/nokia/maemo/n900/sources/calendar+todo/config.ini templates/clients/phone/nokia/maemo/n900/sources/todo/config.ini templates/clients/phone/nokia/maemo/n900/sources/addressbook/config.ini templates/clients/phone/nokia/maemo/n900/sources/memo/config.ini templates/clients/phone/nokia/S40/7210c/config.ini templates/clients/phone/nokia/S40/7210c/template.ini templates/clients/phone/nokia/S40/7210c/sources/calendar/config.ini templates/clients/phone/nokia/S40/7210c/sources/calendar+todo/config.ini templates/clients/phone/nokia/S40/7210c/sources/todo/config.ini templates/clients/phone/nokia/S40/7210c/sources/addressbook/config.ini templates/clients/phone/nokia/S40/7210c/sources/memo/config.ini templates/clients/SyncEvolution/config.ini templates/clients/SyncEvolution/template.ini templates/clients/SyncEvolution/sources/calendar/config.ini templates/clients/SyncEvolution/sources/todo/config.ini templates/clients/SyncEvolution/sources/addressbook/config.ini templates/clients/SyncEvolution/sources/memo/config.ini
 templatedir = $(datadir)/syncevolution/
-nobase_dist_template_DATA = $(TEMPLATE_FILES)
-
-DISTCLEANFILES = synccompare
-MAINTAINERCLEANFILES = Makefile.in
-CLEANFILES = libstdc++.a client-test $(CLIENT_LIB_TEST_FILES) \
-       org.syncevolution.service
 
 # synccompare is created by replacing its 'import Algorithm::Diff;'
 # with a simplified copy of Diff.pm.
@@ -99,8 +128,11 @@ endif
 # if linking statically against them, empty otherwise;
 # either way this does not lead to a dependency on those libs - done explicitly
 syncevolution_LDADD = $(CORE_LDADD) $(KEYRING_LIBS)
-syncevolution_LDFLAGS = $(CORE_LD_FLAGS)
-syncevolution_CXXFLAGS = $(SYNCEVOLUTION_CXXFLAGS) $(CORE_CXXFLAGS) $(KEYRING_CFLAGS)
+if COND_DBUS
+syncevolution_LDADD += gdbus/libgdbus.la
+endif
+syncevolution_LDFLAGS = $(CORE_LD_FLAGS) $(DBUS_LIBS)
+syncevolution_CXXFLAGS = $(SYNCEVOLUTION_CXXFLAGS) $(CORE_CXXFLAGS) $(KEYRING_CFLAGS) -I$(srcdir)/gdbus $(DBUS_CFLAGS)
 syncevolution_DEPENDENCIES = $(EXTRA_LTLIBRARIES) $(CORE_DEP) # $(SYNTHESIS_DEP)
 
 # rule which is only relevant when compiling Synthesis in subdirectory
@@ -152,9 +184,9 @@ if ENABLE_UNIT_TESTS
 nodist_syncevo_dbus_server_SOURCES = ../test/test.cpp
 endif
 
-syncevo_dbus_server_LDADD = gdbus/libgdbus.la $(CORE_LDADD) $(KEYRING_LIBS)
-syncevo_dbus_server_CPPFLAGS = -DHAVE_CONFIG_H -I$(srcdir)/gdbus $(AM_CPPFLAGS)
-syncevo_dbus_server_CXXFLAGS = $(SYNCEVOLUTION_CXXFLAGS) $(CORE_CXXFLAGS) $(GLIB_CFLAGS) $(DBUS_CFLAGS) $(LIBSOUP_CFLAGS) $(KEYRING_CFLAGS)
+syncevo_dbus_server_LDADD = gdbus/libgdbus.la $(CORE_LDADD) $(KEYRING_LIBS) $(LIBNOTIFY_LIBS)
+syncevo_dbus_server_CPPFLAGS = -DHAVE_CONFIG_H -I$(srcdir)/gdbus $(AM_CPPFLAGS) -DSYNCEVOLUTION_LOCALEDIR=\"${SYNCEVOLUTION_LOCALEDIR}\"
+syncevo_dbus_server_CXXFLAGS = $(SYNCEVOLUTION_CXXFLAGS) $(CORE_CXXFLAGS) $(GLIB_CFLAGS) $(DBUS_CFLAGS) $(LIBSOUP_CFLAGS) $(KEYRING_CFLAGS) $(LIBNOTIFY_CFLAGS)
 syncevo_dbus_server_LDFLAGS = $(CORE_LD_FLAGS) $(LIBSOUP_LIBS)
 syncevo_dbus_server_DEPENDENCIES = gdbus/libgdbus.la $(EXTRA_LTLIBRARIES) $(CORE_DEP) $(SYNTHESIS_DEP)
 endif
@@ -165,6 +197,7 @@ endif
 # link line.
 client_test_SOURCES = \
        client-test-app.cpp \
+       CmdlineSyncClient.cpp \
        ../test/ClientTest.cpp \
        ../test/ClientTest.h \
        ../test/client-test-main.cpp \
@@ -179,7 +212,6 @@ nodist_client_test_SOURCES = ../test/test.cpp
 CLIENT_LIB_TEST_FILES = \
        testcases/lcs/file1.txt \
        testcases/lcs/file2.txt \
-       testcases/templates/clients/default/template.ini \
        testcases/templates/clients/SyncEvolution/sources/addressbook/config.ini \
        testcases/templates/clients/SyncEvolution/sources/memo/config.ini \
        testcases/templates/clients/SyncEvolution/sources/todo/config.ini \
@@ -209,8 +241,8 @@ TEST_FILES_PATCHED = $(wildcard testcases/*.tem)
 CLIENT_LIB_TEST_FILES += $(TEST_FILES_GENERATED)
 
 client_test_CPPFLAGS = -DHAVE_CONFIG_H -DENABLE_INTEGRATION_TESTS -DENABLE_UNIT_TESTS $(AM_CPPFLAGS)
-client_test_CXXFLAGS = `cppunit-config --cflags` $(SYNCEVOLUTION_CXXFLAGS) $(CORE_CXXFLAGS)
-client_test_LDFLAGS = `cppunit-config --libs` `nm syncevo/.libs/libsyncevolution.a | grep funambolAutoRegisterRegistry | sed -e 's/.* /-u /'` $(CORE_LD_FLAGS)
+client_test_CXXFLAGS = `cppunit-config --cflags` $(SYNCEVOLUTION_CXXFLAGS) $(CORE_CXXFLAGS) $(KEYRING_CFLAGS)
+client_test_LDFLAGS = `cppunit-config --libs` `nm syncevo/.libs/libsyncevolution.a | grep funambolAutoRegisterRegistry | sed -e 's/.* /-u /'` $(CORE_LD_FLAGS) $(KEYRING_LIBS)
 client_test_LDADD = $(CORE_LDADD) $(SYNTHESIS_ENGINE)
 # These dependencies are intentionally a bit too broad:
 # they ensure that all files are in place to *run* client-test.
index 13afd29..c50ce9d 100644 (file)
@@ -34,29 +34,40 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-@ENABLE_GNOME_BLUETOOTH_PANEL_TRUE@am__append_1 = gnome-bluetooth
 EXTRA_PROGRAMS = $(am__EXEEXT_1) abort-redirect$(EXEEXT)
-TESTS = $(am__EXEEXT_2)
-bin_PROGRAMS = syncevolution$(EXEEXT) $(am__EXEEXT_2)
-@COND_DBUS_TRUE@libexec_PROGRAMS = syncevo-dbus-server$(EXEEXT)
-@ENABLE_MODULES_FALSE@am__append_2 = $(SYNCSOURCES)
-@ENABLE_MODULES_FALSE@am__append_3 = $(SYNCSOURCES)
-@ENABLE_MODULES_TRUE@am__append_4 = $(BACKEND_REGISTRIES)
-@ENABLE_MODULES_FALSE@am__append_5 = $(BACKEND_REGISTRIES)
+TESTS = $(am__EXEEXT_3)
+bin_PROGRAMS = $(am__EXEEXT_2) $(am__EXEEXT_3)
+libexec_PROGRAMS = $(am__EXEEXT_4)
+@COND_DBUS_TRUE@am__append_1 = gdbus
+@ENABLE_GNOME_BLUETOOTH_PANEL_TRUE@am__append_2 = gnome-bluetooth
+@COND_CORE_TRUE@am__append_3 = $(SYNTHESIS_SUBDIR) syncevo $(BACKENDS)
+@COND_CORE_TRUE@am__append_4 = syncevolution
+@COND_CORE_TRUE@am__append_5 = synccompare
+@COND_CORE_TRUE@am__append_6 = $(TEMPLATE_FILES)
+@COND_CORE_FALSE@am__append_7 = $(SYNTHESIS_SUBDIR_INCLUDES)
+@COND_GUI_TRUE@am__append_8 = dbus gtk-ui
+@COND_DBUS_TRUE@am__append_9 = syncevo-dbus-server
+@COND_DBUS_TRUE@am__append_10 = syncevo-http-server
+@COND_DBUS_TRUE@am__append_11 = $(SYNCEVO_DBUS_SERVER_SCRIPT)
+@ENABLE_MODULES_FALSE@am__append_12 = $(SYNCSOURCES)
+@ENABLE_MODULES_FALSE@am__append_13 = $(SYNCSOURCES)
+@ENABLE_MODULES_TRUE@am__append_14 = $(BACKEND_REGISTRIES)
+@ENABLE_MODULES_FALSE@am__append_15 = $(BACKEND_REGISTRIES)
+@COND_DBUS_TRUE@am__append_16 = gdbus/libgdbus.la
 
 # distribute test system?
 # yes: install client-test in bindir, test files in datadir
-@ENABLE_TESTING_TRUE@am__append_6 = client-test
-@ENABLE_TESTING_TRUE@am__append_7 = client-test
+@ENABLE_TESTING_TRUE@am__append_17 = client-test
+@ENABLE_TESTING_TRUE@am__append_18 = 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_8 = client-test
-@ENABLE_TESTING_FALSE@am__append_9 = $(CLIENT_LIB_TEST_FILES)
-@ENABLE_TESTING_FALSE@am__append_10 = all
+@ENABLE_TESTING_FALSE@am__append_19 = client-test
+@ENABLE_TESTING_FALSE@am__append_20 = $(CLIENT_LIB_TEST_FILES)
+@ENABLE_TESTING_FALSE@am__append_21 = all
 subdir = src
 DIST_COMMON = $(am__nobase_dist_doc_DATA_DIST) \
-       $(nobase_dist_template_DATA) $(srcdir)/Makefile.am \
+       $(am__nobase_dist_template_DATA_DIST) $(srcdir)/Makefile.am \
        $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4-repo/ax_boost_base.m4 \
@@ -67,11 +78,15 @@ mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
 @ENABLE_TESTING_FALSE@am__EXEEXT_1 = client-test$(EXEEXT)
-@ENABLE_TESTING_TRUE@am__EXEEXT_2 = client-test$(EXEEXT)
+@COND_CORE_TRUE@am__EXEEXT_2 = syncevolution$(EXEEXT)
+@ENABLE_TESTING_TRUE@am__EXEEXT_3 = client-test$(EXEEXT)
 am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libexecdir)" \
-       "$(DESTDIR)$(bindir)" "$(DESTDIR)$(docdir)" \
-       "$(DESTDIR)$(templatedir)" "$(DESTDIR)$(servicedir)"
+       "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libexecdir)" \
+       "$(DESTDIR)$(bindir)" "$(DESTDIR)$(autostartdir)" \
+       "$(DESTDIR)$(docdir)" "$(DESTDIR)$(templatedir)" \
+       "$(DESTDIR)$(servicedir)"
 binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+@COND_DBUS_TRUE@am__EXEEXT_4 = syncevo-dbus-server$(EXEEXT)
 libexecPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
 PROGRAMS = $(bin_PROGRAMS) $(libexec_PROGRAMS)
 am_abort_redirect_OBJECTS = abort_redirect-abort-redirect.$(OBJEXT)
@@ -87,8 +102,8 @@ abort_redirect_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
        $(abort_redirect_CXXFLAGS) $(CXXFLAGS) \
        $(abort_redirect_LDFLAGS) $(LDFLAGS) -o $@
 am__client_test_SOURCES_DIST = client-test-app.cpp \
-       ../test/ClientTest.cpp ../test/ClientTest.h \
-       ../test/client-test-main.cpp \
+       CmdlineSyncClient.cpp ../test/ClientTest.cpp \
+       ../test/ClientTest.h ../test/client-test-main.cpp \
        backends/addressbook/AddressBookSourceRegister.cpp \
        backends/evolution/EvolutionCalendarSourceRegister.cpp \
        backends/evolution/EvolutionContactSourceRegister.cpp \
@@ -106,6 +121,7 @@ am__objects_1 = client_test-AddressBookSourceRegister.$(OBJEXT) \
 @ENABLE_MODULES_FALSE@am__objects_2 = $(am__objects_1)
 am__objects_3 = $(am__objects_2)
 am_client_test_OBJECTS = client_test-client-test-app.$(OBJEXT) \
+       client_test-CmdlineSyncClient.$(OBJEXT) \
        client_test-ClientTest.$(OBJEXT) \
        client_test-client-test-main.$(OBJEXT) $(am__objects_3)
 am__objects_4 =
@@ -173,7 +189,9 @@ syncevolution_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
        $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(syncevolution_CXXFLAGS) \
        $(CXXFLAGS) $(syncevolution_LDFLAGS) $(LDFLAGS) -o $@
 binSCRIPT_INSTALL = $(INSTALL_SCRIPT)
-SCRIPTS = $(bin_SCRIPTS)
+libexecSCRIPT_INSTALL = $(INSTALL_SCRIPT)
+nodist_binSCRIPT_INSTALL = $(INSTALL_SCRIPT)
+SCRIPTS = $(bin_SCRIPTS) $(libexec_SCRIPTS) $(nodist_bin_SCRIPTS)
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/depcomp
 am__depfiles_maybe = depfiles
@@ -210,9 +228,15 @@ RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
        install-pdf-recursive install-ps-recursive install-recursive \
        installcheck-recursive installdirs-recursive pdf-recursive \
        ps-recursive uninstall-recursive
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+autostartDATA_INSTALL = $(INSTALL_DATA)
 am__nobase_dist_doc_DATA_DIST = testcases/lcs/file1.txt \
        testcases/lcs/file2.txt \
-       testcases/templates/clients/default/template.ini \
        testcases/templates/clients/SyncEvolution/sources/addressbook/config.ini \
        testcases/templates/clients/SyncEvolution/sources/memo/config.ini \
        testcases/templates/clients/SyncEvolution/sources/todo/config.ini \
@@ -230,17 +254,51 @@ am__nobase_dist_doc_DATA_DIST = testcases/lcs/file1.txt \
        testcases/ical20.ics testcases/imemo20.ics \
        testcases/itodo20.ics $(subst .patch,,$(subst \
        $(srcdir)/../test/,,$(TEST_FILES_PATCHES)))
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
 nobase_dist_docDATA_INSTALL = $(install_sh_DATA)
+am__nobase_dist_template_DATA_DIST = templates/README \
+       templates/servers/Funambol/config.ini \
+       templates/servers/Funambol/template.ini \
+       templates/servers/Funambol/sources/calendar/config.ini \
+       templates/servers/Funambol/sources/todo/config.ini \
+       templates/servers/Funambol/sources/addressbook/config.ini \
+       templates/servers/Funambol/sources/memo/config.ini \
+       templates/servers/ScheduleWorld/config.ini \
+       templates/servers/ScheduleWorld/template.ini \
+       templates/servers/ScheduleWorld/sources/calendar/config.ini \
+       templates/servers/ScheduleWorld/sources/todo/config.ini \
+       templates/servers/ScheduleWorld/sources/addressbook/config.ini \
+       templates/servers/ScheduleWorld/sources/memo/config.ini \
+       templates/clients/phone/nokia/S60/N85/config.ini \
+       templates/clients/phone/nokia/S60/N85/template.ini \
+       templates/clients/phone/nokia/S60/N85/sources/calendar/config.ini \
+       templates/clients/phone/nokia/S60/N85/sources/calendar+todo/config.ini \
+       templates/clients/phone/nokia/S60/N85/sources/todo/config.ini \
+       templates/clients/phone/nokia/S60/N85/sources/addressbook/config.ini \
+       templates/clients/phone/nokia/S60/N85/sources/memo/config.ini \
+       templates/clients/phone/nokia/maemo/n900/config.ini \
+       templates/clients/phone/nokia/maemo/n900/template.ini \
+       templates/clients/phone/nokia/maemo/n900/sources/calendar/config.ini \
+       templates/clients/phone/nokia/maemo/n900/sources/calendar+todo/config.ini \
+       templates/clients/phone/nokia/maemo/n900/sources/todo/config.ini \
+       templates/clients/phone/nokia/maemo/n900/sources/addressbook/config.ini \
+       templates/clients/phone/nokia/maemo/n900/sources/memo/config.ini \
+       templates/clients/phone/nokia/S40/7210c/config.ini \
+       templates/clients/phone/nokia/S40/7210c/template.ini \
+       templates/clients/phone/nokia/S40/7210c/sources/calendar/config.ini \
+       templates/clients/phone/nokia/S40/7210c/sources/calendar+todo/config.ini \
+       templates/clients/phone/nokia/S40/7210c/sources/todo/config.ini \
+       templates/clients/phone/nokia/S40/7210c/sources/addressbook/config.ini \
+       templates/clients/phone/nokia/S40/7210c/sources/memo/config.ini \
+       templates/clients/SyncEvolution/config.ini \
+       templates/clients/SyncEvolution/template.ini \
+       templates/clients/SyncEvolution/sources/calendar/config.ini \
+       templates/clients/SyncEvolution/sources/todo/config.ini \
+       templates/clients/SyncEvolution/sources/addressbook/config.ini \
+       templates/clients/SyncEvolution/sources/memo/config.ini
 nobase_dist_templateDATA_INSTALL = $(install_sh_DATA)
 serviceDATA_INSTALL = $(INSTALL_DATA)
-DATA = $(nobase_dist_doc_DATA) $(nobase_dist_template_DATA) \
-       $(service_DATA)
+DATA = $(autostart_DATA) $(nobase_dist_doc_DATA) \
+       $(nobase_dist_template_DATA) $(service_DATA)
 RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive        \
   distclean-recursive maintainer-clean-recursive
 ETAGS = etags
@@ -345,6 +403,8 @@ LDFLAGS = @LDFLAGS@
 LIBEXECDIR = @LIBEXECDIR@
 LIBICAL_AVAILABLE_CFLAGS = @LIBICAL_AVAILABLE_CFLAGS@
 LIBICAL_AVAILABLE_LIBS = @LIBICAL_AVAILABLE_LIBS@
+LIBNOTIFY_CFLAGS = @LIBNOTIFY_CFLAGS@
+LIBNOTIFY_LIBS = @LIBNOTIFY_LIBS@
 LIBOBJS = @LIBOBJS@
 LIBOPENOBEX_CFLAGS = @LIBOPENOBEX_CFLAGS@
 LIBOPENOBEX_LIBS = @LIBOPENOBEX_LIBS@
@@ -363,6 +423,8 @@ MODIFY_SYNCCOMPARE = @MODIFY_SYNCCOMPARE@
 MSGFMT = @MSGFMT@
 MSGFMT_OPTS = @MSGFMT_OPTS@
 MSGMERGE = @MSGMERGE@
+MX_GTK_0_99_1_CFLAGS = @MX_GTK_0_99_1_CFLAGS@
+MX_GTK_0_99_1_LIBS = @MX_GTK_0_99_1_LIBS@
 NMEDIT = @NMEDIT@
 NSS_CFLAGS = @NSS_CFLAGS@
 NSS_LIBS = @NSS_LIBS@
@@ -388,7 +450,7 @@ SQLITE_LIBS = @SQLITE_LIBS@
 STABLE_VERSION = @STABLE_VERSION@
 STRIP = @STRIP@
 SYNCEVOLUTION_CXXFLAGS = @SYNCEVOLUTION_CXXFLAGS@
-SYNCEVOLUTION_LDADD = @SYNCEVOLUTION_LDADD@ $(am__append_2)
+SYNCEVOLUTION_LDADD = @SYNCEVOLUTION_LDADD@ $(am__append_12)
 SYNCEVOLUTION_LOCALEDIR = @SYNCEVOLUTION_LOCALEDIR@
 SYNCSOURCES = @SYNCSOURCES@
 SYNTHESIS = @SYNTHESIS@
@@ -400,6 +462,7 @@ SYNTHESIS_LIB = @SYNTHESIS_LIB@
 SYNTHESIS_LIBS = @SYNTHESIS_LIBS@
 SYNTHESIS_SRC = @SYNTHESIS_SRC@
 SYNTHESIS_SUBDIR = @SYNTHESIS_SUBDIR@
+SYNTHESIS_SUBDIR_INCLUDES = @SYNTHESIS_SUBDIR_INCLUDES@
 TRANSPORT_CFLAGS = @TRANSPORT_CFLAGS@
 TRANSPORT_LIBS = @TRANSPORT_LIBS@
 UNIQUE_CFLAGS = @UNIQUE_CFLAGS@
@@ -464,22 +527,35 @@ target_alias = @target_alias@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 BACKENDS = backends/addressbook backends/evolution backends/file backends/maemo backends/sqlite backends/xmlrpc
+
+# start with building nothing and add more targets below
+SUBDIRS = $(am__append_1) $(am__append_2) $(am__append_3) \
+       $(am__append_7) $(am__append_8)
+bin_SCRIPTS = $(am__append_5)
+nodist_bin_SCRIPTS = $(am__append_10) syncevo-phone-config
+libexec_SCRIPTS = $(am__append_11)
+nobase_dist_template_DATA = $(am__append_6)
+DISTCLEANFILES = synccompare
+CLEANFILES = libstdc++.a client-test $(CLIENT_LIB_TEST_FILES) \
+       org.syncevolution.service $(SYNCEVO_DBUS_SERVER_DESKTOP) \
+       $(SYNCEVO_DBUS_SERVER_SCRIPT) syncevo-http-server \
+       syncevo-phone-config abort-redirect.log
+BUILT_SOURCES = 
 service_in_files = org.syncevolution.service.in
 @COND_DBUS_TRUE@servicedir = $(DBUS_SERVICES_DIR)
 @COND_DBUS_TRUE@service_DATA = $(service_in_files:.service.in=.service)
-# jump into interface directory directly instead of going through dbus
-@COND_DBUS_FALSE@@COND_GUI_TRUE@DBUS_DIRS = dbus/interfaces
-@COND_DBUS_TRUE@DBUS_DIRS = gdbus dbus
-@COND_GUI_TRUE@GUI_DIR = gtk-ui
-SUBDIRS = $(SYNTHESIS_SUBDIR) $(DBUS_DIRS) syncevo $(BACKENDS) \
-       $(GUI_DIR) $(am__append_1)
-DIST_SUBDIRS = gdbus dbus syncevo $(BACKENDS) gtk-ui gnome-bluetooth
-BUILT_SOURCES = 
+DIST_SUBDIRS = gdbus dbus syncevo $(BACKENDS) gtk-ui gnome-bluetooth synthesis-includes
 AM_CPPFLAGS = $(SUBDIRS:%=-I$(srcdir)/%) -I$(srcdir)/../test -I$(top_srcdir) $(BACKEND_CPPFLAGS)
-bin_SCRIPTS = synccompare
-SYNCEVOLUTION_DEP = $(am__append_3)
+SYNCEVO_DBUS_SERVER_SCRIPT = syncevo-dbus-server-startup.sh
+SYNCEVO_DBUS_SERVER_SCRIPT_IN = $(SYNCEVO_DBUS_SERVER_SCRIPT).in
+autostartdir = $(sysconfdir)/xdg/autostart
+SYNCEVO_DBUS_SERVER_DESKTOP = syncevo-dbus-server.desktop
+SYNCEVO_DBUS_SERVER_DESKTOP_IN = $(SYNCEVO_DBUS_SERVER_DESKTOP).in
+@COND_DBUS_TRUE@autostart_DATA = $(SYNCEVO_DBUS_SERVER_DESKTOP)
+SYNCEVOLUTION_DEP = $(am__append_13)
 EXTRA_DIST = shlibs.local Makefile-gen.am $(service_in_files) \
-       $(am__append_4)
+       $(SYNCEVO_DBUS_SERVER_SCRIPT_IN) \
+       $(SYNCEVO_DBUS_SERVER_DESKTOP_IN) $(am__append_14)
 TEMPLATE_FILES = templates/README \
        templates/servers/Funambol/config.ini \
        templates/servers/Funambol/template.ini \
@@ -493,6 +569,20 @@ TEMPLATE_FILES = templates/README \
        templates/servers/ScheduleWorld/sources/todo/config.ini \
        templates/servers/ScheduleWorld/sources/addressbook/config.ini \
        templates/servers/ScheduleWorld/sources/memo/config.ini \
+       templates/clients/phone/nokia/S60/N85/config.ini \
+       templates/clients/phone/nokia/S60/N85/template.ini \
+       templates/clients/phone/nokia/S60/N85/sources/calendar/config.ini \
+       templates/clients/phone/nokia/S60/N85/sources/calendar+todo/config.ini \
+       templates/clients/phone/nokia/S60/N85/sources/todo/config.ini \
+       templates/clients/phone/nokia/S60/N85/sources/addressbook/config.ini \
+       templates/clients/phone/nokia/S60/N85/sources/memo/config.ini \
+       templates/clients/phone/nokia/maemo/n900/config.ini \
+       templates/clients/phone/nokia/maemo/n900/template.ini \
+       templates/clients/phone/nokia/maemo/n900/sources/calendar/config.ini \
+       templates/clients/phone/nokia/maemo/n900/sources/calendar+todo/config.ini \
+       templates/clients/phone/nokia/maemo/n900/sources/todo/config.ini \
+       templates/clients/phone/nokia/maemo/n900/sources/addressbook/config.ini \
+       templates/clients/phone/nokia/maemo/n900/sources/memo/config.ini \
        templates/clients/phone/nokia/S40/7210c/config.ini \
        templates/clients/phone/nokia/S40/7210c/template.ini \
        templates/clients/phone/nokia/S40/7210c/sources/calendar/config.ini \
@@ -500,7 +590,6 @@ TEMPLATE_FILES = templates/README \
        templates/clients/phone/nokia/S40/7210c/sources/todo/config.ini \
        templates/clients/phone/nokia/S40/7210c/sources/addressbook/config.ini \
        templates/clients/phone/nokia/S40/7210c/sources/memo/config.ini \
-       templates/clients/default/template.ini \
        templates/clients/SyncEvolution/config.ini \
        templates/clients/SyncEvolution/template.ini \
        templates/clients/SyncEvolution/sources/calendar/config.ini \
@@ -508,12 +597,7 @@ TEMPLATE_FILES = templates/README \
        templates/clients/SyncEvolution/sources/addressbook/config.ini \
        templates/clients/SyncEvolution/sources/memo/config.ini
 templatedir = $(datadir)/syncevolution/
-nobase_dist_template_DATA = $(TEMPLATE_FILES)
-DISTCLEANFILES = synccompare
-MAINTAINERCLEANFILES = Makefile.in
-CLEANFILES = libstdc++.a client-test $(CLIENT_LIB_TEST_FILES) \
-       org.syncevolution.service abort-redirect.log
-CORE_SOURCES = $(am__append_5)
+CORE_SOURCES = $(am__append_15)
 
 # The files which register backends have to be compiled into
 # "client-test" and "syncevolution" in order to pull in the
@@ -540,18 +624,18 @@ 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
-syncevolution_LDADD = $(CORE_LDADD) $(KEYRING_LIBS)
-syncevolution_LDFLAGS = $(CORE_LD_FLAGS)
-syncevolution_CXXFLAGS = $(SYNCEVOLUTION_CXXFLAGS) $(CORE_CXXFLAGS) $(KEYRING_CFLAGS)
+syncevolution_LDADD = $(CORE_LDADD) $(KEYRING_LIBS) $(am__append_16)
+syncevolution_LDFLAGS = $(CORE_LD_FLAGS) $(DBUS_LIBS)
+syncevolution_CXXFLAGS = $(SYNCEVOLUTION_CXXFLAGS) $(CORE_CXXFLAGS) $(KEYRING_CFLAGS) -I$(srcdir)/gdbus $(DBUS_CFLAGS)
 syncevolution_DEPENDENCIES = $(EXTRA_LTLIBRARIES) $(CORE_DEP) # $(SYNTHESIS_DEP)
 @COND_DBUS_TRUE@syncevo_dbus_server_SOURCES = \
 @COND_DBUS_TRUE@       syncevo-dbus-server.cpp \
 @COND_DBUS_TRUE@       $(CORE_SOURCES)
 
 @COND_DBUS_TRUE@@ENABLE_UNIT_TESTS_TRUE@nodist_syncevo_dbus_server_SOURCES = ../test/test.cpp
-@COND_DBUS_TRUE@syncevo_dbus_server_LDADD = gdbus/libgdbus.la $(CORE_LDADD) $(KEYRING_LIBS)
-@COND_DBUS_TRUE@syncevo_dbus_server_CPPFLAGS = -DHAVE_CONFIG_H -I$(srcdir)/gdbus $(AM_CPPFLAGS)
-@COND_DBUS_TRUE@syncevo_dbus_server_CXXFLAGS = $(SYNCEVOLUTION_CXXFLAGS) $(CORE_CXXFLAGS) $(GLIB_CFLAGS) $(DBUS_CFLAGS) $(LIBSOUP_CFLAGS) $(KEYRING_CFLAGS)
+@COND_DBUS_TRUE@syncevo_dbus_server_LDADD = gdbus/libgdbus.la $(CORE_LDADD) $(KEYRING_LIBS) $(LIBNOTIFY_LIBS)
+@COND_DBUS_TRUE@syncevo_dbus_server_CPPFLAGS = -DHAVE_CONFIG_H -I$(srcdir)/gdbus $(AM_CPPFLAGS) -DSYNCEVOLUTION_LOCALEDIR=\"${SYNCEVOLUTION_LOCALEDIR}\"
+@COND_DBUS_TRUE@syncevo_dbus_server_CXXFLAGS = $(SYNCEVOLUTION_CXXFLAGS) $(CORE_CXXFLAGS) $(GLIB_CFLAGS) $(DBUS_CFLAGS) $(LIBSOUP_CFLAGS) $(KEYRING_CFLAGS) $(LIBNOTIFY_CFLAGS)
 @COND_DBUS_TRUE@syncevo_dbus_server_LDFLAGS = $(CORE_LD_FLAGS) $(LIBSOUP_LIBS)
 @COND_DBUS_TRUE@syncevo_dbus_server_DEPENDENCIES = gdbus/libgdbus.la $(EXTRA_LTLIBRARIES) $(CORE_DEP) $(SYNTHESIS_DEP)
 
@@ -561,12 +645,13 @@ syncevolution_DEPENDENCIES = $(EXTRA_LTLIBRARIES) $(CORE_DEP) # $(SYNTHESIS_DEP)
 # link line.
 client_test_SOURCES = \
        client-test-app.cpp \
+       CmdlineSyncClient.cpp \
        ../test/ClientTest.cpp \
        ../test/ClientTest.h \
        ../test/client-test-main.cpp \
        $(CORE_SOURCES)
 
-nodist_client_test_SOURCES = ../test/test.cpp $(am__append_9)
+nodist_client_test_SOURCES = ../test/test.cpp $(am__append_20)
 
 # list of test file base files
 #
@@ -576,7 +661,6 @@ nodist_client_test_SOURCES = ../test/test.cpp $(am__append_9)
 # add files created via patches
 CLIENT_LIB_TEST_FILES = testcases/lcs/file1.txt \
        testcases/lcs/file2.txt \
-       testcases/templates/clients/default/template.ini \
        testcases/templates/clients/SyncEvolution/sources/addressbook/config.ini \
        testcases/templates/clients/SyncEvolution/sources/memo/config.ini \
        testcases/templates/clients/SyncEvolution/sources/todo/config.ini \
@@ -601,8 +685,8 @@ TEST_FILES_GENERATED = $(subst .patch,,$(subst $(srcdir)/../test/,,$(TEST_FILES_
 # all patched files, regardless whether the patch already exists
 TEST_FILES_PATCHED = $(wildcard testcases/*.tem)
 client_test_CPPFLAGS = -DHAVE_CONFIG_H -DENABLE_INTEGRATION_TESTS -DENABLE_UNIT_TESTS $(AM_CPPFLAGS)
-client_test_CXXFLAGS = `cppunit-config --cflags` $(SYNCEVOLUTION_CXXFLAGS) $(CORE_CXXFLAGS)
-client_test_LDFLAGS = `cppunit-config --libs` `nm syncevo/.libs/libsyncevolution.a | grep funambolAutoRegisterRegistry | sed -e 's/.* /-u /'` $(CORE_LD_FLAGS)
+client_test_CXXFLAGS = `cppunit-config --cflags` $(SYNCEVOLUTION_CXXFLAGS) $(CORE_CXXFLAGS) $(KEYRING_CFLAGS)
+client_test_LDFLAGS = `cppunit-config --libs` `nm syncevo/.libs/libsyncevolution.a | grep funambolAutoRegisterRegistry | sed -e 's/.* /-u /'` $(CORE_LD_FLAGS) $(KEYRING_LIBS)
 client_test_LDADD = $(CORE_LDADD) $(SYNTHESIS_ENGINE)
 
 # The binary does not really depend on the test cases, only running it does.
@@ -610,7 +694,7 @@ client_test_LDADD = $(CORE_LDADD) $(SYNTHESIS_ENGINE)
 # runs the binary with out-dated auxiliary files.
 client_test_DEPENDENCIES = $(EXTRA_LTLIBRARIES) $(CORE_DEP) \
        $(CLIENT_LIB_TEST_FILES) testcase2patch synccompare templates \
-       $(am__append_10)
+       $(am__append_21)
 @ENABLE_TESTING_TRUE@nobase_dist_doc_DATA = $(CLIENT_LIB_TEST_FILES)
 abort_redirect_SOURCES = ../test/abort-redirect.cpp
 abort_redirect_CPPFLAGS = -DHAVE_CONFIG_H $(AM_CPPFLAGS)
@@ -739,6 +823,44 @@ uninstall-binSCRIPTS:
          echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
          rm -f "$(DESTDIR)$(bindir)/$$f"; \
        done
+install-libexecSCRIPTS: $(libexec_SCRIPTS)
+       @$(NORMAL_INSTALL)
+       test -z "$(libexecdir)" || $(MKDIR_P) "$(DESTDIR)$(libexecdir)"
+       @list='$(libexec_SCRIPTS)'; for p in $$list; do \
+         if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+         if test -f $$d$$p; then \
+           f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
+           echo " $(libexecSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(libexecdir)/$$f'"; \
+           $(libexecSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(libexecdir)/$$f"; \
+         else :; fi; \
+       done
+
+uninstall-libexecSCRIPTS:
+       @$(NORMAL_UNINSTALL)
+       @list='$(libexec_SCRIPTS)'; for p in $$list; do \
+         f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
+         echo " rm -f '$(DESTDIR)$(libexecdir)/$$f'"; \
+         rm -f "$(DESTDIR)$(libexecdir)/$$f"; \
+       done
+install-nodist_binSCRIPTS: $(nodist_bin_SCRIPTS)
+       @$(NORMAL_INSTALL)
+       test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
+       @list='$(nodist_bin_SCRIPTS)'; for p in $$list; do \
+         if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+         if test -f $$d$$p; then \
+           f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
+           echo " $(nodist_binSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+           $(nodist_binSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(bindir)/$$f"; \
+         else :; fi; \
+       done
+
+uninstall-nodist_binSCRIPTS:
+       @$(NORMAL_UNINSTALL)
+       @list='$(nodist_bin_SCRIPTS)'; for p in $$list; do \
+         f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
+         echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+         rm -f "$(DESTDIR)$(bindir)/$$f"; \
+       done
 
 mostlyclean-compile:
        -rm -f *.$(OBJEXT)
@@ -749,6 +871,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/abort_redirect-abort-redirect.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/client_test-AddressBookSourceRegister.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/client_test-ClientTest.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/client_test-CmdlineSyncClient.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/client_test-EvolutionCalendarSourceRegister.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/client_test-EvolutionContactSourceRegister.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/client_test-FileSyncSourceRegister.Po@am__quote@
@@ -827,6 +950,20 @@ client_test-client-test-app.obj: client-test-app.cpp
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(client_test_CPPFLAGS) $(CPPFLAGS) $(client_test_CXXFLAGS) $(CXXFLAGS) -c -o client_test-client-test-app.obj `if test -f 'client-test-app.cpp'; then $(CYGPATH_W) 'client-test-app.cpp'; else $(CYGPATH_W) '$(srcdir)/client-test-app.cpp'; fi`
 
+client_test-CmdlineSyncClient.o: CmdlineSyncClient.cpp
+@am__fastdepCXX_TRUE@  $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(client_test_CPPFLAGS) $(CPPFLAGS) $(client_test_CXXFLAGS) $(CXXFLAGS) -MT client_test-CmdlineSyncClient.o -MD -MP -MF $(DEPDIR)/client_test-CmdlineSyncClient.Tpo -c -o client_test-CmdlineSyncClient.o `test -f 'CmdlineSyncClient.cpp' || echo '$(srcdir)/'`CmdlineSyncClient.cpp
+@am__fastdepCXX_TRUE@  mv -f $(DEPDIR)/client_test-CmdlineSyncClient.Tpo $(DEPDIR)/client_test-CmdlineSyncClient.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='CmdlineSyncClient.cpp' object='client_test-CmdlineSyncClient.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(client_test_CPPFLAGS) $(CPPFLAGS) $(client_test_CXXFLAGS) $(CXXFLAGS) -c -o client_test-CmdlineSyncClient.o `test -f 'CmdlineSyncClient.cpp' || echo '$(srcdir)/'`CmdlineSyncClient.cpp
+
+client_test-CmdlineSyncClient.obj: CmdlineSyncClient.cpp
+@am__fastdepCXX_TRUE@  $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(client_test_CPPFLAGS) $(CPPFLAGS) $(client_test_CXXFLAGS) $(CXXFLAGS) -MT client_test-CmdlineSyncClient.obj -MD -MP -MF $(DEPDIR)/client_test-CmdlineSyncClient.Tpo -c -o client_test-CmdlineSyncClient.obj `if test -f 'CmdlineSyncClient.cpp'; then $(CYGPATH_W) 'CmdlineSyncClient.cpp'; else $(CYGPATH_W) '$(srcdir)/CmdlineSyncClient.cpp'; fi`
+@am__fastdepCXX_TRUE@  mv -f $(DEPDIR)/client_test-CmdlineSyncClient.Tpo $(DEPDIR)/client_test-CmdlineSyncClient.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='CmdlineSyncClient.cpp' object='client_test-CmdlineSyncClient.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(client_test_CPPFLAGS) $(CPPFLAGS) $(client_test_CXXFLAGS) $(CXXFLAGS) -c -o client_test-CmdlineSyncClient.obj `if test -f 'CmdlineSyncClient.cpp'; then $(CYGPATH_W) 'CmdlineSyncClient.cpp'; else $(CYGPATH_W) '$(srcdir)/CmdlineSyncClient.cpp'; fi`
+
 client_test-ClientTest.o: ../test/ClientTest.cpp
 @am__fastdepCXX_TRUE@  $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(client_test_CPPFLAGS) $(CPPFLAGS) $(client_test_CXXFLAGS) $(CXXFLAGS) -MT client_test-ClientTest.o -MD -MP -MF $(DEPDIR)/client_test-ClientTest.Tpo -c -o client_test-ClientTest.o `test -f '../test/ClientTest.cpp' || echo '$(srcdir)/'`../test/ClientTest.cpp
 @am__fastdepCXX_TRUE@  mv -f $(DEPDIR)/client_test-ClientTest.Tpo $(DEPDIR)/client_test-ClientTest.Po
@@ -1238,6 +1375,23 @@ mostlyclean-libtool:
 
 clean-libtool:
        -rm -rf .libs _libs
+install-autostartDATA: $(autostart_DATA)
+       @$(NORMAL_INSTALL)
+       test -z "$(autostartdir)" || $(MKDIR_P) "$(DESTDIR)$(autostartdir)"
+       @list='$(autostart_DATA)'; for p in $$list; do \
+         if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+         f=$(am__strip_dir) \
+         echo " $(autostartDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(autostartdir)/$$f'"; \
+         $(autostartDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(autostartdir)/$$f"; \
+       done
+
+uninstall-autostartDATA:
+       @$(NORMAL_UNINSTALL)
+       @list='$(autostart_DATA)'; for p in $$list; do \
+         f=$(am__strip_dir) \
+         echo " rm -f '$(DESTDIR)$(autostartdir)/$$f'"; \
+         rm -f "$(DESTDIR)$(autostartdir)/$$f"; \
+       done
 install-nobase_dist_docDATA: $(nobase_dist_doc_DATA)
        @$(NORMAL_INSTALL)
        test -z "$(docdir)" || $(MKDIR_P) "$(DESTDIR)$(docdir)"
@@ -1550,7 +1704,7 @@ check: $(BUILT_SOURCES)
 all-am: Makefile $(PROGRAMS) $(SCRIPTS) $(DATA)
 installdirs: installdirs-recursive
 installdirs-am:
-       for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(docdir)" "$(DESTDIR)$(templatedir)" "$(DESTDIR)$(servicedir)"; do \
+       for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(autostartdir)" "$(DESTDIR)$(docdir)" "$(DESTDIR)$(templatedir)" "$(DESTDIR)$(servicedir)"; do \
          test -z "$$dir" || $(MKDIR_P) "$$dir"; \
        done
 install: $(BUILT_SOURCES)
@@ -1581,7 +1735,6 @@ maintainer-clean-generic:
        @echo "This command is intended for maintainers to use"
        @echo "it deletes files that may require special tools to rebuild."
        -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
-       -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
 clean: clean-recursive
 
 clean-am: clean-binPROGRAMS clean-generic clean-libexecPROGRAMS \
@@ -1603,13 +1756,14 @@ info: info-recursive
 
 info-am:
 
-install-data-am: install-nobase_dist_docDATA \
+install-data-am: install-autostartDATA install-nobase_dist_docDATA \
        install-nobase_dist_templateDATA install-serviceDATA
 
 install-dvi: install-dvi-recursive
 
 install-exec-am: install-binPROGRAMS install-binSCRIPTS \
-       install-libexecPROGRAMS
+       install-libexecPROGRAMS install-libexecSCRIPTS \
+       install-nodist_binSCRIPTS
 
 install-html: install-html-recursive
 
@@ -1641,9 +1795,11 @@ ps: ps-recursive
 
 ps-am:
 
-uninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS \
-       uninstall-libexecPROGRAMS uninstall-nobase_dist_docDATA \
-       uninstall-nobase_dist_templateDATA uninstall-serviceDATA
+uninstall-am: uninstall-autostartDATA uninstall-binPROGRAMS \
+       uninstall-binSCRIPTS uninstall-libexecPROGRAMS \
+       uninstall-libexecSCRIPTS uninstall-nobase_dist_docDATA \
+       uninstall-nobase_dist_templateDATA uninstall-nodist_binSCRIPTS \
+       uninstall-serviceDATA
 
 .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
        install-strip
@@ -1654,23 +1810,34 @@ uninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS \
        ctags ctags-recursive dist-hook distclean distclean-compile \
        distclean-generic distclean-libtool distclean-local \
        distclean-tags distdir dvi dvi-am html html-am info info-am \
-       install install-am install-binPROGRAMS install-binSCRIPTS \
-       install-data install-data-am install-dvi install-dvi-am \
-       install-exec install-exec-am install-html install-html-am \
-       install-info install-info-am install-libexecPROGRAMS \
-       install-man install-nobase_dist_docDATA \
-       install-nobase_dist_templateDATA install-pdf install-pdf-am \
+       install install-am install-autostartDATA install-binPROGRAMS \
+       install-binSCRIPTS install-data install-data-am install-dvi \
+       install-dvi-am install-exec install-exec-am install-html \
+       install-html-am install-info install-info-am \
+       install-libexecPROGRAMS install-libexecSCRIPTS install-man \
+       install-nobase_dist_docDATA install-nobase_dist_templateDATA \
+       install-nodist_binSCRIPTS install-pdf install-pdf-am \
        install-ps install-ps-am install-serviceDATA install-strip \
        installcheck installcheck-am installdirs installdirs-am \
        maintainer-clean maintainer-clean-generic mostlyclean \
        mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
        pdf pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \
-       uninstall-binPROGRAMS uninstall-binSCRIPTS \
-       uninstall-libexecPROGRAMS uninstall-nobase_dist_docDATA \
-       uninstall-nobase_dist_templateDATA uninstall-serviceDATA
+       uninstall-autostartDATA uninstall-binPROGRAMS \
+       uninstall-binSCRIPTS uninstall-libexecPROGRAMS \
+       uninstall-libexecSCRIPTS uninstall-nobase_dist_docDATA \
+       uninstall-nobase_dist_templateDATA uninstall-nodist_binSCRIPTS \
+       uninstall-serviceDATA
 
 @COND_DBUS_TRUE@$(service_DATA): $(service_in_files) Makefile
 @COND_DBUS_TRUE@       @sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@
+@COND_DBUS_TRUE@$(libexec_SCRIPTS): $(SYNCEVO_DBUS_SERVER_SCRIPT_IN) Makefile
+@COND_DBUS_TRUE@       @sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@
+@COND_DBUS_TRUE@$(autostart_DATA): $(SYNCEVO_DBUS_SERVER_DESKTOP_IN) Makefile
+@COND_DBUS_TRUE@       @sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@
+syncevo-http-server: $(srcdir)/../test/syncevo-http-server.py
+       cp $< $@
+syncevo-phone-config: $(srcdir)/../test/syncevo-phone-config.py
+       cp $< $@
 
 # synccompare is created by replacing its 'import Algorithm::Diff;'
 # with a simplified copy of Diff.pm.
index eab241f..b5fb042 100644 (file)
@@ -189,6 +189,8 @@ LDFLAGS = @LDFLAGS@
 LIBEXECDIR = @LIBEXECDIR@
 LIBICAL_AVAILABLE_CFLAGS = @LIBICAL_AVAILABLE_CFLAGS@
 LIBICAL_AVAILABLE_LIBS = @LIBICAL_AVAILABLE_LIBS@
+LIBNOTIFY_CFLAGS = @LIBNOTIFY_CFLAGS@
+LIBNOTIFY_LIBS = @LIBNOTIFY_LIBS@
 LIBOBJS = @LIBOBJS@
 LIBOPENOBEX_CFLAGS = @LIBOPENOBEX_CFLAGS@
 LIBOPENOBEX_LIBS = @LIBOPENOBEX_LIBS@
@@ -207,6 +209,8 @@ MODIFY_SYNCCOMPARE = @MODIFY_SYNCCOMPARE@
 MSGFMT = @MSGFMT@
 MSGFMT_OPTS = @MSGFMT_OPTS@
 MSGMERGE = @MSGMERGE@
+MX_GTK_0_99_1_CFLAGS = @MX_GTK_0_99_1_CFLAGS@
+MX_GTK_0_99_1_LIBS = @MX_GTK_0_99_1_LIBS@
 NMEDIT = @NMEDIT@
 NSS_CFLAGS = @NSS_CFLAGS@
 NSS_LIBS = @NSS_LIBS@
@@ -244,6 +248,7 @@ SYNTHESIS_LIB = @SYNTHESIS_LIB@
 SYNTHESIS_LIBS = @SYNTHESIS_LIBS@
 SYNTHESIS_SRC = @SYNTHESIS_SRC@
 SYNTHESIS_SUBDIR = @SYNTHESIS_SUBDIR@
+SYNTHESIS_SUBDIR_INCLUDES = @SYNTHESIS_SUBDIR_INCLUDES@
 TRANSPORT_CFLAGS = @TRANSPORT_CFLAGS@
 TRANSPORT_LIBS = @TRANSPORT_LIBS@
 UNIQUE_CFLAGS = @UNIQUE_CFLAGS@
index 8c7a8b8..9dff32d 100644 (file)
@@ -177,6 +177,7 @@ void EvolutionCalendarSource::open()
     string id = getDatabaseID();    
     ESource *source = findSource(sources, id);
     bool onlyIfExists = true;
+    bool created = false;
     if (!source) {
         // might have been special "<<system>>" or "<<default>>", try that and
         // creating address book from file:// URI before giving up
@@ -187,6 +188,7 @@ void EvolutionCalendarSource::open()
         } else {
             throwError(string("not found: '") + id + "'");
         }
+        created = true;
         onlyIfExists = false;
     } else {
         m_calendar.set(e_cal_new(source, m_type), m_typeName.c_str());
@@ -195,10 +197,14 @@ void EvolutionCalendarSource::open()
     e_cal_set_auth_func(m_calendar, eCalAuthFunc, this);
     
     if (!e_cal_open(m_calendar, onlyIfExists, &gerror)) {
-        // opening newly created address books often failed, perhaps that also applies to calendars - try again
-        g_clear_error(&gerror);
-        sleep(5);
-        if (!e_cal_open(m_calendar, onlyIfExists, &gerror)) {
+        if (created) {
+            // opening newly created address books often failed, perhaps that also applies to calendars - try again
+            g_clear_error(&gerror);
+            sleep(5);
+            if (!e_cal_open(m_calendar, onlyIfExists, &gerror)) {
+                throwError(string("opening ") + m_typeName, gerror );
+            }
+        } else {
             throwError(string("opening ") + m_typeName, gerror );
         }
     }
index 42c0296..3f79de1 100644 (file)
@@ -333,11 +333,12 @@ public:
 
 static class SuperTest : public RegisterSyncSourceTest {
 public:
-    SuperTest() : RegisterSyncSourceTest("super", "super") {}
+    SuperTest() : RegisterSyncSourceTest("calendar+todo", "calendar+todo") {}
 
     virtual void updateConfig(ClientTestConfig &config) const
     {
         config.type = "virtual:text/x-vcalendar";
+        config.subConfigs = "ical20,itodo20";
     }
 
 } superTest;
index 4b59d47..605fc1d 100644 (file)
@@ -156,6 +156,7 @@ void EvolutionContactSource::open()
     string id = getDatabaseID();
     ESource *source = findSource(sources, id);
     bool onlyIfExists = true;
+    bool created = false;
     if (!source) {
         // might have been special "<<system>>" or "<<default>>", try that and
         // creating address book from file:// URI before giving up
@@ -168,17 +169,22 @@ void EvolutionContactSource::open()
         } else {
             throwError(string(getName()) + ": no such address book: '" + id + "'");
         }
+        created = true;
         onlyIfExists = false;
     } else {
         m_addressbook.set( e_book_new( source, &gerror ), "address book" );
     }
  
     if (!e_book_open( m_addressbook, onlyIfExists, &gerror) ) {
-        // opening newly created address books often fails, try again once more
-        g_clear_error(&gerror);
-        sleep(5);
-        if (!e_book_open( m_addressbook, onlyIfExists, &gerror) ) {
-            throwError( "opening address book", gerror );
+        if (created) {
+            // opening newly created address books often fails, try again once more
+            g_clear_error(&gerror);
+            sleep(5);
+            if (!e_book_open(m_addressbook, onlyIfExists, &gerror)) {
+                throwError("opening address book", gerror);
+            }
+        } else {
+            throwError("opening address book", gerror);
         }
     }
 
index ae04511..9cc007d 100644 (file)
@@ -213,6 +213,8 @@ LDFLAGS = @LDFLAGS@
 LIBEXECDIR = @LIBEXECDIR@
 LIBICAL_AVAILABLE_CFLAGS = @LIBICAL_AVAILABLE_CFLAGS@
 LIBICAL_AVAILABLE_LIBS = @LIBICAL_AVAILABLE_LIBS@
+LIBNOTIFY_CFLAGS = @LIBNOTIFY_CFLAGS@
+LIBNOTIFY_LIBS = @LIBNOTIFY_LIBS@
 LIBOBJS = @LIBOBJS@
 LIBOPENOBEX_CFLAGS = @LIBOPENOBEX_CFLAGS@
 LIBOPENOBEX_LIBS = @LIBOPENOBEX_LIBS@
@@ -231,6 +233,8 @@ MODIFY_SYNCCOMPARE = @MODIFY_SYNCCOMPARE@
 MSGFMT = @MSGFMT@
 MSGFMT_OPTS = @MSGFMT_OPTS@
 MSGMERGE = @MSGMERGE@
+MX_GTK_0_99_1_CFLAGS = @MX_GTK_0_99_1_CFLAGS@
+MX_GTK_0_99_1_LIBS = @MX_GTK_0_99_1_LIBS@
 NMEDIT = @NMEDIT@
 NSS_CFLAGS = @NSS_CFLAGS@
 NSS_LIBS = @NSS_LIBS@
@@ -268,6 +272,7 @@ SYNTHESIS_LIB = @SYNTHESIS_LIB@
 SYNTHESIS_LIBS = @SYNTHESIS_LIBS@
 SYNTHESIS_SRC = @SYNTHESIS_SRC@
 SYNTHESIS_SUBDIR = @SYNTHESIS_SUBDIR@
+SYNTHESIS_SUBDIR_INCLUDES = @SYNTHESIS_SUBDIR_INCLUDES@
 TRANSPORT_CFLAGS = @TRANSPORT_CFLAGS@
 TRANSPORT_LIBS = @TRANSPORT_LIBS@
 UNIQUE_CFLAGS = @UNIQUE_CFLAGS@
index 6f27d08..d764e55 100644 (file)
@@ -461,7 +461,8 @@ icaltimezone *e_cal_tzlookup_ecal(const char *tzid,
     } else {
         g_assert(*error);
         if ((*error)->domain == E_CALENDAR_ERROR &&
-            (*error)->code == E_CALENDAR_STATUS_OBJECT_NOT_FOUND) {
+            ((*error)->code == E_CALENDAR_STATUS_OBJECT_NOT_FOUND /* EDS < 2.30 */ ||
+             (*error)->code == E_CALENDAR_STATUS_INVALID_OBJECT /* EDS >= 2.30 */ )) {
             /*
              * we had to trigger this error to check for the timezone existance,
              * clear it and return NULL
index 3279145..de43c45 100644 (file)
@@ -235,7 +235,8 @@ void FileSyncSource::removeItem(const string &uid)
 {
     string filename = createFilename(uid);
 
-    if (unlink(filename.c_str())) {
+    if (unlink(filename.c_str()) &&
+        errno != ENOENT) {
         throwError(filename, errno);
     }
 }
index 6eca2a3..9621716 100644 (file)
@@ -171,6 +171,18 @@ public:
     }
 } ITodo20Test;
 
+static class SuperTest : public RegisterSyncSourceTest {
+public:
+    SuperTest() : RegisterSyncSourceTest("file_calendar+todo", "calendar+todo") {}
+
+    virtual void updateConfig(ClientTestConfig &config) const
+    {
+        config.type = "virtual:text/x-vcalendar";
+        config.subConfigs = "file_ical20,file_itodo20";
+    }
+
+} superTest;
+
 }
 
 #endif // ENABLE_FILE
index 0881629..ca502ad 100644 (file)
@@ -186,6 +186,8 @@ LDFLAGS = @LDFLAGS@
 LIBEXECDIR = @LIBEXECDIR@
 LIBICAL_AVAILABLE_CFLAGS = @LIBICAL_AVAILABLE_CFLAGS@
 LIBICAL_AVAILABLE_LIBS = @LIBICAL_AVAILABLE_LIBS@
+LIBNOTIFY_CFLAGS = @LIBNOTIFY_CFLAGS@
+LIBNOTIFY_LIBS = @LIBNOTIFY_LIBS@
 LIBOBJS = @LIBOBJS@
 LIBOPENOBEX_CFLAGS = @LIBOPENOBEX_CFLAGS@
 LIBOPENOBEX_LIBS = @LIBOPENOBEX_LIBS@
@@ -204,6 +206,8 @@ MODIFY_SYNCCOMPARE = @MODIFY_SYNCCOMPARE@
 MSGFMT = @MSGFMT@
 MSGFMT_OPTS = @MSGFMT_OPTS@
 MSGMERGE = @MSGMERGE@
+MX_GTK_0_99_1_CFLAGS = @MX_GTK_0_99_1_CFLAGS@
+MX_GTK_0_99_1_LIBS = @MX_GTK_0_99_1_LIBS@
 NMEDIT = @NMEDIT@
 NSS_CFLAGS = @NSS_CFLAGS@
 NSS_LIBS = @NSS_LIBS@
@@ -241,6 +245,7 @@ SYNTHESIS_LIB = @SYNTHESIS_LIB@
 SYNTHESIS_LIBS = @SYNTHESIS_LIBS@
 SYNTHESIS_SRC = @SYNTHESIS_SRC@
 SYNTHESIS_SUBDIR = @SYNTHESIS_SUBDIR@
+SYNTHESIS_SUBDIR_INCLUDES = @SYNTHESIS_SUBDIR_INCLUDES@
 TRANSPORT_CFLAGS = @TRANSPORT_CFLAGS@
 TRANSPORT_LIBS = @TRANSPORT_LIBS@
 UNIQUE_CFLAGS = @UNIQUE_CFLAGS@
index d407307..4cc1b76 100644 (file)
@@ -187,6 +187,8 @@ LDFLAGS = @LDFLAGS@
 LIBEXECDIR = @LIBEXECDIR@
 LIBICAL_AVAILABLE_CFLAGS = @LIBICAL_AVAILABLE_CFLAGS@
 LIBICAL_AVAILABLE_LIBS = @LIBICAL_AVAILABLE_LIBS@
+LIBNOTIFY_CFLAGS = @LIBNOTIFY_CFLAGS@
+LIBNOTIFY_LIBS = @LIBNOTIFY_LIBS@
 LIBOBJS = @LIBOBJS@
 LIBOPENOBEX_CFLAGS = @LIBOPENOBEX_CFLAGS@
 LIBOPENOBEX_LIBS = @LIBOPENOBEX_LIBS@
@@ -205,6 +207,8 @@ MODIFY_SYNCCOMPARE = @MODIFY_SYNCCOMPARE@
 MSGFMT = @MSGFMT@
 MSGFMT_OPTS = @MSGFMT_OPTS@
 MSGMERGE = @MSGMERGE@
+MX_GTK_0_99_1_CFLAGS = @MX_GTK_0_99_1_CFLAGS@
+MX_GTK_0_99_1_LIBS = @MX_GTK_0_99_1_LIBS@
 NMEDIT = @NMEDIT@
 NSS_CFLAGS = @NSS_CFLAGS@
 NSS_LIBS = @NSS_LIBS@
@@ -242,6 +246,7 @@ SYNTHESIS_LIB = @SYNTHESIS_LIB@
 SYNTHESIS_LIBS = @SYNTHESIS_LIBS@
 SYNTHESIS_SRC = @SYNTHESIS_SRC@
 SYNTHESIS_SUBDIR = @SYNTHESIS_SUBDIR@
+SYNTHESIS_SUBDIR_INCLUDES = @SYNTHESIS_SUBDIR_INCLUDES@
 TRANSPORT_CFLAGS = @TRANSPORT_CFLAGS@
 TRANSPORT_LIBS = @TRANSPORT_LIBS@
 UNIQUE_CFLAGS = @UNIQUE_CFLAGS@
index 6cf4f9b..dd32b21 100644 (file)
@@ -187,6 +187,8 @@ LDFLAGS = @LDFLAGS@
 LIBEXECDIR = @LIBEXECDIR@
 LIBICAL_AVAILABLE_CFLAGS = @LIBICAL_AVAILABLE_CFLAGS@
 LIBICAL_AVAILABLE_LIBS = @LIBICAL_AVAILABLE_LIBS@
+LIBNOTIFY_CFLAGS = @LIBNOTIFY_CFLAGS@
+LIBNOTIFY_LIBS = @LIBNOTIFY_LIBS@
 LIBOBJS = @LIBOBJS@
 LIBOPENOBEX_CFLAGS = @LIBOPENOBEX_CFLAGS@
 LIBOPENOBEX_LIBS = @LIBOPENOBEX_LIBS@
@@ -205,6 +207,8 @@ MODIFY_SYNCCOMPARE = @MODIFY_SYNCCOMPARE@
 MSGFMT = @MSGFMT@
 MSGFMT_OPTS = @MSGFMT_OPTS@
 MSGMERGE = @MSGMERGE@
+MX_GTK_0_99_1_CFLAGS = @MX_GTK_0_99_1_CFLAGS@
+MX_GTK_0_99_1_LIBS = @MX_GTK_0_99_1_LIBS@
 NMEDIT = @NMEDIT@
 NSS_CFLAGS = @NSS_CFLAGS@
 NSS_LIBS = @NSS_LIBS@
@@ -242,6 +246,7 @@ SYNTHESIS_LIB = @SYNTHESIS_LIB@
 SYNTHESIS_LIBS = @SYNTHESIS_LIBS@
 SYNTHESIS_SRC = @SYNTHESIS_SRC@
 SYNTHESIS_SUBDIR = @SYNTHESIS_SUBDIR@
+SYNTHESIS_SUBDIR_INCLUDES = @SYNTHESIS_SUBDIR_INCLUDES@
 TRANSPORT_CFLAGS = @TRANSPORT_CFLAGS@
 TRANSPORT_LIBS = @TRANSPORT_LIBS@
 UNIQUE_CFLAGS = @UNIQUE_CFLAGS@
index c8399b0..a09d95b 100644 (file)
@@ -363,6 +363,7 @@ void SQLiteContactSource::deleteItem(const string& uid)
 void SQLiteContactSource::enableServerMode()
 {
     SyncSourceAdmin::init(m_operations, this);
+    SyncSourceBlob::init(m_operations, getCacheDir());
 }
 
 bool SQLiteContactSource::serverModeEnabled() const
index 622ad4d..b5093e9 100644 (file)
@@ -54,6 +54,7 @@ SE_BEGIN_CXX
 class SQLiteContactSource : public SyncSource,
     virtual public SyncSourceSession,
     virtual public SyncSourceAdmin,
+    virtual public SyncSourceBlob,
     virtual public SyncSourceRevisions,
     virtual public SyncSourceDelete,
     virtual public SyncSourceLogging,
index 6956704..c8c2a33 100644 (file)
@@ -186,6 +186,8 @@ LDFLAGS = @LDFLAGS@
 LIBEXECDIR = @LIBEXECDIR@
 LIBICAL_AVAILABLE_CFLAGS = @LIBICAL_AVAILABLE_CFLAGS@
 LIBICAL_AVAILABLE_LIBS = @LIBICAL_AVAILABLE_LIBS@
+LIBNOTIFY_CFLAGS = @LIBNOTIFY_CFLAGS@
+LIBNOTIFY_LIBS = @LIBNOTIFY_LIBS@
 LIBOBJS = @LIBOBJS@
 LIBOPENOBEX_CFLAGS = @LIBOPENOBEX_CFLAGS@
 LIBOPENOBEX_LIBS = @LIBOPENOBEX_LIBS@
@@ -204,6 +206,8 @@ MODIFY_SYNCCOMPARE = @MODIFY_SYNCCOMPARE@
 MSGFMT = @MSGFMT@
 MSGFMT_OPTS = @MSGFMT_OPTS@
 MSGMERGE = @MSGMERGE@
+MX_GTK_0_99_1_CFLAGS = @MX_GTK_0_99_1_CFLAGS@
+MX_GTK_0_99_1_LIBS = @MX_GTK_0_99_1_LIBS@
 NMEDIT = @NMEDIT@
 NSS_CFLAGS = @NSS_CFLAGS@
 NSS_LIBS = @NSS_LIBS@
@@ -241,6 +245,7 @@ SYNTHESIS_LIB = @SYNTHESIS_LIB@
 SYNTHESIS_LIBS = @SYNTHESIS_LIBS@
 SYNTHESIS_SRC = @SYNTHESIS_SRC@
 SYNTHESIS_SUBDIR = @SYNTHESIS_SUBDIR@
+SYNTHESIS_SUBDIR_INCLUDES = @SYNTHESIS_SUBDIR_INCLUDES@
 TRANSPORT_CFLAGS = @TRANSPORT_CFLAGS@
 TRANSPORT_LIBS = @TRANSPORT_LIBS@
 UNIQUE_CFLAGS = @UNIQUE_CFLAGS@
index 73cd1fd..fb39b6f 100644 (file)
@@ -35,7 +35,7 @@
 # include <execinfo.h>
 #endif
 
-#include <syncevo/SyncContext.h>
+#include "CmdlineSyncClient.h"
 #include "EvolutionSyncSource.h"
 #include <syncevo/util.h>
 #include <syncevo/VolatileConfigNode.h>
@@ -243,9 +243,7 @@ public:
 
             // always set these properties: they might have changed since the last run
             string database = getDatabaseName(test->m_configName);
-            if (test->m_configName!="super"){
-                sc->setDatabaseID(database);
-            }
+            sc->setDatabaseID(database);
             sc->setUser(m_evoUser);
             sc->setPassword(m_evoPassword);
         }
@@ -312,12 +310,12 @@ public:
         server += "_";
         server += m_clientID;
         
-        class ClientTest : public SyncContext {
+        class ClientTest : public CmdlineSyncClient {
         public:
             ClientTest(const string &server,
                        const string &logbase,
                        const SyncOptions &options) :
-                SyncContext(server, false),
+                CmdlineSyncClient(server, false, true),
                 m_logbase(logbase),
                 m_options(options),
                 m_started(false)
@@ -330,6 +328,8 @@ public:
                 setMaxObjSize(m_options.m_maxObjSize, true);
                 setMaxMsgSize(m_options.m_maxMsgSize, true);
                 setWBXML(m_options.m_isWBXML, true);
+                setRetryDuration(m_options.m_retryDuration, true);
+                setRetryInterval(m_options.m_retryInterval, true);
                 SyncContext::prepare();
             }
 
@@ -399,6 +399,11 @@ private:
 
     /** returns the name of the Evolution database */
     string getDatabaseName(const string &configName) {
+        if (configName == "calendar+todo") {
+            return "ical20,itodo20";
+        } else if (configName == "file_calendar+todo") {
+            return "file_ical20,file_itodo20";
+        }
         return m_evoPrefix + configName + "_" + m_clientID;
     }
     
@@ -413,9 +418,7 @@ private:
                                                           "_" + (isSourceA ? "A" : "B"));
 
         // always set this property: the name might have changes since last test run
-        if (name != "super") {
-            nodes.getProperties()->setProperty("evolutionsource", database.c_str());
-        }
+        nodes.getProperties()->setProperty("evolutionsource", database.c_str());
         nodes.getProperties()->setProperty("evolutionuser", evClient.m_evoUser.c_str());
         nodes.getProperties()->setProperty("evolutionpassword", evClient.m_evoPassword.c_str());
 
@@ -474,6 +477,7 @@ public:
         // this is required when using glib directly or indirectly
         g_type_init();
         g_thread_init(NULL);
+        g_set_prgname("client-test");
 #endif
         EDSAbiWrapperInit();
         testClient.registerTests();
index 48e0d67..c306747 100644 (file)
@@ -215,6 +215,8 @@ LDFLAGS = @LDFLAGS@
 LIBEXECDIR = @LIBEXECDIR@
 LIBICAL_AVAILABLE_CFLAGS = @LIBICAL_AVAILABLE_CFLAGS@
 LIBICAL_AVAILABLE_LIBS = @LIBICAL_AVAILABLE_LIBS@
+LIBNOTIFY_CFLAGS = @LIBNOTIFY_CFLAGS@
+LIBNOTIFY_LIBS = @LIBNOTIFY_LIBS@
 LIBOBJS = @LIBOBJS@
 LIBOPENOBEX_CFLAGS = @LIBOPENOBEX_CFLAGS@
 LIBOPENOBEX_LIBS = @LIBOPENOBEX_LIBS@
@@ -233,6 +235,8 @@ MODIFY_SYNCCOMPARE = @MODIFY_SYNCCOMPARE@
 MSGFMT = @MSGFMT@
 MSGFMT_OPTS = @MSGFMT_OPTS@
 MSGMERGE = @MSGMERGE@
+MX_GTK_0_99_1_CFLAGS = @MX_GTK_0_99_1_CFLAGS@
+MX_GTK_0_99_1_LIBS = @MX_GTK_0_99_1_LIBS@
 NMEDIT = @NMEDIT@
 NSS_CFLAGS = @NSS_CFLAGS@
 NSS_LIBS = @NSS_LIBS@
@@ -270,6 +274,7 @@ SYNTHESIS_LIB = @SYNTHESIS_LIB@
 SYNTHESIS_LIBS = @SYNTHESIS_LIBS@
 SYNTHESIS_SRC = @SYNTHESIS_SRC@
 SYNTHESIS_SUBDIR = @SYNTHESIS_SUBDIR@
+SYNTHESIS_SUBDIR_INCLUDES = @SYNTHESIS_SUBDIR_INCLUDES@
 TRANSPORT_CFLAGS = @TRANSPORT_CFLAGS@
 TRANSPORT_LIBS = @TRANSPORT_LIBS@
 UNIQUE_CFLAGS = @UNIQUE_CFLAGS@
index 0cafde9..af184e3 100644 (file)
@@ -143,6 +143,8 @@ LDFLAGS = @LDFLAGS@
 LIBEXECDIR = @LIBEXECDIR@
 LIBICAL_AVAILABLE_CFLAGS = @LIBICAL_AVAILABLE_CFLAGS@
 LIBICAL_AVAILABLE_LIBS = @LIBICAL_AVAILABLE_LIBS@
+LIBNOTIFY_CFLAGS = @LIBNOTIFY_CFLAGS@
+LIBNOTIFY_LIBS = @LIBNOTIFY_LIBS@
 LIBOBJS = @LIBOBJS@
 LIBOPENOBEX_CFLAGS = @LIBOPENOBEX_CFLAGS@
 LIBOPENOBEX_LIBS = @LIBOPENOBEX_LIBS@
@@ -161,6 +163,8 @@ MODIFY_SYNCCOMPARE = @MODIFY_SYNCCOMPARE@
 MSGFMT = @MSGFMT@
 MSGFMT_OPTS = @MSGFMT_OPTS@
 MSGMERGE = @MSGMERGE@
+MX_GTK_0_99_1_CFLAGS = @MX_GTK_0_99_1_CFLAGS@
+MX_GTK_0_99_1_LIBS = @MX_GTK_0_99_1_LIBS@
 NMEDIT = @NMEDIT@
 NSS_CFLAGS = @NSS_CFLAGS@
 NSS_LIBS = @NSS_LIBS@
@@ -198,6 +202,7 @@ SYNTHESIS_LIB = @SYNTHESIS_LIB@
 SYNTHESIS_LIBS = @SYNTHESIS_LIBS@
 SYNTHESIS_SRC = @SYNTHESIS_SRC@
 SYNTHESIS_SUBDIR = @SYNTHESIS_SUBDIR@
+SYNTHESIS_SUBDIR_INCLUDES = @SYNTHESIS_SUBDIR_INCLUDES@
 TRANSPORT_CFLAGS = @TRANSPORT_CFLAGS@
 TRANSPORT_LIBS = @TRANSPORT_LIBS@
 UNIQUE_CFLAGS = @UNIQUE_CFLAGS@
index 0fee97e..3bf2cea 100644 (file)
       <doc:doc><doc:description>
         Get an array of all configured servers (or templates)
 
-        In getting templates mode, the dbus server checks the paired devices
-        from bluez and returns the matched templates. Templates for each device
-        are re-named with 'Bluetooth_&lt;mac address&gt;_&lt;number&gt;', where number
-        enumerates the templates created for the device.
-
-        Get these templates latter when calling GetConfig with additional new
-        properties: 
-            description - the description for the template
-            score - the calculated score based on the device name and template
-            deviceName - the device name that the template is for
-            fingerPrint - the fingerPrint of the template, used for dbus
-                          clients to re-match with user input device info
-        Also a property value is changed: 'syncURL' is replaced with the device 
-        mac address.
+        In getting templates mode, the dbus server checks all paired devices
+        from bluez daemon and filters them by SyncML capability. Then it
+        looks through built-in templates and returns their matched templates.
+        Multiple templates might be created for each device, with different
+        matching scores(range: 1-5). Scores represent how well the device name
+        matches a template. The higher, the better.
+        
+        A template might be used to help creation for multiple devices. Thus template
+        names must be reset in a naming rule. They are re-named with 'Bluetooth_&lt;
+        mac address&gt;_&lt;sequence number&gt;'. Here 'mac address' is the mac
+        address of the Bluetooth device and 'sequence number' enumerates all the
+        matched templates created for the device.
+
+        When retrieving the templates with GetConfig(), several additional
+        properties will be returned:
+            description - the description for the template (non-localized string)
+            score - the calculated score based on the device name and template (1-5, 5 is best)
+            deviceName - the device name that the template is for (copied verbatim from that device)
+            templateName - string identifying the class of devices the templates works for,
+                           like "Nokia S40"; meant to be shown to users; optional, fall back
+                           to first entry in fingerPrint if not set
+            fingerPrint - comma separated list of devices which work with this template,
+                          typically in "vendor model" format; can be used by D-Bus
+                          clients to re-match with user provided device information
+
+        Together with these changes, a property value is changed: 'syncURL' in the
+        configuration is replaced with the mac address of the device.
       </doc:description></doc:doc>
       <arg type="b" name="template" direction="in">
         <doc:doc><doc:summary>
           </doc:summary>
         </doc:doc>
       </arg>
-      <arg type="o" name="handler">
+      <arg type="s" name="handler">
         <doc:doc>
           <doc:summary>
             for state="waiting": the client which first replied
       </arg>
     </method>
 
+    <signal name="LogOutput">
+      <doc:doc><doc:description></doc:description>Broadcast the console part of the output</doc:doc>
+      <arg type="o" name="path">
+          <doc:doc>
+            <doc:summary>
+              D-Bus object path. If the output belongs to a session, then path is set as session's
+              object path. Else, it's set as dbus server's object path.
+            </doc:summary>
+          </doc:doc>
+      </arg>
+      <arg type="s" name="level">
+        <doc:doc><doc:summary>the output level (DEBUG/INFO/SHOW/ERROR/WARNING/DEV)</doc:summary></doc:doc>
+      </arg>
+      <arg type="s" name="output">
+        <doc:doc><doc:summary>the output string to be broadcast</doc:summary></doc:doc>
+      </arg>
+    </signal>
+
   </interface>
 </node>
index 10fca9b..19d8784 100644 (file)
       </arg>
     </method>
 
+    <method name="Execute">
+      <doc:doc><doc:description>Execute command line arguments </doc:description></doc:doc>
+      <arg type="as" name="args" direction="in">
+        <doc:doc><doc:summary>Command line arguments</doc:summary></doc:doc>
+      </arg>
+      <arg type="a{ss}" name="vars" direction="in">
+        <doc:doc><doc:summary>Environment variables in clients</doc:summary></doc:doc>
+      </arg>
+    </method>
+
     <signal name="StatusChanged">
       <doc:doc><doc:description>Session status change. See GetStatus() for argument descriptions.</doc:description></doc:doc>
       <arg type="s" name="status"/>
index c303214..87b383a 100644 (file)
@@ -62,6 +62,7 @@ typedef enum {
   SYNCEVO_PHASE_RECEIVING,
 } SyncevoSourcePhase;
 
+#define SYNCEVO_TYPE_STRING_STRING_HASHTABLE (dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_STRING))
 #define SYNCEVO_TYPE_SOURCE_STATUS (dbus_g_type_get_struct ("GValueArray", G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_INVALID))
 #define SYNCEVO_TYPE_SOURCE_STATUSES (dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, SYNCEVO_TYPE_SOURCE_STATUS))
 #define SYNCEVO_TYPE_SOURCE_PROGRESS (dbus_g_type_get_struct ("GValueArray", G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INVALID))
index 3c4afd1..c3171a0 100644 (file)
@@ -273,7 +273,7 @@ syncevo_server_get_new_proxy (SyncevoServer *server)
                              G_TYPE_STRING,
                              G_TYPE_STRING,
                              G_TYPE_STRING,
-                             DBUS_TYPE_G_STRING_STRING_HASHTABLE,
+                             SYNCEVO_TYPE_STRING_STRING_HASHTABLE,
                              G_TYPE_INVALID);
     dbus_g_proxy_connect_signal (priv->proxy, "InfoRequest",
                                  G_CALLBACK (info_request_cb), server, NULL);
@@ -319,7 +319,7 @@ syncevo_server_init (SyncevoServer *server)
                                        G_TYPE_STRING,
                                        G_TYPE_STRING,
                                        G_TYPE_STRING,
-                                       DBUS_TYPE_G_STRING_STRING_HASHTABLE,
+                                       G_TYPE_BOXED,
                                        G_TYPE_INVALID);
 
     /* TemplatesChanged */
@@ -365,7 +365,7 @@ syncevo_server_class_init (SyncevoServerClass *klass)
                           NULL, NULL,
                           syncevo_marshal_VOID__STRING_STRING_STRING_STRING_STRING_BOXED,
                           G_TYPE_NONE,
-                          6, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, DBUS_TYPE_G_STRING_STRING_HASHTABLE);
+                          6, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER);
     signals[TEMPLATES_CHANGED] =
             g_signal_new ("templates-changed",
                           G_TYPE_FROM_CLASS (klass),
index 128db31..a5b2c15 100644 (file)
@@ -22,7 +22,6 @@
 #include "syncevo-server.h"
 
 #include <synthesis/syerror.h>
-#include <synthesis/engine_defs.h>
 
 gboolean stop = FALSE;
 GMainLoop *loop;
index 9c7e0f1..7d35682 100644 (file)
@@ -197,6 +197,8 @@ LDFLAGS = @LDFLAGS@
 LIBEXECDIR = @LIBEXECDIR@
 LIBICAL_AVAILABLE_CFLAGS = @LIBICAL_AVAILABLE_CFLAGS@
 LIBICAL_AVAILABLE_LIBS = @LIBICAL_AVAILABLE_LIBS@
+LIBNOTIFY_CFLAGS = @LIBNOTIFY_CFLAGS@
+LIBNOTIFY_LIBS = @LIBNOTIFY_LIBS@
 LIBOBJS = @LIBOBJS@
 LIBOPENOBEX_CFLAGS = @LIBOPENOBEX_CFLAGS@
 LIBOPENOBEX_LIBS = @LIBOPENOBEX_LIBS@
@@ -215,6 +217,8 @@ MODIFY_SYNCCOMPARE = @MODIFY_SYNCCOMPARE@
 MSGFMT = @MSGFMT@
 MSGFMT_OPTS = @MSGFMT_OPTS@
 MSGMERGE = @MSGMERGE@
+MX_GTK_0_99_1_CFLAGS = @MX_GTK_0_99_1_CFLAGS@
+MX_GTK_0_99_1_LIBS = @MX_GTK_0_99_1_LIBS@
 NMEDIT = @NMEDIT@
 NSS_CFLAGS = @NSS_CFLAGS@
 NSS_LIBS = @NSS_LIBS@
@@ -252,6 +256,7 @@ SYNTHESIS_LIB = @SYNTHESIS_LIB@
 SYNTHESIS_LIBS = @SYNTHESIS_LIBS@
 SYNTHESIS_SRC = @SYNTHESIS_SRC@
 SYNTHESIS_SUBDIR = @SYNTHESIS_SUBDIR@
+SYNTHESIS_SUBDIR_INCLUDES = @SYNTHESIS_SUBDIR_INCLUDES@
 TRANSPORT_CFLAGS = @TRANSPORT_CFLAGS@
 TRANSPORT_LIBS = @TRANSPORT_LIBS@
 UNIQUE_CFLAGS = @UNIQUE_CFLAGS@
index 94407c6..db4a5a1 100644 (file)
@@ -138,12 +138,12 @@ class DBusErrorCXX : public DBusError
 {
  public:
     DBusErrorCXX() { dbus_error_init(this); }
-    void throwFailure(const std::string &operation)
+    void throwFailure(const std::string &operation, const std::string &explanation = " failed")
     {
         if (dbus_error_is_set(this)) {
             throw std::runtime_error(operation + ": " + message);
         } else {
-            throw std::runtime_error(operation + " failed");
+            throw std::runtime_error(operation + explanation);
         }
     }
 
@@ -4026,69 +4026,63 @@ public:
     virtual ~DBusCallObject() {}
 };
 
-/*
- * A DBus Client Call object handling 0 argument and 1 return value.
- */
-template <class R>
-class DBusClientCall0
+template <class T>
+class DBusClientCall
 {
+protected:
     const std::string m_destination;
     const std::string m_path;
     const std::string m_interface;
     const std::string m_method;
     const DBusConnectionPtr m_conn;
 
-    /** called by libdbus on error or completion of call */
-    static void dbusCallback (DBusPendingCall *call, void *user_data)
-    {
-        DBusMessagePtr reply = dbus_pending_call_steal_reply (call);
-        const char* errname = dbus_message_get_error_name (reply.get());
-        std::string error;
-        typename dbus_traits<R>::host_type r;
-        if (!errname) {
-            DBusMessageIter iter;
-            dbus_message_iter_init(reply.get(), &iter);
-            //why need connection?
-            dbus_traits<R>::get(NULL, reply.get(), iter, r);
-        } else {
-            error = errname;
-        }
-        //unmarshal the return results and call user callback
-        (*static_cast <Callback_t *>(user_data))(r, error);
-    }
+    typedef DBusPendingCallNotifyFunction DBusCallback;
+    DBusCallback m_dbusCallback;
 
     /**
      * called by libdbus to free the user_data pointer set in 
      * dbus_pending_call_set_notify()
      */
     static void callDataUnref(void *user_data) {
-        delete static_cast <Callback_t *>(user_data);
+        delete static_cast<CallbackData *>(user_data);
     }
 
-public:
-    /**
-     * called when result of call is available (R) or an error occurred (non-empty string)
-     */
-    typedef boost::function<void (const R &, const std::string &)> Callback_t;
+    typedef T Callback_t;
 
-    DBusClientCall0 (const DBusCallObject &object)
+public:
+    struct CallbackData
+    {
+        //only keep connection, for DBusClientCall instance is absent when 'dbus client call' returns
+        //suppose connection is available in the callback handler
+        const DBusConnectionPtr m_conn;
+        Callback_t m_callback;
+        CallbackData(const DBusConnectionPtr &conn, const Callback_t &callback)
+            :m_conn(conn), m_callback(callback)
+        {}
+    };
+
+    DBusClientCall(const DBusCallObject &object, DBusCallback dbusCallback)
         :m_destination (object.getDestination()),
          m_path (object.getPath()),
          m_interface (object.getInterface()),
          m_method (object.getMethod()),
-         m_conn (object.getConnection())
+         m_conn (object.getConnection()),
+         m_dbusCallback(dbusCallback)
     {
     }
 
-    DBusClientCall0 (const DBusRemoteObject &object, const std::string &method)
+    DBusClientCall(const DBusRemoteObject &object, const std::string &method, DBusCallback dbusCallback)
         :m_destination (object.getDestination()),
          m_path (object.getPath()),
          m_interface (object.getInterface()),
          m_method (method),
-         m_conn (object.getConnection())
+         m_conn (object.getConnection()),
+         m_dbusCallback(dbusCallback)
     {
     }
 
+    DBusConnection *getConnection() { return m_conn.get(); }
+
     void operator () (const Callback_t &callback)
     {
         DBusPendingCall *call;
@@ -4107,19 +4101,297 @@ public:
         }
 
         DBusPendingCallPtr mCall (call);
-        Callback_t *data = new Callback_t(callback);
+        CallbackData *data = new CallbackData(m_conn, callback);
         dbus_pending_call_set_notify(mCall.get(),
-                                     dbusCallback,
+                                     m_dbusCallback,
                                      data,
                                      callDataUnref);
     }
+
+    template <class A1>
+    void operator () (const A1 &a1, const Callback_t &callback)
+    {
+        DBusPendingCall *call;
+        DBusMessagePtr msg(dbus_message_new_method_call(
+                    m_destination.c_str(),
+                    m_path.c_str(),
+                    m_interface.c_str(),
+                    m_method.c_str()));
+        if (!msg) {
+            throw std::runtime_error("dbus_message_new_method_call() failed");
+        }
+        append_retvals(msg, a1);
+
+        //parameter marshaling (none)
+        if (!dbus_connection_send_with_reply(m_conn.get(), msg.get(), &call, -1)) {
+            throw std::runtime_error("dbus_connection_send failed");
+        }
+
+        DBusPendingCallPtr mCall (call);
+        CallbackData *data = new CallbackData(m_conn, callback);
+        dbus_pending_call_set_notify(mCall.get(),
+                                     m_dbusCallback,
+                                     data,
+                                     callDataUnref);
+    }
+
+    template <class A1, class A2>
+    void operator () (const A1 &a1, const A2 &a2, const Callback_t &callback)
+    {
+        DBusPendingCall *call;
+        DBusMessagePtr msg(dbus_message_new_method_call(
+                    m_destination.c_str(),
+                    m_path.c_str(),
+                    m_interface.c_str(),
+                    m_method.c_str()));
+        if (!msg) {
+            throw std::runtime_error("dbus_message_new_method_call() failed");
+        }
+        append_retvals(msg, a1);
+        append_retvals(msg, a2);
+
+        //parameter marshaling (none)
+        if (!dbus_connection_send_with_reply(m_conn.get(), msg.get(), &call, -1)) {
+            throw std::runtime_error("dbus_connection_send failed");
+        }
+
+        DBusPendingCallPtr mCall (call);
+        CallbackData *data = new CallbackData(m_conn, callback);
+        dbus_pending_call_set_notify(mCall.get(),
+                                     m_dbusCallback,
+                                     data,
+                                     callDataUnref);
+    }
+
+    template <class A1, class A2, class A3>
+    void operator () (const A1 &a1, const A2 &a2, const A3 &a3, const Callback_t &callback)
+    {
+        DBusPendingCall *call;
+        DBusMessagePtr msg(dbus_message_new_method_call(
+                    m_destination.c_str(),
+                    m_path.c_str(),
+                    m_interface.c_str(),
+                    m_method.c_str()));
+        if (!msg) {
+            throw std::runtime_error("dbus_message_new_method_call() failed");
+        }
+        append_retvals(msg, a1);
+        append_retvals(msg, a2);
+        append_retvals(msg, a3);
+
+        //parameter marshaling (none)
+        if (!dbus_connection_send_with_reply(m_conn.get(), msg.get(), &call, -1)) {
+            throw std::runtime_error("dbus_connection_send failed");
+        }
+
+        DBusPendingCallPtr mCall (call);
+        CallbackData *data = new CallbackData(m_conn, callback);
+        dbus_pending_call_set_notify(mCall.get(),
+                                     m_dbusCallback,
+                                     data,
+                                     callDataUnref);
+    }
+};
+
+/*
+ * A DBus Client Call object handling zero or more parameter and
+ * zero return value.
+ */
+class DBusClientCall0 : public DBusClientCall<boost::function<void (const std::string &)> >
+{
+    /**
+     * called when result of call is available or an error occurred (non-empty string)
+     */
+    typedef boost::function<void (const std::string &)> Callback_t;
+
+    /** called by libdbus on error or completion of call */
+    static void dbusCallback (DBusPendingCall *call, void *user_data)
+    {
+        CallbackData *data = static_cast<CallbackData *>(user_data);
+        DBusMessagePtr reply = dbus_pending_call_steal_reply (call);
+        const char* errname = dbus_message_get_error_name (reply.get());
+        std::string error;
+        if (errname) {
+            error = errname;
+        }
+        //unmarshal the return results and call user callback
+        (data->m_callback)(error);
+    }
+
+public:
+    DBusClientCall0 (const DBusCallObject &object)
+        : DBusClientCall<Callback_t>(object, &DBusClientCall0::dbusCallback) 
+    {
+    }
+
+    DBusClientCall0 (const DBusRemoteObject &object, const std::string &method)
+        : DBusClientCall<Callback_t>(object, method, &DBusClientCall0::dbusCallback)
+    {
+    }
+};
+
+/** 1 return value and 0 or more parameters */
+template <class R1>
+class DBusClientCall1 : public DBusClientCall<boost::function<void (const R1 &, const std::string &)> >
+{
+    /**
+     * called when the call is returned or an error occurred (non-empty string)
+     */
+    typedef boost::function<void (const R1 &, const std::string &)> Callback_t;
+
+    /** called by libdbus on error or completion of call */
+    static void dbusCallback (DBusPendingCall *call, void *user_data)
+    {
+        typedef typename DBusClientCall<Callback_t>::CallbackData CallbackData;
+        CallbackData *data = static_cast<CallbackData *>(user_data);
+        DBusMessagePtr reply = dbus_pending_call_steal_reply (call);
+        const char* errname = dbus_message_get_error_name (reply.get());
+        std::string error;
+        typename dbus_traits<R1>::host_type r;
+        if (!errname) {
+            DBusMessageIter iter;
+            dbus_message_iter_init(reply.get(), &iter);
+            dbus_traits<R1>::get(data->m_conn.get(), reply.get(), iter, r);
+        } else {
+            error = errname;
+        }
+        //unmarshal the return results and call user callback
+        //(*static_cast <Callback_t *>(user_data))(r, error);
+        (data->m_callback)(r, error);
+    }
+
+public:
+    DBusClientCall1 (const DBusCallObject &object)
+        : DBusClientCall<Callback_t>(object, &DBusClientCall1::dbusCallback) 
+    {
+    }
+
+    DBusClientCall1 (const DBusRemoteObject &object, const std::string &method)
+        : DBusClientCall<Callback_t>(object, method, &DBusClientCall1::dbusCallback)
+    {
+    }
 };
 
-class SignalWatch
+/** 2 return value and 0 or more parameters */
+template <class R1, class R2>
+class DBusClientCall2 : public DBusClientCall<boost::function<
+                               void (const R1 &, const R2 &, const std::string &)> >
+
 {
+    /**
+     * called when the call is returned or an error occurred (non-empty string)
+     */
+    typedef boost::function<void (const R1 &, const R2 &, const std::string &)> Callback_t;
+
+    /** called by libdbus on error or completion of call */
+    static void dbusCallback (DBusPendingCall *call, void *user_data)
+    {
+        typedef typename DBusClientCall<Callback_t>::CallbackData CallbackData;
+        CallbackData *data = static_cast<CallbackData *>(user_data);
+        DBusMessagePtr reply = dbus_pending_call_steal_reply (call);
+        const char* errname = dbus_message_get_error_name (reply.get());
+        std::string error;
+        typename dbus_traits<R1>::host_type r1;
+        typename dbus_traits<R2>::host_type r2;
+        if (!errname) {
+            DBusMessageIter iter;
+            dbus_message_iter_init(reply.get(), &iter);
+            dbus_traits<R1>::get(data->m_conn.get(), reply.get(), iter, r1);
+            dbus_traits<R2>::get(data->m_conn.get(), reply.get(), iter, r2);
+        } else {
+            error = errname;
+        }
+        //unmarshal the return results and call user callback
+        (data->m_callback)(r1, r2, error);
+    }
+
+public:
+    DBusClientCall2 (const DBusCallObject &object)
+        : DBusClientCall<Callback_t>(object, &DBusClientCall2::dbusCallback) 
+    {
+    }
+
+    DBusClientCall2 (const DBusRemoteObject &object, const std::string &method)
+        : DBusClientCall<Callback_t>(object, method, &DBusClientCall2::dbusCallback)
+    {
+    }
+};
+
+/** 3 return value and 0 or more parameters */
+template <class R1, class R2, class R3>
+class DBusClientCall3 : public DBusClientCall<boost::function<
+                               void (const R1 &, const R2 &, const R3 &, const std::string &)> >
+
+{
+    /**
+     * called when the call is returned or an error occurred (non-empty string)
+     */
+    typedef boost::function<void (const R1 &, const R2 &, const R3 &, const std::string &)> Callback_t;
+
+    /** called by libdbus on error or completion of call */
+    static void dbusCallback (DBusPendingCall *call, void *user_data)
+    {
+        typedef typename DBusClientCall<Callback_t>::CallbackData CallbackData;
+        CallbackData *data = static_cast<CallbackData *>(user_data);
+        DBusMessagePtr reply = dbus_pending_call_steal_reply (call);
+        const char* errname = dbus_message_get_error_name (reply.get());
+        std::string error;
+        typename dbus_traits<R1>::host_type r1;
+        typename dbus_traits<R2>::host_type r2;
+        typename dbus_traits<R3>::host_type r3;
+        if (!errname) {
+            DBusMessageIter iter;
+            dbus_message_iter_init(reply.get(), &iter);
+            dbus_traits<R1>::get(data->m_conn.get(), reply.get(), iter, r1);
+            dbus_traits<R2>::get(data->m_conn.get(), reply.get(), iter, r2);
+            dbus_traits<R3>::get(data->m_conn.get(), reply.get(), iter, r3);
+        } else {
+            error = errname;
+        }
+        //unmarshal the return results and call user callback
+        (data->m_callback)(r1, r2, r3, error);
+    }
+
+public:
+    DBusClientCall3 (const DBusCallObject &object)
+        : DBusClientCall<Callback_t>(object, &DBusClientCall3::dbusCallback) 
+    {
+    }
+
+    DBusClientCall3 (const DBusRemoteObject &object, const std::string &method)
+        : DBusClientCall<Callback_t>(object, method, &DBusClientCall3::dbusCallback)
+    {
+    }
+};
+
+/**
+ * Common functionality of all SignalWatch* classes.
+ * @param T     boost::function with the right signature
+ */
+template <class T> class SignalWatch
+{
+ public:
+    SignalWatch(const DBusRemoteObject &object,
+                 const std::string &signal)
+        : m_object(object), m_signal(signal)
+    {
+    }
+
+    ~SignalWatch()
+    {
+        if (m_tag) {
+            g_dbus_remove_watch(m_object.getConnection(), m_tag);
+        }
+    }
+
+    typedef T Callback_t;
+    const Callback_t &getCallback() const{ return m_callback; }
+
  protected:
     const DBusRemoteObject &m_object;
     std::string m_signal;
+    guint m_tag;
+    T m_callback;
 
     std::string makeSignalRule() {
         std::string rule;
@@ -4139,122 +4411,265 @@ class SignalWatch
                 dbus_message_is_signal(msg, watch->m_object.getInterface(), watch->m_signal.c_str());
     }
 
+    void activateInternal(const Callback_t &callback,
+                          gboolean (*cb)(DBusConnection *, DBusMessage *, void *))
+    {
+        m_callback = callback;
+        std::string rule = makeSignalRule();
+        m_tag = g_dbus_add_signal_watch(m_object.getConnection(),
+                                        rule.c_str(),
+                                        cb,
+                                        this,
+                                        NULL);
+    }
+};
+
+class SignalWatch0 : public SignalWatch< boost::function<void (void)> >
+{
+    typedef boost::function<void (void)> Callback_t;
+
  public:
-    SignalWatch(const DBusRemoteObject &object,
+    SignalWatch0(const DBusRemoteObject &object,
                  const std::string &signal)
-        : m_object(object), m_signal(signal)
+        : SignalWatch<Callback_t>(object, signal)
     {
     }
 
-    virtual ~SignalWatch() {}
+    static gboolean internalCallback(DBusConnection *conn, DBusMessage *msg, void *data)
+    {
+        if(isMatched(msg, data) == FALSE) {
+            return TRUE;
+        }
+        const Callback_t &cb = static_cast< SignalWatch<Callback_t> *>(data)->getCallback();
+        cb();
+
+        return TRUE;
+    }
+
+    void activate(const Callback_t &callback) { activateInternal(callback, internalCallback); }
 };
 
 template <typename A1>
-class SignalWatch1 : public SignalWatch
+class SignalWatch1 : public SignalWatch< boost::function<void (const A1 &)> >
 {
     typedef boost::function<void (const A1 &)> Callback_t;
-    guint m_tag;
-    Callback_t *m_callback;
 
  public:
     SignalWatch1(const DBusRemoteObject &object,
                  const std::string &signal)
-        : SignalWatch(object, signal), m_tag(0), m_callback(0)
+        : SignalWatch<Callback_t>(object, signal)
     {
     }
 
-    ~SignalWatch1()
+    static gboolean internalCallback(DBusConnection *conn, DBusMessage *msg, void *data)
     {
-        if(m_tag) {
-            g_dbus_remove_watch(m_object.getConnection(), m_tag);
-        }
-        if(m_callback) {
-            delete m_callback;
+        if (SignalWatch<Callback_t>::isMatched(msg, data) == FALSE) {
+            return TRUE;
         }
+        const Callback_t &cb =static_cast< SignalWatch<Callback_t> *>(data)->getCallback();
+
+        typename dbus_traits<A1>::host_type a1;
+
+        DBusMessageIter iter;
+        dbus_message_iter_init(msg, &iter);
+        dbus_traits<A1>::get(conn, msg, iter, a1);
+        cb(a1);
+
+        return TRUE;
+    }
+
+    void activate(const Callback_t &callback) { activateInternal(callback, internalCallback); }
+};
+
+template <typename A1, typename A2>
+class SignalWatch2 : public SignalWatch< boost::function<void (const A1 &, const A2 &)> >
+{
+    typedef boost::function<void (const A1 &, const A2 &)> Callback_t;
+
+ public:
+    SignalWatch2(const DBusRemoteObject &object,
+                 const std::string &signal)
+        : SignalWatch<Callback_t>(object, signal)
+    {
     }
 
     static gboolean internalCallback(DBusConnection *conn, DBusMessage *msg, void *data)
     {
-        if(isMatched(msg, data) == FALSE) {
+        if (SignalWatch<Callback_t>::isMatched(msg, data) == FALSE) {
             return TRUE;
         }
-        SignalWatch1<A1> *watch = static_cast<SignalWatch1<A1>* >(data);
+        const Callback_t &cb = static_cast< SignalWatch<Callback_t> *>(data)->getCallback();
 
         typename dbus_traits<A1>::host_type a1;
+        typename dbus_traits<A2>::host_type a2;
 
         DBusMessageIter iter;
         dbus_message_iter_init(msg, &iter);
         dbus_traits<A1>::get(conn, msg, iter, a1);
-        (*watch->m_callback)(a1);
+        dbus_traits<A2>::get(conn, msg, iter, a2);
+        cb(a1, a2);
 
         return TRUE;
     }
 
-    void operator () (const Callback_t &callback)
+    void activate(const Callback_t &callback) { activateInternal(callback, internalCallback); }
+};
+
+template <typename A1, typename A2, typename A3>
+class SignalWatch3 : public SignalWatch< boost::function<void (const A1 &, const A2 &, const A3 &)> >
+{
+    typedef boost::function<void (const A1 &, const A2 &, const A3 &)> Callback_t;
+
+ public:
+    SignalWatch3(const DBusRemoteObject &object,
+                 const std::string &signal)
+        : SignalWatch<Callback_t>(object, signal)
     {
-        m_callback = new Callback_t(callback);
-        std::string rule = makeSignalRule();
-        m_tag = g_dbus_add_signal_watch(m_object.getConnection(),
-                                        rule.c_str(),
-                                        internalCallback,
-                                        this,
-                                        NULL);
     }
+
+    static gboolean internalCallback(DBusConnection *conn, DBusMessage *msg, void *data)
+    {
+        if (SignalWatch<Callback_t>::isMatched(msg, data) == FALSE) {
+            return TRUE;
+        }
+        const Callback_t &cb =static_cast< SignalWatch<Callback_t> *>(data)->getCallback();
+
+        typename dbus_traits<A1>::host_type a1;
+        typename dbus_traits<A2>::host_type a2;
+        typename dbus_traits<A3>::host_type a3;
+
+        DBusMessageIter iter;
+        dbus_message_iter_init(msg, &iter);
+        dbus_traits<A1>::get(conn, msg, iter, a1);
+        dbus_traits<A2>::get(conn, msg, iter, a2);
+        dbus_traits<A3>::get(conn, msg, iter, a3);
+        cb(a1, a2, a3);
+
+        return TRUE;
+    }
+
+    void activate(const Callback_t &callback) { activateInternal(callback, internalCallback); }
 };
 
-template <typename A1, typename A2>
-class SignalWatch2 : public SignalWatch
+template <typename A1, typename A2, typename A3, typename A4>
+class SignalWatch4 : public SignalWatch< boost::function<void (const A1 &, const A2 &, const A3 &, const A4 &)> >
 {
-    typedef boost::function<void (const A1 &, const A2 &)> Callback_t;
+    typedef boost::function<void (const A1 &, const A2 &, const A3 &, const A4 &)> Callback_t;
 
-    guint m_tag;
-    Callback_t *m_callback;
  public:
-    SignalWatch2(const DBusRemoteObject &object,
+    SignalWatch4(const DBusRemoteObject &object,
                  const std::string &signal)
-        : SignalWatch(object, signal), m_tag(0), m_callback(0)
+        : SignalWatch<Callback_t>(object, signal)
     {
     }
 
-    ~SignalWatch2()
+    static gboolean internalCallback(DBusConnection *conn, DBusMessage *msg, void *data)
     {
-        if(m_tag) {
-            g_dbus_remove_watch(m_object.getConnection(), m_tag);
-        }
-        if(m_callback) {
-            delete m_callback;
+        if (SignalWatch<Callback_t>::isMatched(msg, data) == FALSE) {
+            return TRUE;
         }
+        const Callback_t &cb = static_cast< SignalWatch<Callback_t> *>(data)->getCallback();
+
+        typename dbus_traits<A1>::host_type a1;
+        typename dbus_traits<A2>::host_type a2;
+        typename dbus_traits<A3>::host_type a3;
+        typename dbus_traits<A4>::host_type a4;
+
+        DBusMessageIter iter;
+        dbus_message_iter_init(msg, &iter);
+        dbus_traits<A1>::get(conn, msg, iter, a1);
+        dbus_traits<A2>::get(conn, msg, iter, a2);
+        dbus_traits<A3>::get(conn, msg, iter, a3);
+        dbus_traits<A4>::get(conn, msg, iter, a4);
+        cb(a1, a2, a3, a4);
+
+        return TRUE;
+    }
+
+    void activate(const Callback_t &callback) { activateInternal(callback, internalCallback); }
+};
+
+template <typename A1, typename A2, typename A3, typename A4, typename A5>
+class SignalWatch5 : public SignalWatch< boost::function<void (const A1 &, const A2 &, const A3 &, const A4 &, const A5 &)> >
+{
+    typedef boost::function<void (const A1 &, const A2 &, const A3 &, const A4 &, const A5 &)> Callback_t;
+
+ public:
+    SignalWatch5(const DBusRemoteObject &object,
+                 const std::string &signal)
+        : SignalWatch<Callback_t>(object, signal)
+    {
     }
 
     static gboolean internalCallback(DBusConnection *conn, DBusMessage *msg, void *data)
     {
-        if(isMatched(msg, data) == FALSE) {
+        if (SignalWatch<Callback_t>::isMatched(msg, data) == FALSE) {
             return TRUE;
         }
-        SignalWatch2<A1, A2> *watch = static_cast<SignalWatch2<A1, A2> *>(data);
+        const Callback_t &cb = static_cast< SignalWatch<Callback_t> *>(data)->getCallback();
 
         typename dbus_traits<A1>::host_type a1;
         typename dbus_traits<A2>::host_type a2;
+        typename dbus_traits<A3>::host_type a3;
+        typename dbus_traits<A4>::host_type a4;
+        typename dbus_traits<A5>::host_type a5;
 
         DBusMessageIter iter;
         dbus_message_iter_init(msg, &iter);
         dbus_traits<A1>::get(conn, msg, iter, a1);
         dbus_traits<A2>::get(conn, msg, iter, a2);
-        (*watch->m_callback)(a1, a2);
+        dbus_traits<A3>::get(conn, msg, iter, a3);
+        dbus_traits<A4>::get(conn, msg, iter, a4);
+        dbus_traits<A5>::get(conn, msg, iter, a5);
+        cb(a1, a2, a3, a4, a5);
 
         return TRUE;
     }
 
-    void operator () (const Callback_t &callback)
+    void activate(const Callback_t &callback) { activateInternal(callback, internalCallback); }
+};
+
+template <typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
+class SignalWatch6 : public SignalWatch< boost::function<void (const A1 &, const A2 &, const A3 &, const A4 &, const A5 &, const A6 &)> >
+{
+    typedef boost::function<void (const A1 &, const A2 &, const A3 &, const A4 &, const A5 &, const A6 &)> Callback_t;
+
+
+ public:
+    SignalWatch6(const DBusRemoteObject &object,
+                 const std::string &signal)
+        : SignalWatch<Callback_t>(object, signal)
     {
-        m_callback = new Callback_t(callback);
-        std::string rule = makeSignalRule();
-        m_tag = g_dbus_add_signal_watch(m_object.getConnection(),
-                                        rule.c_str(),
-                                        internalCallback,
-                                        this,
-                                        NULL);
     }
+
+    static gboolean internalCallback(DBusConnection *conn, DBusMessage *msg, void *data)
+    {
+        if (SignalWatch<Callback_t>::isMatched(msg, data) == FALSE) {
+            return TRUE;
+        }
+        const Callback_t &cb = static_cast< SignalWatch<Callback_t> *>(data)->getCallback();
+
+        typename dbus_traits<A1>::host_type a1;
+        typename dbus_traits<A2>::host_type a2;
+        typename dbus_traits<A3>::host_type a3;
+        typename dbus_traits<A4>::host_type a4;
+        typename dbus_traits<A5>::host_type a5;
+        typename dbus_traits<A6>::host_type a6;
+
+        DBusMessageIter iter;
+        dbus_message_iter_init(msg, &iter);
+        dbus_traits<A1>::get(conn, msg, iter, a1);
+        dbus_traits<A2>::get(conn, msg, iter, a2);
+        dbus_traits<A3>::get(conn, msg, iter, a3);
+        dbus_traits<A4>::get(conn, msg, iter, a4);
+        dbus_traits<A5>::get(conn, msg, iter, a5);
+        dbus_traits<A6>::get(conn, msg, iter, a6);
+        cb(a1, a2, a3, a4, a5, a6);
+
+        return TRUE;
+    }
+
+    void activate(const Callback_t &callback) { activateInternal(callback, internalCallback); }
 };
 
 #endif // INCL_GDBUS_CXX_BRIDGE
index 1e5113e..b033de1 100644 (file)
@@ -481,14 +481,12 @@ DBusConnection *g_dbus_setup_bus(DBusBusType type, const char *name,
                if (dbus_bus_request_name(connection, name,
                                DBUS_NAME_FLAG_DO_NOT_QUEUE, error) !=
                                DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER ) {
-                       dbus_connection_unref(connection);
-                       return NULL;
+                       goto failed;
                }
 
                if (error != NULL) {
                        if (dbus_error_is_set(error) == TRUE) {
-                               dbus_connection_unref(connection);
-                               return NULL;
+                               goto failed;
                        }
                }
        }
@@ -496,6 +494,12 @@ DBusConnection *g_dbus_setup_bus(DBusBusType type, const char *name,
        g_dbus_setup_connection(connection, unshared, NULL);
 
        return connection;
+
+ failed:
+       if (unshared)
+               dbus_connection_close(connection);
+       dbus_connection_unref(connection);
+       return NULL;
 }
 
 /**
index e6ffa9b..6246fb2 100644 (file)
@@ -173,6 +173,8 @@ LDFLAGS = @LDFLAGS@
 LIBEXECDIR = @LIBEXECDIR@
 LIBICAL_AVAILABLE_CFLAGS = @LIBICAL_AVAILABLE_CFLAGS@
 LIBICAL_AVAILABLE_LIBS = @LIBICAL_AVAILABLE_LIBS@
+LIBNOTIFY_CFLAGS = @LIBNOTIFY_CFLAGS@
+LIBNOTIFY_LIBS = @LIBNOTIFY_LIBS@
 LIBOBJS = @LIBOBJS@
 LIBOPENOBEX_CFLAGS = @LIBOPENOBEX_CFLAGS@
 LIBOPENOBEX_LIBS = @LIBOPENOBEX_LIBS@
@@ -191,6 +193,8 @@ MODIFY_SYNCCOMPARE = @MODIFY_SYNCCOMPARE@
 MSGFMT = @MSGFMT@
 MSGFMT_OPTS = @MSGFMT_OPTS@
 MSGMERGE = @MSGMERGE@
+MX_GTK_0_99_1_CFLAGS = @MX_GTK_0_99_1_CFLAGS@
+MX_GTK_0_99_1_LIBS = @MX_GTK_0_99_1_LIBS@
 NMEDIT = @NMEDIT@
 NSS_CFLAGS = @NSS_CFLAGS@
 NSS_LIBS = @NSS_LIBS@
@@ -228,6 +232,7 @@ SYNTHESIS_LIB = @SYNTHESIS_LIB@
 SYNTHESIS_LIBS = @SYNTHESIS_LIBS@
 SYNTHESIS_SRC = @SYNTHESIS_SRC@
 SYNTHESIS_SUBDIR = @SYNTHESIS_SUBDIR@
+SYNTHESIS_SUBDIR_INCLUDES = @SYNTHESIS_SUBDIR_INCLUDES@
 TRANSPORT_CFLAGS = @TRANSPORT_CFLAGS@
 TRANSPORT_LIBS = @TRANSPORT_LIBS@
 UNIQUE_CFLAGS = @UNIQUE_CFLAGS@
index e791b8a..a6cc77f 100644 (file)
@@ -22,7 +22,6 @@ dist_icon_DATA = sync.png
 
 themercdir = $(datadir)/syncevolution/
 themerc_DATA = \
-       close.png close_hover.png settings.png settings_hover.png \
        sync-generic.png \
        sync-spinner.gif \
        sync-ui.rc
@@ -51,7 +50,7 @@ bin_PROGRAMS = $(GUI_PROGRAMS)
 
 sync_ui_SOURCES = \
        main.c sync-ui.c sync-ui.h sync-ui-config.c sync-ui-config.h \
-       mux-frame.c mux-frame.h mux-window.c mux-window.h mux-icon-button.c mux-icon-button.h \
+       mux-frame.c mux-frame.h \
        sync-config-widget.c sync-config-widget.h \
        gtkinfobar.c gtkinfobar.h
 
index fe14411..4a22400 100644 (file)
@@ -53,7 +53,6 @@ binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
 PROGRAMS = $(bin_PROGRAMS)
 am_sync_ui_OBJECTS = sync_ui-main.$(OBJEXT) sync_ui-sync-ui.$(OBJEXT) \
        sync_ui-sync-ui-config.$(OBJEXT) sync_ui-mux-frame.$(OBJEXT) \
-       sync_ui-mux-window.$(OBJEXT) sync_ui-mux-icon-button.$(OBJEXT) \
        sync_ui-sync-config-widget.$(OBJEXT) \
        sync_ui-gtkinfobar.$(OBJEXT)
 sync_ui_OBJECTS = $(am_sync_ui_OBJECTS)
@@ -67,8 +66,6 @@ am__objects_1 = sync_ui_gtk-main.$(OBJEXT) \
        sync_ui_gtk-sync-ui.$(OBJEXT) \
        sync_ui_gtk-sync-ui-config.$(OBJEXT) \
        sync_ui_gtk-mux-frame.$(OBJEXT) \
-       sync_ui_gtk-mux-window.$(OBJEXT) \
-       sync_ui_gtk-mux-icon-button.$(OBJEXT) \
        sync_ui_gtk-sync-config-widget.$(OBJEXT) \
        sync_ui_gtk-gtkinfobar.$(OBJEXT)
 am_sync_ui_gtk_OBJECTS = $(am__objects_1)
@@ -85,8 +82,6 @@ am__objects_2 = sync_ui_moblin-main.$(OBJEXT) \
        sync_ui_moblin-sync-ui.$(OBJEXT) \
        sync_ui_moblin-sync-ui-config.$(OBJEXT) \
        sync_ui_moblin-mux-frame.$(OBJEXT) \
-       sync_ui_moblin-mux-window.$(OBJEXT) \
-       sync_ui_moblin-mux-icon-button.$(OBJEXT) \
        sync_ui_moblin-sync-config-widget.$(OBJEXT) \
        sync_ui_moblin-gtkinfobar.$(OBJEXT)
 am_sync_ui_moblin_OBJECTS = $(am__objects_2)
@@ -228,6 +223,8 @@ LDFLAGS = @LDFLAGS@
 LIBEXECDIR = @LIBEXECDIR@
 LIBICAL_AVAILABLE_CFLAGS = @LIBICAL_AVAILABLE_CFLAGS@
 LIBICAL_AVAILABLE_LIBS = @LIBICAL_AVAILABLE_LIBS@
+LIBNOTIFY_CFLAGS = @LIBNOTIFY_CFLAGS@
+LIBNOTIFY_LIBS = @LIBNOTIFY_LIBS@
 LIBOBJS = @LIBOBJS@
 LIBOPENOBEX_CFLAGS = @LIBOPENOBEX_CFLAGS@
 LIBOPENOBEX_LIBS = @LIBOPENOBEX_LIBS@
@@ -246,6 +243,8 @@ MODIFY_SYNCCOMPARE = @MODIFY_SYNCCOMPARE@
 MSGFMT = @MSGFMT@
 MSGFMT_OPTS = @MSGFMT_OPTS@
 MSGMERGE = @MSGMERGE@
+MX_GTK_0_99_1_CFLAGS = @MX_GTK_0_99_1_CFLAGS@
+MX_GTK_0_99_1_LIBS = @MX_GTK_0_99_1_LIBS@
 NMEDIT = @NMEDIT@
 NSS_CFLAGS = @NSS_CFLAGS@
 NSS_LIBS = @NSS_LIBS@
@@ -283,6 +282,7 @@ SYNTHESIS_LIB = @SYNTHESIS_LIB@
 SYNTHESIS_LIBS = @SYNTHESIS_LIBS@
 SYNTHESIS_SRC = @SYNTHESIS_SRC@
 SYNTHESIS_SUBDIR = @SYNTHESIS_SUBDIR@
+SYNTHESIS_SUBDIR_INCLUDES = @SYNTHESIS_SUBDIR_INCLUDES@
 TRANSPORT_CFLAGS = @TRANSPORT_CFLAGS@
 TRANSPORT_LIBS = @TRANSPORT_LIBS@
 UNIQUE_CFLAGS = @UNIQUE_CFLAGS@
@@ -358,7 +358,6 @@ icondir = $(datadir)/icons/hicolor/48x48/apps
 dist_icon_DATA = sync.png
 themercdir = $(datadir)/syncevolution/
 themerc_DATA = \
-       close.png close_hover.png settings.png settings_hover.png \
        sync-generic.png \
        sync-spinner.gif \
        sync-ui.rc
@@ -373,7 +372,7 @@ EXTRA_DIST = \
 bin_PROGRAMS = $(GUI_PROGRAMS)
 sync_ui_SOURCES = \
        main.c sync-ui.c sync-ui.h sync-ui-config.c sync-ui-config.h \
-       mux-frame.c mux-frame.h mux-window.c mux-window.h mux-icon-button.c mux-icon-button.h \
+       mux-frame.c mux-frame.h \
        sync-config-widget.c sync-config-widget.h \
        gtkinfobar.c gtkinfobar.h
 
@@ -481,24 +480,18 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_ui-gtkinfobar.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_ui-main.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_ui-mux-frame.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_ui-mux-icon-button.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_ui-mux-window.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_ui-sync-config-widget.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_ui-sync-ui-config.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_ui-sync-ui.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_ui_gtk-gtkinfobar.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_ui_gtk-main.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_ui_gtk-mux-frame.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_ui_gtk-mux-icon-button.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_ui_gtk-mux-window.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_ui_gtk-sync-config-widget.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_ui_gtk-sync-ui-config.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_ui_gtk-sync-ui.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_ui_moblin-gtkinfobar.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_ui_moblin-main.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_ui_moblin-mux-frame.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_ui_moblin-mux-icon-button.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_ui_moblin-mux-window.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_ui_moblin-sync-config-widget.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_ui_moblin-sync-ui-config.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_ui_moblin-sync-ui.Po@am__quote@
@@ -580,34 +573,6 @@ sync_ui-mux-frame.obj: mux-frame.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sync_ui_CPPFLAGS) $(CPPFLAGS) $(sync_ui_CFLAGS) $(CFLAGS) -c -o sync_ui-mux-frame.obj `if test -f 'mux-frame.c'; then $(CYGPATH_W) 'mux-frame.c'; else $(CYGPATH_W) '$(srcdir)/mux-frame.c'; fi`
 
-sync_ui-mux-window.o: mux-window.c
-@am__fastdepCC_TRUE@   $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sync_ui_CPPFLAGS) $(CPPFLAGS) $(sync_ui_CFLAGS) $(CFLAGS) -MT sync_ui-mux-window.o -MD -MP -MF $(DEPDIR)/sync_ui-mux-window.Tpo -c -o sync_ui-mux-window.o `test -f 'mux-window.c' || echo '$(srcdir)/'`mux-window.c
-@am__fastdepCC_TRUE@   mv -f $(DEPDIR)/sync_ui-mux-window.Tpo $(DEPDIR)/sync_ui-mux-window.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='mux-window.c' object='sync_ui-mux-window.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sync_ui_CPPFLAGS) $(CPPFLAGS) $(sync_ui_CFLAGS) $(CFLAGS) -c -o sync_ui-mux-window.o `test -f 'mux-window.c' || echo '$(srcdir)/'`mux-window.c
-
-sync_ui-mux-window.obj: mux-window.c
-@am__fastdepCC_TRUE@   $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sync_ui_CPPFLAGS) $(CPPFLAGS) $(sync_ui_CFLAGS) $(CFLAGS) -MT sync_ui-mux-window.obj -MD -MP -MF $(DEPDIR)/sync_ui-mux-window.Tpo -c -o sync_ui-mux-window.obj `if test -f 'mux-window.c'; then $(CYGPATH_W) 'mux-window.c'; else $(CYGPATH_W) '$(srcdir)/mux-window.c'; fi`
-@am__fastdepCC_TRUE@   mv -f $(DEPDIR)/sync_ui-mux-window.Tpo $(DEPDIR)/sync_ui-mux-window.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='mux-window.c' object='sync_ui-mux-window.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sync_ui_CPPFLAGS) $(CPPFLAGS) $(sync_ui_CFLAGS) $(CFLAGS) -c -o sync_ui-mux-window.obj `if test -f 'mux-window.c'; then $(CYGPATH_W) 'mux-window.c'; else $(CYGPATH_W) '$(srcdir)/mux-window.c'; fi`
-
-sync_ui-mux-icon-button.o: mux-icon-button.c
-@am__fastdepCC_TRUE@   $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sync_ui_CPPFLAGS) $(CPPFLAGS) $(sync_ui_CFLAGS) $(CFLAGS) -MT sync_ui-mux-icon-button.o -MD -MP -MF $(DEPDIR)/sync_ui-mux-icon-button.Tpo -c -o sync_ui-mux-icon-button.o `test -f 'mux-icon-button.c' || echo '$(srcdir)/'`mux-icon-button.c
-@am__fastdepCC_TRUE@   mv -f $(DEPDIR)/sync_ui-mux-icon-button.Tpo $(DEPDIR)/sync_ui-mux-icon-button.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='mux-icon-button.c' object='sync_ui-mux-icon-button.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sync_ui_CPPFLAGS) $(CPPFLAGS) $(sync_ui_CFLAGS) $(CFLAGS) -c -o sync_ui-mux-icon-button.o `test -f 'mux-icon-button.c' || echo '$(srcdir)/'`mux-icon-button.c
-
-sync_ui-mux-icon-button.obj: mux-icon-button.c
-@am__fastdepCC_TRUE@   $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sync_ui_CPPFLAGS) $(CPPFLAGS) $(sync_ui_CFLAGS) $(CFLAGS) -MT sync_ui-mux-icon-button.obj -MD -MP -MF $(DEPDIR)/sync_ui-mux-icon-button.Tpo -c -o sync_ui-mux-icon-button.obj `if test -f 'mux-icon-button.c'; then $(CYGPATH_W) 'mux-icon-button.c'; else $(CYGPATH_W) '$(srcdir)/mux-icon-button.c'; fi`
-@am__fastdepCC_TRUE@   mv -f $(DEPDIR)/sync_ui-mux-icon-button.Tpo $(DEPDIR)/sync_ui-mux-icon-button.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='mux-icon-button.c' object='sync_ui-mux-icon-button.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sync_ui_CPPFLAGS) $(CPPFLAGS) $(sync_ui_CFLAGS) $(CFLAGS) -c -o sync_ui-mux-icon-button.obj `if test -f 'mux-icon-button.c'; then $(CYGPATH_W) 'mux-icon-button.c'; else $(CYGPATH_W) '$(srcdir)/mux-icon-button.c'; fi`
-
 sync_ui-sync-config-widget.o: sync-config-widget.c
 @am__fastdepCC_TRUE@   $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sync_ui_CPPFLAGS) $(CPPFLAGS) $(sync_ui_CFLAGS) $(CFLAGS) -MT sync_ui-sync-config-widget.o -MD -MP -MF $(DEPDIR)/sync_ui-sync-config-widget.Tpo -c -o sync_ui-sync-config-widget.o `test -f 'sync-config-widget.c' || echo '$(srcdir)/'`sync-config-widget.c
 @am__fastdepCC_TRUE@   mv -f $(DEPDIR)/sync_ui-sync-config-widget.Tpo $(DEPDIR)/sync_ui-sync-config-widget.Po
@@ -692,34 +657,6 @@ sync_ui_gtk-mux-frame.obj: mux-frame.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sync_ui_gtk_CPPFLAGS) $(CPPFLAGS) $(sync_ui_gtk_CFLAGS) $(CFLAGS) -c -o sync_ui_gtk-mux-frame.obj `if test -f 'mux-frame.c'; then $(CYGPATH_W) 'mux-frame.c'; else $(CYGPATH_W) '$(srcdir)/mux-frame.c'; fi`
 
-sync_ui_gtk-mux-window.o: mux-window.c
-@am__fastdepCC_TRUE@   $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sync_ui_gtk_CPPFLAGS) $(CPPFLAGS) $(sync_ui_gtk_CFLAGS) $(CFLAGS) -MT sync_ui_gtk-mux-window.o -MD -MP -MF $(DEPDIR)/sync_ui_gtk-mux-window.Tpo -c -o sync_ui_gtk-mux-window.o `test -f 'mux-window.c' || echo '$(srcdir)/'`mux-window.c
-@am__fastdepCC_TRUE@   mv -f $(DEPDIR)/sync_ui_gtk-mux-window.Tpo $(DEPDIR)/sync_ui_gtk-mux-window.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='mux-window.c' object='sync_ui_gtk-mux-window.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sync_ui_gtk_CPPFLAGS) $(CPPFLAGS) $(sync_ui_gtk_CFLAGS) $(CFLAGS) -c -o sync_ui_gtk-mux-window.o `test -f 'mux-window.c' || echo '$(srcdir)/'`mux-window.c
-
-sync_ui_gtk-mux-window.obj: mux-window.c
-@am__fastdepCC_TRUE@   $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sync_ui_gtk_CPPFLAGS) $(CPPFLAGS) $(sync_ui_gtk_CFLAGS) $(CFLAGS) -MT sync_ui_gtk-mux-window.obj -MD -MP -MF $(DEPDIR)/sync_ui_gtk-mux-window.Tpo -c -o sync_ui_gtk-mux-window.obj `if test -f 'mux-window.c'; then $(CYGPATH_W) 'mux-window.c'; else $(CYGPATH_W) '$(srcdir)/mux-window.c'; fi`
-@am__fastdepCC_TRUE@   mv -f $(DEPDIR)/sync_ui_gtk-mux-window.Tpo $(DEPDIR)/sync_ui_gtk-mux-window.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='mux-window.c' object='sync_ui_gtk-mux-window.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sync_ui_gtk_CPPFLAGS) $(CPPFLAGS) $(sync_ui_gtk_CFLAGS) $(CFLAGS) -c -o sync_ui_gtk-mux-window.obj `if test -f 'mux-window.c'; then $(CYGPATH_W) 'mux-window.c'; else $(CYGPATH_W) '$(srcdir)/mux-window.c'; fi`
-
-sync_ui_gtk-mux-icon-button.o: mux-icon-button.c
-@am__fastdepCC_TRUE@   $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sync_ui_gtk_CPPFLAGS) $(CPPFLAGS) $(sync_ui_gtk_CFLAGS) $(CFLAGS) -MT sync_ui_gtk-mux-icon-button.o -MD -MP -MF $(DEPDIR)/sync_ui_gtk-mux-icon-button.Tpo -c -o sync_ui_gtk-mux-icon-button.o `test -f 'mux-icon-button.c' || echo '$(srcdir)/'`mux-icon-button.c
-@am__fastdepCC_TRUE@   mv -f $(DEPDIR)/sync_ui_gtk-mux-icon-button.Tpo $(DEPDIR)/sync_ui_gtk-mux-icon-button.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='mux-icon-button.c' object='sync_ui_gtk-mux-icon-button.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sync_ui_gtk_CPPFLAGS) $(CPPFLAGS) $(sync_ui_gtk_CFLAGS) $(CFLAGS) -c -o sync_ui_gtk-mux-icon-button.o `test -f 'mux-icon-button.c' || echo '$(srcdir)/'`mux-icon-button.c
-
-sync_ui_gtk-mux-icon-button.obj: mux-icon-button.c
-@am__fastdepCC_TRUE@   $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sync_ui_gtk_CPPFLAGS) $(CPPFLAGS) $(sync_ui_gtk_CFLAGS) $(CFLAGS) -MT sync_ui_gtk-mux-icon-button.obj -MD -MP -MF $(DEPDIR)/sync_ui_gtk-mux-icon-button.Tpo -c -o sync_ui_gtk-mux-icon-button.obj `if test -f 'mux-icon-button.c'; then $(CYGPATH_W) 'mux-icon-button.c'; else $(CYGPATH_W) '$(srcdir)/mux-icon-button.c'; fi`
-@am__fastdepCC_TRUE@   mv -f $(DEPDIR)/sync_ui_gtk-mux-icon-button.Tpo $(DEPDIR)/sync_ui_gtk-mux-icon-button.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='mux-icon-button.c' object='sync_ui_gtk-mux-icon-button.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sync_ui_gtk_CPPFLAGS) $(CPPFLAGS) $(sync_ui_gtk_CFLAGS) $(CFLAGS) -c -o sync_ui_gtk-mux-icon-button.obj `if test -f 'mux-icon-button.c'; then $(CYGPATH_W) 'mux-icon-button.c'; else $(CYGPATH_W) '$(srcdir)/mux-icon-button.c'; fi`
-
 sync_ui_gtk-sync-config-widget.o: sync-config-widget.c
 @am__fastdepCC_TRUE@   $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sync_ui_gtk_CPPFLAGS) $(CPPFLAGS) $(sync_ui_gtk_CFLAGS) $(CFLAGS) -MT sync_ui_gtk-sync-config-widget.o -MD -MP -MF $(DEPDIR)/sync_ui_gtk-sync-config-widget.Tpo -c -o sync_ui_gtk-sync-config-widget.o `test -f 'sync-config-widget.c' || echo '$(srcdir)/'`sync-config-widget.c
 @am__fastdepCC_TRUE@   mv -f $(DEPDIR)/sync_ui_gtk-sync-config-widget.Tpo $(DEPDIR)/sync_ui_gtk-sync-config-widget.Po
@@ -804,34 +741,6 @@ sync_ui_moblin-mux-frame.obj: mux-frame.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sync_ui_moblin_CPPFLAGS) $(CPPFLAGS) $(sync_ui_moblin_CFLAGS) $(CFLAGS) -c -o sync_ui_moblin-mux-frame.obj `if test -f 'mux-frame.c'; then $(CYGPATH_W) 'mux-frame.c'; else $(CYGPATH_W) '$(srcdir)/mux-frame.c'; fi`
 
-sync_ui_moblin-mux-window.o: mux-window.c
-@am__fastdepCC_TRUE@   $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sync_ui_moblin_CPPFLAGS) $(CPPFLAGS) $(sync_ui_moblin_CFLAGS) $(CFLAGS) -MT sync_ui_moblin-mux-window.o -MD -MP -MF $(DEPDIR)/sync_ui_moblin-mux-window.Tpo -c -o sync_ui_moblin-mux-window.o `test -f 'mux-window.c' || echo '$(srcdir)/'`mux-window.c
-@am__fastdepCC_TRUE@   mv -f $(DEPDIR)/sync_ui_moblin-mux-window.Tpo $(DEPDIR)/sync_ui_moblin-mux-window.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='mux-window.c' object='sync_ui_moblin-mux-window.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sync_ui_moblin_CPPFLAGS) $(CPPFLAGS) $(sync_ui_moblin_CFLAGS) $(CFLAGS) -c -o sync_ui_moblin-mux-window.o `test -f 'mux-window.c' || echo '$(srcdir)/'`mux-window.c
-
-sync_ui_moblin-mux-window.obj: mux-window.c
-@am__fastdepCC_TRUE@   $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sync_ui_moblin_CPPFLAGS) $(CPPFLAGS) $(sync_ui_moblin_CFLAGS) $(CFLAGS) -MT sync_ui_moblin-mux-window.obj -MD -MP -MF $(DEPDIR)/sync_ui_moblin-mux-window.Tpo -c -o sync_ui_moblin-mux-window.obj `if test -f 'mux-window.c'; then $(CYGPATH_W) 'mux-window.c'; else $(CYGPATH_W) '$(srcdir)/mux-window.c'; fi`
-@am__fastdepCC_TRUE@   mv -f $(DEPDIR)/sync_ui_moblin-mux-window.Tpo $(DEPDIR)/sync_ui_moblin-mux-window.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='mux-window.c' object='sync_ui_moblin-mux-window.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sync_ui_moblin_CPPFLAGS) $(CPPFLAGS) $(sync_ui_moblin_CFLAGS) $(CFLAGS) -c -o sync_ui_moblin-mux-window.obj `if test -f 'mux-window.c'; then $(CYGPATH_W) 'mux-window.c'; else $(CYGPATH_W) '$(srcdir)/mux-window.c'; fi`
-
-sync_ui_moblin-mux-icon-button.o: mux-icon-button.c
-@am__fastdepCC_TRUE@   $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sync_ui_moblin_CPPFLAGS) $(CPPFLAGS) $(sync_ui_moblin_CFLAGS) $(CFLAGS) -MT sync_ui_moblin-mux-icon-button.o -MD -MP -MF $(DEPDIR)/sync_ui_moblin-mux-icon-button.Tpo -c -o sync_ui_moblin-mux-icon-button.o `test -f 'mux-icon-button.c' || echo '$(srcdir)/'`mux-icon-button.c
-@am__fastdepCC_TRUE@   mv -f $(DEPDIR)/sync_ui_moblin-mux-icon-button.Tpo $(DEPDIR)/sync_ui_moblin-mux-icon-button.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='mux-icon-button.c' object='sync_ui_moblin-mux-icon-button.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sync_ui_moblin_CPPFLAGS) $(CPPFLAGS) $(sync_ui_moblin_CFLAGS) $(CFLAGS) -c -o sync_ui_moblin-mux-icon-button.o `test -f 'mux-icon-button.c' || echo '$(srcdir)/'`mux-icon-button.c
-
-sync_ui_moblin-mux-icon-button.obj: mux-icon-button.c
-@am__fastdepCC_TRUE@   $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sync_ui_moblin_CPPFLAGS) $(CPPFLAGS) $(sync_ui_moblin_CFLAGS) $(CFLAGS) -MT sync_ui_moblin-mux-icon-button.obj -MD -MP -MF $(DEPDIR)/sync_ui_moblin-mux-icon-button.Tpo -c -o sync_ui_moblin-mux-icon-button.obj `if test -f 'mux-icon-button.c'; then $(CYGPATH_W) 'mux-icon-button.c'; else $(CYGPATH_W) '$(srcdir)/mux-icon-button.c'; fi`
-@am__fastdepCC_TRUE@   mv -f $(DEPDIR)/sync_ui_moblin-mux-icon-button.Tpo $(DEPDIR)/sync_ui_moblin-mux-icon-button.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='mux-icon-button.c' object='sync_ui_moblin-mux-icon-button.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sync_ui_moblin_CPPFLAGS) $(CPPFLAGS) $(sync_ui_moblin_CFLAGS) $(CFLAGS) -c -o sync_ui_moblin-mux-icon-button.obj `if test -f 'mux-icon-button.c'; then $(CYGPATH_W) 'mux-icon-button.c'; else $(CYGPATH_W) '$(srcdir)/mux-icon-button.c'; fi`
-
 sync_ui_moblin-sync-config-widget.o: sync-config-widget.c
 @am__fastdepCC_TRUE@   $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(sync_ui_moblin_CPPFLAGS) $(CPPFLAGS) $(sync_ui_moblin_CFLAGS) $(CFLAGS) -MT sync_ui_moblin-sync-config-widget.o -MD -MP -MF $(DEPDIR)/sync_ui_moblin-sync-config-widget.Tpo -c -o sync_ui_moblin-sync-config-widget.o `test -f 'sync-config-widget.c' || echo '$(srcdir)/'`sync-config-widget.c
 @am__fastdepCC_TRUE@   mv -f $(DEPDIR)/sync_ui_moblin-sync-config-widget.Tpo $(DEPDIR)/sync_ui_moblin-sync-config-widget.Po
diff --git a/src/gtk-ui/close.png b/src/gtk-ui/close.png
deleted file mode 100644 (file)
index 18a4cdc..0000000
Binary files a/src/gtk-ui/close.png and /dev/null differ
diff --git a/src/gtk-ui/close_hover.png b/src/gtk-ui/close_hover.png
deleted file mode 100644 (file)
index be1f5b6..0000000
Binary files a/src/gtk-ui/close_hover.png and /dev/null differ
diff --git a/src/gtk-ui/mux-icon-button.c b/src/gtk-ui/mux-icon-button.c
deleted file mode 100644 (file)
index 54961e4..0000000
+++ /dev/null
@@ -1,283 +0,0 @@
-/*
- * Copyright (C) 2009 Intel Corporation
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) version 3.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301  USA
- */
-
-/* TODO: should probably ensure specific icon size? */
-
-#include "mux-icon-button.h"
-
-enum {
-       PROP_0,
-       PROP_TOGGLEABLE,
-       PROP_PIXBUF_NORMAL,
-       PROP_PIXBUF_ACTIVE,
-       PROP_PIXBUF_PRELIGHT,
-       PROP_PIXBUF_SELECTED,
-       PROP_PIXBUF_INSENSITIVE
-};
-
-G_DEFINE_TYPE (MuxIconButton, mux_icon_button, GTK_TYPE_BUTTON)
-
-
-static void
-mux_icon_button_get_property (GObject *object, guint property_id,
-                              GValue *value, GParamSpec *pspec)
-{
-    MuxIconButton *btn = MUX_ICON_BUTTON (object);
-    
-    switch (property_id) {
-    case PROP_TOGGLEABLE:
-        g_value_set_boolean (value, btn->toggleable);
-        break;
-    case PROP_PIXBUF_NORMAL:
-        g_value_set_object (value, mux_icon_button_get_pixbuf (btn, GTK_STATE_NORMAL));
-        break;
-    case PROP_PIXBUF_ACTIVE:
-        g_value_set_object (value, mux_icon_button_get_pixbuf (btn, GTK_STATE_ACTIVE));
-        break;
-    case PROP_PIXBUF_PRELIGHT:
-        g_value_set_object (value, mux_icon_button_get_pixbuf (btn, GTK_STATE_PRELIGHT));
-        break;
-    case PROP_PIXBUF_SELECTED:
-        g_value_set_object (value, mux_icon_button_get_pixbuf (btn, GTK_STATE_SELECTED));
-        break;
-    case PROP_PIXBUF_INSENSITIVE:
-        g_value_set_object (value, mux_icon_button_get_pixbuf (btn, GTK_STATE_INSENSITIVE));
-        break;
-    default:
-        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
-    }
-}
-
-static void
-mux_icon_button_set_property (GObject *object, guint property_id,
-                              const GValue *value, GParamSpec *pspec)
-{
-    MuxIconButton *btn = MUX_ICON_BUTTON (object);
-    GdkPixbuf *pixbuf;
-    
-    switch (property_id) {
-    case PROP_TOGGLEABLE:
-        btn->toggleable = g_value_get_boolean (value);
-        break;
-    case PROP_PIXBUF_NORMAL:
-        pixbuf = GDK_PIXBUF (g_value_get_object (value));
-        mux_icon_button_set_pixbuf (btn, GTK_STATE_NORMAL, pixbuf);
-        break;
-    case PROP_PIXBUF_ACTIVE:
-        pixbuf = GDK_PIXBUF (g_value_get_object (value));
-        mux_icon_button_set_pixbuf (btn, GTK_STATE_ACTIVE, pixbuf);
-        break;
-    case PROP_PIXBUF_PRELIGHT:
-        pixbuf = GDK_PIXBUF (g_value_get_object (value));
-        mux_icon_button_set_pixbuf (btn, GTK_STATE_PRELIGHT, pixbuf);
-        break;
-    case PROP_PIXBUF_SELECTED:
-        pixbuf = GDK_PIXBUF (g_value_get_object (value));
-        mux_icon_button_set_pixbuf (btn, GTK_STATE_SELECTED, pixbuf);
-        break;
-    case PROP_PIXBUF_INSENSITIVE:
-        pixbuf = GDK_PIXBUF (g_value_get_object (value));
-        mux_icon_button_set_pixbuf (btn, GTK_STATE_INSENSITIVE, pixbuf);
-        break;
-    default:
-        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
-    }
-}
-
-static void
-mux_icon_button_dispose (GObject *object)
-{
-    int i;
-    MuxIconButton *btn = MUX_ICON_BUTTON (object);
-    
-    for (i = 0; i < 5; i++) {
-        if (btn->pixbufs[i]) {
-            g_object_unref (btn->pixbufs[i]);
-            btn->pixbufs[i] = NULL;
-        }
-    }
-    G_OBJECT_CLASS (mux_icon_button_parent_class)->dispose (object);
-}
-
-static void
-mux_icon_button_size_request (GtkWidget      *widget,
-                              GtkRequisition *requisition)
-{
-    MuxIconButton *btn = MUX_ICON_BUTTON (widget);
-
-    if (btn->pixbufs[GTK_STATE_NORMAL]) {
-        requisition->width  = gdk_pixbuf_get_width  (btn->pixbufs[GTK_STATE_NORMAL]);
-        requisition->height = gdk_pixbuf_get_height (btn->pixbufs[GTK_STATE_NORMAL]);
-    }
-}
-
-static gboolean
-mux_icon_button_expose (GtkWidget *widget,
-                        GdkEventExpose *event)
-{
-    GdkRectangle dirty_area, btn_area;
-    MuxIconButton *btn = MUX_ICON_BUTTON (widget);
-    GdkPixbuf *pixbuf;
-    GtkStateType state;
-
-    if (btn->active) {
-        /* this is a active toggle button */
-        state = GTK_STATE_ACTIVE;
-    } else {
-        state = GTK_WIDGET_STATE (widget);
-    }
-
-    if (btn->pixbufs[state]) {
-        pixbuf = btn->pixbufs[state];
-    } else {
-        pixbuf = btn->pixbufs[GTK_STATE_NORMAL];
-    }
-
-    if (!pixbuf)
-        return FALSE;
-
-    btn_area.width = gdk_pixbuf_get_width (pixbuf);
-    btn_area.height = gdk_pixbuf_get_height (pixbuf);
-    btn_area.x = widget->allocation.x + (widget->allocation.width - btn_area.width) / 2;
-    btn_area.y = widget->allocation.y + (widget->allocation.height - btn_area.height) / 2;
-    
-    if (gdk_rectangle_intersect (&event->area, &widget->allocation, &dirty_area) &&
-        gdk_rectangle_intersect (&btn_area, &dirty_area, &dirty_area)) {
-
-        gdk_draw_pixbuf (widget->window, NULL, pixbuf,
-                         dirty_area.x - btn_area.x, dirty_area.y - btn_area.y,
-                         dirty_area.x, dirty_area.y,
-                         dirty_area.width, dirty_area.height,
-                         GDK_RGB_DITHER_NORMAL, 0, 0);
-    }
-    return FALSE;
-}
-
-static void
-mux_icon_button_clicked (GtkButton *button)
-{
-    MuxIconButton *icon_button = MUX_ICON_BUTTON (button);
-    
-    if (icon_button->toggleable) {
-        icon_button->active = !icon_button->active;
-    }
-}
-
-static void
-mux_icon_button_class_init (MuxIconButtonClass *klass)
-{
-    GObjectClass *object_class = G_OBJECT_CLASS (klass);
-    GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
-    GtkButtonClass *button_class = GTK_BUTTON_CLASS (klass);
-    GParamSpec *pspec;
-
-    object_class->get_property = mux_icon_button_get_property;
-    object_class->set_property = mux_icon_button_set_property;
-    object_class->dispose = mux_icon_button_dispose;
-
-    widget_class->size_request = mux_icon_button_size_request;
-    widget_class->expose_event = mux_icon_button_expose;
-
-    button_class->clicked = mux_icon_button_clicked;
-
-    pspec = g_param_spec_boolean ("toggleable",
-                                 "Toggleable",
-                                 "Is icon button button a toggle or normal",
-                                 FALSE,
-                                 G_PARAM_READWRITE);
-    g_object_class_install_property (object_class, PROP_TOGGLEABLE, pspec);
-    pspec = g_param_spec_object ("normal-state-pixbuf",
-                                 "Normal state pixbuf",
-                                 "GdkPixbuf for GTK_STATE_NORMAL",
-                                 GDK_TYPE_PIXBUF,
-                                 G_PARAM_READWRITE);
-    g_object_class_install_property (object_class, PROP_PIXBUF_NORMAL, pspec);
-    pspec = g_param_spec_object ("active-state-pixbuf",
-                                 "Active state pixbuf",
-                                 "GdkPixbuf for GTK_STATE_ACTIVE",
-                                 GDK_TYPE_PIXBUF,
-                                 G_PARAM_READWRITE);
-    g_object_class_install_property (object_class, PROP_PIXBUF_ACTIVE, pspec);
-    pspec = g_param_spec_object ("prelight-state-pixbuf",
-                                 "Prelight state pixbuf",
-                                 "GdkPixbuf for GTK_STATE_PRELIGHT",
-                                 GDK_TYPE_PIXBUF,
-                                 G_PARAM_READWRITE);
-    g_object_class_install_property (object_class, PROP_PIXBUF_PRELIGHT, pspec);
-    pspec = g_param_spec_object ("selected-state-pixbuf",
-                                 "Selected state pixbuf",
-                                 "GdkPixbuf for GTK_STATE_SELECTED",
-                                 GDK_TYPE_PIXBUF,
-                                 G_PARAM_READWRITE);
-    g_object_class_install_property (object_class, PROP_PIXBUF_SELECTED, pspec);
-    pspec = g_param_spec_object ("insensitive-state-pixbuf",
-                                 "Insensitive state pixbuf",
-                                 "GdkPixbuf for GTK_STATE_INSENSITIVE",
-                                 GDK_TYPE_PIXBUF,
-                                 G_PARAM_READWRITE);
-    g_object_class_install_property (object_class, PROP_PIXBUF_INSENSITIVE, pspec);
-}
-
-static void
-mux_icon_button_init (MuxIconButton *self)
-{
-}
-
-GtkWidget*
-mux_icon_button_new (GdkPixbuf *normal_pixbuf, gboolean toggleable)
-{
-    return g_object_new (MUX_TYPE_ICON_BUTTON, 
-                         "normal-state-pixbuf", normal_pixbuf,
-                         "toggleable", toggleable,
-                         NULL);
-}
-
-void
-mux_icon_button_set_pixbuf (MuxIconButton *button, GtkStateType state, GdkPixbuf *pixbuf)
-{
-    if (button->pixbufs[state]) {
-        g_object_unref (button->pixbufs[state]);
-    }
-    button->pixbufs[state] = g_object_ref (pixbuf);
-
-    if (state == GTK_STATE_NORMAL) {
-        gtk_widget_queue_resize (GTK_WIDGET (button));
-    } else if (state == GTK_WIDGET_STATE (GTK_WIDGET (button))) {
-        gtk_widget_queue_draw (GTK_WIDGET (button));
-    }
-}
-
-GdkPixbuf*
-mux_icon_button_get_pixbuf (MuxIconButton *button, GtkStateType state)
-{
-    return button->pixbufs[state];
-}
-
-void
-mux_icon_button_set_active (MuxIconButton *button, gboolean active)
-{
-    button->active = active;
-    gtk_widget_queue_draw (GTK_WIDGET (button));
-}
-
-gboolean 
-mux_icon_button_get_active (MuxIconButton *button)
-{
-    return button->active;
-}
diff --git a/src/gtk-ui/mux-icon-button.h b/src/gtk-ui/mux-icon-button.h
deleted file mode 100644 (file)
index a6e0130..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2009 Intel Corporation
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) version 3.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301  USA
- */
-
-#ifndef _MUX_ICON_BUTTON
-#define _MUX_ICON_BUTTON
-
-#include <gtk/gtk.h>
-
-G_BEGIN_DECLS
-
-#define MUX_TYPE_ICON_BUTTON mux_icon_button_get_type()
-
-#define MUX_ICON_BUTTON(obj) \
-  (G_TYPE_CHECK_INSTANCE_CAST ((obj), MUX_TYPE_ICON_BUTTON, MuxIconButton))
-
-#define MUX_ICON_BUTTON_CLASS(klass) \
-  (G_TYPE_CHECK_CLASS_CAST ((klass), MUX_TYPE_ICON_BUTTON, MuxIconButtonClass))
-
-#define MUX_IS_ICON_BUTTON(obj) \
-  (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MUX_TYPE_ICON_BUTTON))
-
-#define MUX_IS_ICON_BUTTON_CLASS(klass) \
-  (G_TYPE_CHECK_CLASS_TYPE ((klass), MUX_TYPE_ICON_BUTTON))
-
-#define MUX_ICON_BUTTON_GET_CLASS(obj) \
-  (G_TYPE_INSTANCE_GET_CLASS ((obj), MUX_TYPE_ICON_BUTTON, MuxIconButtonClass))
-
-typedef struct {
-    GtkButton parent;
-    GdkPixbuf *pixbufs[5];
-
-    gboolean toggleable;
-    gboolean active;
-} MuxIconButton;
-
-typedef struct {
-    GtkButtonClass parent_class;
-} MuxIconButtonClass;
-
-GType mux_icon_button_get_type (void);
-
-GtkWidget* mux_icon_button_new (GdkPixbuf *normal_pixbuf, gboolean toggleable);
-
-void mux_icon_button_set_pixbuf (MuxIconButton *button, GtkStateType state, GdkPixbuf *pixbuf);
-
-GdkPixbuf* mux_icon_button_get_pixbuf (MuxIconButton *button, GtkStateType state);
-
-/* for togglebuttons */
-void mux_icon_button_set_active (MuxIconButton *button, gboolean active);
-
-gboolean mux_icon_button_get_active (MuxIconButton *button);
-
-G_END_DECLS
-
-#endif
diff --git a/src/gtk-ui/mux-window.c b/src/gtk-ui/mux-window.c
deleted file mode 100644 (file)
index 3fda800..0000000
+++ /dev/null
@@ -1,630 +0,0 @@
-/*
- * Copyright (C) 2009 Intel Corporation
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) version 3.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301  USA
- */
-
-#include "mux-window.h"
-#include "mux-icon-button.h"
-
-static GdkColor mux_window_default_title_bar_bg = { 0, 0x3300, 0x3300, 0x3300 };
-
-#define MUX_WINDOW_DEFAULT_TITLE_BAR_HEIGHT 63
-
-GType
-mux_decorations_get_type (void)
-{
-  static GType etype = 0;
-  if (etype == 0) {
-    static const GFlagsValue values[] = {
-      { MUX_DECOR_CLOSE, "MUX_CLOSE", "close" },
-      { MUX_DECOR_SETTINGS, "MUX_SETTINGS", "settings" },
-      { 0, NULL, NULL }
-    };
-    etype = g_flags_register_static (g_intern_static_string ("MuxDecorations"), values);
-  }
-  return etype;
-}
-
-
-enum {
-  PROP_0,
-  PROP_DECORATIONS,
-  PROP_BACK_TITLE,
-};
-
-enum {
-  SETTINGS_VISIBILITY_CHANGED,
-  LAST_SIGNAL
-};
-
-static guint mux_window_signals[LAST_SIGNAL] = { 0 };
-
-G_DEFINE_TYPE (MuxWindow, mux_window, GTK_TYPE_WINDOW)
-
-#define GET_PRIVATE(o) \
-    (G_TYPE_INSTANCE_GET_PRIVATE ((o), MUX_TYPE_WINDOW, MuxWindowPrivate))
-
-typedef struct _MuxWindowPrivate MuxWindowPrivate;
-
-struct _MuxWindowPrivate {
-    int dummy;
-};
-
-static void
-mux_window_get_property (GObject *object, guint property_id,
-                         GValue *value, GParamSpec *pspec)
-{
-    MuxWindow *win = MUX_WINDOW (object);
-
-    switch (property_id) {
-    case PROP_DECORATIONS:
-        g_value_set_uint (value, win->decorations);
-        break;
-    case PROP_BACK_TITLE:
-        g_value_set_string (value,
-                            gtk_button_get_label (GTK_BUTTON (win->back_btn)));
-        break;
-    default:
-        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
-    }
-}
-
-static void
-mux_window_set_property (GObject *object, guint property_id,
-                         const GValue *value, GParamSpec *pspec)
-{
-    MuxWindow *win = MUX_WINDOW (object);
-
-    switch (property_id) {
-    case PROP_DECORATIONS:
-        mux_window_set_decorations (win, g_value_get_uint (value));
-        break;
-    case PROP_BACK_TITLE:
-        g_free (win->back_title);
-        win->back_title = g_strdup (g_value_get_string (value));
-        if (win->back_btn) {
-            gtk_button_set_label (GTK_BUTTON (win->back_btn), win->back_title);
-        }
-        break;
-    default:
-        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
-    }
-}
-
-static void
-mux_window_update_style (MuxWindow *win)
-{
-    GdkColor *title_bar_bg = NULL;
-    guint title_bar_height;
-
-    g_return_if_fail (win->title_bar);
-
-    gtk_widget_style_get (GTK_WIDGET (win),
-                          "title-bar-height", &title_bar_height, 
-                          "title-bar-bg", &title_bar_bg,
-                          NULL);
-
-    if (title_bar_bg) {
-        gtk_widget_modify_bg (win->title_bar, GTK_STATE_NORMAL, title_bar_bg);
-        gdk_color_free (title_bar_bg);
-    } else {
-        gtk_widget_modify_bg (win->title_bar, GTK_STATE_NORMAL, 
-                              &mux_window_default_title_bar_bg);
-    }
-
-    gtk_widget_set_size_request (win->title_bar, -1, title_bar_height);
-}
-
-static void 
-mux_window_style_set (GtkWidget *widget,
-                      GtkStyle *previous)
-{
-    MuxWindow *win = MUX_WINDOW (widget);
-
-    mux_window_update_style (win);
-
-    GTK_WIDGET_CLASS (mux_window_parent_class)->style_set (widget, previous);
-}
-
-static void
-mux_window_forall (GtkContainer *container,
-                   gboolean include_internals,
-                   GtkCallback callback,
-                   gpointer callback_data)
-{
-    MuxWindow *mux_win = MUX_WINDOW (container);
-    GtkBin *bin = GTK_BIN (container);
-
-    /* FIXME: call parents forall instead ? */
-    if (bin->child)
-        (* callback) (bin->child, callback_data);
-
-    if (mux_win->title_bar)
-        (* callback) (mux_win->title_bar, callback_data);
-    if (mux_win->notebook)
-        (* callback) (mux_win->notebook, callback_data);
-}
-
-static void
-mux_window_add (GtkContainer *container,
-                GtkWidget *widget)
-{
-    MuxWindowClass *klass;
-    GtkContainerClass *parent_container_class;
-
-    klass = MUX_WINDOW_GET_CLASS (container);
-    parent_container_class = GTK_CONTAINER_CLASS (g_type_class_peek_parent (klass));
-
-    parent_container_class->add (container, widget);
-}
-
-static void
-mux_window_remove (GtkContainer *container,
-                   GtkWidget *child)
-{
-    MuxWindow *win = MUX_WINDOW (container);
-    GtkBin *bin = GTK_BIN (container);
-
-    if (child == win->title_bar) {
-        gtk_widget_unparent (win->title_bar);
-        win->title_bar = NULL;
-    } else if (child == win->notebook) {
-        gtk_widget_unparent (win->notebook);
-        win->notebook = NULL;
-    } else if (bin->child) {
-        if (bin->child == child) {
-            /* should call parents remove... */
-            gtk_widget_unparent (child);
-            bin->child = NULL;
-        }
-    }
-}
-
-static void
-mux_window_size_request (GtkWidget *widget,
-                         GtkRequisition *requisition)
-{
-    GtkBin *bin = GTK_BIN (widget);
-    MuxWindow *mux_win = MUX_WINDOW (widget);
-    GtkRequisition req;
-
-    /* we will always be maximized so none of this should be necessary
-     * (requisition will never be used), but some widgets to assume
-     * size_request is called */
-    if (mux_win->title_bar && GTK_WIDGET_VISIBLE (mux_win->title_bar))
-        gtk_widget_size_request (mux_win->title_bar, &req);
-    if (bin->child && GTK_WIDGET_VISIBLE (bin->child))
-        gtk_widget_size_request (bin->child, &req);
-    if (mux_win->notebook && GTK_WIDGET_VISIBLE (mux_win->notebook))
-        gtk_widget_size_request (mux_win->notebook, &req);
-
-    requisition->width = 1024;
-    requisition->height = 600;
-}
-
-static void
-mux_window_size_allocate (GtkWidget *widget,
-                          GtkAllocation *allocation)
-{
-    GtkBin *bin = GTK_BIN (widget);
-    MuxWindow *mux_win = MUX_WINDOW (widget);
-    GtkAllocation child_allocation;
-    int xmargin, ymargin, title_height;
-
-    widget->allocation = *allocation;
-    xmargin = GTK_CONTAINER (widget)->border_width +
-              widget->style->xthickness;
-    ymargin = GTK_CONTAINER (widget)->border_width +
-              widget->style->ythickness;
-    title_height = 0;
-
-    if (mux_win->title_bar) {
-        GtkAllocation title_allocation;
-        GtkRequisition title_req;
-        gtk_widget_get_child_requisition (mux_win->title_bar, &title_req);
-
-        title_height = title_req.height;
-        title_allocation.x = allocation->x;
-        title_allocation.y = allocation->y;
-        title_allocation.width = allocation->width;
-        title_allocation.height = title_height;
-        gtk_widget_size_allocate (mux_win->title_bar, &title_allocation);
-
-    }
-
-    child_allocation.x = allocation->x + xmargin;
-    child_allocation.y = allocation->y + title_height + ymargin;
-    child_allocation.width = allocation->width - 2 * xmargin;
-    child_allocation.height = allocation->height - (2 * ymargin + title_height);
-
-    if (GTK_WIDGET_MAPPED (widget) &&
-        (child_allocation.x != mux_win->child_allocation.x ||
-         child_allocation.y != mux_win->child_allocation.y ||
-         child_allocation.width != mux_win->child_allocation.width ||
-         child_allocation.height != mux_win->child_allocation.height)) {
-        gdk_window_invalidate_rect (widget->window, &widget->allocation, FALSE);
-    }
-
-    if (bin->child && GTK_WIDGET_VISIBLE (bin->child)) {
-        gtk_widget_size_allocate (bin->child, &child_allocation);
-    }
-
-    if (mux_win->notebook && GTK_WIDGET_VISIBLE (mux_win->notebook)) {
-        gtk_widget_size_allocate (mux_win->notebook, &child_allocation);
-    }
-
-    mux_win->child_allocation = child_allocation;
-}
-
-static void
-mux_window_class_init (MuxWindowClass *klass)
-{
-    GObjectClass *object_class = G_OBJECT_CLASS (klass);
-    GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
-    GtkContainerClass *container_class = GTK_CONTAINER_CLASS (klass);
-    GParamSpec *pspec;
-
-    g_type_class_add_private (klass, sizeof (MuxWindowPrivate));
-
-    object_class->get_property = mux_window_get_property;
-    object_class->set_property = mux_window_set_property;
-
-    widget_class->size_request = mux_window_size_request;
-    widget_class->size_allocate = mux_window_size_allocate;
-    widget_class->style_set = mux_window_style_set;
-
-    container_class->forall = mux_window_forall;
-    container_class->remove = mux_window_remove;
-    container_class->add = mux_window_add;
-
-    pspec = g_param_spec_uint ("title-bar-height",
-                               "Title bar height",
-                               "Total height of the title bar",
-                               0, G_MAXUINT, MUX_WINDOW_DEFAULT_TITLE_BAR_HEIGHT,
-                               G_PARAM_READWRITE);
-    gtk_widget_class_install_style_property(widget_class, pspec);
-    pspec = g_param_spec_boxed ("title-bar-bg",
-                                "Title bar bg color",
-                                "Color of the title bar background",
-                                GDK_TYPE_COLOR,
-                                G_PARAM_READWRITE);
-    gtk_widget_class_install_style_property(widget_class, pspec);
-
-    pspec = g_param_spec_flags ("decorations", 
-                               NULL,
-                               "Bitfield of MuxDecorations defining used window decorations",
-                               MUX_TYPE_DECORATIONS, 
-                               MUX_DECOR_CLOSE,
-                               G_PARAM_READWRITE);
-    g_object_class_install_property (object_class,
-                                     PROP_DECORATIONS,
-                                     pspec);
-
-    pspec = g_param_spec_string ("back-title", 
-                                 NULL,
-                                 "title of the back button in the window decoration",
-                                 "", 
-                                 G_PARAM_READWRITE);
-    g_object_class_install_property (object_class,
-                                     PROP_BACK_TITLE,
-                                     pspec);
-
-    mux_window_signals[SETTINGS_VISIBILITY_CHANGED] = 
-            g_signal_new ("settings-visibility-changed",
-                          G_OBJECT_CLASS_TYPE (object_class),
-                          G_SIGNAL_RUN_FIRST,
-                          G_STRUCT_OFFSET (MuxWindowClass, settings_visibility_changed),
-                          NULL, NULL,
-                          g_cclosure_marshal_VOID__VOID,
-                          G_TYPE_NONE, 0, NULL);
-
-}
-
-static void
-mux_window_settings_clicked (MuxIconButton *button, MuxWindow *window)
-{
-    gboolean active;
-    active = mux_icon_button_get_active (button);
-    mux_window_set_settings_visible (window, active);
-}
-
-static void
-mux_window_close_clicked (MuxWindow *window)
-{
-    /* this is how GtkDialog does it... */
-    GdkEvent *event;
-
-    event = gdk_event_new (GDK_DELETE);
-    event->any.window = g_object_ref (GTK_WIDGET (window)->window);
-    event->any.send_event = TRUE;
-
-    gtk_main_do_event (event);
-    gdk_event_free (event);
-}
-
-static GdkPixbuf*
-load_icon (MuxWindow *window, const char *icon_name)
-{
-    static GtkIconTheme *theme = NULL;
-    GdkScreen *screen;
-    GdkPixbuf *pixbuf;
-
-    if (!theme) {
-        screen = gtk_widget_get_screen (GTK_WIDGET (window));
-        theme = gtk_icon_theme_get_for_screen (screen);
-    }
-
-    pixbuf = gtk_icon_theme_load_icon (theme, icon_name,
-                                       48, 0, NULL);
-
-
-    /* FIXME: workaround until icons are in Moblin Netbook theme */
-    if (!pixbuf) {
-        char *str = g_strdup_printf ("%s/%s.png", THEMEDIR, icon_name);
-        pixbuf = gdk_pixbuf_new_from_file_at_size (str, 48, 48, NULL);
-
-        g_free (str);
-    }
-
-    if (!pixbuf) {
-        g_warning ("Icon '%s' not found in theme", icon_name);
-        pixbuf = gtk_widget_render_icon (GTK_WIDGET (window),
-                                         GTK_STOCK_MISSING_IMAGE,
-                                         GTK_ICON_SIZE_DIALOG,
-                                         NULL);
-
-    }
-    return pixbuf;
-}
-
-static void
-bread_crumb_clicked_cb (GtkButton *btn, MuxWindow *window)
-{
-    mux_window_set_current_page (window, -1);
-}
-
-static void
-mux_window_build_title_bar (MuxWindow *window)
-{
-    GtkWidget *box, *button_box, *btn, *align;
-    GdkPixbuf *pixbuf, *pixbuf_hover;
-
-    if (window->title_bar) {
-        gtk_widget_unparent (window->title_bar);
-    }
-
-    window->title_bar = gtk_event_box_new ();
-    gtk_widget_set_name (window->title_bar, "mux_window_title_bar");
-    gtk_widget_set_parent (window->title_bar, GTK_WIDGET (window));
-    gtk_widget_show (window->title_bar);
-
-    box = gtk_hbox_new (FALSE, 0);
-    gtk_container_add (GTK_CONTAINER (window->title_bar), box);
-    gtk_widget_show (box);
-
-    align = gtk_alignment_new (0, 0.5, 0, 0);
-    gtk_box_pack_start (GTK_BOX (box), align, FALSE, FALSE, 4);
-    gtk_widget_show (align);
-
-    button_box = gtk_hbox_new (FALSE, 0);
-    gtk_widget_set_name (window->title_bar, "mux_window_bread_crumbs");
-    gtk_container_add (GTK_CONTAINER (align), button_box);
-    gtk_widget_show (button_box);
-
-    window->back_btn = gtk_button_new_with_label (window->back_title);
-    gtk_box_pack_start (GTK_BOX (button_box), window->back_btn,
-                        FALSE, FALSE, 4);
-    g_signal_connect (window->back_btn, "clicked",
-                      G_CALLBACK (bread_crumb_clicked_cb), window);
-    if (mux_window_get_current_page (window) != -1) {
-        gtk_widget_show (window->back_btn);
-    }
-    /*window->title_label = gtk_label_new (gtk_window_get_title (GTK_WINDOW (window)));
-    gtk_box_pack_start (GTK_BOX (box), window->title_label,
-                        FALSE, FALSE, 0);
-    gtk_widget_show (window->title_label);*/
-
-    button_box = gtk_hbox_new (TRUE, 0);
-    gtk_box_pack_end (GTK_BOX (box), button_box, FALSE, FALSE, 4);
-    gtk_widget_show (button_box);
-
-    if (window->decorations & MUX_DECOR_CLOSE) {
-        pixbuf = load_icon (window, "close");
-        pixbuf_hover = load_icon (window, "close_hover");
-        btn = g_object_new (MUX_TYPE_ICON_BUTTON,
-                            "normal-state-pixbuf", pixbuf,
-                            "prelight-state-pixbuf", pixbuf_hover,
-                            NULL);
-        gtk_widget_set_name (btn, "mux_icon_button_close");
-        g_signal_connect_swapped (btn, "clicked", 
-                                  G_CALLBACK (mux_window_close_clicked), window);
-        gtk_box_pack_end (GTK_BOX (button_box), btn, FALSE, FALSE, 0);
-        gtk_widget_show (btn);
-    }
-
-    if (window->decorations & MUX_DECOR_SETTINGS) {
-        pixbuf = load_icon (window, "settings");
-        pixbuf_hover = load_icon (window, "settings_hover");
-        window->settings_button = g_object_new (MUX_TYPE_ICON_BUTTON,
-                                  "normal-state-pixbuf", pixbuf,
-                                  "prelight-state-pixbuf", pixbuf_hover,
-                                  "active-state-pixbuf", pixbuf_hover,
-                                  "toggleable", TRUE,
-                                  NULL);
-        gtk_widget_set_name (window->settings_button, "mux_icon_button_settings");
-        g_signal_connect (window->settings_button, "clicked", 
-                          G_CALLBACK (mux_window_settings_clicked), window);
-        gtk_box_pack_end (GTK_BOX (button_box), window->settings_button, FALSE, FALSE, 0);
-        gtk_widget_show (window->settings_button);
-    }
-
-    mux_window_update_style (window);
-
-    gtk_widget_map (window->title_bar); /*TODO: is there a better way to do this ? */
-    if (GTK_WIDGET_VISIBLE (window))
-        gtk_widget_queue_resize (GTK_WIDGET (window));
-
-}
-
-static void
-mux_window_title_changed (MuxWindow *window, 
-                          GParamSpec *pspec,
-                          gpointer user_data)
-{
-    mux_window_build_title_bar (window);
-}
-
-/* For some reason metacity sometimes won't maximize but will if asked 
- * another time. For the record, I'm not proud of writing this */
-static gboolean
-mux_window_try_maximize (MuxWindow *self)
-{
-    static int count = 0;
-
-    count++;
-    gtk_window_maximize (GTK_WINDOW (self));
-
-    return (count < 10);
-}
-
-static void
-mux_window_init (MuxWindow *self)
-{
-    self->decorations = MUX_DECOR_CLOSE;
-
-    gtk_window_set_decorated (GTK_WINDOW (self), FALSE);
-
-    g_signal_connect (self, "notify::title",
-                      G_CALLBACK (mux_window_title_changed), NULL);
-
-    mux_window_build_title_bar (self);
-
-    self->notebook = gtk_notebook_new ();
-    gtk_notebook_set_show_tabs (GTK_NOTEBOOK (self->notebook), FALSE);
-    gtk_notebook_set_show_border (GTK_NOTEBOOK (self->notebook), FALSE);
-    gtk_widget_set_parent (self->notebook, GTK_WIDGET (self));
-    self->settings_index = -2;
-
-
-    gtk_window_maximize (GTK_WINDOW (self));
-    g_timeout_add (10, (GSourceFunc)mux_window_try_maximize, self);
-}
-
-GtkWidget*
-mux_window_new (const char *back_title)
-{
-    return g_object_new (MUX_TYPE_WINDOW,
-                         "back-title", back_title,
-                         NULL);
-}
-
-void 
-mux_window_set_decorations (MuxWindow *window, 
-                            MuxDecorations decorations)
-{
-    g_return_if_fail (MUX_IS_WINDOW (window));
-    
-    if (decorations != window->decorations) {
-        window->decorations = decorations;
-        mux_window_build_title_bar (window);
-    }
-}
-
-MuxDecorations 
-mux_window_get_decorations (MuxWindow *window)
-{
-    g_return_val_if_fail (MUX_IS_WINDOW (window), MUX_DECOR_NONE);
-
-    return window->decorations;
-}
-
-void
-mux_window_set_settings_visible (MuxWindow *window, gboolean show)
-{
-    gboolean visible;
-
-    visible = (mux_window_get_current_page (window) == window->settings_index);
-    if (visible != show) {
-        if (show) {
-            mux_window_set_current_page (window, window->settings_index);
-        } else {
-            mux_window_set_current_page (window, -1);
-        }
-
-        g_signal_emit (window, mux_window_signals[SETTINGS_VISIBILITY_CHANGED], 0);
-
-        if (window->settings_button)
-            mux_icon_button_set_active (MUX_ICON_BUTTON (window->settings_button),
-                                        show);
-    }
-}
-
-gboolean
-mux_window_get_settings_visible (MuxWindow *window)
-{
-    return (mux_window_get_current_page (window) == window->settings_index);
-}
-
-gint
-mux_window_append_page (MuxWindow *window,
-                        GtkWidget *page,
-                        gboolean is_settings)
-{
-    gint index;
-
-    index = gtk_notebook_append_page (GTK_NOTEBOOK (window->notebook), page, NULL);
-
-    if (is_settings) {
-        window->settings_index = index;
-    }
-    return index;
-}
-
-void mux_window_set_current_page (MuxWindow *window, gint index)
-{
-    GtkBin *bin = GTK_BIN (window);
-
-    if (index == -1) {
-        gtk_widget_hide (window->notebook);
-        if (bin->child) {
-            gtk_widget_show (bin->child);
-        }
-        gtk_widget_hide (window->back_btn);
-    } else {
-        gtk_notebook_set_current_page (GTK_NOTEBOOK (window->notebook), index);
-        if (bin->child) {
-            gtk_widget_hide (bin->child);
-        }
-        gtk_widget_show (window->notebook);
-        gtk_widget_map (window->notebook);
-
-        gtk_widget_show (window->back_btn);
-    }
-}
-
-gint
-mux_window_get_current_page (MuxWindow *window)
-{
-    GtkBin *bin = GTK_BIN (window);
-
-    if (bin->child && GTK_WIDGET_VISIBLE (bin->child)) {
-        return -1;
-    } else if (window->notebook) {
-        return gtk_notebook_get_current_page (GTK_NOTEBOOK (window->notebook));
-    }
-    return -1;
-}
diff --git a/src/gtk-ui/mux-window.h b/src/gtk-ui/mux-window.h
deleted file mode 100644 (file)
index fed7f1d..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (C) 2009 Intel Corporation
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) version 3.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301  USA
- */
-
-#ifndef _MUX_WINDOW
-#define _MUX_WINDOW
-
-#include <gtk/gtk.h>
-
-G_BEGIN_DECLS
-
-typedef enum {
-    MUX_DECOR_NONE = 0,
-    MUX_DECOR_CLOSE = 1 << 0,
-    MUX_DECOR_SETTINGS = 1 << 1,
-} MuxDecorations;
-
-GType mux_decorations_get_type (void) G_GNUC_CONST;
-#define MUX_TYPE_DECORATIONS (mux_decorations_get_type())
-
-
-#define MUX_TYPE_WINDOW mux_window_get_type()
-#define MUX_WINDOW(obj) \
-    (G_TYPE_CHECK_INSTANCE_CAST ((obj), MUX_TYPE_WINDOW, MuxWindow))
-#define MUX_WINDOW_CLASS(klass) \
-    (G_TYPE_CHECK_CLASS_CAST ((klass), MUX_TYPE_WINDOW, MuxWindowClass))
-#define MUX_IS_WINDOW(obj) \
-    (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MUX_TYPE_WINDOW))
-#define MUX_IS_WINDOW_CLASS(klass) \
-    (G_TYPE_CHECK_CLASS_TYPE ((klass), MUX_TYPE_WINDOW))
-#define MUX_WINDOW_GET_CLASS(obj) \
-    (G_TYPE_INSTANCE_GET_CLASS ((obj), MUX_TYPE_WINDOW, MuxWindowClass))
-
-typedef struct {
-    GtkWindow parent;
-
-    GtkWidget *title_bar;
-    GtkWidget *back_btn;
-    GtkWidget *settings;
-    GtkWidget *settings_button;
-    GtkWidget *notebook;
-
-    gint settings_index;
-
-    GtkAllocation child_allocation;
-
-    MuxDecorations decorations;
-    GdkColor title_bar_color;
-    guint title_bar_height;
-    char *back_title;
-
-} MuxWindow;
-
-typedef struct {
-    GtkWindowClass parent_class;
-
-    void (*settings_visibility_changed) (MuxWindow *window);
-} MuxWindowClass;
-
-GType mux_window_get_type (void);
-
-GtkWidget* mux_window_new (const char *back_title);
-
-void mux_window_set_decorations (MuxWindow *window, MuxDecorations decorations);
-MuxDecorations mux_window_get_decorations (MuxWindow *window);
-
-void mux_window_set_settings_visible (MuxWindow *window, gboolean visible);
-gboolean mux_window_get_settings_visible (MuxWindow *window);
-
-gint mux_window_append_page (MuxWindow *window, GtkWidget *page, gboolean is_settings);
-
-void mux_window_set_current_page (MuxWindow *window, gint index);
-gint mux_window_get_current_page (MuxWindow *window);
-
-G_END_DECLS
-
-#endif
diff --git a/src/gtk-ui/settings.png b/src/gtk-ui/settings.png
deleted file mode 100644 (file)
index 52a6d90..0000000
Binary files a/src/gtk-ui/settings.png and /dev/null differ
diff --git a/src/gtk-ui/settings_hover.png b/src/gtk-ui/settings_hover.png
deleted file mode 100644 (file)
index 80d356d..0000000
Binary files a/src/gtk-ui/settings_hover.png and /dev/null differ
index f910bdb..01306d2 100644 (file)
@@ -1,12 +1,17 @@
 #include "config.h"
 
+#include <stdlib.h>
 #include <string.h>
 #include <glib/gi18n.h>
 #include <dbus/dbus-glib.h>
 
 #ifdef USE_MOBLIN_UX
+#ifdef MX_GTK_0_99_1
+#include <mx-gtk/mx-gtk.h>
+#else
 #include <mx/mx-gtk.h>
 #endif
+#endif
 
 #include "sync-ui.h"
 #include "sync-config-widget.h"
@@ -22,6 +27,8 @@ G_DEFINE_TYPE (SyncConfigWidget, sync_config_widget, GTK_TYPE_CONTAINER)
 
 
 typedef struct source_widgets {
+    char *name;
+
     GtkWidget *label;
     GtkWidget *entry;
     GtkWidget *check;
@@ -110,47 +117,112 @@ update_source_uri (char *name,
     g_hash_table_insert (source_configuration, g_strdup ("uri"), g_strdup (uri));
 }
 
+typedef struct save_config_data {
+    SyncConfigWidget *widget;
+    gboolean delete;
+    gboolean temporary;
+    source_widgets *widgets;
+} save_config_data;
+
+static source_widgets *
+source_widgets_ref (source_widgets *widgets)
+{
+    if (widgets) {
+        widgets->count++;
+    }
+    return widgets;
+}
+
+static void
+source_widgets_unref (source_widgets *widgets)
+{
+    if (widgets) {
+        widgets->count--;
+        if (widgets->count == 0)
+            g_slice_free (source_widgets, widgets);
+    }
+}
+
+static void
+check_source_cb (SyncevoSession *session,
+                 GError *error,
+                 source_widgets *widgets)
+{
+    gboolean show = TRUE;
+
+    if (error) {
+        if(error->code == DBUS_GERROR_REMOTE_EXCEPTION &&
+           dbus_g_error_has_name (error, SYNCEVO_DBUS_ERROR_SOURCE_UNUSABLE)) {
+            show = FALSE;
+        } else {
+            g_warning ("CheckSource failed: %s", error->message);
+            /* non-fatal, ignore in UI */
+        }
+        g_error_free (error);
+    }
+
+    if (widgets->count > 1) {
+        if (show) {
+            /* NOTE: with the new two sources per row layout not showing things
+             * may look weird in some cases... the layout should really only be
+             * done at this point  */
+            gtk_widget_show (widgets->source_toggle_label);
+            gtk_widget_show (widgets->label);
+            gtk_widget_show (widgets->entry);
+            gtk_widget_show (widgets->check);
+        } else {
+            /* next save should disable this source */
+            toggle_set_active (widgets->check, FALSE);
+        }
+    }
+    source_widgets_unref (widgets);
+    g_object_unref (session);
+}
+
 static void
 set_config_cb (SyncevoSession *session,
                GError *error,
-               SyncConfigWidget *self)
+               save_config_data *data)
 {
     if (error) {
         g_warning ("Error in Session.SetConfig: %s", error->message);
         g_error_free (error);
         g_object_unref (session);
-        /* TODO show in UI: save failed in service list */
+        show_error_dialog (GTK_WIDGET (data->widget),
+                           _("Sorry, failed to save the configuration"));
         return;
     }
 
-    self->configured = TRUE;
+    if (data->temporary) {
+        syncevo_session_check_source (session,
+                                      data->widgets->name,
+                                      (SyncevoSessionGenericCb)check_source_cb,
+                                      data->widgets);
+    } else {
+        data->widget->configured = TRUE;
+        g_signal_emit (data->widget, signals[SIGNAL_CHANGED], 0);
+        g_object_unref (session);
+    }
 
-    g_object_unref (session);
-    g_signal_emit (self, signals[SIGNAL_CHANGED], 0);
 }
 
 static void
-sync_config_widget_save_config (SyncConfigWidget *self,
-                                SyncevoSession *session,
-                                gboolean delete)
+save_config (save_config_data *data,
+             SyncevoSession *session)
 {
-    if (delete) {
-        syncevo_config_free (self->config);
-        self->config = g_hash_table_new (g_str_hash, g_str_equal);
+    if (data->delete) {
+        syncevo_config_free (data->widget->config);
+        data->widget->config = g_hash_table_new (g_str_hash, g_str_equal);
     }
+
     syncevo_session_set_config (session,
-                                FALSE,
-                                FALSE,
-                                self->config,
+                                data->temporary,
+                                data->temporary,
+                                data->widget->config,
                                 (SyncevoSessionGenericCb)set_config_cb,
-                                self);
+                                data);
 }
 
-typedef struct save_config_data {
-    SyncConfigWidget *widget;
-    gboolean delete;
-} save_config_data;
-
 static void
 status_changed_for_config_write_cb (SyncevoSession *session,
                                     SyncevoSessionStatus status,
@@ -159,7 +231,7 @@ status_changed_for_config_write_cb (SyncevoSession *session,
                                     save_config_data *data)
 {
     if (status == SYNCEVO_STATUS_IDLE) {
-        sync_config_widget_save_config (data->widget, session, data->delete);
+        save_config (data, session);
     }
 }
 
@@ -182,7 +254,7 @@ get_status_for_config_write_cb (SyncevoSession *session,
     syncevo_source_statuses_free (source_statuses);
 
     if (status == SYNCEVO_STATUS_IDLE) {
-        sync_config_widget_save_config (data->widget, session, data->delete);
+        save_config (data, session);
     }
 }
 
@@ -227,6 +299,7 @@ stop_clicked_cb (GtkButton *btn, SyncConfigWidget *self)
     data = g_slice_new (save_config_data);
     data->widget = self;
     data->delete = FALSE;
+    data->temporary = FALSE;
     syncevo_server_start_session (self->server,
                                   self->config_name,
                                   (SyncevoServerStartSessionCb)start_session_for_config_write_cb,
@@ -246,40 +319,6 @@ use_clicked_cb (GtkButton *btn, SyncConfigWidget *self)
         return;
     }
 
-    if (self->current_service_name && !self->current) {
-        gboolean ret;
-        char *msg, *yes, *no, *new_name, *old_name;
-
-        /*TRANSLATORS: warning dialog text for changing current service */
-        msg = g_strdup_printf
-            (_("Do you want to replace %s with %s? This "
-               "will not remove any synced information on either "
-               "end but you will no longer be able to sync with %s."),
-             self->current_service_name,
-             gtk_entry_get_text (GTK_ENTRY (self->entry)),
-             self->current_service_name);
-
-        new_name = g_strndup (gtk_entry_get_text (GTK_ENTRY (self->entry)), 40);
-        old_name = g_strndup (self->current_service_name, 40);
-
-        /* TRANSLATORS: decline/accept buttons in warning dialog.
-           Placeholder is service name */
-        yes = g_strdup_printf (_("Yes, use %s"), new_name);
-        no = g_strdup_printf (_("No, use %s"), old_name);
-
-        ret = show_confirmation (GTK_WIDGET (self), msg, yes, no);
-
-        g_free (msg);
-        g_free (yes);
-        g_free (no);
-        g_free (new_name);
-        g_free (old_name);
-
-        if (!ret) {
-            return;
-        }
-    }
-
     if (strlen (self->config_name) == 0) {
         g_free (self->config_name);
         self->config_name = g_strdup (gtk_entry_get_text (GTK_ENTRY (self->entry)));
@@ -308,7 +347,8 @@ use_clicked_cb (GtkButton *btn, SyncConfigWidget *self)
             const char *mode_str;
             gboolean active;
 
-            active = toggle_get_active (widgets->check);
+            active = toggle_get_active (widgets->check) &&
+                     GTK_WIDGET_SENSITIVE (widgets->check);
             if (active) {
                 mode_str = syncevo_sync_mode_to_string (mode);
             } else {
@@ -356,6 +396,7 @@ use_clicked_cb (GtkButton *btn, SyncConfigWidget *self)
     data = g_slice_new (save_config_data);
     data->widget = self;
     data->delete = FALSE;
+    data->temporary = FALSE;
     syncevo_server_start_session (self->server,
                                   self->config_name,
                                   (SyncevoServerStartSessionCb)start_session_for_config_write_cb,
@@ -390,7 +431,7 @@ reset_delete_clicked_cb (GtkButton *btn, SyncConfigWidget *self)
         msg = g_strdup_printf
             (_("Do you want to delete the settings for %s? "
                "This will not remove any synced information on either "
-               "end but it will remove this service configuration."),
+               "end but it will remove these settings."),
              self->pretty_name);
         /*TRANSLATORS: buttons in delete-service warning dialog */
         yes = _("Yes, delete");
@@ -411,6 +452,7 @@ reset_delete_clicked_cb (GtkButton *btn, SyncConfigWidget *self)
     data = g_slice_new (save_config_data);
     data->widget = self;
     data->delete = TRUE;
+    data->temporary = FALSE;
     syncevo_server_start_session (self->server,
                                   self->config_name,
                                   (SyncevoServerStartSessionCb)start_session_for_config_write_cb,
@@ -422,10 +464,10 @@ static void update_buttons (SyncConfigWidget *self)
     if (self->has_template) {
         /* TRANSLATORS: button labels in service configuration form */
         gtk_button_set_label (GTK_BUTTON (self->reset_delete_button),
-                              _("Reset service"));
+                              _("Reset settings"));
     } else {
         gtk_button_set_label (GTK_BUTTON (self->reset_delete_button),
-                              _("Delete service"));
+                              _("Delete settings"));
     }
     if (self->configured) {
         gtk_widget_show (GTK_WIDGET (self->reset_delete_button));
@@ -433,71 +475,30 @@ static void update_buttons (SyncConfigWidget *self)
         gtk_widget_hide (GTK_WIDGET (self->reset_delete_button));
     }
 
-    if (self->current_service_name || self->current) {
+    if (self->current || !self->current_service_name) {
         gtk_button_set_label (GTK_BUTTON (self->use_button),
                               _("Save and use"));
-    } else { 
+    } else {
         gtk_button_set_label (GTK_BUTTON (self->use_button),
                               _("Save and replace\ncurrent service"));
     }
 
-    if (self->current) {
-        gtk_widget_show (self->stop_button);
-    } else { 
-        gtk_widget_hide (self->stop_button);
-    }
-}
-
-static void
-source_widgets_ref (source_widgets *widgets)
-{
-    if (widgets) {
-        widgets->count++;
-    }
-}
 
-static void
-source_widgets_unref (source_widgets *widgets)
-{
-    if (widgets) {
-        widgets->count--;
-        if (widgets->count == 0)
-            g_slice_free (source_widgets, widgets);
-    }
-}
-
-static void
-check_source_cb (SyncevoServer *server,
-                 GError *error,
-                 source_widgets *widgets)
-{
-    gboolean show = TRUE;
 
-    if (error) {
-        if(error->code == DBUS_GERROR_REMOTE_EXCEPTION &&
-           dbus_g_error_has_name (error, SYNCEVO_DBUS_ERROR_SOURCE_UNUSABLE)) {
-            show = FALSE;
-        } else if (error->code == DBUS_GERROR_REMOTE_EXCEPTION &&
-                   dbus_g_error_has_name (error,
-                                          SYNCEVO_DBUS_ERROR_NO_SUCH_CONFIG)){
-            /* apparently templates can't be checked... */
-            /* TODO: could use a temporary config to do it... */
+    if (self->current && self->config) {
+        char *client;
+        syncevo_config_get_value (self->config, NULL, "PeerIsClient", &client);
+        if (client && g_strcmp0 (client, "1") == 0) {
+            gtk_button_set_label (GTK_BUTTON (self->stop_button),
+                                              _("Stop using device"));
         } else {
-            g_warning ("CheckSource failed: %s", error->message);
-            /* non-fatal, ignore in UI */
+            gtk_button_set_label (GTK_BUTTON (self->stop_button),
+                                              _("Stop using service"));
         }
-        g_error_free (error);
-    }
-
-    if (show && widgets->count > 1) {
-        /* TODO: with the new two sources per row layout not showing things
-         * probably won't look good... */
-        gtk_widget_show (widgets->source_toggle_label);
-        gtk_widget_show (widgets->label);
-        gtk_widget_show (widgets->entry);
-        gtk_widget_show (widgets->check);
+        gtk_widget_show (self->stop_button);
+    } else { 
+        gtk_widget_hide (self->stop_button);
     }
-    source_widgets_unref (widgets);
 }
 
 static void
@@ -532,6 +533,9 @@ add_toggle_widget (SyncConfigWidget *self,
                    guint row, guint col)
 {
     GtkWidget *toggle;
+    int padding;
+
+    padding = (col == 1) ? 0 : 32;
 
 #ifdef USE_MOBLIN_UX
     GtkWidget *label;
@@ -559,9 +563,10 @@ add_toggle_widget (SyncConfigWidget *self,
     g_signal_connect (toggle, "notify::active",
                       G_CALLBACK (mode_widget_notify_active_cb), self);
 #endif
+
     gtk_table_attach (GTK_TABLE (self->mode_table), toggle,
                       col + 1, col + 2, row, row + 1,
-                      GTK_FILL, GTK_FILL, 32, 0);
+                      GTK_FILL, GTK_FILL, padding, 0);
 
     return toggle;
 }
@@ -622,6 +627,7 @@ init_source (char *name,
     static guint col = 0;
     source_widgets *widgets;
     SyncevoSyncMode mode;
+    save_config_data *data;
 
     type = g_hash_table_lookup (source_configuration, "type");
     uri = g_hash_table_lookup (source_configuration, "uri");
@@ -652,6 +658,7 @@ init_source (char *name,
     self->no_source_toggles = FALSE;
 
     widgets = g_slice_new0 (source_widgets);
+    widgets->name = name;
     widgets->count = 1;
     g_hash_table_insert (self->sources, name, widgets);
 
@@ -697,21 +704,18 @@ init_source (char *name,
     gtk_widget_set_sensitive (widgets->check,
                               uri && strlen (uri) > 0);
 
-    /* TODO: template sources cannot be checked. Should set a temporary config
-     * to check sources */
-    if (self->configured) {
-        source_widgets_ref (widgets);
-        syncevo_server_check_source (self->server,
-                                     self->config_name,
-                                     name,
-                                     (SyncevoServerGenericCb)check_source_cb,
-                                     widgets);
-    } else {
-        gtk_widget_show (widgets->source_toggle_label);
-        gtk_widget_show (widgets->label);
-        gtk_widget_show (widgets->entry);
-        gtk_widget_show (widgets->check);
-    }
+    /* start a session so we save a temporary config so we can do
+     * CheckSource, and show the source-related widgets if the 
+     * source is available */
+    data = g_slice_new (save_config_data);
+    data->widget = self;
+    data->delete = FALSE;
+    data->temporary = TRUE;
+    data->widgets = source_widgets_ref (widgets);
+    syncevo_server_start_session (self->server,
+                                  self->config_name,
+                                  (SyncevoServerStartSessionCb)start_session_for_config_write_cb,
+                                  data);
 }
 
 static void
@@ -849,10 +853,12 @@ sync_config_widget_update_expander (SyncConfigWidget *self)
      * or device name */
     str = g_strdup_printf (_("Send changes to %s"), self->pretty_name);
     self->send_check = add_toggle_widget (self, str, send, 0, 0);
+    gtk_widget_show (self->send_check);
     g_free (str);
 
     str = g_strdup_printf (_("Receive changes from %s"), self->pretty_name);
     self->receive_check = add_toggle_widget (self, str, receive, 0, 1);
+    gtk_widget_show (self->receive_check);
     g_free (str);
 
     align = gtk_alignment_new (0.0, 1.0, 0.0, 0.0);
@@ -920,8 +926,57 @@ sync_config_widget_add_config (SyncConfigWidget *self,
                                const char *name,
                                SyncevoConfig *config)
 {
-    g_hash_table_insert (self->configs, g_strdup (name), config);
-    gtk_combo_box_prepend_text (GTK_COMBO_BOX (self->combo), name);
+    GtkListStore *store;
+    GtkTreeIter iter;
+    const char *guess_name;
+    SyncevoConfig *guess_config;
+    int score = 1;
+    int guess_score, second_guess_score = -1;
+    char *str;
+
+    store = GTK_LIST_STORE (gtk_combo_box_get_model (GTK_COMBO_BOX (self->combo)));
+    if (syncevo_config_get_value (config, NULL, "score", &str)) {
+        score = (int)strtol (str, NULL, 10);
+    }
+    gtk_list_store_append (store, &iter);
+    gtk_list_store_set (store, &iter,
+                        0, name,
+                        1, config,
+                        2, score,
+                        -1);
+
+    /* make an educated guess if possible */
+    gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter);
+    gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,
+                        0, &guess_name,
+                        1, &guess_config,
+                        2, &guess_score,
+                        -1);
+
+    if (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter)) {
+        gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,
+                            2, &second_guess_score,
+                            -1);
+    }
+
+    if (guess_score > 1 && guess_score > second_guess_score) {
+        gtk_combo_box_set_active (GTK_COMBO_BOX (self->combo), 0);
+        /* TRANSLATORS: explanation before a device template combobox.
+         * Placeholder is a device name like 'Nokia N85' or 'Syncevolution
+         * Client' */
+        str = g_strdup_printf (_("This device looks like it might be a '%s'. "
+                                 "If this is not correct, please take a look at "
+                                 "the list of supported devices and pick yours "
+                                 "if it is listed"), guess_name);
+    } else {
+        gtk_combo_box_set_active (GTK_COMBO_BOX (self->combo), -1);
+        str = g_strdup (_("We don't know what this device is exactly. "
+                          "Please take a look at the list of "
+                          "supported devices and pick yours if it "
+                          "is listed"));
+    }
+    gtk_label_set_text (GTK_LABEL (self->device_text), str);
+    g_free (str);
 }
 
 static void
@@ -971,20 +1026,24 @@ sync_config_widget_set_name (SyncConfigWidget *self,
 static void
 device_selection_btn_clicked_cb (GtkButton *btn, SyncConfigWidget *self)
 {
-    const char *name;
-    SyncevoConfig *config;
+    GtkTreeIter iter;
 
-    self->device_template_selected = TRUE;
+    if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (self->combo), &iter)) {
+        const char *name;
+        SyncevoConfig *config;
+        GtkTreeModel *model;
 
-    name = gtk_combo_box_get_active_text (GTK_COMBO_BOX (self->combo));
-    config = g_hash_table_lookup (self->configs, name);
+        self->device_template_selected = TRUE;
 
-    g_return_if_fail (config);
+        model = gtk_combo_box_get_model(GTK_COMBO_BOX (self->combo));
+        gtk_tree_model_get (model, &iter, 0, &name, -1 );
+        gtk_tree_model_get (model, &iter, 1, &config, -1 );
 
-    sync_config_widget_set_config (self, config);
-    sync_config_widget_set_name (self, name);
+        sync_config_widget_set_config (self, config);
+        sync_config_widget_set_name (self, name);
 
-    sync_config_widget_update_expander (self);
+        sync_config_widget_update_expander (self);
+    }
 }
 
 static void
@@ -1125,7 +1184,6 @@ session_changed_cb (SyncevoServer *server,
                     gboolean started,
                     SyncConfigWidget *self)
 {
-
     if (started) {
         set_session (self, path);
     } else if (g_strcmp0 (self->running_session, path) == 0 ) {
@@ -1143,11 +1201,14 @@ get_sessions_cb (SyncevoServer *server,
         g_warning ("Server.GetSessions failed: %s", error->message);
         g_error_free (error);
         /* non-fatal, ignore in UI */
+
+        g_object_unref (self);
         return;
     }
 
     set_session (self, syncevo_sessions_index (sessions, 0));
     syncevo_sessions_free (sessions);
+    g_object_unref (self);
 }
 
 void
@@ -1171,7 +1232,8 @@ sync_config_widget_set_server (SyncConfigWidget *self,
     g_signal_connect (self->server, "session-changed",
                       G_CALLBACK (session_changed_cb), self);
 
-    /* TODO: this is stupid, every widget running the same dbus call*/
+    /* reference is released in callback */
+    g_object_ref (self);
     syncevo_server_get_sessions (self->server,
                                  (SyncevoServerGetSessionsCb)get_sessions_cb,
                                  self);
@@ -1256,10 +1318,6 @@ sync_config_widget_dispose (GObject *object)
     }
     self->config = NULL;
 
-    if (self->configs) {
-        g_hash_table_destroy (self->configs);
-        self->configs = NULL;
-    }
     g_free (self->config_name);
     self->config_name = NULL;
     g_free (self->current_service_name);
@@ -1655,6 +1713,16 @@ label_leave_notify_cb (GtkWidget *widget,
 }
 
 static void
+device_combo_changed (GtkComboBox *combo,
+                      SyncConfigWidget *self)
+{
+    char *selected;
+
+    selected = gtk_combo_box_get_active_text (GTK_COMBO_BOX (combo));
+    gtk_widget_set_sensitive (self->device_select_btn, selected != NULL);
+}
+
+static void
 label_button_release_cb (GtkWidget *widget,
                          GdkEventButton *event,
                          SyncConfigWidget *self)
@@ -1666,17 +1734,29 @@ label_button_release_cb (GtkWidget *widget,
     }
 }
 
+static gint
+compare_list_items (GtkTreeModel *model,
+                    GtkTreeIter  *a,
+                    GtkTreeIter  *b,
+                    SyncConfigWidget *self)
+{
+    int score_a, score_b;
+
+    gtk_tree_model_get(model, a, 2, &score_a, -1);
+    gtk_tree_model_get(model, b, 2, &score_b, -1);
+
+    return score_a - score_b;
+}
+
 static void
 sync_config_widget_init (SyncConfigWidget *self)
 {
-    GtkWidget *tmp_box, *hbox, *cont, *vbox, *label, *btn;
+    GtkWidget *tmp_box, *hbox, *cont, *vbox, *label;
+    GtkListStore *store;
+    GtkCellRenderer *renderer;
 
     GTK_WIDGET_SET_FLAGS (GTK_WIDGET (self), GTK_NO_WINDOW);
 
-    /* should free the config? */
-    self->configs = g_hash_table_new_full (g_str_hash, g_str_equal,
-                                           g_free, NULL);
-
     self->label_box = gtk_event_box_new ();
     gtk_widget_set_app_paintable (self->label_box, TRUE);
     gtk_widget_show (self->label_box);
@@ -1745,7 +1825,6 @@ sync_config_widget_init (SyncConfigWidget *self)
     gtk_widget_set_no_show_all (self->expando_box, TRUE);
     gtk_widget_set_parent (self->expando_box, GTK_WIDGET (self));
 
-    /* device_selector_box does device template selection */
     self->device_selector_box = gtk_vbox_new (FALSE, 0);
     gtk_box_pack_start (GTK_BOX (self->expando_box), self->device_selector_box,
                         TRUE, TRUE, 16);
@@ -1753,17 +1832,51 @@ sync_config_widget_init (SyncConfigWidget *self)
     hbox = gtk_hbox_new (FALSE, 8);
     gtk_widget_show (hbox);
     gtk_box_pack_start (GTK_BOX (self->device_selector_box), hbox,
+                        FALSE, TRUE, 8);
+    self->device_text = gtk_label_new (("We don't know what this device is exactly. "
+                                        "Please take a look at the list of "
+                                        "supported devices and pick yours if it "
+                                        "is listed"));
+    gtk_widget_show (self->device_text);
+    gtk_label_set_line_wrap (GTK_LABEL (self->device_text), TRUE);
+    gtk_widget_set_size_request (self->device_text, 600, -1);
+    gtk_box_pack_start (GTK_BOX (hbox), self->device_text,
+                        FALSE, TRUE, 0);
+
+
+    hbox = gtk_hbox_new (FALSE, 16);
+    gtk_widget_show (hbox);
+    gtk_box_pack_start (GTK_BOX (self->device_selector_box), hbox,
                         FALSE, TRUE, 16);
-    self->combo = gtk_combo_box_new_text ();
+
+    store = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_INT);
+    gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store),
+                                          2, GTK_SORT_DESCENDING);
+    gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (store), 2,
+                                     (GtkTreeIterCompareFunc)compare_list_items,
+                                     NULL, NULL);
+
+    self->combo = gtk_combo_box_new_with_model (GTK_TREE_MODEL (store));
+    g_object_unref (G_OBJECT (store)); 
     gtk_widget_set_size_request (self->combo, 200, -1);
     gtk_widget_show (self->combo);
-    gtk_box_pack_start (GTK_BOX (hbox), self->combo,
-                        FALSE, TRUE, 0);
-    btn = gtk_button_new_with_label ("Use these settings");
-    gtk_widget_show (btn);
-    gtk_box_pack_start (GTK_BOX (hbox), btn,
+    gtk_box_pack_start (GTK_BOX (hbox), self->combo, FALSE, TRUE, 0);
+
+    renderer = gtk_cell_renderer_text_new ();
+    gtk_cell_layout_pack_start (GTK_CELL_LAYOUT(self->combo), renderer, TRUE);
+    gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT(self->combo), renderer,
+                                    "text", 0, NULL);
+
+    g_signal_connect (self->combo, "changed",
+                      G_CALLBACK (device_combo_changed), self);
+
+
+    self->device_select_btn = gtk_button_new_with_label ("Use these settings");
+    gtk_widget_set_sensitive (self->device_select_btn, FALSE);
+    gtk_widget_show (self->device_select_btn);
+    gtk_box_pack_start (GTK_BOX (hbox), self->device_select_btn,
                         FALSE, TRUE, 0);
-    g_signal_connect (btn, "clicked",
+    g_signal_connect (self->device_select_btn, "clicked",
                       G_CALLBACK (device_selection_btn_clicked_cb), self);
 
     /* settings_box has normal expander contents */
@@ -1834,7 +1947,7 @@ sync_config_widget_init (SyncConfigWidget *self)
                         FALSE, FALSE, 0);
     /* TRANSLATORS: warning in service configuration form for people
        who have modified the configuration via other means. */
-    label = gtk_label_new (_("Current service configuration is more complex "
+    label = gtk_label_new (_("Current configuration is more complex "
                              "than what can be shown here. Changes to sync "
                              "mode or synced data types will overwrite that "
                              "configuration."));
@@ -1885,8 +1998,7 @@ sync_config_widget_init (SyncConfigWidget *self)
     g_signal_connect (self->use_button, "clicked",
                       G_CALLBACK (use_clicked_cb), self);
 
-    /* TRANSLATORS: button in service configuration form */
-    self->stop_button = gtk_button_new_with_label (_("Stop using service"));
+    self->stop_button = gtk_button_new ();
     gtk_box_pack_end (GTK_BOX (tmp_box), self->stop_button, FALSE, FALSE, 8);
     g_signal_connect (self->stop_button, "clicked",
                       G_CALLBACK (stop_clicked_cb), self);
index c29f3a1..ea07b0c 100644 (file)
@@ -32,7 +32,9 @@ typedef struct {
     GtkWidget *label_box;
 
     GtkWidget *device_selector_box;
+    GtkWidget *device_text;
     GtkWidget *combo;
+    GtkWidget *device_select_btn;
 
     GtkWidget *settings_box;
 
index 23bff2a..c6b619e 100644 (file)
@@ -34,7 +34,6 @@
 /* for return value definitions */
 /* TODO: would be nice to have a non-synthesis-dependent API but for now it's like this... */
 #include <synthesis/syerror.h>
-#include <synthesis/engine_defs.h>
 
 #include "config.h"
 #include "sync-ui-config.h"
 
 #ifdef USE_MOBLIN_UX
 #include "mux-frame.h"
-#include "mux-window.h"
+
+#ifdef MX_GTK_0_99_1
+#include <mx-gtk/mx-gtk.h>
+#else
 #include <mx/mx-gtk.h>
 #endif
 
+#endif
+
 static gboolean support_canceling = FALSE;
 #define REPORTS_PER_CALL 10
 
@@ -57,6 +61,12 @@ static gboolean support_canceling = FALSE;
 
 #define STRING_VARIANT_HASHTABLE (dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE))
 
+enum  {
+    PAGE_MAIN,
+    PAGE_SETTINGS,
+    PAGE_EMERGENCY,
+};
+
 typedef enum bluetooth_type {
     SYNC_BLUETOOTH_NONE,
     SYNC_BLUETOOTH_GNOME,
@@ -93,8 +103,10 @@ struct _app_data {
 
     GtkWidget *services_win; /* will be NULL when USE_MOBLIN_UX is set*/
     GtkWidget *emergency_win; /* will be NULL when USE_MOBLIN_UX is set*/
-
-    gint emergency_index; /* for use in mux_window_set_current_page() */
+    GtkWidget *notebook; /* only in use with USE_MOBLIN_UX */
+    GtkWidget *back_btn; /* only in use with USE_MOBLIN_UX */
+    GtkWidget *settings_btn; /* only in use with USE_MOBLIN_UX */
+    guint settings_id;
 
     GtkWidget *service_box;
     GtkWidget *info_bar;
@@ -112,6 +124,8 @@ struct _app_data {
     GtkWidget *emergency_btn;
 
     GtkWidget *server_label;
+    GtkWidget *autosync_box;
+    GtkWidget *autosync_toggle;
     GtkWidget *last_synced_label;
     GtkWidget *sources_box;
 
@@ -120,8 +134,8 @@ struct _app_data {
     GtkWidget *services_box;
     GtkWidget *devices_box;
     GtkWidget *scrolled_window;
-    GtkWidget *back_btn;
     GtkWidget *expanded_config;
+    GtkWidget *settings_close_btn;
 
     GtkWidget *emergency_label;
     GtkWidget *emergency_expander;
@@ -129,6 +143,7 @@ struct _app_data {
     GtkWidget *refresh_from_server_btn_label;
     GtkWidget *refresh_from_client_btn_label;
     GtkWidget *emergency_backup_table;
+    GtkWidget *emergency_close_btn;
 
     GtkWidget *password_dialog_entry;
     char *password_dialog_id;
@@ -147,6 +162,7 @@ struct _app_data {
     ui_operation current_operation;
     server_config *current_service;
     app_state current_state;
+    guint service_list_updates_left;
     gboolean open_current; /* should the service list open the current 
                               service when it populates next time*/
     char *config_id_to_open;
@@ -288,7 +304,7 @@ reload_config (app_data *data, const char *server)
     if (!server || strlen (server) == 0) {
         data->current_service = NULL;
         update_service_ui (data);
-        set_app_state (data, SYNC_UI_STATE_NO_SERVER);
+        set_app_state (data, SYNC_UI_STATE_SERVER_OK);
     } else {
         data->synced_this_session = FALSE;
         data->current_service = g_slice_new0 (server_config);
@@ -486,9 +502,18 @@ start_sync (app_data *data)
 static void
 sync_clicked_cb (GtkButton *btn, app_data *data)
 {
+    g_return_if_fail (data->current_service);
+
     start_sync (data);
 }
 
+#define DAY 60 * 60 * 24
+#define HALF_DAY 60 * 60 * 12
+#define HOUR 60 * 60
+#define HALF_HOUR 60 * 30
+#define MINUTE 60
+#define HALF_MINUTE 30
+
 static gboolean
 refresh_last_synced_label (app_data *data)
 {
@@ -501,44 +526,44 @@ refresh_last_synced_label (app_data *data)
     diff = val.tv_sec - data->last_sync;
 
     if (!data->current_service) {
-        msg = g_strdup (_("No service selected"));
+        msg = g_strdup (_("No service or device selected"));
         delay = -1;
     } else if (data->last_sync <= 0) {
         msg = g_strdup (data->current_service->pretty_name); /* we don't know */
         delay = -1;
-    } else if (diff < 30) {
+    } else if (diff < HALF_MINUTE) {
         /* TRANSLATORS: This is the title on main view. Placeholder is 
          * the service name. Example: "Google - synced just now" */
         msg = g_strdup_printf (_("%s - synced just now"),
                                data->current_service->pretty_name);
-        delay = 30;
-    } else if (diff < 90) {
+        delay = 10;
+    } else if (diff < MINUTE + HALF_MINUTE) {
         msg = g_strdup_printf (_("%s - synced a minute ago"),
                                data->current_service->pretty_name);
-        delay = 60;
-    } else if (diff < 60 * 60) {
+        delay = MINUTE;
+    } else if (diff < HOUR) {
         msg = g_strdup_printf (_("%s - synced %ld minutes ago"),
                                data->current_service->pretty_name,
-                               (diff + 30) / 60);
-        delay = 60;
-    } else if (diff < 60 * 90) {
+                               (diff + HALF_MINUTE) / MINUTE);
+        delay = MINUTE;
+    } else if (diff < HOUR + HALF_HOUR) {
         msg = g_strdup_printf (_("%s - synced an hour ago"),
                                data->current_service->pretty_name);
-        delay = 60 * 60;
-    } else if (diff < 60 * 60 * 24) {
+        delay = HOUR;
+    } else if (diff < DAY) {
         msg = g_strdup_printf (_("%s - synced %ld hours ago"),
                                data->current_service->pretty_name,
-                               (diff + 60 * 30) / (60 * 60));
-        delay = 60 * 60;
-    } else if (diff < 60 * 60 * 24 - (60 * 30)) {
+                               (diff + HALF_HOUR) / (HOUR));
+        delay = HOUR;
+    } else if (diff < DAY + HALF_DAY) {
         msg = g_strdup_printf (_("%s - synced a day ago"),
                                data->current_service->pretty_name);
-        delay = 60 * 60 * 24;
+        delay = HOUR;
     } else {
         msg = g_strdup_printf (_("%s - synced %ld days ago"),
                                data->current_service->pretty_name,
-                               (diff + 24 * 60 * 30) / (60 * 60 * 24));
-        delay = 60 * 60 * 24;
+                               (diff + HALF_DAY) / (DAY));
+        delay = HOUR;
     }
 
     gtk_label_set_text (GTK_LABEL (data->server_label), msg);
@@ -552,7 +577,6 @@ refresh_last_synced_label (app_data *data)
     return FALSE;
 }
 
-
 static void
 set_sync_progress (app_data *data, float progress, char *status)
 {
@@ -627,10 +651,6 @@ set_info_bar (GtkWidget *widget,
 static void
 set_app_state (app_data *data, app_state state)
 {
-
-    if (data->current_state == state)
-        return;
-
     if (state != SYNC_UI_STATE_CURRENT_STATE)
         data->current_state = state;
 
@@ -644,27 +664,13 @@ set_app_state (app_data *data, app_state state)
         gtk_widget_set_sensitive (data->main_frame, TRUE);
         gtk_widget_set_sensitive (data->sync_btn, FALSE);
         gtk_widget_set_sensitive (data->change_service_btn, FALSE);
+        gtk_widget_set_sensitive (data->settings_btn, FALSE);
         gtk_widget_set_sensitive (data->emergency_btn, FALSE);
         break;
-    case SYNC_UI_STATE_NO_SERVER:
-        gtk_widget_hide (data->service_box);
-        set_info_bar (data->info_bar,
-                      GTK_MESSAGE_INFO, SYNC_ERROR_RESPONSE_SETTINGS_SELECT,
-                      _("You haven't selected a sync service yet. "
-                        "Sync services let you synchronize your data "
-                        "between your netbook and a web service"));
-        refresh_last_synced_label (data);
-
-        gtk_label_set_text (GTK_LABEL (data->sync_status_label), "");
-
-        gtk_widget_set_sensitive (data->main_frame, TRUE);
-        gtk_widget_set_sensitive (data->sync_btn, FALSE);
-        gtk_widget_set_sensitive (data->change_service_btn, TRUE);
-        gtk_widget_set_sensitive (data->emergency_btn, FALSE);
-        gtk_window_set_focus (GTK_WINDOW (data->sync_win), data->change_service_btn);
-        break;
     case SYNC_UI_STATE_SERVER_FAILURE:
         gtk_widget_hide (data->service_box);
+        gtk_widget_hide (data->autosync_box);
+        gtk_widget_hide (data->progress);
         refresh_last_synced_label (data);
 
         /* info bar content should be set earlier */
@@ -676,28 +682,55 @@ set_app_state (app_data *data, app_state state)
         gtk_widget_set_sensitive (data->sync_btn, FALSE);
         gtk_widget_set_sensitive (data->emergency_btn, FALSE);
         gtk_widget_set_sensitive (data->change_service_btn, FALSE);
+        gtk_widget_set_sensitive (data->settings_btn, FALSE);
         break;
     case SYNC_UI_STATE_SERVER_OK:
-        /* we have a active, idle session */
-        gtk_widget_show (data->service_box);
-        gtk_widget_hide (data->info_bar);
-
-        gtk_widget_set_sensitive (data->main_frame, TRUE);
         if (data->online) {
             gtk_widget_hide (data->no_connection_box);
         } else {
             gtk_widget_show (data->no_connection_box);
         }
-        gtk_widget_set_sensitive (data->sync_btn, data->online);
+
+        if (!data->current_service) {
+            gtk_widget_hide (data->service_box);
+            gtk_widget_hide (data->autosync_box);
+            gtk_widget_hide (data->progress);
+            set_info_bar (data->info_bar,
+                          GTK_MESSAGE_INFO, SYNC_ERROR_RESPONSE_SETTINGS_SELECT,
+                          _("You haven't selected a sync service or device yet. "
+                            "Sync services let you synchronize your data "
+                            "between your netbook and a web service. You can "
+                            "also sync directly with some devices."));
+            refresh_last_synced_label (data);
+
+            gtk_label_set_text (GTK_LABEL (data->sync_status_label), "");
+
+            gtk_widget_set_sensitive (data->sync_btn, FALSE);
+            gtk_widget_set_sensitive (data->emergency_btn, FALSE);
+            gtk_window_set_focus (GTK_WINDOW (data->sync_win),
+                                  data->change_service_btn);
+        } else {
+            gtk_widget_hide (data->info_bar);
+            gtk_widget_show (data->service_box);
+            gtk_widget_show (data->autosync_box);
+            gtk_widget_set_sensitive (data->sync_btn, data->online);
+            gtk_widget_set_sensitive (data->emergency_btn, TRUE);
+            /* TRANSLATORS: These are for the button in main view, right side.
+               Keep line length below ~20 characters, use two lines if needed */
+            if (data->synced_this_session && data->current_operation != OP_RESTORE) {
+                gtk_button_set_label (GTK_BUTTON (data->sync_btn),
+                                      _("Sync again"));
+            } else {
+                gtk_widget_hide (data->progress);
+                gtk_button_set_label (GTK_BUTTON (data->sync_btn),
+                                      _("Sync now"));
+            }
+            gtk_window_set_focus (GTK_WINDOW (data->sync_win), data->sync_btn);
+        }
+
+        gtk_widget_set_sensitive (data->main_frame, TRUE);
         gtk_widget_set_sensitive (data->change_service_btn, TRUE);
-        gtk_widget_set_sensitive (data->emergency_btn, TRUE);
-        /* TRANSLATORS: These are for the button in main view, right side.
-           Keep line length below ~20 characters, use two lines if needed */
-        if (data->synced_this_session && data->current_operation != OP_RESTORE)
-            gtk_button_set_label (GTK_BUTTON (data->sync_btn), _("Sync again"));
-        else
-            gtk_button_set_label (GTK_BUTTON (data->sync_btn), _("Sync now"));
-        gtk_window_set_focus (GTK_WINDOW (data->sync_win), data->sync_btn);
+        gtk_widget_set_sensitive (data->settings_btn, TRUE);
 
         data->syncing = FALSE;
         break;
@@ -713,6 +746,7 @@ set_app_state (app_data *data, app_state state)
         }
         gtk_widget_set_sensitive (data->main_frame, FALSE);
         gtk_widget_set_sensitive (data->change_service_btn, FALSE);
+        gtk_widget_set_sensitive (data->settings_btn, FALSE);
         gtk_widget_set_sensitive (data->emergency_btn, FALSE);
 
         gtk_widget_set_sensitive (data->sync_btn, 
@@ -732,10 +766,6 @@ set_app_state (app_data *data, app_state state)
 
 #ifdef USE_MOBLIN_UX
 
-/* truly stupid, but glade doesn't allow custom containers.
-   Now glade file has dummy containers that will be replaced here.
-   The dummy should be a gtkbin and it's parent should be a box with just one child */ 
-
 static GtkWidget*
 switch_dummy_to_mux_frame (GtkWidget *dummy)
 {
@@ -756,79 +786,205 @@ switch_dummy_to_mux_frame (GtkWidget *dummy)
     gtk_widget_reparent (gtk_bin_get_child (GTK_BIN (dummy)), frame);
     gtk_container_remove (GTK_CONTAINER (parent), dummy);
 
-    /* make sure there are no other children in box */
-    g_assert (gtk_container_get_children (GTK_CONTAINER (parent)) == NULL);
-
     gtk_box_pack_start (GTK_BOX (parent), frame, TRUE, TRUE, 0);
     gtk_widget_show (frame);
     return frame;
 }
 
+static void
+set_page (app_data *data, int page)
+{
+    int current = gtk_notebook_get_current_page (GTK_NOTEBOOK (data->notebook));
+
+    if (page != current) {
+        gtk_notebook_set_current_page (GTK_NOTEBOOK (data->notebook),
+                                       page);
+        if (page != PAGE_MAIN) {
+            gtk_widget_show (data->back_btn);
+        } else {
+            gtk_widget_hide (data->back_btn);
+        }
+
+        /* make sure the toggle is correct */
+        g_signal_handler_block (data->settings_btn, data->settings_id);
+        if (page == PAGE_SETTINGS) {
+            gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (data->settings_btn),
+                                          TRUE); 
+        } else if (current == PAGE_SETTINGS) {
+            gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (data->settings_btn),
+                                          FALSE);
+        }
+        g_signal_handler_unblock (data->settings_btn, data->settings_id);
+    }
+
+    gtk_window_present (GTK_WINDOW (data->sync_win));
+}
+
+
+static void
+settings_toggled (GtkToggleButton *button, app_data *data)
+{
+    int page = gtk_notebook_get_current_page (GTK_NOTEBOOK (data->notebook));
+
+    if (page == PAGE_SETTINGS) {
+        show_main_view (data);
+    } else {
+        show_services_list (data, NULL);
+    }
+}
 
 static gboolean
 key_press_cb (GtkWidget *widget,
               GdkEventKey *event,
               app_data *data)
 {
-    if (event->keyval == GDK_Escape &&
-        mux_window_get_current_page (MUX_WINDOW (data->sync_win)) >= 0) {
+    int page = gtk_notebook_get_current_page (GTK_NOTEBOOK (data->notebook));
 
+    if (event->keyval == GDK_Escape && page != PAGE_MAIN) {
         show_main_view (data);
     }
 
     return FALSE;
 }
 
-static void
-settings_visibility_changed_cb (MuxWindow *win, app_data *data)
+/* For some reason metacity sometimes won't maximize but will if asked 
+ * another time. For the record, I'm not proud of writing this */
+static gboolean
+try_maximize (GtkWindow *win)
 {
-    update_services_list (data);
+    static int count = 0;
+
+    count++;
+    gtk_window_maximize (win);
+
+    return (count < 10);
 }
 
+
 static void
 setup_windows (app_data *data,
                GtkWidget *main,
                GtkWidget *settings,
                GtkWidget *emergency)
 {
-    GtkWidget *mux_main;
-    GtkWidget *tmp;
+    GtkWidget *tmp, *toolbar, *close_btn;
+    GtkToolItem *item;
 
     g_assert (GTK_IS_WINDOW (main));
     g_assert (GTK_IS_WINDOW (settings));
     g_assert (GTK_IS_WINDOW (emergency));
 
-    /* TRANSLATORS: button in the Moblin window title bar when main view is 
-     * not visible */
-    mux_main = mux_window_new (_("Back to sync"));
-    gtk_window_set_title (GTK_WINDOW (mux_main),
-                          gtk_window_get_title (GTK_WINDOW (main)));
-    gtk_window_set_default_size (GTK_WINDOW (mux_main), 1024, 600);
-    gtk_widget_set_name (mux_main, gtk_widget_get_name (main));
-    gtk_widget_reparent (gtk_bin_get_child (GTK_BIN (main)), mux_main);
-    mux_window_set_decorations (MUX_WINDOW (mux_main), MUX_DECOR_SETTINGS|MUX_DECOR_CLOSE);
-    g_signal_connect (mux_main, "key-press-event",
+    data->sync_win = main;
+    data->services_win = NULL;
+    data->emergency_win = NULL;
+
+    /* populate the notebook with window contents */
+    data->notebook = gtk_notebook_new ();
+    gtk_widget_show (data->notebook);
+    gtk_notebook_set_show_tabs (GTK_NOTEBOOK (data->notebook), FALSE);
+    gtk_notebook_set_show_border (GTK_NOTEBOOK (data->notebook), FALSE);
+
+    gtk_window_maximize (GTK_WINDOW (data->sync_win));
+    g_timeout_add (10, (GSourceFunc)try_maximize, data->sync_win);
+    gtk_window_set_decorated (GTK_WINDOW (data->sync_win), FALSE);
+    gtk_widget_set_name (data->sync_win, "meego_win");
+    g_signal_connect (data->sync_win, "key-press-event",
                       G_CALLBACK (key_press_cb), data);
-    g_signal_connect (mux_main, "settings-visibility-changed",
-                      G_CALLBACK (settings_visibility_changed_cb), data);
 
+    tmp = g_object_ref (gtk_bin_get_child (GTK_BIN (data->sync_win)));
+    gtk_container_remove (GTK_CONTAINER (data->sync_win), tmp);
+    gtk_notebook_append_page (GTK_NOTEBOOK (data->notebook), tmp, NULL);
+    g_object_unref (tmp);
 
     tmp = g_object_ref (gtk_bin_get_child (GTK_BIN (settings)));
     gtk_container_remove (GTK_CONTAINER (settings), tmp);
-    mux_window_append_page (MUX_WINDOW (mux_main), tmp, TRUE);
+    gtk_notebook_append_page (GTK_NOTEBOOK (data->notebook), tmp, NULL);
     g_object_unref (tmp);
 
     tmp = g_object_ref (gtk_bin_get_child (GTK_BIN (emergency)));
     gtk_container_remove (GTK_CONTAINER (emergency), tmp);
-    data->emergency_index =
-        mux_window_append_page (MUX_WINDOW (mux_main), tmp, FALSE);
+    gtk_notebook_append_page (GTK_NOTEBOOK (data->notebook), tmp, NULL);
     g_object_unref (tmp);
 
-    data->sync_win = mux_main;
-    data->services_win = NULL;
-    data->emergency_win = NULL;
+    tmp = gtk_vbox_new (FALSE, 0);
+    gtk_widget_show (tmp);
+    gtk_container_add (GTK_CONTAINER (data->sync_win), tmp);
+
+    gtk_box_pack_end (GTK_BOX (tmp), data->notebook,
+                      TRUE, TRUE, 0);
+
+    /* create the window toolbar */
+    toolbar = gtk_toolbar_new ();
+    gtk_widget_set_name (toolbar, "moblin-toolbar");
+    gtk_box_pack_start (GTK_BOX (tmp), toolbar,
+                        FALSE, FALSE, 0);
+
+    data->back_btn = gtk_button_new_with_label (_("Back to sync"));
+    gtk_widget_set_can_focus (data->back_btn, FALSE);
+    gtk_widget_set_no_show_all (data->back_btn, TRUE);
+    g_signal_connect_swapped (data->back_btn, "clicked",
+                              G_CALLBACK (show_main_view), data);
+    item = gtk_tool_item_new ();
+    gtk_container_add (GTK_CONTAINER (item), data->back_btn);
+    gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, 0);
+
+    item = gtk_separator_tool_item_new ();
+    gtk_tool_item_set_expand (item, TRUE);
+    gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, 1);
+
+    data->settings_btn = gtk_toggle_button_new ();
+    gtk_widget_set_can_focus (data->settings_btn, FALSE);
+    gtk_widget_set_name (data->settings_btn, "moblin-settings-button");
+    data->settings_id = g_signal_connect (data->settings_btn, "toggled",
+                                          G_CALLBACK (settings_toggled), data);
+
+    gtk_container_add (GTK_CONTAINER (data->settings_btn),
+                       gtk_image_new_from_icon_name ("preferences-other-hover",
+                                                     GTK_ICON_SIZE_DIALOG));
+    item = gtk_tool_item_new ();
+    gtk_container_add (GTK_CONTAINER (item), data->settings_btn);
+    gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
+
+    close_btn = gtk_button_new ();
+    gtk_widget_set_can_focus (close_btn, FALSE);
+    gtk_widget_set_name (close_btn, "moblin-close-button");
+    g_signal_connect (close_btn, "clicked",
+                      G_CALLBACK (gtk_main_quit), NULL);
+    gtk_container_add (GTK_CONTAINER (close_btn),
+                       gtk_image_new_from_icon_name ("window-close-hover",
+                                                     GTK_ICON_SIZE_DIALOG));
+    item = gtk_tool_item_new ();
+    gtk_container_add (GTK_CONTAINER (item), close_btn);
+    gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
+
+    gtk_widget_show_all (toolbar);
+
+    /* no need for close buttons */
+    gtk_widget_hide (data->settings_close_btn);
+    gtk_widget_hide (data->emergency_close_btn);
 }
 
+static void
+show_emergency_view (app_data *data)
+{
+    update_emergency_view (data);
+    set_page (data, PAGE_EMERGENCY);
+}
+
+static void
+show_services_list (app_data *data, const char *config_id_to_open)
+{
+    g_free (data->config_id_to_open);
+    data->config_id_to_open = g_strdup (config_id_to_open);
+    set_page (data, PAGE_SETTINGS);
+    update_services_list (data);
+}
+
+static void
+show_main_view (app_data *data)
+{
+    set_page (data, PAGE_MAIN);
+}
 
 #else
 
@@ -855,6 +1011,34 @@ setup_windows (app_data *data,
     g_signal_connect (data->emergency_win, "delete-event",
                       G_CALLBACK (gtk_widget_hide_on_delete), NULL);
 }
+
+static void
+show_emergency_view (app_data *data)
+{
+    update_emergency_view (data);
+    gtk_widget_hide (data->services_win);
+    gtk_window_present (GTK_WINDOW (data->emergency_win));
+}
+
+static void
+show_services_list (app_data *data, const char *config_id_to_open)
+{
+    g_free (data->config_id_to_open);
+    data->config_id_to_open = g_strdup (config_id_to_open);
+
+    gtk_widget_hide (data->emergency_win);
+    gtk_window_present (GTK_WINDOW (data->services_win));
+    update_services_list (data);
+}
+
+static void
+show_main_view (app_data *data)
+{
+    gtk_widget_hide (data->services_win);
+    gtk_widget_hide (data->emergency_win);
+    gtk_window_present (GTK_WINDOW (data->sync_win));
+}
+
 #endif
 
 /* This is a hacky way to achieve autoscrolling when the expanders open/close */
@@ -995,6 +1179,77 @@ init_bluetooth_ui (app_data *data)
     }
 }
 
+
+static void
+autosync_toggle_cb (GtkWidget *widget, gpointer x, app_data *data)
+{
+    if (data->current_service && data->current_service->config) {
+        gboolean new_active, old_active = FALSE;
+        char *autosync = NULL;
+
+        new_active = toggle_get_active (widget);
+        syncevo_config_get_value (data->current_service->config, NULL,
+                                  "autoSync", &autosync);
+        old_active = (g_strcmp0 (autosync, "1") == 0);
+
+        if (old_active != new_active) {
+            char *new_val;
+            operation_data *op_data;
+
+            new_val = new_active ? "1": "0";
+            syncevo_config_set_value (data->current_service->config, NULL,
+                                      "autoSync", new_val);
+
+            op_data = g_slice_new (operation_data);
+            op_data->data = data;
+            op_data->operation = OP_SAVE;
+            op_data->started = FALSE;
+            syncevo_server_start_session (data->server,
+                                          data->current_service->name,
+                                          (SyncevoServerStartSessionCb)start_session_cb,
+                                          op_data);
+        }
+    }
+}
+
+static void
+build_autosync_ui (app_data *data)
+{
+    char *txt;
+
+    /* TRANSLATORS: label for checkbutton/toggle in main view.
+     * Please stick to similar length strings or break the line with
+     * "\n" if absolutely needed */
+    txt = _("Automatic sync");
+
+#ifdef USE_MOBLIN_UX
+    GtkWidget *lbl;
+
+    lbl = gtk_label_new (txt);
+    gtk_widget_show (lbl);
+    gtk_box_pack_end (GTK_BOX (data->autosync_box), lbl, FALSE, FALSE, 0);
+
+    data->autosync_toggle = mx_gtk_light_switch_new ();
+    gtk_widget_show (data->autosync_toggle);
+    gtk_box_pack_end (GTK_BOX (data->autosync_box), data->autosync_toggle,
+                      FALSE, FALSE, 0);
+    g_signal_connect (data->autosync_toggle, "switch-flipped",
+                      G_CALLBACK (autosync_toggle_cb), data);
+#else
+    GtkWidget *align;
+
+    align = gtk_alignment_new (0.5, 1.0, 1.0, 0.0);
+    gtk_widget_show (align);
+    gtk_box_pack_start (GTK_BOX (data->autosync_box), align, TRUE, TRUE, 0);
+
+    data->autosync_toggle = gtk_check_button_new_with_label (txt);
+    gtk_container_add (GTK_CONTAINER (align), data->autosync_toggle);
+    g_signal_connect (data->autosync_toggle, "notify::active",
+                      G_CALLBACK (autosync_toggle_cb), data);
+#endif
+    gtk_widget_show (data->autosync_toggle);
+}
+
 static gboolean
 init_ui (app_data *data)
 {
@@ -1039,6 +1294,9 @@ init_ui (app_data *data)
     gtk_widget_set_no_show_all (data->spinner_image, TRUE);
     gtk_widget_hide (data->spinner_image);
 
+    data->autosync_box = GTK_WIDGET (gtk_builder_get_object (builder, "autosync_box"));
+    build_autosync_ui (data);
+
     data->server_label = GTK_WIDGET (gtk_builder_get_object (builder, "sync_service_label"));
     data->last_synced_label = GTK_WIDGET (gtk_builder_get_object (builder, "last_synced_label"));
     data->sources_box = GTK_WIDGET (gtk_builder_get_object (builder, "sources_box"));
@@ -1058,8 +1316,7 @@ init_ui (app_data *data)
                      G_CALLBACK (services_box_allocate_cb), data);
 
     data->devices_box = GTK_WIDGET (gtk_builder_get_object (builder, "devices_box"));
-
-    data->back_btn = GTK_WIDGET (gtk_builder_get_object (builder, "back_btn"));
+    data->settings_close_btn = GTK_WIDGET (gtk_builder_get_object (builder, "settings_close_btn"));
 
     /* emergency view */
     btn = GTK_WIDGET (gtk_builder_get_object (builder, "slow_sync_btn"));
@@ -1076,6 +1333,7 @@ init_ui (app_data *data)
     data->emergency_expander = GTK_WIDGET (gtk_builder_get_object (builder, "emergency_expander"));
     data->emergency_source_table = GTK_WIDGET (gtk_builder_get_object (builder, "emergency_source_table"));
     data->emergency_backup_table = GTK_WIDGET (gtk_builder_get_object (builder, "emergency_backup_table"));
+    data->emergency_close_btn = GTK_WIDGET (gtk_builder_get_object (builder, "emergency_close_btn"));
 
     /* No (documented) way to add own widgets to gtkbuilder it seems...
        swap the all dummy widgets with Muxwidgets */
@@ -1097,6 +1355,12 @@ init_ui (app_data *data)
                       G_CALLBACK (emergency_clicked_cb), data);
     g_signal_connect (data->sync_btn, "clicked", 
                       G_CALLBACK (sync_clicked_cb), data);
+    g_signal_connect_swapped (data->emergency_close_btn, "clicked",
+                              G_CALLBACK (show_main_view), data);
+    g_signal_connect_swapped (data->settings_close_btn, "clicked",
+                              G_CALLBACK (show_main_view), data);
+    g_signal_connect (data->emergency_btn, "clicked",
+                      G_CALLBACK (emergency_clicked_cb), data);
 
     data->new_device_btn = GTK_WIDGET (gtk_builder_get_object (builder, "new_device_btn"));
     g_signal_connect (data->new_device_btn, "clicked", 
@@ -1240,8 +1504,9 @@ update_emergency_expander (app_data *data)
 }
 
 static void
-add_emergency_source (const char *name, source_config *conf, app_data *data)
+add_emergency_source (const char *name, GHashTable *source, app_data *data)
 {
+    source_config *conf;
     GtkWidget *toggle;
     guint rows, cols;
     guint row;
@@ -1249,6 +1514,8 @@ add_emergency_source (const char *name, source_config *conf, app_data *data)
     gboolean active = TRUE;
     char *pretty_name;
 
+    conf = g_hash_table_lookup (data->current_service->source_configs,
+                                name);
     g_object_get (data->emergency_source_table,
                   "n-rows", &rows,
                   "n-columns", &cols,
@@ -1339,9 +1606,9 @@ add_backup (app_data *data, const char *peername, const char *dir,
     char time_str[60];
     struct tm *tim;
 
+    tim = localtime (&endtime);
     /* TRANSLATORS: date/time for strftime(), used in emergency view backup
      * label. Any time format that shows date and time is good. */
-    tim = localtime (&endtime);
     strftime (time_str, sizeof (time_str), _("%x %X"), tim);
 
     g_object_get (data->emergency_backup_table,
@@ -1521,9 +1788,12 @@ update_emergency_view (app_data *data)
                            (GtkCallback)remove_child,
                            data->emergency_source_table);
     gtk_table_resize (GTK_TABLE (data->emergency_source_table), 1, 1);
-    g_hash_table_foreach (data->current_service->source_configs,
-                          (GHFunc)add_emergency_source,
-                          data);
+
+     /* using this instead of current_service->source_configs
+      *  to get the same order as the configuration has... */
+    syncevo_config_foreach_source (data->current_service->config,
+                                   (ConfigFunc)add_emergency_source,
+                                   data);
     update_emergency_expander (data);
 
     data->backup_count = 0;
@@ -1610,6 +1880,7 @@ static void
 update_service_ui (app_data *data)
 {
     char *icon_uri = NULL;
+    char *autosync = NULL;
 
     gtk_container_foreach (GTK_CONTAINER (data->sources_box),
                            (GtkCallback)remove_child,
@@ -1618,6 +1889,8 @@ update_service_ui (app_data *data)
     if (data->current_service && data->current_service->config) {
         syncevo_config_get_value (data->current_service->config,
                                   NULL, "IconURI", &icon_uri);
+        syncevo_config_get_value (data->current_service->config,
+                                  NULL, "autoSync", &autosync);
 
         g_hash_table_foreach (data->current_service->source_configs,
                               (GHFunc)update_service_source_ui,
@@ -1627,6 +1900,9 @@ update_service_ui (app_data *data)
                GTK_BOX (data->server_icon_box),
                SYNC_UI_ICON_SIZE);
 
+    toggle_set_active (data->autosync_toggle,
+                       g_strcmp0 (autosync, "1") == 0);
+
     refresh_last_synced_label (data);
 
     gtk_widget_show_all (data->sources_box);
@@ -1742,6 +2018,8 @@ get_config_for_config_widget_cb (SyncevoServer *server,
 {
     char *ready, *is_peer, *url;
 
+    c_data->data->service_list_updates_left--;
+
     if (error) {
         /* show in UI? */
         g_warning ("Server.GetConfig() failed: %s", error->message);
@@ -1762,12 +2040,14 @@ get_config_for_config_widget_cb (SyncevoServer *server,
             /* NOTE: using device_name here means a new config will be saved with
              * device_name (and not the template name). Not sure if this is
              * what we really want... */
-            syncevo_config_get_value (config, NULL, "fingerPrint", &fp);
-
-            if (fp) {
-                fpv = g_strsplit_set (fp, ",;", 2);
-                if (g_strv_length (fpv) > 0) {
-                    device_name = fpv[0];
+            syncevo_config_get_value (config, NULL, "templateName", &device_name);
+            if (!device_name) {
+                syncevo_config_get_value (config, NULL, "fingerPrint", &fp);
+                if (fp) {
+                    fpv = g_strsplit_set (fp, ",;", 2);
+                    if (g_strv_length (fpv) > 0) {
+                        device_name = fpv[0];
+                    }
                 }
             }
             if (!device_name) {
@@ -1792,10 +2072,11 @@ get_config_for_config_widget_cb (SyncevoServer *server,
                  * all configs / templates, then decide what to sho w*/
 
                 /* there is a widget for this device already, add this info there*/
-                sync_config_widget_add_alternative_config (w, device_name, config, 
-                                                           c_data->has_configuration);
+                if (g_strcmp0 ("1", ready) == 0) {
+                    sync_config_widget_add_alternative_config (w, device_name, config, 
+                                                               c_data->has_configuration);
+                }
             }
-
             g_strfreev (fpv);
         }
     } else {
@@ -1824,6 +2105,8 @@ get_config_for_config_widget (app_data *data,
 {
     config_data *c_data;
 
+    data->service_list_updates_left++;
+
     c_data = g_slice_new0 (config_data);
     c_data->data = data;
     c_data->name = g_strdup (config);
@@ -1876,6 +2159,8 @@ get_configs_cb (SyncevoServer *server,
     app_data *data;
     GHashTable *device_templates;
 
+    templ_data->data->service_list_updates_left = 0;
+
     templates = templ_data->templates;
     data = templ_data->data;
     g_slice_free (templates_data, templ_data);
@@ -1949,6 +2234,7 @@ get_template_configs_cb (SyncevoServer *server,
     templates_data *templ_data;
 
     if (error) {
+        data->service_list_updates_left = 0;
         show_main_view (data);
 
         show_error_dialog (data->sync_win, 
@@ -1971,6 +2257,10 @@ get_template_configs_cb (SyncevoServer *server,
 static void
 update_services_list (app_data *data)
 {
+    if (data->service_list_updates_left > 0) {
+        return;
+    }
+
     gtk_container_foreach (GTK_CONTAINER (data->services_box),
                            (GtkCallback)remove_child,
                            data->services_box);
@@ -1978,6 +2268,8 @@ update_services_list (app_data *data)
                            (GtkCallback)remove_child,
                            data->devices_box);
 
+    /* set temp number before we know the real one */
+    data->service_list_updates_left = 1;
     syncevo_server_get_configs (data->server,
                                 TRUE,
                                 (SyncevoServerGetConfigsCb)get_template_configs_cb,
@@ -1994,11 +2286,16 @@ get_config_for_main_win_cb (SyncevoServer *server,
         if (error->code == DBUS_GERROR_REMOTE_EXCEPTION &&
             dbus_g_error_has_name (error, SYNCEVO_DBUS_ERROR_NO_SUCH_CONFIG)) {
             /* another syncevolution client probably removed the config */
+            reload_config (data, NULL);
         } else {
             g_warning ("Error in Server.GetConfig: %s", error->message);
-            /* non-fatal, ignore in UI */
+            /* TRANSLATORS: message in main view */
+            set_info_bar (data->info_bar, GTK_MESSAGE_ERROR,
+                          SYNC_ERROR_RESPONSE_NONE,
+                          _("There was a problem communicating with the "
+                            "sync process. Please try again later."));
+            set_app_state (data, SYNC_UI_STATE_SERVER_FAILURE);
         }
-        set_app_state (data, SYNC_UI_STATE_NO_SERVER);
         g_error_free (error);
 
         return;
@@ -2519,6 +2816,14 @@ get_reports_cb (SyncevoServer *server,
             type = GTK_MESSAGE_QUESTION;
         }
 
+        if (!data->synced_this_session) {
+            /* TRANSLATORS: the placeholder is a error message (hopefully) 
+             * explaining the problem */
+            char *msg = g_strdup_printf (_("There was a problem with last sync:\n%s"),
+                                         error_msg);
+            g_free (error_msg);
+            error_msg = msg;
+        }
         set_info_bar (data->info_bar, type, response, error_msg);
         g_free (error_msg);
     } else if (data->current_operation == OP_RESTORE) {
@@ -2826,46 +3131,6 @@ start_session_cb (SyncevoServer *server,
     g_free (path);
 }
 
-static void
-show_emergency_view (app_data *data)
-{
-    update_emergency_view (data);
-#ifdef USE_MOBLIN_UX
-    mux_window_set_current_page (MUX_WINDOW (data->sync_win),
-                                 data->emergency_index);
-#else
-    gtk_widget_hide (data->services_win);
-    gtk_window_present (GTK_WINDOW (data->emergency_win));
-#endif
-}
-
-static void
-show_services_list (app_data *data, const char *config_id_to_open)
-{
-    g_free (data->config_id_to_open);
-    data->config_id_to_open = g_strdup (config_id_to_open);
-
-#ifdef USE_MOBLIN_UX
-    mux_window_set_settings_visible (MUX_WINDOW (data->sync_win), TRUE);
-#else
-    gtk_widget_hide (data->emergency_win);
-    gtk_window_present (GTK_WINDOW (data->services_win));
-    update_services_list (data);
-#endif
-}
-
-static void
-show_main_view (app_data *data)
-{
-#ifdef USE_MOBLIN_UX
-    mux_window_set_current_page (MUX_WINDOW (data->sync_win), -1);
-#else
-    gtk_widget_hide (data->services_win);
-    gtk_widget_hide (data->emergency_win);
-#endif
-    gtk_window_present (GTK_WINDOW (data->sync_win));
-}
-
 /* TODO: this function should accept source/peer name as param */
 char*
 get_error_string_for_code (int error_code, SyncErrorResponse *response)
@@ -2885,11 +3150,22 @@ get_error_string_for_code (int error_code, SyncErrorResponse *response)
         if (response) {
             *response = SYNC_ERROR_RESPONSE_EMERGENCY;
         }
+        /* TRANSLATORS: next strings are error messages. */
         return g_strdup (_("A normal sync is not possible at this time. The server "
                            "suggests a slow sync, but this might not always be "
                            "what you want if both ends already have data."));
     case 22002:
-        return g_strdup (_("The sync service died unexpectedly."));
+        return g_strdup (_("The sync process died unexpectedly."));
+    case 22003:
+        if (response) {
+            *response = SYNC_ERROR_RESPONSE_SETTINGS_OPEN;
+        }
+        return g_strdup (_("Password request was not answered. You can save the "
+                           "password in the settings to prevent the request."));
+    case 506:
+        /* TODO use the service device name here, this is a remote problem */
+        return g_strdup (_("There was a problem processing sync request. "
+                           "Trying again may help."));
     case DB_Unauthorized:
         if (response) {
             *response = SYNC_ERROR_RESPONSE_SETTINGS_OPEN;
@@ -2902,18 +3178,18 @@ get_error_string_for_code (int error_code, SyncErrorResponse *response)
         if (response) {
             *response = SYNC_ERROR_RESPONSE_SETTINGS_OPEN;
         }
-        return g_strdup(_("The source could not be found. Could there be a "
-                          "problem with the server settings?"));
+        /* TRANSLATORS: data source means e.g. calendar or addressbook */
+        return g_strdup(_("A data source could not be found. Could there be a "
+                          "problem with the settings?"));
     case DB_Fatal:
-        return g_strdup(_("Fatal database error"));
+    case DB_Error:
+        return g_strdup(_("Remote database error"));
     case LOCAL_STATUS_CODE + DB_Fatal:
         /* This can happen when EDS is borked, restart it may help... */
         return g_strdup(_("There is a problem with the local database. "
                           "Syncing again or rebooting may help."));
-    case DB_Error:
-        return g_strdup(_("Database error"));
     case DB_Full:
-        return g_strdup(_("No space left"));
+        return g_strdup(_("No space on disk"));
     case LOCERR_PROCESSMSG:
         return g_strdup(_("Failed to process SyncML"));
     case LOCERR_AUTHFAIL:
@@ -2941,11 +3217,17 @@ get_error_string_for_code (int error_code, SyncErrorResponse *response)
         }
         return g_strdup(_("We were unable to connect to the server. The problem "
                           "could be temporary or there could be something wrong "
-                          "with the server settings."));
+                          "with the settings."));
     case LOCERR_BADURL:
-        return g_strdup(_("URL is bad"));
+        if (response) {
+            *response = SYNC_ERROR_RESPONSE_SETTINGS_OPEN;
+        }
+        return g_strdup(_("The server URL is bad"));
     case LOCERR_SRVNOTFOUND:
-        return g_strdup(_("Server not found"));
+        if (response) {
+            *response = SYNC_ERROR_RESPONSE_SETTINGS_OPEN;
+        }
+        return g_strdup(_("The server was not found"));
     default:
         return g_strdup_printf (_("Error %d"), error_code);
     }
index 7572363..389c704 100644 (file)
@@ -1,12 +1,5 @@
 # generic rules for MuxWidgets
 
-style "mux-win" {
-    bg[NORMAL] = "#4a535a"
-    MuxWindow::title-bar-bg = "#333333"
-    MuxWindow::title-bar-fg = "#c2c2c2"
-}
-class "MuxWindow" style "mux-win"
-
 style "mux-frame" {
     bg[NORMAL] = "#ffffff"
     bg[INSENSITIVE] = "#ffffff"
@@ -18,6 +11,11 @@ class "MuxFrame" style "mux-frame"
 
 # sync-ui specific rules
 
+style "meego-win" {
+    bg[NORMAL] = "#4a535a"
+}
+widget "meego_win" style "meego-win"
+
 style "data-box" {
     bg[NORMAL] = "#ececec"
     bg[INSENSITIVE] = "#ececec"
index 077a160..d632895 100644 (file)
   <!-- interface-naming-policy toplevel-contextual -->
   <widget class="GtkWindow" id="sync_win">
     <property name="width_request">1024</property>
-    <property name="border_width">5</property>
     <property name="title" translatable="yes">Sync</property>
     <property name="default_width">800</property>
     <property name="default_height">550</property>
     <child>
-      <widget class="GtkHBox" id="hbox2">
+      <widget class="GtkVBox" id="window_child">
         <property name="visible">True</property>
-        <property name="spacing">5</property>
         <child>
-          <widget class="GtkVBox" id="vbox2">
+          <widget class="GtkHBox" id="hbox2">
             <property name="visible">True</property>
-            <property name="orientation">vertical</property>
+            <property name="border_width">4</property>
+            <property name="spacing">4</property>
             <child>
-              <widget class="GtkFrame" id="main_frame">
+              <widget class="GtkVBox" id="vbox2">
                 <property name="visible">True</property>
-                <property name="label_xalign">0</property>
-                <property name="shadow_type">none</property>
+                <property name="orientation">vertical</property>
                 <child>
-                  <widget class="GtkVBox" id="main_box">
+                  <widget class="GtkFrame" id="main_frame">
                     <property name="visible">True</property>
-                    <property name="orientation">vertical</property>
+                    <property name="label_xalign">0</property>
+                    <property name="shadow_type">none</property>
                     <child>
-                      <widget class="GtkHBox" id="hbox3">
+                      <widget class="GtkVBox" id="main_box">
                         <property name="visible">True</property>
+                        <property name="orientation">vertical</property>
                         <child>
-                          <widget class="GtkHBox" id="server_icon_box">
-                            <property name="width_request">48</property>
-                            <property name="height_request">48</property>
+                          <widget class="GtkHBox" id="hbox3">
                             <property name="visible">True</property>
                             <child>
-                              <widget class="GtkImage" id="sync_service_image">
+                              <widget class="GtkHBox" id="server_icon_box">
+                                <property name="width_request">48</property>
+                                <property name="height_request">48</property>
                                 <property name="visible">True</property>
-                                <property name="stock">gtk-missing-image</property>
-                                <property name="icon-size">6</property>
+                                <child>
+                                  <widget class="GtkImage" id="sync_service_image">
+                                    <property name="visible">True</property>
+                                    <property name="stock">gtk-missing-image</property>
+                                    <property name="icon-size">6</property>
+                                  </widget>
+                                  <packing>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
                               </widget>
                               <packing>
+                                <property name="expand">False</property>
+                                <property name="padding">10</property>
                                 <property name="position">0</property>
                               </packing>
                             </child>
+                            <child>
+                              <widget class="GtkLabel" id="sync_service_label">
+                                <property name="visible">True</property>
+                                <property name="xalign">0</property>
+                                <property name="yalign">0.20000000298023224</property>
+                                <property name="use_markup">True</property>
+                                <property name="ellipsize">end</property>
+                                <property name="max_width_chars">42</property>
+                              </widget>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="padding">5</property>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <widget class="GtkVBox" id="autosync_box">
+                                <property name="visible">True</property>
+                                <property name="border_width">6</property>
+                                <property name="orientation">vertical</property>
+                                <property name="spacing">4</property>
+                                <child>
+                                  <placeholder/>
+                                </child>
+                                <child>
+                                  <placeholder/>
+                                </child>
+                              </widget>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="padding">8</property>
+                                <property name="pack_type">end</property>
+                                <property name="position">2</property>
+                              </packing>
+                            </child>
                           </widget>
                           <packing>
                             <property name="expand">False</property>
-                            <property name="padding">10</property>
+                            <property name="padding">16</property>
                             <property name="position">0</property>
                           </packing>
                         </child>
                         <child>
-                          <widget class="GtkLabel" id="sync_service_label">
-                            <property name="visible">True</property>
-                            <property name="xalign">0</property>
-                            <property name="yalign">0.80000001192092896</property>
-                            <property name="use_markup">True</property>
-                            <property name="ellipsize">end</property>
-                            <property name="max_width_chars">45</property>
-                          </widget>
-                          <packing>
-                            <property name="expand">False</property>
-                            <property name="padding">5</property>
-                            <property name="position">1</property>
-                          </packing>
-                        </child>
-                      </widget>
-                      <packing>
-                        <property name="expand">False</property>
-                        <property name="padding">16</property>
-                        <property name="position">0</property>
-                      </packing>
-                    </child>
-                    <child>
-                      <widget class="GtkVBox" id="vbox5">
-                        <property name="visible">True</property>
-                        <property name="orientation">vertical</property>
-                        <child>
-                          <widget class="GtkEventBox" id="sync_data_and_type_box">
+                          <widget class="GtkVBox" id="vbox5">
                             <property name="visible">True</property>
+                            <property name="orientation">vertical</property>
                             <child>
-                              <widget class="GtkVBox" id="vbox15">
+                              <widget class="GtkEventBox" id="sync_data_and_type_box">
                                 <property name="visible">True</property>
-                                <property name="orientation">vertical</property>
                                 <child>
-                                  <widget class="GtkHBox" id="hbox15">
+                                  <widget class="GtkVBox" id="vbox15">
                                     <property name="visible">True</property>
+                                    <property name="orientation">vertical</property>
                                     <child>
-                                      <widget class="GtkVBox" id="vbox16">
+                                      <widget class="GtkHBox" id="hbox15">
                                         <property name="visible">True</property>
-                                        <property name="orientation">vertical</property>
                                         <child>
-                                          <widget class="GtkHBox" id="service_error_box">
+                                          <widget class="GtkVBox" id="vbox16">
                                             <property name="visible">True</property>
                                             <property name="orientation">vertical</property>
                                             <child>
-                                              <placeholder/>
+                                              <widget class="GtkHBox" id="service_error_box">
+                                                <property name="visible">True</property>
+                                                <property name="orientation">vertical</property>
+                                                <child>
+                                                  <placeholder/>
+                                                </child>
+                                              </widget>
+                                              <packing>
+                                                <property name="position">0</property>
+                                              </packing>
                                             </child>
-                                          </widget>
-                                          <packing>
-                                            <property name="position">0</property>
-                                          </packing>
-                                        </child>
-                                        <child>
-                                          <widget class="GtkVBox" id="service_box">
-                                            <property name="orientation">vertical</property>
                                             <child>
-                                              <widget class="GtkFrame" id="frame2">
-                                                <property name="visible">True</property>
-                                                <property name="label_xalign">0</property>
-                                                <property name="shadow_type">none</property>
+                                              <widget class="GtkVBox" id="service_box">
+                                                <property name="orientation">vertical</property>
                                                 <child>
-                                                  <widget class="GtkAlignment" id="alignment1">
+                                                  <widget class="GtkFrame" id="frame2">
                                                     <property name="visible">True</property>
-                                                    <property name="top_padding">5</property>
-                                                    <property name="left_padding">12</property>
+                                                    <property name="label_xalign">0</property>
+                                                    <property name="shadow_type">none</property>
                                                     <child>
-                                                      <widget class="GtkVBox" id="sources_box">
+                                                      <widget class="GtkAlignment" id="alignment1">
                                                         <property name="visible">True</property>
-                                                        <property name="orientation">vertical</property>
+                                                        <property name="top_padding">5</property>
+                                                        <property name="left_padding">12</property>
                                                         <child>
-                                                          <placeholder/>
-                                                        </child>
-                                                        <child>
-                                                          <placeholder/>
-                                                        </child>
-                                                        <child>
-                                                          <placeholder/>
-                                                        </child>
-                                                        <child>
-                                                          <placeholder/>
+                                                          <widget class="GtkVBox" id="sources_box">
+                                                            <property name="visible">True</property>
+                                                            <property name="orientation">vertical</property>
+                                                            <child>
+                                                            <placeholder/>
+                                                            </child>
+                                                            <child>
+                                                            <placeholder/>
+                                                            </child>
+                                                            <child>
+                                                            <placeholder/>
+                                                            </child>
+                                                            <child>
+                                                            <placeholder/>
+                                                            </child>
+                                                          </widget>
                                                         </child>
                                                       </widget>
                                                     </child>
+                                                    <child>
+                                                      <placeholder/>
+                                                      <packing>
+                                                        <property name="type">label_item</property>
+                                                      </packing>
+                                                    </child>
                                                   </widget>
+                                                  <packing>
+                                                    <property name="expand">False</property>
+                                                    <property name="fill">False</property>
+                                                    <property name="position">0</property>
+                                                  </packing>
                                                 </child>
                                                 <child>
                                                   <placeholder/>
-                                                  <packing>
-                                                    <property name="type">label_item</property>
-                                                  </packing>
                                                 </child>
                                               </widget>
                                               <packing>
-                                                <property name="expand">False</property>
-                                                <property name="fill">False</property>
-                                                <property name="position">0</property>
+                                                <property name="position">1</property>
                                               </packing>
                                             </child>
-                                            <child>
-                                              <placeholder/>
-                                            </child>
                                           </widget>
                                           <packing>
-                                            <property name="position">1</property>
+                                            <property name="padding">55</property>
+                                            <property name="position">0</property>
                                           </packing>
                                         </child>
                                       </widget>
                                       <packing>
-                                        <property name="padding">55</property>
+                                        <property name="expand">False</property>
+                                        <property name="fill">False</property>
+                                        <property name="padding">6</property>
                                         <property name="position">0</property>
                                       </packing>
                                     </child>
                                   </widget>
-                                  <packing>
-                                    <property name="expand">False</property>
-                                    <property name="fill">False</property>
-                                    <property name="padding">6</property>
-                                    <property name="position">0</property>
-                                  </packing>
                                 </child>
                               </widget>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <placeholder/>
                             </child>
                           </widget>
                           <packing>
                             <property name="expand">False</property>
-                            <property name="position">0</property>
+                            <property name="position">1</property>
                           </packing>
                         </child>
-                        <child>
-                          <placeholder/>
-                        </child>
+                      </widget>
+                    </child>
+                    <child>
+                      <widget class="GtkLabel" id="label13">
+                        <property name="visible">True</property>
+                        <property name="use_markup">True</property>
                       </widget>
                       <packing>
-                        <property name="expand">False</property>
-                        <property name="position">1</property>
+                        <property name="type">label_item</property>
                       </packing>
                     </child>
                   </widget>
-                </child>
-                <child>
-                  <widget class="GtkLabel" id="label13">
-                    <property name="visible">True</property>
-                    <property name="use_markup">True</property>
-                  </widget>
                   <packing>
-                    <property name="type">label_item</property>
+                    <property name="position">0</property>
                   </packing>
                 </child>
               </widget>
                 <property name="position">0</property>
               </packing>
             </child>
-          </widget>
-          <packing>
-            <property name="position">0</property>
-          </packing>
-        </child>
-        <child>
-          <widget class="GtkVBox" id="vbox3">
-            <property name="width_request">250</property>
-            <property name="visible">True</property>
-            <property name="orientation">vertical</property>
-            <property name="spacing">5</property>
             <child>
-              <widget class="GtkVBox" id="vbox9">
+              <widget class="GtkVBox" id="vbox3">
+                <property name="width_request">250</property>
                 <property name="visible">True</property>
                 <property name="orientation">vertical</property>
+                <property name="spacing">5</property>
                 <child>
-                  <widget class="GtkFrame" id="log_frame">
+                  <widget class="GtkVBox" id="vbox9">
                     <property name="visible">True</property>
-                    <property name="label_xalign">0</property>
-                    <property name="shadow_type">in</property>
+                    <property name="orientation">vertical</property>
                     <child>
-                      <widget class="GtkVBox" id="vbox18">
+                      <widget class="GtkFrame" id="log_frame">
                         <property name="visible">True</property>
-                        <property name="orientation">vertical</property>
+                        <property name="label_xalign">0</property>
+                        <property name="shadow_type">in</property>
                         <child>
-                          <widget class="GtkVBox" id="vbox10">
+                          <widget class="GtkVBox" id="vbox18">
                             <property name="visible">True</property>
                             <property name="orientation">vertical</property>
                             <child>
-                              <widget class="GtkHBox" id="hbox7">
+                              <widget class="GtkVBox" id="vbox10">
                                 <property name="visible">True</property>
+                                <property name="orientation">vertical</property>
                                 <child>
-                                  <widget class="GtkLabel" id="sync_status_label">
-                                    <property name="visible">True</property>
-                                    <property name="xalign">0</property>
-                                  </widget>
-                                  <packing>
-                                    <property name="expand">False</property>
-                                    <property name="fill">False</property>
-                                    <property name="padding">6</property>
-                                    <property name="position">0</property>
-                                  </packing>
-                                </child>
-                                <child>
-                                  <widget class="GtkVBox" id="spinner_box">
-                                    <property name="height_request">24</property>
+                                  <widget class="GtkHBox" id="hbox7">
                                     <property name="visible">True</property>
-                                    <property name="orientation">vertical</property>
                                     <child>
-                                      <widget class="GtkImage" id="spinner_image">
+                                      <widget class="GtkLabel" id="sync_status_label">
                                         <property name="visible">True</property>
-                                        <property name="stock">gtk-missing-image</property>
+                                        <property name="xalign">0</property>
                                       </widget>
                                       <packing>
                                         <property name="expand">False</property>
+                                        <property name="fill">False</property>
+                                        <property name="padding">6</property>
                                         <property name="position">0</property>
                                       </packing>
                                     </child>
+                                    <child>
+                                      <widget class="GtkVBox" id="spinner_box">
+                                        <property name="height_request">24</property>
+                                        <property name="visible">True</property>
+                                        <property name="orientation">vertical</property>
+                                        <child>
+                                          <widget class="GtkImage" id="spinner_image">
+                                            <property name="visible">True</property>
+                                            <property name="stock">gtk-missing-image</property>
+                                          </widget>
+                                          <packing>
+                                            <property name="expand">False</property>
+                                            <property name="position">0</property>
+                                          </packing>
+                                        </child>
+                                      </widget>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="position">1</property>
+                                      </packing>
+                                    </child>
                                   </widget>
                                   <packing>
-                                    <property name="expand">False</property>
-                                    <property name="position">1</property>
+                                    <property name="position">0</property>
                                   </packing>
                                 </child>
                               </widget>
                               <packing>
+                                <property name="expand">False</property>
+                                <property name="padding">10</property>
                                 <property name="position">0</property>
                               </packing>
                             </child>
-                          </widget>
-                          <packing>
-                            <property name="expand">False</property>
-                            <property name="padding">10</property>
-                            <property name="position">0</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <widget class="GtkHBox" id="hbox20">
-                            <property name="visible">True</property>
                             <child>
-                              <widget class="GtkVBox" id="info_box">
+                              <widget class="GtkHBox" id="hbox20">
                                 <property name="visible">True</property>
-                                <property name="orientation">vertical</property>
                                 <child>
-                                  <widget class="GtkHBox" id="no_connection_box">
+                                  <widget class="GtkVBox" id="info_box">
+                                    <property name="visible">True</property>
+                                    <property name="orientation">vertical</property>
                                     <child>
-                                      <placeholder/>
+                                      <widget class="GtkHBox" id="no_connection_box">
+                                        <child>
+                                          <placeholder/>
+                                        </child>
+                                      </widget>
+                                      <packing>
+                                        <property name="position">0</property>
+                                      </packing>
                                     </child>
                                   </widget>
                                   <packing>
+                                    <property name="expand">False</property>
+                                    <property name="padding">5</property>
                                     <property name="position">0</property>
                                   </packing>
                                 </child>
                               <packing>
                                 <property name="expand">False</property>
                                 <property name="padding">5</property>
-                                <property name="position">0</property>
-                              </packing>
-                            </child>
-                          </widget>
-                          <packing>
-                            <property name="expand">False</property>
-                            <property name="padding">5</property>
-                            <property name="position">1</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <widget class="GtkHBox" id="hbox17">
-                            <property name="height_request">25</property>
-                            <property name="visible">True</property>
-                            <child>
-                              <widget class="GtkProgressBar" id="progressbar">
-                                <property name="text_xalign">0.029999999329447746</property>
-                                <property name="ellipsize">end</property>
-                              </widget>
-                              <packing>
-                                <property name="padding">5</property>
-                                <property name="pack_type">end</property>
-                                <property name="position">0</property>
+                                <property name="position">1</property>
                               </packing>
                             </child>
-                          </widget>
-                          <packing>
-                            <property name="expand">False</property>
-                            <property name="fill">False</property>
-                            <property name="position">2</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <widget class="GtkHBox" id="hbox6">
-                            <property name="visible">True</property>
                             <child>
-                              <widget class="GtkVBox" id="vbox8">
+                              <widget class="GtkHBox" id="hbox17">
+                                <property name="height_request">25</property>
                                 <property name="visible">True</property>
-                                <property name="orientation">vertical</property>
-                                <property name="spacing">10</property>
                                 <child>
-                                  <widget class="GtkLabel" id="action_label">
-                                    <property name="visible">True</property>
-                                    <property name="xalign">0</property>
-                                    <property name="label" translatable="yes" comments="title for the buttons on the right side of main view">&lt;b&gt;Actions&lt;/b&gt;</property>
-                                    <property name="use_markup">True</property>
+                                  <widget class="GtkProgressBar" id="progressbar">
+                                    <property name="text_xalign">0.029999999329447746</property>
+                                    <property name="ellipsize">end</property>
                                   </widget>
                                   <packing>
+                                    <property name="padding">5</property>
+                                    <property name="pack_type">end</property>
                                     <property name="position">0</property>
                                   </packing>
                                 </child>
+                              </widget>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">2</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <widget class="GtkHBox" id="hbox6">
+                                <property name="visible">True</property>
                                 <child>
-                                  <widget class="GtkButton" id="sync_btn">
-                                    <property name="label">Sync now</property>
-                                    <property name="visible">True</property>
-                                    <property name="can_focus">True</property>
-                                    <property name="receives_default">True</property>
-                                  </widget>
-                                  <packing>
-                                    <property name="fill">False</property>
-                                    <property name="position">1</property>
-                                  </packing>
-                                </child>
-                                <child>
-                                  <widget class="GtkButton" id="change_service_btn">
+                                  <widget class="GtkVBox" id="vbox8">
                                     <property name="visible">True</property>
-                                    <property name="can_focus">True</property>
-                                    <property name="receives_default">True</property>
+                                    <property name="orientation">vertical</property>
+                                    <property name="spacing">10</property>
                                     <child>
-                                      <widget class="GtkLabel" id="label15">
+                                      <widget class="GtkLabel" id="action_label">
                                         <property name="visible">True</property>
-                                        <property name="label" translatable="yes" comments="Button in main view, right side. Keep to below 20 chars per line, feel free to use two lines">Change or edit
+                                        <property name="xalign">0</property>
+                                        <property name="label" translatable="yes" comments="title for the buttons on the right side of main view">&lt;b&gt;Actions&lt;/b&gt;</property>
+                                        <property name="use_markup">True</property>
+                                      </widget>
+                                      <packing>
+                                        <property name="position">0</property>
+                                      </packing>
+                                    </child>
+                                    <child>
+                                      <widget class="GtkButton" id="sync_btn">
+                                        <property name="label">Sync now</property>
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">True</property>
+                                        <property name="receives_default">True</property>
+                                      </widget>
+                                      <packing>
+                                        <property name="fill">False</property>
+                                        <property name="position">1</property>
+                                      </packing>
+                                    </child>
+                                    <child>
+                                      <widget class="GtkButton" id="change_service_btn">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">True</property>
+                                        <property name="receives_default">True</property>
+                                        <child>
+                                          <widget class="GtkLabel" id="label15">
+                                            <property name="visible">True</property>
+                                            <property name="label" translatable="yes" comments="Button in main view, right side. Keep to below 20 chars per line, feel free to use two lines">Change or edit
 sync service</property>
-                                        <property name="justify">center</property>
+                                            <property name="justify">center</property>
+                                          </widget>
+                                        </child>
                                       </widget>
+                                      <packing>
+                                        <property name="fill">False</property>
+                                        <property name="position">2</property>
+                                      </packing>
                                     </child>
-                                  </widget>
-                                  <packing>
-                                    <property name="fill">False</property>
-                                    <property name="position">2</property>
-                                  </packing>
-                                </child>
-                                <child>
-                                  <widget class="GtkButton" id="emergency_btn">
-                                    <property name="label" translatable="yes" comments="button in main view, right side. Keep length to 20 characters or so, use two lines if needed">Fix a sync
+                                    <child>
+                                      <widget class="GtkButton" id="emergency_btn">
+                                        <property name="label" translatable="yes" comments="button in main view, right side. Keep length to 20 characters or so, use two lines if needed">Fix a sync
 emergency</property>
-                                    <property name="visible">True</property>
-                                    <property name="can_focus">True</property>
-                                    <property name="receives_default">True</property>
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">True</property>
+                                        <property name="receives_default">True</property>
+                                      </widget>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="fill">False</property>
+                                        <property name="position">3</property>
+                                      </packing>
+                                    </child>
                                   </widget>
                                   <packing>
-                                    <property name="expand">False</property>
-                                    <property name="fill">False</property>
-                                    <property name="position">3</property>
+                                    <property name="padding">30</property>
+                                    <property name="position">0</property>
                                   </packing>
                                 </child>
                               </widget>
                               <packing>
-                                <property name="padding">30</property>
-                                <property name="position">0</property>
+                                <property name="expand">False</property>
+                                <property name="padding">20</property>
+                                <property name="position">3</property>
                               </packing>
                             </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
                           </widget>
-                          <packing>
-                            <property name="expand">False</property>
-                            <property name="padding">20</property>
-                            <property name="position">3</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <placeholder/>
                         </child>
                         <child>
-                          <placeholder/>
+                          <widget class="GtkLabel" id="label18">
+                            <property name="visible">True</property>
+                            <property name="use_markup">True</property>
+                          </widget>
+                          <packing>
+                            <property name="type">label_item</property>
+                          </packing>
                         </child>
                       </widget>
-                    </child>
-                    <child>
-                      <widget class="GtkLabel" id="label18">
-                        <property name="visible">True</property>
-                        <property name="use_markup">True</property>
-                      </widget>
                       <packing>
-                        <property name="type">label_item</property>
+                        <property name="position">0</property>
                       </packing>
                     </child>
                   </widget>
@@ -433,14 +462,14 @@ emergency</property>
                 </child>
               </widget>
               <packing>
-                <property name="position">0</property>
+                <property name="expand">False</property>
+                <property name="pack_type">end</property>
+                <property name="position">1</property>
               </packing>
             </child>
           </widget>
           <packing>
-            <property name="expand">False</property>
-            <property name="pack_type">end</property>
-            <property name="position">1</property>
+            <property name="position">0</property>
           </packing>
         </child>
       </widget>
@@ -458,6 +487,7 @@ emergency</property>
     <child>
       <widget class="GtkVBox" id="vbox6">
         <property name="visible">True</property>
+        <property name="border_width">4</property>
         <property name="orientation">vertical</property>
         <child>
           <widget class="GtkFrame" id="services_list_frame">
@@ -729,6 +759,29 @@ you can setup a service manually.</property>
             <property name="position">0</property>
           </packing>
         </child>
+        <child>
+          <widget class="GtkHBox" id="settings_close_box">
+            <property name="visible">True</property>
+            <child>
+              <widget class="GtkButton" id="settings_close_btn">
+                <property name="label" translatable="yes" comments="close button for settings window">Close</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+              </widget>
+              <packing>
+                <property name="expand">False</property>
+                <property name="padding">12</property>
+                <property name="pack_type">end</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
       </widget>
     </child>
   </widget>
@@ -744,6 +797,7 @@ you can setup a service manually.</property>
     <child>
       <widget class="GtkVBox" id="vbox14">
         <property name="visible">True</property>
+        <property name="border_width">4</property>
         <property name="orientation">vertical</property>
         <child>
           <widget class="GtkFrame" id="emergency_frame">
@@ -1251,6 +1305,29 @@ local information</property>
             <property name="position">0</property>
           </packing>
         </child>
+        <child>
+          <widget class="GtkHBox" id="emergency_close_box">
+            <property name="visible">True</property>
+            <child>
+              <widget class="GtkButton" id="emergency_close_btn">
+                <property name="label" translatable="yes" comments="close button for settings window">Close</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+              </widget>
+              <packing>
+                <property name="expand">False</property>
+                <property name="padding">12</property>
+                <property name="pack_type">end</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
       </widget>
     </child>
   </widget>
diff --git a/src/syncevo-dbus-server-startup.sh.in b/src/syncevo-dbus-server-startup.sh.in
new file mode 100755 (executable)
index 0000000..8d19cf7
--- /dev/null
@@ -0,0 +1,3 @@
+#! /bin/sh
+sleep 120
+exec @libexecdir@/syncevo-dbus-server 2>/dev/null 1>&1
index 291cbb5..96c13dc 100644 (file)
 #endif
 
 #include <syncevo/Logging.h>
+#include <syncevo/LogStdout.h>
+#include <syncevo/LogRedirect.h>
 #include <syncevo/util.h>
 #include <syncevo/SyncContext.h>
 #include <syncevo/SoupTransportAgent.h>
 #include <syncevo/SyncSource.h>
 #include <syncevo/SyncML.h>
 #include <syncevo/FileConfigNode.h>
+#include <syncevo/Cmdline.h>
 
 #include <synthesis/san.h>
 
 #include <boost/noncopyable.hpp>
 
 #include <glib-object.h>
+#include <glib/gi18n.h>
 #ifdef USE_GNOME_KEYRING
 extern "C" {
 #include <gnome-keyring.h>
 }
 #endif
 
+#ifdef HAS_NOTIFY
+#include <libnotify/notify.h>
+#endif
+
 class DBusMessage;
 static DBusMessage *SyncEvoHandleException(DBusMessage *msg);
 #define DBUS_CXX_EXCEPTION_HANDLER SyncEvoHandleException
@@ -66,6 +74,7 @@ using namespace SyncEvo;
 
 static GMainLoop *loop = NULL;
 static bool shutdownRequested = false;
+static LogRedirect *redirectPtr;
 
 /**
  * Anything that can be owned by a client, like a connection
@@ -224,8 +233,14 @@ private:
      */
     virtual bool setFilters(SyncConfig &config) { return false; }
 
-    /** utility method which constructs a SyncConfig which references a local configuration (never a template) */
-    boost::shared_ptr<DBusUserInterface> getLocalConfig(const std::string &configName);
+    /**
+     * utility method which constructs a SyncConfig which references a local configuration (never a template)
+     *
+     * In general, the config must exist, except in two cases:
+     * - configName = @default (considered always available)
+     * - mustExist = false (used when reading a templates for a context which might not exist yet)
+     */
+    boost::shared_ptr<DBusUserInterface> getLocalConfig(const std::string &configName, bool mustExist = true);
 };
 
 /**
@@ -248,31 +263,33 @@ template<> struct dbus_traits<ReadOperations::SourceDatabase> :
  */
 class AutoTerm {
     int m_refs;
-    guint m_elapsed;
-    guint m_interval;
+    time_t m_interval;
     guint m_checkSource;
+    time_t m_lastUsed;
 
-    static const guint TERM_INTERVAL = 5;
-
-    /* A callback is called in each TERM_INTERVAL seconds, registered to check whether the
-     * dbus server is timeout regurally.
-     * In reality it will be called after TERM_INTERVAL + delta, with delta being large
-     * if the D-Bus server is busy. Therefore m_elapsed will underestimate the real
-     * elapsed time. But because this only happens in a busy server and a busy server
-     * doesn't have to auto-terminate, this assumption could work.
+    /**
+     * This callback is called as soon as we might have to terminate.
+     * If it finds that the server has been used in the meantime, it
+     * will simply set another timeout and check again later.
      */
     static gboolean checkCallback(gpointer data) {
         AutoTerm *at = static_cast<AutoTerm*>(data);
-        // if no conncetions or attached clients
-        if(at->m_refs <= 0) {
-            at->m_elapsed += TERM_INTERVAL;
-            if(at->m_elapsed >= at->m_interval) {
+        if (!at->m_refs) {
+            // currently idle, but also long enough?
+            time_t now = time(NULL);
+            if (at->m_lastUsed + at->m_interval <= now) {
+                // yes, shut down event loop and daemon
                 shutdownRequested = true;
                 g_main_loop_quit(loop);
-                return FALSE;
+            } else {
+                // check again later
+                at->m_checkSource = g_timeout_add_seconds(at->m_lastUsed + at->m_interval - now,
+                                                          checkCallback,
+                                                          data);
             }
         }
-        return TRUE;
+        // always remove the current timeout, its job is done
+        return FALSE;
     }
 
  public:
@@ -280,39 +297,68 @@ class AutoTerm {
      * constructor
      * If interval is less than 0, it means 'unlimited' and never terminate
      */
-    AutoTerm(int interval) : m_refs(0), m_elapsed(0) {
-            if(interval <= 0) {
-                ref();
-                m_interval = 0;
-                m_checkSource = 0;
-            } else {
-                m_interval = interval;
-                // call checking every 5 seconds
-                // here we don't use add/remove new sources for we might
-                // make glib source id integer overflow since its id calculation
-                // only plus one each time
-                m_checkSource = g_timeout_add_seconds(TERM_INTERVAL, 
-                                                      (GSourceFunc) checkCallback,
-                                                      static_cast<gpointer>(this));
-            }
+    AutoTerm(int interval) :
+        m_refs(0),
+        m_checkSource(0),
+        m_lastUsed(0)
+    {
+        if (interval <= 0) {
+            m_interval = 0;
+            // increasing reference counts prevents shutdown forever
+            ref();
+        } else {
+            m_interval = interval;
         }
+        reset();
+    }
+
+    ~AutoTerm()
+    {
+        if (m_checkSource) {
+            g_source_remove(m_checkSource);
+        }
+    }
 
     //increase the actives objects
     void ref(int refs = 1) {  
         m_refs += refs; 
+        reset();
     }
 
     //decrease the actives objects
     void unref(int refs = 1) { 
         m_refs -= refs; 
         if(m_refs <= 0) {
-           reset();
            m_refs = 0;
         }
+        reset();
     }
 
-    void reset() {
-        m_elapsed = 0;
+    /**
+     * To be called each time the server interacts with a client,
+     * which includes adding or removing a client. If necessary,
+     * this installs a timeout to stop the daemon when it has been
+     * idle long enough.
+     */
+    void reset()
+    {
+        if (m_refs > 0) {
+            // in use, don't need timeout
+            if (m_checkSource) {
+                g_source_remove(m_checkSource);
+                m_checkSource = 0;
+            }
+        } else {
+            // An already active timeout will trigger at the chosen time,
+            // then notice that the server has been used in the meantime and
+            // reset the timer. Therefore we don't have to remove it.
+            m_lastUsed = time(NULL);
+            if (!m_checkSource) {
+                m_checkSource = g_timeout_add_seconds(m_interval,
+                                                      checkCallback,
+                                                      static_cast<gpointer>(this));
+            }
+        }
     }
 };
 
@@ -467,13 +513,428 @@ private:
     boost::shared_ptr<BluezAdapter> m_adapter;
 
     /** represents 'DefaultAdapterChanged' signal of org.bluez.Adapter*/
-    boost::shared_ptr<SignalWatch1<DBusObject_t> > m_adapterChanged;
+    SignalWatch1<DBusObject_t> m_adapterChanged;
 
     /** flag to indicate whether the calls are all returned */
     bool m_done;
 };
 
 /**
+ * a listener to listen changes of session 
+ * currently only used to track changes of running a sync in a session
+ */
+class SessionListener
+{
+public:
+    /**
+     * method is called when a sync is successfully started.
+     * Here 'successfully started' means the synthesis engine starts
+     * to access the sources.
+     */
+    virtual void syncSuccessStart() {}
+
+    /**
+     * method is called when a sync is done. Also
+     * sync status are passed.
+     */
+    virtual void syncDone(SyncMLStatus status) {}
+
+    virtual ~SessionListener() {}
+};
+
+/**
+ * Manager to manage automatic sync.
+ * Once a configuration is enabled with automatic sync, possibly http or obex-bt or both, one or more
+ * tasks for different URLs are added in the task map, grouped by their intervals. 
+ * A task have to be checked whether there is an existing same task in the working queue. Once actived,
+ * it is put in the working queue. 
+ *
+ * At any time, there is at most one session for the first task. Once it is active by DBusServer,
+ * we prepare it and make it ready to run. After completion, a new session is created again for the
+ * next task. And so on.
+ *
+ * The DBusServer is in charge of dispatching requests from dbus clients and automatic sync tasks.
+ * See DBusServer::run().
+ *
+ * Here there are 3 scenarios which have been considered to do automatic sync right now:
+ * 1) For a config enables autosync, an interval has passed.
+ * 2) Once users log in or resume and an interval has passed. Not implemented yet.
+ * 3) Evolution data server notify any changes. Not implemented yet. 
+ */
+class AutoSyncManager : public SessionListener
+{
+    DBusServer &m_server;
+
+    /**
+     * A single task for automatic sync.
+     * Each task maintain one task for only one sync URL, which never combines
+     * more than one sync URLs. The difference from 'syncURL' property here is
+     * that different URLs may have different transports with different statuses.
+     * Another reason is that SyncContext only use the first URL if it has many sync
+     * URLs when running. So we split, schedule and process them one by one. 
+     * Each task contains one peer name, peer duration and peer url.
+     * It is created in initialization and may be updated due to config change.
+     * It is scheduled by AutoSyncManager to be put in the working queue.
+     */
+    class AutoSyncTask
+    {
+     public:
+        /** the peer name of a config */
+        string m_peer;
+        /** the time that the peer must at least have been around (seconds) */
+        unsigned int m_delay;
+        /** the 'syncURL' used by synchronization. It always contains only one sync URL. */
+        string m_url;
+
+        AutoSyncTask(const string &peer, unsigned int delay, const string &url)
+            : m_peer(peer), m_delay(delay), m_url(url)
+        {}
+
+        /** compare whether two tasks are the same. May refine it later with more information */
+        bool operator==(const AutoSyncTask &right) const
+        {
+            if(boost::iequals(m_peer, right.m_peer) &&
+                    boost::iequals(m_url, right.m_url)) {
+                return true;
+            }
+            return false;
+        }
+    };
+
+    /**
+     * AutoSyncTaskList is used to manage sync tasks which are grouped by the
+     * interval. Each list has one timeout gsource.
+     */
+    class AutoSyncTaskList : public list<AutoSyncTask>
+    {
+        AutoSyncManager &m_manager;
+        /** the interval used to create timeout source (seconds) */
+        unsigned int m_interval;
+
+        /** timeout gsource */
+        GLibEvent m_source;
+
+        /** callback of timeout source */
+        static gboolean taskListTimeoutCb(gpointer data);
+
+     public:
+        AutoSyncTaskList(AutoSyncManager &manager, unsigned int interval)
+            : m_manager(manager), m_interval(interval), m_source(0) 
+        {}
+        ~AutoSyncTaskList() {
+            if(m_source) {
+                g_source_remove(m_source);
+            }
+        }
+
+        /** create timeout source once all tasks are added */
+        void createTimeoutSource();
+
+        /** check task list and put task into working queue */
+        void scheduleTaskList();
+    };
+
+#ifdef HAS_NOTIFY
+    /**
+     * This class is to send notifications to notification server.
+     * Notifications are sent via 'send'. Once a new noficication is
+     * to be sent, the old notification will be closed and a new one
+     * is created for the new requirement.
+     */
+    class Notification
+    {
+    public:
+        Notification(); 
+        ~Notification();
+
+        /** callback of click button(actions) of notification */
+        static void notifyAction(NotifyNotification *notify, gchar *action, gpointer userData);
+
+        /**
+         * send a notification in the notification server
+         * Action for 'view' may pop up a sync-ui, but needs some
+         * parameters. 'viewParams' is the params used by sync-ui.
+         */
+        void send(const char *summary, const char *body, const char *viewParams = NULL);
+    private:
+        /** flag to indicate whether libnotify is initalized successfully */
+        bool m_init;
+
+        /** flag to indicate whether libnotify accepts actions */
+        bool m_actions;
+
+        /** the current notification */
+        NotifyNotification *m_notification;
+    };
+#endif
+
+    /** init a config and set up auto sync task for it */
+    void initConfig(const string &configName);
+
+    /** remove tasks from m_peerMap and m_workQueue created from the config */
+    void remove(const string &configName);
+
+    /** a map to contain all auto sync tasks. All initialized tasks are stored here.
+     * Tasks here are grouped by auto sync interval */
+    typedef std::map<unsigned int, boost::shared_ptr<AutoSyncTaskList> > PeerMap;
+    PeerMap m_peerMap;
+
+    /** 
+     * a working queue that including tasks which are pending for doing sync.
+     * Tasks here are picked from m_peerMap and scheduled to do auto sync */
+    list<AutoSyncTask> m_workQueue;
+
+    /**
+     * the current active task, which may own a session 
+     */
+    boost::shared_ptr<AutoSyncTask> m_activeTask;
+
+    /** 
+     * the only session created for active task and is put in the session queue.
+     * at most one session at any time no matter how many tasks we actually have 
+     */
+    boost::shared_ptr<Session> m_session;
+
+    /** the current sync of session is successfully started */
+    bool m_syncSuccessStart;
+
+#ifdef HAS_NOTIFY
+    /** used to send notifications */
+    Notification m_notify;
+#endif
+
+    /** 
+     * It reads all peers which are enabled to do auto sync and store them in
+     * the m_peerMap and then add timeout sources in the main loop to schedule
+     * auto sync tasks.
+     */
+    void init();
+
+    /** operations on tasks queue */
+    void clearAllTasks() { m_workQueue.clear(); }
+
+    /** check m_peerMap and put all tasks in it to working queue */
+    void scheduleAll();
+
+    /** 
+     * add an auto sync task in the working queue
+     * Do check before adding a task in the working queue
+     * Return true if the task is added in the list.
+     */
+    bool addTask(const AutoSyncTask &syncTask);
+
+    /** find an auto sync task in the working queue or is running */
+    bool findTask(const AutoSyncTask &syncTask);
+
+    /** 
+     * check whether a task is suitable to put in the working queue
+     * Manager has the information needed to make the decision
+     */
+    bool taskLikelyToRun(const AutoSyncTask &syncTask);
+
+ public:
+    AutoSyncManager(DBusServer &server)
+        : m_server(server), m_syncSuccessStart(false) 
+    { 
+        init();
+    }
+
+    /**
+     * prevent dbus server automatic termination when it has
+     * any auto sync task enabled in the configs.
+     * If returning true, prevent automatic termination.
+     */
+    bool preventTerm() { return !m_peerMap.empty(); }
+
+    /**
+     * called when a config is changed. This causes re-loading the config 
+     */
+    void update(const string &configName);
+
+    /* Is there any auto sync task in the queue? */
+    bool hasTask() { return !m_workQueue.empty(); }
+
+    /** 
+     * pick the front task from the working queue and create a session for it.
+     * The session won't be used to do sync until it is active so 'prepare' is
+     * for calling 'sync' to make the session ready to run
+     * If there has been a session for the front task, do nothing
+     */
+    void startTask();
+
+    /** check whether the active session is owned by Automatic Sync Manger */
+    bool hasActiveSession();
+
+    /** set config and run sync to make the session ready to run */
+    void prepare();
+
+    /**
+     * Acts as a session listener to track sync statuses if the session is 
+     * belonged to auto sync manager to do auto sync. 
+     * Two methods to listen to session sync changes.
+     */
+    virtual void syncSuccessStart();
+    virtual void syncDone(SyncMLStatus status);
+};
+
+/**
+ * A timer helper to check whether now is timeout according to
+ * user's setting. Timeout is calculated in milliseconds
+ */ 
+class Timer {
+    timeval m_startTime;  ///< start time
+    unsigned long m_timeoutMs; ///< timeout in milliseconds, set by user
+
+    /**
+     * calculate duration between now and start time
+     * return value is in milliseconds
+     */
+    unsigned long duration(const timeval &minuend, const timeval &subtrahend)
+    {
+        unsigned long result = 0;
+        if(minuend.tv_sec > subtrahend.tv_sec || 
+                (minuend.tv_sec == subtrahend.tv_sec && minuend.tv_usec > subtrahend.tv_usec)) {
+            result = minuend.tv_sec - subtrahend.tv_sec;
+            result *= 1000;
+            result += (minuend.tv_usec - subtrahend.tv_usec) / 1000;
+        }
+        return result;
+    }
+
+ public:
+    /**
+     * constructor
+     * @param timeoutMs timeout in milliseconds
+     */
+    Timer(unsigned long timeoutMs = 0) : m_timeoutMs(timeoutMs)
+    {
+        reset();
+    }
+
+    /**
+     * reset the timer and mark start time as current time
+     */
+    void reset() { gettimeofday(&m_startTime, NULL); }
+
+    /**
+     * check whether it is timeout
+     */
+    bool timeout() 
+    {
+        return timeout(m_timeoutMs);
+    }
+
+    /** 
+     * check whether the duration timer records is longer than the given duration 
+     */
+    bool timeout(unsigned long timeoutMs)
+    {
+        timeval now;
+        gettimeofday(&now, NULL);
+        return duration(now, m_startTime) >= timeoutMs;
+    }
+};
+
+class PresenceStatus {
+    bool m_httpPresence;
+    bool m_btPresence;
+    bool m_initiated;
+    DBusServer &m_server;
+
+    /** two timers to record when the statuses of network and bt are changed */
+    Timer m_httpTimer;
+    Timer m_btTimer;
+
+    enum PeerStatus {
+        /* The transport is not available (local problem) */
+        NOTRANSPORT,
+        /* The peer is not contactable (remote problem) */
+        UNREACHABLE,
+        /* Not for sure whether the peer is presence but likely*/
+        MIGHTWORK,
+
+        INVALID
+    };
+
+    typedef map<string, vector<pair <string, PeerStatus> > > StatusMap;
+    typedef pair<const string, vector<pair <string, PeerStatus> > > StatusPair;
+    typedef pair <string, PeerStatus> PeerStatusPair;
+    StatusMap m_peers;
+
+    static std::string status2string (PeerStatus status) {
+        switch (status) {
+            case NOTRANSPORT:
+                return "no transport";
+                break;
+            case UNREACHABLE:
+                return "not present";
+                break;
+            case MIGHTWORK:
+                return "";
+                break;
+            case INVALID:
+                return "invalid transport status";
+        }
+        // not reached, keep compiler happy
+        return "";
+    }
+
+    public:
+    PresenceStatus (DBusServer &server)
+        :m_httpPresence (false), m_btPresence (false), m_initiated (false), m_server (server),
+        m_httpTimer(), m_btTimer()
+    {
+    }
+
+    enum TransportType{
+        HTTP_TRANSPORT,
+        BT_TRANSPORT,
+        INVALID_TRANSPORT
+    };
+
+    void init();
+
+    /* Implement DBusServer::checkPresence*/
+    void checkPresence (const string &peer, string& status, std::vector<std::string> &transport); 
+
+    void updateConfigPeers (const std::string &peer, const ReadOperations::Config_t &config);
+
+    void updatePresenceStatus (bool httpPresence, bool btPresence); 
+    void updatePresenceStatus (bool newStatus, TransportType type);
+
+    bool getHttpPresence() { return m_httpPresence; }
+    bool getBtPresence() { return m_btPresence; }
+    Timer& getHttpTimer() { return m_httpTimer; }
+    Timer& getBtTimer() { return m_btTimer; }
+};
+
+/*
+ * Implements org.moblin.connman.Manager
+ * GetProperty  : getPropCb
+ * PropertyChanged: propertyChanged
+ **/
+class ConnmanClient : public DBusRemoteObject
+{
+public:
+    ConnmanClient (DBusServer &server);
+    virtual const char *getDestination() const {return "org.moblin.connman";}
+    virtual const char *getPath() const {return "/";}
+    virtual const char *getInterface() const {return "org.moblin.connman.Manager";}
+    virtual DBusConnection *getConnection() const {return m_connmanConn.get();}
+
+    void propertyChanged(const string &name,
+                         const boost::variant<vector<string>, string> &prop);
+
+    void getPropCb(const std::map <std::string, boost::variant <std::vector <std::string> > >& props, const string &error);
+
+private:
+    DBusServer &m_server;
+    DBusConnectionPtr m_connmanConn;
+
+    SignalWatch2 <string,boost::variant<vector<string>, string> > m_propertyChanged;
+};
+
+/**
  * Implements the main org.syncevolution.Server interface.
  *
  * All objects created by it get a reference to the creating
@@ -482,7 +943,8 @@ private:
  * of these objects and deletes them before destructing itself,
  * that reference is guaranteed to remain valid.
  */
-class DBusServer : public DBusObjectHelper
+class DBusServer : public DBusObjectHelper,
+                   public LoggerBase
 {
     GMainLoop *m_loop;
     uint32_t m_lastSession;
@@ -546,9 +1008,6 @@ class DBusServer : public DBusObjectHelper
     // the index of last info request
     uint32_t m_lastInfoReq;
 
-    //automatic termination
-    AutoTerm m_autoTerm;
-
     // a hash to represent matched templates for devices, the key is
     // the peer name
     typedef std::map<string, boost::shared_ptr<SyncConfig::TemplateDescription> > MatchedTemplates;
@@ -565,13 +1024,6 @@ class DBusServer : public DBusObjectHelper
      */
     void clientGone(Client *c);
 
-    /**
-     * Returns new unique session ID. Implemented with a running
-     * counter. Checks for overflow, but not currently for active
-     * sessions.
-     */
-    std::string getNextSession();
-
     /** Server.Attach() */
     void attachClient(const Caller_t &caller,
                       const boost::shared_ptr<Watch> &watch);
@@ -641,7 +1093,7 @@ class DBusServer : public DBusObjectHelper
                        std::vector<std::string> &transports);
 
     /** Server.GetSessions() */
-    void getSessions(std::vector<std::string> &sessions);
+    void getSessions(std::vector<DBusObject_t> &sessions);
 
     /** Server.InfoResponse() */
     void infoResponse(const Caller_t &caller,
@@ -689,157 +1141,25 @@ class DBusServer : public DBusObjectHelper
                 const std::string &,
                 const std::map<string, string> &> infoRequest;
 
-    static gboolean connmanPoll (gpointer dbus_server);
-    DBusConnectionPtr m_connmanConn;
+    /** Server.LogOutput */
+    EmitSignal3<const DBusObject_t &,
+                string,
+                const std::string &> logOutput;
 
     friend class Session;
-    class PresenceStatus {
-        bool m_httpPresence;
-        bool m_btPresence;
-        bool m_initiated;
-        DBusServer &m_server;
-       
-        enum PeerStatus {
-            /* The transport is not available (local problem) */
-            NOTRANSPORT,
-            /* The peer is not contactable (remote problem) */
-            UNREACHABLE,
-            /* Not for sure whether the peer is presence but likely*/
-            MIGHTWORK,
-
-            INVALID
-        };
-
-        typedef map<string, vector<pair <string, PeerStatus> > > StatusMap;
-        typedef pair<const string, vector<pair <string, PeerStatus> > > StatusPair;
-        typedef pair <string, PeerStatus> PeerStatusPair;
-        StatusMap m_peers;
-
-        static std::string status2string (PeerStatus status) {
-            switch (status) {
-                case NOTRANSPORT:
-                    return "no transport";
-                    break;
-                case UNREACHABLE:
-                    return "not present";
-                    break;
-                case MIGHTWORK:
-                    return "";
-                    break;
-                case INVALID:
-                    return "invalid transport status";
-            }
-            // not reached, keep compiler happy
-            return "";
-        }
-
-        public:
-        PresenceStatus (DBusServer &server)
-            :m_httpPresence (false), m_btPresence (false), m_initiated (false), m_server (server)
-        {
-            init();
-        }
-        
-        void init(){
-            //initialize the configured peer list
-            if (!m_initiated) {
-                SyncConfig::ConfigList list = SyncConfig::getConfigs();
-                BOOST_FOREACH(const SyncConfig::ConfigList::value_type &server, list) {
-                    SyncConfig config (server.first);
-                    vector<string> urls = config.getSyncURL();
-                    m_peers[server.first].clear();
-                    BOOST_FOREACH (const string &url, urls) {
-                        m_peers[server.first].push_back(make_pair(url,MIGHTWORK));
-                    }
-                }
-                m_initiated = true;
-            }
-        }
-
-        /* Implement DBusServer::checkPresence*/
-        void checkPresence (const string &peer, string& status, std::vector<std::string> &transport) {
-
-            if (!m_initiated) {
-                //might triggered by updateConfigPeers
-                init();
-            }
-
-            string peerName = SyncConfig::normalizeConfigString (peer);
-            vector< pair<string, PeerStatus> > mytransports = m_peers[peerName];
-            if (mytransports.empty()) {
-                //wrong config name?
-                status = status2string(NOTRANSPORT);
-                transport.clear();
-                return;
-            }
-            PeerStatus mystatus = MIGHTWORK;
-            transport.clear();
-            //only if all transports are unavailable can we declare the peer
-            //status as unavailable
-            BOOST_FOREACH (PeerStatusPair &mytransport, mytransports) {
-                if (mytransport.second == MIGHTWORK) {
-                    transport.push_back (mytransport.first);
-                }
-            }
-            if (transport.empty()) {
-                mystatus = NOTRANSPORT;
-            }
-            status = status2string(mystatus);
-        }
-
-        void updateConfigPeers (const std::string &peer, const ReadOperations::Config_t &config) {
-            ReadOperations::Config_t::const_iterator iter = config.find ("");
-            if (iter != config.end()) {
-                //As a simple approach, just reinitialize the whole STATUSMAP
-                //it will cause later updatePresenceStatus resend all signals
-                //and a reload in checkPresence
-                m_initiated = false;
-            }
-        }
 
-        void updatePresenceStatus (bool httpPresence, bool btPresence) {
-            bool httpChanged = (m_httpPresence != httpPresence);
-            bool btChanged = (m_btPresence != btPresence);
-            m_httpPresence = httpPresence;
-            m_btPresence = btPresence;
+    PresenceStatus m_presence;
+    ConnmanClient m_connman;
 
-            if (m_initiated && !httpChanged && !btChanged) {
-                //nothing changed
-                return;
-            }
+    /** manager to automatic sync */
+    AutoSyncManager m_autoSync;
 
-            //initialize the configured peer list
-            bool initiated = m_initiated;
-            if (!m_initiated) {
-                init();
-            }
+    //automatic termination
+    AutoTerm m_autoTerm;
 
-            //iterate all configured peers and fire singals
-            BOOST_FOREACH (StatusPair &peer, m_peers) {
-                //iterate all possible transports
-                //TODO One peer might got more than one signals, avoid this
-                std::vector<pair<string, PeerStatus> > &transports = peer.second;
-                BOOST_FOREACH (PeerStatusPair &entry, transports) {
-                    string url = entry.first;
-                    if (boost::starts_with (url, "http") && (httpChanged || !initiated)) {
-                        entry.second = m_httpPresence ? MIGHTWORK: NOTRANSPORT;
-                        m_server.presence (peer.first, status2string (entry.second), entry.first);
-                        SE_LOG_DEBUG(NULL, NULL,
-                                     "http presence signal %s,%s,%s",
-                                     peer.first.c_str(),
-                                     status2string (entry.second).c_str(), entry.first.c_str());
-                    } else if (boost::starts_with (url, "obex-bt") && (btChanged || !initiated)) {
-                        entry.second = m_btPresence ? MIGHTWORK: NOTRANSPORT;
-                        m_server.presence (peer.first, status2string (entry.second), entry.first);
-                        SE_LOG_DEBUG(NULL, NULL,
-                                    "bluetooth presence signal %s,%s,%s",
-                                    peer.first.c_str(),
-                                    status2string (entry.second).c_str(), entry.first.c_str());
-                    }
-                }
-            }
-        }
-    }m_presence;
+    //records the parent logger, dbus server acts as logger to 
+    //send signals to clients and put logs in the parent logger.
+    LoggerBase &m_parentLogger;
 
 public:
     DBusServer(GMainLoop *loop, const DBusConnectionPtr &conn, int duration);
@@ -910,8 +1230,6 @@ public:
 
     PresenceStatus& getPresenceStatus() {return m_presence;}
 
-    DBusConnectionPtr getConnmanConnection() {return m_connmanConn;}
-
     void clearPeerTempls() { m_matchedTempls.clear(); }
     void addPeerTempl(const string &templName, const boost::shared_ptr<SyncConfig::TemplateDescription> peerTempl);
 
@@ -933,8 +1251,35 @@ public:
     void removeDevice(const string &deviceId);
     /** update a device with the given device information. If not found, do nothing */
     void updateDevice(const string &deviceId, const SyncConfig::DeviceDescription &device);
-};
 
+    /** emit a presence signal */
+    void emitPresence(const string &server, const string &status, const string &transport)
+    { 
+        presence(server, status, transport); 
+    }
+
+    /**
+     * Returns new unique session ID. Implemented with a running
+     * counter. Checks for overflow, but not currently for active
+     * sessions.
+     */
+    std::string getNextSession();
+
+    AutoSyncManager &getAutoSyncManager() { return m_autoSync; }
+
+    /**
+     * implement virtual method from LogStdout.
+     * Not only print the message in the console
+     * but also send them as signals to clients
+     */
+    virtual void messagev(Level level,
+                          const char *prefix,
+                          const char *file,
+                          int line,
+                          const char *function,
+                          const char *format,
+                          va_list args);
+};
 
 /**
  * Tracks a single client and all sessions and connections that it is
@@ -1131,6 +1476,9 @@ protected:
 
     virtual void reportStepCmd(sysync::uInt16 stepCmd);
 
+    /** called when a sync is successfully started */
+    virtual void syncSuccessStart(); 
+
     /**
      * Implement checkForSuspend and checkForAbort.
      * They will check whether dbus clients suspend
@@ -1152,56 +1500,6 @@ protected:
 };
 
 /**
- * A timer helper to check whether now is timeout according to
- * user's setting. Timeout is calculated in milliseconds
- */ 
-class Timer {
-    timeval m_startTime;  ///< start time
-    unsigned long m_timeoutMs; ///< timeout in milliseconds, set by user
-
-    /**
-     * calculate duration between now and start time
-     * return value is in milliseconds
-     */
-    unsigned long duration(const timeval &minuend, const timeval &subtrahend)
-    {
-        unsigned long result = 0;
-        if(minuend.tv_sec > subtrahend.tv_sec || 
-                (minuend.tv_sec == subtrahend.tv_sec && minuend.tv_usec > subtrahend.tv_usec)) {
-            result = minuend.tv_sec - subtrahend.tv_sec;
-            result *= 1000;
-            result += (minuend.tv_usec - subtrahend.tv_usec) / 1000;
-        }
-        return result;
-    }
-
- public:
-    /**
-     * constructor
-     * @param timeoutMs timeout in milliseconds
-     */
-    Timer(unsigned long timeoutMs) : m_timeoutMs(timeoutMs)
-    {
-        reset();
-    }
-
-    /**
-     * reset the timer and mark start time as current time
-     */
-    void reset() { gettimeofday(&m_startTime, NULL); }
-
-    /**
-     * check whether it is timeout
-     */
-    bool timeout() 
-    {
-        timeval now;
-        gettimeofday(&now, NULL);
-        return duration(now, m_startTime) >= m_timeoutMs;
-    }
-};
-
-/**
  * Hold progress info and try to estimate current progress
  */
 class ProgressData {
@@ -1349,6 +1647,8 @@ private:
     string m_source;
 };
 
+class CmdlineWrapper;
+
 /**
  * Represents and implements the Session interface.  Use
  * boost::shared_ptr to track it and ensure that there are references
@@ -1380,6 +1680,9 @@ class Session : public DBusObjectHelper,
     /** whether dbus clients set temporary configs */
     bool m_tempConfig;
 
+    /** whether dbus clients update or clear configs, not include temporary set */
+    bool m_setConfig;
+
     /**
      * True while clients are allowed to make calls other than Detach(),
      * which is always allowed. Some calls are not allowed while this
@@ -1389,6 +1692,11 @@ class Session : public DBusObjectHelper,
     bool m_active;
 
     /**
+     * Indicates whether this session was initiated by the peer or locally.
+     */
+    bool m_remoteInitiated;
+
+    /**
      * The SyncEvolution instance which currently prepares or runs a sync.
      */
     boost::shared_ptr<DBusSync> m_sync;
@@ -1444,20 +1752,24 @@ class Session : public DBusObjectHelper,
 
     enum RunOperation {
         OP_SYNC = 0,
-        OP_RESTORE
+        OP_RESTORE = 1,
+        OP_CMDLINE = 2,
+        OP_NULL
     };
 
     static string runOpToString(RunOperation op);
 
     RunOperation m_runOperation;
 
+    /** listener to listen to changes of sync */
+    SessionListener *m_listener;
+
+    /** Cmdline to execute command line args */
+    boost::shared_ptr<CmdlineWrapper> m_cmdline;
+
     /** Session.Detach() */
     void detach(const Caller_t &caller);
 
-    /** Session.SetConfig() */
-    void setConfig(bool update, bool temporary,
-                   const ReadOperations::Config_t &config);
-
     /** Session.GetStatus() */
     void getStatus(std::string &status,
                    uint32_t &error,
@@ -1472,6 +1784,9 @@ class Session : public DBusObjectHelper,
     /** Session.checkPresence() */
     void checkPresence (string &status);
 
+    /** Session.Execute() */
+    void execute(const vector<string> &args, const map<string, string> &vars);
+
     /**
      * Must be called each time that properties changing the
      * overall status are changed. Ensures that the corresponding
@@ -1505,8 +1820,10 @@ public:
     ~Session();
 
     enum {
+        PRI_CMDLINE = -10,
         PRI_DEFAULT = 0,
-        PRI_CONNECTION = 10
+        PRI_CONNECTION = 10,
+        PRI_AUTOSYNC = 20
     };
 
     /**
@@ -1544,7 +1861,7 @@ public:
     /**
      * TRUE if the session is ready to take over control
      */
-    bool readyToRun() { return (m_syncStatus != SYNC_DONE) && m_sync; }
+    bool readyToRun() { return (m_syncStatus != SYNC_DONE) && (m_runOperation != OP_NULL); }
 
     /**
      * transfer control to the session for the duration of the sync,
@@ -1558,6 +1875,8 @@ public:
      */
     void setActive(bool active);
 
+    bool getActive() { return m_active; }
+
     void syncProgress(sysync::TProgressEventEnum type,
                       int32_t extra1, int32_t extra2, int32_t extra3);
     void sourceProgress(sysync::TProgressEventEnum type,
@@ -1567,6 +1886,10 @@ public:
                        const string &descr, 
                        const ConfigPasswordKey &key);
 
+    /** Session.SetConfig() */
+    void setConfig(bool update, bool temporary,
+                   const ReadOperations::Config_t &config);
+
     typedef StringMap SourceModes_t;
     /** Session.Sync() */
     void sync(const std::string &mode, const SourceModes_t &source_modes);
@@ -1585,11 +1908,131 @@ public:
      */
     void setStepInfo(bool isWaiting); 
 
+    /** sync is successfully started */
+    void syncSuccessStart();
+
+    /**
+     * add a listener of the session. Old set listener is returned
+     */
+    SessionListener* addListener(SessionListener *listener);
+
+    void setRemoteInitiated (bool remote) { m_remoteInitiated = remote;}
 private:
     /** set m_syncFilter and m_sourceFilters to config */
     virtual bool setFilters(SyncConfig &config);
 };
 
+/**
+ * a wrapper to maintain the execution of command line 
+ * arguments from dbus clients. It is in charge of
+ * redirecting output of cmd line to logging system.
+ */
+class CmdlineWrapper
+{
+    /**
+     * inherit from stream buf to redirect the output.
+     * Set a log until we gets a '\n' separator since we know
+     * the command line message often ends with '\n'. The reason
+     * is to avoid setting less characters in one log and thus
+     * sending many signals to dbus clients.
+     */
+    class CmdlineStreamBuf : public std::streambuf
+    {
+    public:
+        virtual ~CmdlineStreamBuf()
+        {
+            //flush cached characters
+            if(!m_str.empty()) {
+                SE_LOG(LoggerBase::SHOW, NULL, NULL, "%s", m_str.c_str());
+            }
+        }
+    protected:
+        /**
+         * inherit from std::streambuf, all characters are cached in m_str
+         * until a character '\n' is reached.
+         */
+        virtual int_type overflow (int_type ch) {
+            if(ch == '\n') {
+                //don't append this character for logging system will append it
+                SE_LOG(LoggerBase::SHOW, NULL, NULL, "%s", m_str.c_str());
+                m_str.clear();
+            } else if (ch != EOF) {
+                m_str += ch;
+            }
+            return ch;
+        }
+
+        /** the cached output characters */
+        string m_str;
+    };
+
+    /** streambuf used for m_cmdlineOutStream */
+    CmdlineStreamBuf m_outStreamBuf;
+
+    /** stream for command line out and err arguments */
+    std::ostream m_cmdlineOutStream;
+
+    /**
+     * implement factory method to create DBusSync instances
+     * This can check 'abort' and 'suspend' command from clients.
+     */
+    class DBusCmdline : public Cmdline {
+        Session &m_session;
+    public:
+        DBusCmdline(Session &session,
+                    const vector<string> &args,
+                    ostream &out,
+                    ostream &err)
+            :Cmdline(args, out, err), m_session(session)
+        {}
+
+        SyncContext* createSyncClient() {
+            return new DBusSync(m_server, m_session);
+        }
+    };
+
+    /** instance to run command line arguments */
+    DBusCmdline m_cmdline;
+
+    /** environment variables passed from client */
+    map<string, string> m_envVars;
+
+public:
+    /**
+     * constructor to create cmdline instance.
+     * Here just one stream is used and error message in
+     * command line is output to this stream for it is
+     * different from Logger::ERROR.
+     */
+    CmdlineWrapper(Session &session,
+                   const vector<string> &args,
+                   const map<string, string> &vars)
+        : m_cmdlineOutStream(&m_outStreamBuf),
+        m_cmdline(session, args, m_cmdlineOutStream, m_cmdlineOutStream),
+        m_envVars(vars)
+    {}
+
+    bool parse() { return m_cmdline.parse(); }
+    void run()
+    {
+        //temporarily set environment variables and restore them after running
+        list<boost::shared_ptr<ScopedEnvChange> > changes;
+        BOOST_FOREACH(const StringPair &var, m_envVars) {
+            changes.push_back(boost::shared_ptr<ScopedEnvChange>(new ScopedEnvChange(var.first, var.second)));
+        }
+        // exceptions must be handled (= printed) before returning,
+        // so that our client gets the output
+        try {
+            m_cmdline.run();
+        } catch (...) {
+            redirectPtr->flush();
+            throw;
+        }
+        // always forward all currently pending redirected output
+        // before closing the session
+        redirectPtr->flush();
+    }
+};
 
 /**
  * Represents and implements the Connection interface.
@@ -1645,6 +2088,19 @@ class Connection : public DBusObjectHelper, public Resource
     SharedBuffer m_incomingMsg;
     std::string m_incomingMsgType;
 
+    struct SANContent {
+        std::vector <string> m_syncType;
+        std::vector <uint32_t> m_contentType;
+        std::vector <string> m_serverURI;
+    };
+
+    /**
+     * The content of a parsed SAN package to be processed via
+     * connection.ready
+     */
+    boost::shared_ptr <SANContent> m_SANContent;
+    std::string m_peerBtAddr;
+
     /**
      * records the reason for the failure, sends Abort signal and puts
      * the connection into the FAILED state.
@@ -1900,14 +2356,14 @@ void ReadOperations::getConfigs(bool getTemplates, std::vector<std::string> &con
         BOOST_FOREACH(const boost::shared_ptr<SyncConfig::TemplateDescription> peer, list) {
             //if it is not a template for device
             if(peer->m_fingerprint.empty()) {
-                configNames.push_back(peer->m_name);
+                configNames.push_back(peer->m_templateId);
             } else {
                 string templName = "Bluetooth_";
-                templName += peer->m_id;
+                templName += peer->m_deviceId;
                 templName += "_";
-                std::map<std::string, int>::iterator it = numbers.find(peer->m_id);
+                std::map<std::string, int>::iterator it = numbers.find(peer->m_deviceId);
                 if(it == numbers.end()) {
-                    numbers.insert(std::make_pair(peer->m_id, 1));
+                    numbers.insert(std::make_pair(peer->m_deviceId, 1));
                     templName += "1";
                 } else {
                     it->second++;
@@ -1927,7 +2383,7 @@ void ReadOperations::getConfigs(bool getTemplates, std::vector<std::string> &con
     }
 }
 
-boost::shared_ptr<DBusUserInterface> ReadOperations::getLocalConfig(const string &configName)
+boost::shared_ptr<DBusUserInterface> ReadOperations::getLocalConfig(const string &configName, bool mustExist)
 {
     string peer, context;
     SyncConfig::splitConfigString(SyncConfig::normalizeConfigString(configName),
@@ -1940,7 +2396,8 @@ boost::shared_ptr<DBusUserInterface> ReadOperations::getLocalConfig(const string
         // the default configuration can always be opened for reading,
         // everything else must exist
         if ((context != "default" || peer != "") &&
-                !syncConfig->exists()) {
+            mustExist &&
+            !syncConfig->exists()) {
             SE_THROW_EXCEPTION(NoSuchConfig, "No configuration '" + configName + "' found");
         }
     }
@@ -1962,7 +2419,7 @@ void ReadOperations::getConfig(bool getTemplate,
         boost::shared_ptr<SyncConfig::TemplateDescription> peerTemplate =
             m_server.getPeerTempl(m_configName);
         if(peerTemplate) {
-            SyncConfig::splitConfigString(SyncConfig::normalizeConfigString(peerTemplate->m_name),
+            SyncConfig::splitConfigString(SyncConfig::normalizeConfigString(peerTemplate->m_templateId),
                     peer, context);
             dbusConfig = SyncConfig::createPeerTemplate(peerTemplate->m_path);
             // if we have cached template information, add match information for it
@@ -1975,11 +2432,15 @@ void ReadOperations::getConfig(bool getTemplate,
             localConfigs.insert(pair<string, string>("deviceName", peerTemplate->m_fingerprint));
             // This is the fingerprint of the template
             localConfigs.insert(pair<string, string>("fingerPrint", peerTemplate->m_matchedModel));
+            // This is the template name presented to UI (or device class)
+            if (!peerTemplate->m_templateName.empty()) {
+                localConfigs.insert(pair<string,string>("templateName", peerTemplate->m_templateName));
+            }
 
             // if the peer is client, then replace syncURL with bluetooth
             // MAC address
             syncURL = "obex-bt://";
-            syncURL += peerTemplate->m_id;
+            syncURL += peerTemplate->m_deviceId;
         } else {
             SyncConfig::splitConfigString(SyncConfig::normalizeConfigString(m_configName),
                     peer, context);
@@ -1992,7 +2453,7 @@ void ReadOperations::getConfig(bool getTemplate,
 
         // use the shared properties from the right context as filter
         // so that the returned template preserves existing properties
-        boost::shared_ptr<DBusUserInterface> shared = getLocalConfig(string("@") + context);
+        boost::shared_ptr<DBusUserInterface> shared = getLocalConfig(string("@") + context, false);
 
         ConfigProps props;
         shared->getProperties()->readProperties(props);
@@ -2001,6 +2462,11 @@ void ReadOperations::getConfig(bool getTemplate,
             SyncSourceNodes nodes = shared->getSyncSourceNodes(source, "");
             props.clear();
             nodes.getProperties()->readProperties(props);
+            // Special case "type" property: the value in the context
+            // is not preserved. Every new peer must ensure that
+            // its own value is compatible (= same backend) with
+            // the other peers.
+            props.erase("type");
             dbusConfig->setConfigFilter(false, source, props);
         }
         syncConfig = dbusConfig.get();
@@ -2036,6 +2502,9 @@ void ReadOperations::getConfig(bool getTemplate,
         }
     }
 
+    // insert 'configName' of the chosen config (m_configName is not normalized)
+    localConfigs.insert(pair<string, string>("configName", syncConfig->getConfigName()));
+
     config.insert(pair<string,map<string, string> >("", localConfigs));
 
     /* get configurations from sources */
@@ -2253,9 +2722,20 @@ boost::shared_ptr<TransportAgent> DBusSync::createTransportAgent()
 {
     if (m_session.useConnection()) {
         // use the D-Bus Connection to send and receive messages
-        return boost::shared_ptr<TransportAgent>(new DBusTransportAgent(m_session.getServer().getLoop(),
-                                                                        m_session,
-                                                                        m_session.getConnection()));
+        boost::shared_ptr<TransportAgent> agent(new DBusTransportAgent(m_session.getServer().getLoop(),
+                                                                       m_session,
+                                                                       m_session.getConnection()));
+        // We don't know whether we'll run as client or server.
+        // But we as we cannot resend messages via D-Bus even if running as
+        // client (API not designed for it), let's use the hard timeout
+        // from RetryDuration here.
+        int timeout = getRetryDuration();
+        if (timeout) {
+            agent->setCallback(transport_cb,
+                               reinterpret_cast<void *>(static_cast<uintptr_t>(timeout)),
+                               timeout);
+        }
+        return agent;
     } else {
         // no connection, use HTTP via libsoup/GMainLoop
         GMainLoop *loop = m_session.getServer().getLoop();
@@ -2295,6 +2775,11 @@ void DBusSync::reportStepCmd(sysync::uInt16 stepCmd)
     }
 }
 
+void DBusSync::syncSuccessStart()
+{
+    m_session.syncSuccessStart();
+}
+
 bool DBusSync::checkForSuspend()
 {
     return m_session.isSuspend() || SyncContext::checkForSuspend();
@@ -2370,8 +2855,9 @@ void Session::setConfig(bool update, bool temporary,
     if (!m_active) {
         SE_THROW_EXCEPTION(InvalidCall, "session is not active, call not allowed at this time");
     }
-    if (m_sync) {
-        SE_THROW_EXCEPTION(InvalidCall, "sync started, cannot change configuration at this time");
+    if (m_runOperation != OP_NULL) {
+        string msg = StringPrintf("%s started, cannot change configuration at this time", runOpToString(m_runOperation).c_str());
+        SE_THROW_EXCEPTION(InvalidCall, msg);
     }
     if (!update && temporary) {
         throw std::runtime_error("Clearing existing configuration and temporary configuration changes which only affects the duration of the session are mutually exclusive");
@@ -2436,6 +2922,7 @@ void Session::setConfig(bool update, bool temporary,
 
         syncConfig->preFlush(*syncConfig);
         syncConfig->flush();
+        m_setConfig = true;
     }
 }
 
@@ -2451,8 +2938,11 @@ void Session::sync(const std::string &mode, const SourceModes_t &source_modes)
     if (!m_active) {
         SE_THROW_EXCEPTION(InvalidCall, "session is not active, call not allowed at this time");
     }
-    if (m_sync) {
-        string msg = StringPrintf("%s started, cannot start(again)", runOpToString(m_runOperation).c_str());
+    if (m_runOperation == OP_SYNC) {
+        string msg = StringPrintf("%s started, cannot start again", runOpToString(m_runOperation).c_str());
+        SE_THROW_EXCEPTION(InvalidCall, msg);
+    } else if (m_runOperation != OP_NULL) {
+        string msg = StringPrintf("%s started, cannot start sync", runOpToString(m_runOperation).c_str());
         SE_THROW_EXCEPTION(InvalidCall, msg);
     }
 
@@ -2469,6 +2959,10 @@ void Session::sync(const std::string &mode, const SourceModes_t &source_modes)
         }
     }
 
+    if (m_remoteInitiated) {
+        m_sync->setRemoteInitiated (true);
+    }
+
     // Apply temporary config filters. The parameters of this function
     // override the source filters, if set.
     m_sync->setConfigFilter(true, "", m_syncFilter);
@@ -2507,7 +3001,7 @@ void Session::sync(const std::string &mode, const SourceModes_t &source_modes)
 
 void Session::abort()
 {
-    if (!m_sync) {
+    if (m_runOperation != OP_SYNC && m_runOperation != OP_CMDLINE) {
         SE_THROW_EXCEPTION(InvalidCall, "sync not started, cannot abort at this time");
     }
     m_syncStatus = SYNC_ABORT;
@@ -2519,7 +3013,7 @@ void Session::abort()
 
 void Session::suspend()
 {
-    if (!m_sync) {
+    if (m_runOperation != OP_SYNC && m_runOperation != OP_CMDLINE) {
         SE_THROW_EXCEPTION(InvalidCall, "sync not started, cannot suspend at this time");
     }
     m_syncStatus = SYNC_SUSPEND;
@@ -2612,7 +3106,9 @@ Session::Session(DBusServer &server,
     m_serverMode(false),
     m_useConnection(false),
     m_tempConfig(false),
+    m_setConfig(false),
     m_active(false),
+    m_remoteInitiated(false),
     m_syncStatus(SYNC_QUEUEING),
     m_stepIsWaiting(false),
     m_priority(PRI_DEFAULT),
@@ -2624,7 +3120,8 @@ Session::Session(DBusServer &server,
     m_restoreBefore(true),
     m_restoreSrcTotal(0),
     m_restoreSrcEnd(0),
-    m_runOperation(OP_SYNC),
+    m_runOperation(OP_NULL),
+    m_listener(NULL),
     emitStatus(*this, "StatusChanged"),
     emitProgress(*this, "ProgressChanged")
 {
@@ -2642,12 +3139,17 @@ Session::Session(DBusServer &server,
     add(this, &Session::getProgress, "GetProgress");
     add(this, &Session::restore, "Restore");
     add(this, &Session::checkPresence, "checkPresence");
+    add(this, &Session::execute, "Execute");
     add(emitStatus);
     add(emitProgress);
 }
 
 Session::~Session()
 {
+    /* update auto sync manager when a config is changed */
+    if(m_setConfig) {
+        m_server.getAutoSyncManager().update(m_configName);
+    }
     m_server.dequeue(this);
 }
     
@@ -2805,7 +3307,7 @@ void Session::sourceProgress(sysync::TProgressEventEnum type,
 
 void Session::run()
 {
-    if (m_sync) {
+    if (m_runOperation != OP_NULL) {
         try {
             m_syncStatus = SYNC_RUNNING;
             fireStatus(true);
@@ -2826,12 +3328,25 @@ void Session::run()
                 if (c) {
                     c->shutdown();
                 }
+                // report 'sync done' event to listener
+                if(m_listener) {
+                    m_listener->syncDone(status);
+                }
                 break;
             }
             case OP_RESTORE:
                 m_sync->restore(m_restoreDir, 
                                 m_restoreBefore ? SyncContext::DATABASE_BEFORE_SYNC : SyncContext::DATABASE_AFTER_SYNC);
                 break;
+            case OP_CMDLINE:
+                try {
+                    m_cmdline->run();
+                } catch (...) {
+                    SyncMLStatus status = Exception::handle();
+                    if (!m_error) {
+                        m_error = status;
+                    }
+                }
             default:
                 break;
             };
@@ -2846,7 +3361,7 @@ void Session::run()
         m_syncStatus = SYNC_DONE;
         m_stepIsWaiting = false;
         fireStatus(true);
-    }
+    } 
 }
 
 bool Session::setFilters(SyncConfig &config)
@@ -2874,10 +3389,13 @@ void Session::restore(const string &dir, bool before, const std::vector<std::str
     if (!m_active) {
         SE_THROW_EXCEPTION(InvalidCall, "session is not active, call not allowed at this time");
     }
-    if (m_sync) {
+    if (m_runOperation == OP_RESTORE) {
+        string msg = StringPrintf("restore started, cannot restore again");
+        SE_THROW_EXCEPTION(InvalidCall, msg);
+    } else if (m_runOperation != OP_NULL) {
         // actually this never happen currently, for during the real restore process, 
         // it never poll the sources in default main context 
-        string msg = StringPrintf("%s started, cannot restore(again)", runOpToString(m_runOperation).c_str());
+        string msg = StringPrintf("%s started, cannot restore", runOpToString(m_runOperation).c_str());
         SE_THROW_EXCEPTION(InvalidCall, msg);
     }
 
@@ -2916,11 +3434,36 @@ string Session::runOpToString(RunOperation op)
         return "sync";
     case OP_RESTORE:
         return "restore";
+    case OP_CMDLINE:
+        return "cmdline";
     default:
         return "";
     };
 }
 
+void Session::execute(const vector<string> &args, const map<string, string> &vars)
+{
+    if (!m_active) {
+        SE_THROW_EXCEPTION(InvalidCall, "session is not active, call not allowed at this time");
+    }
+    if (m_runOperation == OP_CMDLINE) {
+        SE_THROW_EXCEPTION(InvalidCall, "cmdline started, cannot start again");
+    } else if (m_runOperation != OP_NULL) {
+        string msg = StringPrintf("%s started, cannot start cmdline", runOpToString(m_runOperation).c_str());
+        SE_THROW_EXCEPTION(InvalidCall, msg);
+    }
+    //create ostream with a specified streambuf
+    m_cmdline.reset(new CmdlineWrapper(*this, args, vars));
+
+    if(!m_cmdline->parse()) {
+        m_cmdline.reset();
+        SE_THROW_EXCEPTION(DBusSyncException, "arguments parsing error");
+    }
+
+    m_runOperation = OP_CMDLINE;
+    g_main_loop_quit(loop);
+}
+
 inline void insertPair(std::map<string, string> &params,
                        const string &key, 
                        const string &value)
@@ -2946,10 +3489,15 @@ string Session::askPassword(const string &passwordName,
     boost::shared_ptr<InfoReq> req = m_server.createInfoReq("password", params, this);
     std::map<string, string> response;
     if(req->wait(response) == InfoReq::ST_OK) {
-        return response["password"];
+        std::map<string, string>::iterator it = response.find("password");
+        if (it == response.end()) {
+            SE_THROW_EXCEPTION_STATUS(StatusException, "user didn't provide password, abort", SyncMLStatus(sysync::LOCERR_USERABORT));
+        } else {
+            return it->second;
+        }
     } 
 
-    SyncContext::throwError("can't get the password from clients. The password request is '" + req->getStatusStr() + "'");
+    SE_THROW_EXCEPTION_STATUS(StatusException, "can't get the password from clients. The password request is '" + req->getStatusStr() + "'", STATUS_PASSWORD_TIMEOUT);
     return "";
 }
 
@@ -2960,6 +3508,21 @@ void Session::checkPresence (string &status)
     m_server.m_presence.checkPresence (m_configName, status, transport);
 }
 
+void Session::syncSuccessStart()
+{
+    // if listener, report 'sync started' to it
+    if(m_listener) {
+        m_listener->syncSuccessStart();
+    }
+}
+
+SessionListener* Session::addListener(SessionListener *listener)
+{
+    SessionListener *old = m_listener;
+    m_listener = listener;
+    return old;
+}
+
 /************************ ProgressData implementation *****************/
 ProgressData::ProgressData(int32_t &progress) 
     : m_progress(progress),
@@ -3248,12 +3811,16 @@ void Connection::process(const Caller_t &caller,
                               message.first);
             } else if (message_type == TransportAgent::m_contentTypeServerAlertedNotificationDS) {
                sysync::SanPackage san;
-               if (san.PassSan(const_cast<uint8_t *>(message.second), message.first) || san.GetHeader()) {
+               if (san.PassSan(const_cast<uint8_t *>(message.second), message.first, 2) || san.GetHeader()) {
                     // We are very tolerant regarding the content of the message.
                     // If it doesn't parse, try to do something useful anyway.
-                    config = "default";
-                    SE_LOG_DEBUG(NULL, NULL, "SAN parsing failed, falling back to 'default' config");
-               } else {
+                    // only for SAN 1.2, for SAN 1.0/1.1 we can not be sure
+                    // whether it is a SAN package or a normal sync pacakge
+                    if (message_type == TransportAgent::m_contentTypeServerAlertedNotificationDS) {
+                        config = "default";
+                        SE_LOG_DEBUG(NULL, NULL, "SAN parsing failed, falling back to 'default' config");
+                    }  
+               } else { //Server alerted notification case
                     // Extract server ID and match it against a server
                     // configuration.  Multiple different peers might use the
                     // same serverID ("PC Suite"), so check properties of the
@@ -3280,7 +3847,7 @@ void Connection::process(const Caller_t &caller,
                         trans = m_peer.find("transport");
                     if (trans != m_peer.end() && id != m_peer.end()) {
                         if (trans->second == "org.openobex.obexd") {
-                            string btAddr = id->second.substr(0, id->second.find("+"));
+                            m_peerBtAddr = id->second.substr(0, id->second.find("+"));
                             BOOST_FOREACH(const SyncConfig::ConfigList::value_type &server,
                                     servers) {
                                 SyncConfig conf(server.first);
@@ -3288,7 +3855,7 @@ void Connection::process(const Caller_t &caller,
                                 BOOST_FOREACH (string &url, urls){
                                     url = url.substr (0, url.find("+"));
                                     SE_LOG_DEBUG (NULL, NULL, "matching against %s",url.c_str());
-                                    if (url.find ("obex-bt://") ==0 && url.substr(strlen("obex-bt://"), url.npos) == btAddr) {
+                                    if (url.find ("obex-bt://") ==0 && url.substr(strlen("obex-bt://"), url.npos) == m_peerBtAddr) {
                                         config = server.first;
                                         break;
                                     } 
@@ -3310,24 +3877,27 @@ void Connection::process(const Caller_t &caller,
                         }
                     }
 
-                    // pick "default" as configuration name if none matched
+                    // create a default configuration name if none matched
                     if (config.empty()) {
-                        config = "default";
-                        SE_LOG_DEBUG(NULL, NULL, "SAN Server ID '%s' unknown, falling back to 'default' config", serverID.c_str());
+                        config = serverID+"_"+getCurrentTime();
+                        SE_LOG_DEBUG(NULL,
+                                     NULL,
+                                     "SAN Server ID '%s' unknown, falling back to automatically created '%s' config",
+                                     serverID.c_str(), config.c_str());
                     }
 
-                    // TODO: create a suitable configuration automatically?!
 
                     SE_LOG_DEBUG(NULL, NULL, "SAN sync with config %s", config.c_str());
 
+                    m_SANContent.reset (new SANContent ());
                     // extract number of sources
                     int numSources = san.fNSync;
                     int syncType;
                     uint32_t contentType;
                     std::string serverURI;
                     if (!numSources) {
-                        SE_LOG_DEBUG(NULL, NULL, "SAN message with no sources");
-                        // Synchronize all known sources with the selected mode.
+                        SE_LOG_DEBUG(NULL, NULL, "SAN message with no sources, using selected modes");
+                        // Synchronize all known sources with the default mode.
                         if (san.GetNthSync(0, syncType, contentType, serverURI)) {
                             SE_LOG_DEBUG(NULL, NULL, "SAN invalid header, using default modes");
                         } else if (syncType < SYNC_FIRST || syncType > SYNC_LAST) {
@@ -3337,12 +3907,6 @@ void Connection::process(const Caller_t &caller,
                             SE_LOG_DEBUG(NULL, NULL, "SAN sync mode for all configured sources: %s", m_syncMode.c_str());
                         }
                     } else {
-                        const SyncContext context(config);
-                        std::list<std::string> sources = context.getSyncSources();
-
-                        // check what the server wants us to synchronize
-                        // and only synchronize that
-                        m_syncMode = "disabled";
                         for (int sync = 1; sync <= numSources; sync++) {
                             if (san.GetNthSync(sync, syncType, contentType, serverURI)) {
                                 SE_LOG_DEBUG(NULL, NULL, "SAN invalid sync entry #%d", sync);
@@ -3350,38 +3914,13 @@ void Connection::process(const Caller_t &caller,
                                 SE_LOG_DEBUG(NULL, NULL, "SAN invalid sync type %d for entry #%d, ignoring entry", syncType, sync);
                             } else {
                                 std::string syncMode = PrettyPrintSyncMode(SyncMode(syncType), true);
-                                bool found = false;
-                                BOOST_FOREACH(const std::string &source, sources) {
-                                    boost::shared_ptr<const PersistentSyncSourceConfig> sourceConfig(context.getSyncSourceConfig(source));
-                                    // prefix match because the local
-                                    // configuration might contain
-                                    // additional parameters (like date
-                                    // range selection for events)
-                                    if (boost::starts_with(sourceConfig->getURI(), serverURI)) {
-                                        SE_LOG_DEBUG(NULL, NULL,
-                                                     "SAN entry #%d = source %s with mode %s",
-                                                     sync, source.c_str(), syncMode.c_str());
-                                        m_sourceModes[source] = syncMode;
-                                        found = true;
-                                        break;
-                                    }
-                                }
-                                if (!found) {
-                                    SE_LOG_DEBUG(NULL, NULL,
-                                                 "SAN entry #%d with mode %s ignored because Server URI %s is unknown",
-                                                 sync, syncMode.c_str(), serverURI.c_str());
-                                }
+                                m_SANContent->m_syncType.push_back (syncMode);
+                                m_SANContent->m_serverURI.push_back (serverURI);
+                                m_SANContent->m_contentType.push_back (contentType);
                             }
                         }
-
-                        if (m_sourceModes.empty()) {
-                            SE_LOG_DEBUG(NULL, NULL,
-                                         "SAN message with no known entries, falling back to default");
-                            m_syncMode = "";
-                        }
                     }
                 }
-
                 // TODO: use the session ID set by the server if non-null
             } else if (message_type == TransportAgent::m_contentTypeSyncML ||
                        message_type == TransportAgent::m_contentTypeSyncWBXML) {
@@ -3408,10 +3947,10 @@ void Connection::process(const Caller_t &caller,
                     SyncConfig peer(entry.first);
                     if (info.m_deviceID == peer.getRemoteDevID()) {
                         config = entry.first;
-                        SE_LOG_DEBUG(NULL, NULL, "matched %s against config %s (%s)",
-                                     info.toString().c_str(),
-                                     entry.first.c_str(),
-                                     entry.second.c_str());
+                        SE_LOG_INFO(NULL, NULL, "matched %s against config %s (%s)",
+                                    info.toString().c_str(),
+                                    entry.first.c_str(),
+                                    entry.second.c_str());
                         break;
                     }
                 }
@@ -3586,6 +4125,64 @@ Connection::~Connection()
 
 void Connection::ready()
 {
+    //if configuration not yet created
+    std::string configName = m_session->getConfigName();
+    SyncConfig config (configName);
+    if (!config.exists() && m_SANContent) {
+        SE_LOG_DEBUG (NULL, NULL, "Configuration %s not exists for a runnable session in a SAN context, create it automatically", configName.c_str());
+        ReadOperations::Config_t from;
+        const std::string templateName = "SyncEvolution";
+        // TODO: support SAN from other well known servers
+        ReadOperations ops(templateName, m_server);
+        ops.getConfig(true , from);
+        if (!m_peerBtAddr.empty()){
+            from[""]["SyncURL"] = string ("obex-bt://") + m_peerBtAddr;
+        }
+        m_session->setConfig (false, false, from);
+    }
+    const SyncContext context (configName);
+    std::list<std::string> sources = context.getSyncSources();
+
+    if (m_SANContent && !m_SANContent->m_syncType.empty()) {
+        // check what the server wants us to synchronize
+        // and only synchronize that
+        m_syncMode = "disabled";
+        for (size_t sync=0; sync<m_SANContent->m_syncType.size(); sync++) {
+            std::string syncMode = m_SANContent->m_syncType[sync];
+            std::string serverURI = m_SANContent->m_serverURI[sync];
+            //uint32_t contentType = m_SANContent->m_contentType[sync];
+            bool found = false;
+            BOOST_FOREACH(const std::string &source, sources) {
+                boost::shared_ptr<const PersistentSyncSourceConfig> sourceConfig(context.getSyncSourceConfig(source));
+                // prefix match because the local
+                // configuration might contain
+                // additional parameters (like date
+                // range selection for events)
+                if (boost::starts_with(sourceConfig->getURI(), serverURI)) {
+                    SE_LOG_DEBUG(NULL, NULL,
+                                 "SAN entry #%d = source %s with mode %s",
+                                 (int)sync, source.c_str(), syncMode.c_str());
+                    m_sourceModes[source] = syncMode;
+                    found = true;
+                    break;
+                }
+            }
+            if (!found) {
+                SE_LOG_DEBUG(NULL, NULL,
+                             "SAN entry #%d with mode %s ignored because Server URI %s is unknown",
+                             (int)sync, syncMode.c_str(), serverURI.c_str());
+            }
+        }
+        if (m_sourceModes.empty()) {
+            SE_LOG_DEBUG(NULL, NULL,
+                    "SAN message with no known entries, falling back to default");
+            m_syncMode = "";
+        }
+    }
+
+    if (m_SANContent) {
+        m_session->setRemoteInitiated(true);
+    }
     // proceed with sync now that our session is ready
     m_session->sync(m_syncMode, m_sourceModes);
 }
@@ -3731,35 +4328,243 @@ DBusTransportAgent::Status DBusTransportAgent::wait(bool noReply)
         if (m_eventTriggered) {
             return TIME_OUT;
         }
-        doWait(connection);
+        doWait(connection);
+
+        // tell caller to check again
+        return ACTIVE;
+        break;
+    case Connection::DONE:
+        if (!noReply) {
+            SE_THROW_EXCEPTION(TransportException,
+                               "internal error: transport has shut down, can no longer receive reply");
+        }
+        
+        return CLOSED;
+    default:
+        SE_THROW_EXCEPTION(TransportException,
+                           "internal error: send() on connection which is not ready");
+        break;
+    }
+
+    return FAILED;
+}
+
+void DBusTransportAgent::getReply(const char *&data, size_t &len, std::string &contentType)
+{
+    data = m_incomingMsg.get();
+    len = m_incomingMsg.size();
+    contentType = m_incomingMsgType;
+}
+
+/********************* PresenceStatus implementation ****************/
+void PresenceStatus::init(){
+    //initialize the configured peer list
+    if (!m_initiated) {
+        SyncConfig::ConfigList list = SyncConfig::getConfigs();
+        BOOST_FOREACH(const SyncConfig::ConfigList::value_type &server, list) {
+            SyncConfig config (server.first);
+            vector<string> urls = config.getSyncURL();
+            m_peers[server.first].clear();
+            BOOST_FOREACH (const string &url, urls) {
+                m_peers[server.first].push_back(make_pair(url,MIGHTWORK));
+            }
+        }
+        m_initiated = true;
+    }
+}
+
+/* Implement DBusServer::checkPresence*/
+void PresenceStatus::checkPresence (const string &peer, string& status, std::vector<std::string> &transport) {
+
+    if (!m_initiated) {
+        //might triggered by updateConfigPeers
+        init();
+    }
+
+    string peerName = SyncConfig::normalizeConfigString (peer);
+    vector< pair<string, PeerStatus> > mytransports = m_peers[peerName];
+    if (mytransports.empty()) {
+        //wrong config name?
+        status = status2string(NOTRANSPORT);
+        transport.clear();
+        return;
+    }
+    PeerStatus mystatus = MIGHTWORK;
+    transport.clear();
+    //only if all transports are unavailable can we declare the peer
+    //status as unavailable
+    BOOST_FOREACH (PeerStatusPair &mytransport, mytransports) {
+        if (mytransport.second == MIGHTWORK) {
+            transport.push_back (mytransport.first);
+        }
+    }
+    if (transport.empty()) {
+        mystatus = NOTRANSPORT;
+    }
+    status = status2string(mystatus);
+}
+
+void PresenceStatus::updateConfigPeers (const std::string &peer, const ReadOperations::Config_t &config) {
+    ReadOperations::Config_t::const_iterator iter = config.find ("");
+    if (iter != config.end()) {
+        //As a simple approach, just reinitialize the whole STATUSMAP
+        //it will cause later updatePresenceStatus resend all signals
+        //and a reload in checkPresence
+        m_initiated = false;
+    }
+}
+
+void PresenceStatus::updatePresenceStatus (bool newStatus, PresenceStatus::TransportType type) {
+    if (type == PresenceStatus::HTTP_TRANSPORT) {
+        updatePresenceStatus (newStatus, m_btPresence);
+    } else if (type == PresenceStatus::BT_TRANSPORT) {
+        updatePresenceStatus (m_httpPresence, newStatus);
+    }else {
+    }
+}
+
+void PresenceStatus::updatePresenceStatus (bool httpPresence, bool btPresence) {
+    bool httpChanged = (m_httpPresence != httpPresence);
+    bool btChanged = (m_btPresence != btPresence);
+    m_httpPresence = httpPresence;
+    m_btPresence = btPresence;
+    if(httpChanged) {
+        m_httpTimer.reset();
+    }
+    if(btChanged) {
+        m_btTimer.reset();
+    }
+
+    if (m_initiated && !httpChanged && !btChanged) {
+        //nothing changed
+        return;
+    }
+
+    //initialize the configured peer list
+    bool initiated = m_initiated;
+    if (!m_initiated) {
+        init();
+    }
+
+    //iterate all configured peers and fire singals
+    BOOST_FOREACH (StatusPair &peer, m_peers) {
+        //iterate all possible transports
+        //TODO One peer might got more than one signals, avoid this
+        std::vector<pair<string, PeerStatus> > &transports = peer.second;
+        BOOST_FOREACH (PeerStatusPair &entry, transports) {
+            string url = entry.first;
+            if (boost::starts_with (url, "http") && (httpChanged || !initiated)) {
+                entry.second = m_httpPresence ? MIGHTWORK: NOTRANSPORT;
+                m_server.emitPresence (peer.first, status2string (entry.second), entry.first);
+                SE_LOG_DEBUG(NULL, NULL,
+                        "http presence signal %s,%s,%s",
+                        peer.first.c_str(),
+                        status2string (entry.second).c_str(), entry.first.c_str());
+            } else if (boost::starts_with (url, "obex-bt") && (btChanged || !initiated)) {
+                entry.second = m_btPresence ? MIGHTWORK: NOTRANSPORT;
+                m_server.emitPresence (peer.first, status2string (entry.second), entry.first);
+                SE_LOG_DEBUG(NULL, NULL,
+                        "bluetooth presence signal %s,%s,%s",
+                        peer.first.c_str(),
+                        status2string (entry.second).c_str(), entry.first.c_str());
+            }
+        }
+    }
+}
 
-        // tell caller to check again
-        return ACTIVE;
-        break;
-    case Connection::DONE:
-        if (!noReply) {
-            SE_THROW_EXCEPTION(TransportException,
-                               "internal error: transport has shut down, can no longer receive reply");
+/********************** Connman Client implementation **************/
+ConnmanClient::ConnmanClient(DBusServer &server):
+    m_server(server),
+    m_propertyChanged(*this, "PropertyChanged")
+{
+    const char *connmanTest = getenv ("DBUS_TEST_CONNMAN");
+    m_connmanConn = g_dbus_setup_bus (connmanTest ? DBUS_BUS_SESSION: DBUS_BUS_SYSTEM, NULL, true, NULL);
+    if (m_connmanConn){
+        typedef std::map <std::string, boost::variant <std::vector <std::string> > > PropDict;
+        DBusClientCall1<PropDict>  getProp(*this,"GetProperties");
+        getProp (boost::bind(&ConnmanClient::getPropCb, this, _1, _2));
+        m_propertyChanged.activate(boost::bind(&ConnmanClient::propertyChanged, this, _1, _2));
+    }else{
+        SE_LOG_ERROR (NULL, NULL, "DBus connection setup for connman failed");
+    }
+}
+
+void ConnmanClient::getPropCb (const std::map <std::string,
+                               boost::variant <std::vector <std::string> > >& props, const string &error){
+    if (!error.empty()) {
+        if (error == "org.freedesktop.DBus.Error.ServiceUnknown") {
+            // ensure there is still first set of singal set in case of no
+            // connman available
+            m_server.getPresenceStatus().updatePresenceStatus (true, true);
+            SE_LOG_DEBUG (NULL, NULL, "No connman service available %s", error.c_str());
+            return;
         }
-        
-        return CLOSED;
-    default:
-        SE_THROW_EXCEPTION(TransportException,
-                           "internal error: send() on connection which is not ready");
-        break;
+        SE_LOG_DEBUG (NULL, NULL, "error in connmanCallback %s", error.c_str());
+        return;
     }
 
-    return FAILED;
+    typedef std::pair <std::string, boost::variant <std::vector <std::string> > > element;
+    bool httpPresence = false, btPresence = false;
+    BOOST_FOREACH (element entry, props) {
+        //match connected for HTTP based peers (wifi/wimax/ethernet)
+        if (entry.first == "ConnectedTechnologies") {
+            std::vector <std::string> connected = boost::get <std::vector <std::string> > (entry.second);
+            BOOST_FOREACH (std::string tech, connected) {
+                if (boost::iequals (tech, "wifi") || boost::iequals (tech, "ethernet") 
+                || boost::iequals (tech, "wimax")) {
+                    httpPresence = true;
+                    break;
+                }
+            }
+        } else if (entry.first == "AvailableTechnologies") {
+            std::vector <std::string> enabled = boost::get <std::vector <std::string> > (entry.second);
+            BOOST_FOREACH (std::string tech, enabled){
+                if (boost::iequals (tech, "bluetooth")) {
+                    btPresence = true;
+                    break;
+                }
+            }
+        } else {
+            continue;
+        }
+    }
+    //now delivering the signals
+    m_server.getPresenceStatus().updatePresenceStatus (httpPresence, btPresence);
 }
 
-void DBusTransportAgent::getReply(const char *&data, size_t &len, std::string &contentType)
+void ConnmanClient::propertyChanged(const string &name,
+                                    const boost::variant<vector<string>, string> &prop)
 {
-    data = m_incomingMsg.get();
-    len = m_incomingMsg.size();
-    contentType = m_incomingMsgType;
+    bool httpPresence=false, btPresence=false;
+    bool httpChanged=false, btChanged=false;
+    if (boost::iequals(name, "ConnectedTechnologies")) {
+        httpChanged=true;
+        vector<string> connected = boost::get<vector<string> >(prop);
+        BOOST_FOREACH (std::string tech, connected) {
+            if (boost::iequals (tech, "wifi") || boost::iequals (tech, "ethernet") 
+                    || boost::iequals (tech, "wimax")) {
+                httpPresence=true;
+                break;
+            }
+        }
+    } else if (boost::iequals (name, "AvailableTechnologies")){
+        btChanged=true;
+        vector<string> enabled = boost::get<vector<string> >(prop);
+        BOOST_FOREACH (std::string tech, enabled){
+            if (boost::iequals (tech, "bluetooth")) {
+                btPresence = true;
+                break;
+            }
+        }
+    }
+    if(httpChanged) {
+        m_server.getPresenceStatus().updatePresenceStatus (httpPresence, PresenceStatus::HTTP_TRANSPORT);
+    } else if (btChanged) {
+        m_server.getPresenceStatus().updatePresenceStatus (btPresence, PresenceStatus::BT_TRANSPORT);
+    } else {
+    }
 }
 
-
 /********************** DBusServer implementation ******************/
 
 void DBusServer::clientGone(Client *c)
@@ -3895,7 +4700,7 @@ void DBusServer::checkPresence(const std::string &server,
     return m_presence.checkPresence(server, status, transports);
 }
 
-void DBusServer::getSessions(std::vector<std::string> &sessions)
+void DBusServer::getSessions(std::vector<DBusObject_t> &sessions)
 {
     sessions.reserve(m_workQueue.size() + 1);
     if (m_activeSession) {
@@ -3918,13 +4723,17 @@ DBusServer::DBusServer(GMainLoop *loop, const DBusConnectionPtr &conn, int durat
     m_lastSession(time(NULL)),
     m_activeSession(NULL),
     m_lastInfoReq(0),
-    m_autoTerm(duration),
     m_bluezManager(*this),
     sessionChanged(*this, "SessionChanged"),
     presence(*this, "Presence"),
     templatesChanged(*this, "TemplatesChanged"),
     infoRequest(*this, "InfoRequest"),
-    m_presence(*this)
+    logOutput(*this, "LogOutput"),
+    m_presence(*this),
+    m_connman(*this),
+    m_autoSync(*this),
+    m_autoTerm(m_autoSync.preventTerm() ? -1 : duration), //if there is any task in auto sync, prevent auto termination
+    m_parentLogger(LoggerBase::instance())
 {
     struct timeval tv;
     gettimeofday(&tv, NULL);
@@ -3945,13 +4754,10 @@ DBusServer::DBusServer(GMainLoop *loop, const DBusConnectionPtr &conn, int durat
     add(templatesChanged);
     add(presence);
     add(infoRequest);
+    add(logOutput);
 
-    const char *connmanTest = getenv ("DBUS_TEST_CONNMAN");
-    m_connmanConn = g_dbus_setup_bus (connmanTest ? DBUS_BUS_SESSION: DBUS_BUS_SYSTEM, NULL, true, NULL);
-    if (m_connmanConn) {
-        m_pollConnman =  g_timeout_add_seconds (10, connmanPoll, static_cast <gpointer> (this));
-    }
-
+    LoggerBase::pushLogger(this);
+    setLevel(LoggerBase::DEBUG);
 }
 
 DBusServer::~DBusServer()
@@ -3961,6 +4767,7 @@ DBusServer::~DBusServer()
     m_workQueue.clear();
     m_clients.clear();
     m_attachedClients.clear();
+    LoggerBase::popLogger();
 }
 
 void DBusServer::run()
@@ -3989,6 +4796,22 @@ void DBusServer::run()
             }
             session.swap(m_syncSession);
             dequeue(session.get());
+        } 
+
+        if (m_autoSync.hasTask()) {
+            // if there is at least one pending task and no session is created for auto sync,
+            // pick one task and create a session
+            m_autoSync.startTask();
+        }
+        // Make sure check whether m_activeSession is owned by autosync 
+        // Otherwise activeSession is owned by AutoSyncManager but it never
+        // be ready to run. Because methods of Session, like 'sync', are able to be
+        // called when it is active.  
+        if (m_autoSync.hasActiveSession())
+        {
+            // if the autosync is the active session, then invoke 'sync'
+            // to make it ready to run
+            m_autoSync.prepare();
         }
     }
 }
@@ -4139,6 +4962,10 @@ void DBusServer::checkQueue()
             m_activeSessionRef = session;
             session->setActive(true);
             sessionChanged(session->getPath(), true);
+            //if the active session is changed, give a chance to quit the main loop
+            //and make it ready to run if it is owned by AutoSyncManager.
+            //Otherwise, server might be blocked.
+            g_main_loop_quit(m_loop);
             return;
         }
     }
@@ -4191,73 +5018,6 @@ void DBusServer::removeInfoReq(const InfoReq &req)
     }
 }
 
-gboolean DBusServer::connmanPoll (gpointer dbusserver)
-{
-    DBusServer *me = static_cast<DBusServer *>(dbusserver);
-    DBusConnectionPtr conn = me->getConnmanConnection();
-    struct ConnmanClient : public DBusCallObject
-    {
-        DBusConnectionPtr m_connection;
-        ConnmanClient (DBusConnectionPtr conn ) : m_connection (conn) {}
-        virtual const char *getDestination() const {return "org.moblin.connman";}
-        virtual const char *getPath() const {return "/";}
-        virtual const char *getInterface() const {return "org.moblin.connman.Manager";}
-        virtual const char *getMethod() const {return "GetProperties"; }
-        virtual DBusConnection *getConnection() const {return m_connection.get();}
-    }connman (conn);
-
-    typedef std::map <std::string, boost::variant <std::vector <std::string> > > PropDict;
-    DBusClientCall0<PropDict>  getProp(connman);
-    getProp (boost::bind(&DBusServer::connmanCallback, me, _1, _2));
-    return TRUE;
-}
-
-
-void DBusServer::connmanCallback (const std::map <std::string, boost::variant <std::vector <std::string> > >& props, const string &error)
-{
-    if (!error.empty()) {
-        if (error == "org.freedesktop.DBus.Error.ServiceUnknown") {
-            // no connman available, remove connmanPoll.
-            m_pollConnman.set(0);
-            // ensure there is still first set of singal set in case of no
-            // connman available
-            m_presence.updatePresenceStatus (true, true);
-            SE_LOG_DEBUG (NULL, NULL, "No connman service available %s", error.c_str());
-            return;
-        }
-        SE_LOG_DEBUG (NULL, NULL, "error in connmanCallback %s", error.c_str());
-        return;
-    }
-
-    typedef std::pair <std::string, boost::variant <std::vector <std::string> > > element;
-    bool httpPresence = false, btPresence = false;
-    BOOST_FOREACH (element entry, props) {
-        //match connected for HTTP based peers (wifi/wimax/ethernet)
-        if (entry.first == "ConnectedTechnologies") {
-            std::vector <std::string> connected = boost::get <std::vector <std::string> > (entry.second);
-            BOOST_FOREACH (std::string tech, connected) {
-                if (boost::iequals (tech, "wifi") || boost::iequals (tech, "ethernet") 
-                || boost::iequals (tech, "wimax")) {
-                    httpPresence = true;
-                    break;
-                }
-            }
-        } else if (entry.first == "EnabledTechnologies") {
-            std::vector <std::string> enabled = boost::get <std::vector <std::string> > (entry.second);
-            BOOST_FOREACH (std::string tech, enabled){
-                if (boost::iequals (tech, "bluetooth")) {
-                    btPresence = true;
-                    break;
-                }
-            }
-        } else {
-            continue;
-        }
-    }
-    //now delivering the signals
-    m_presence.updatePresenceStatus (httpPresence, btPresence);
-}
-
 void DBusServer::getDeviceList(SyncConfig::DeviceList &devices)
 {
     //wait bluez or other device managers
@@ -4340,6 +5100,32 @@ void DBusServer::updateDevice(const string &deviceId,
     }
 }
 
+void DBusServer::messagev(Level level,
+                          const char *prefix,
+                          const char *file,
+                          int line,
+                          const char *function,
+                          const char *format,
+                          va_list args)
+{
+    // iterating over args in messagev() is destructive, must make a copy first
+    va_list argsCopy;
+    va_copy(argsCopy, args);
+    m_parentLogger.messagev(level, prefix, file, line, function, format, args);
+    string log = StringPrintfV(format, argsCopy);
+    va_end(argsCopy);
+
+    // prefix is used to set session path
+    // for general server output, the object path field is dbus server 
+    // the object path can't be empty for object paths prevent using empty string.
+    string strLevel = Logger::levelToStr(level);
+    if(m_activeSession) {
+        logOutput(m_activeSession->getPath(), strLevel, log);
+    } else {
+        logOutput(getPath(), strLevel, log);
+    }
+}
+
 /********************** InfoReq implementation ******************/
 InfoReq::InfoReq(DBusServer &server,
                  const string &type,
@@ -4458,8 +5244,8 @@ gboolean InfoReq::checkCallback(gpointer data)
 
 bool InfoReq::checkTimeout()
 {
-    // if waiting for 'working' response, check time out
-    if(m_status == ST_RUN && m_infoState == IN_REQ) {
+    // if waiting for client response, check time out
+    if(m_status == ST_RUN) {
         if (m_timer.timeout()) {
             m_status = ST_TIMEOUT;
             return true;
@@ -4476,6 +5262,8 @@ void InfoReq::setResponse(const Caller_t &caller, const string &state, const Inf
         m_handler = caller;
         m_infoState = IN_WAIT;
         m_server.emitInfoReq(*this);
+        //reset the timer, used to check timeout
+        m_timer.reset();
     } else if(m_infoState == IN_WAIT && state == "response") {
         m_response = response;
         m_handler = caller;
@@ -4494,15 +5282,15 @@ void InfoReq::done()
 
 /********************** BluezManager implementation ******************/
 BluezManager::BluezManager(DBusServer &server) :
-    m_server(server)
+    m_server(server),
+    m_adapterChanged(*this, "DefaultAdapterChanged")
 {
     m_bluezConn = g_dbus_setup_bus(DBUS_BUS_SYSTEM, NULL, true, NULL);
     if(m_bluezConn) {
         m_done = false;
-        DBusClientCall0<DBusObject_t> getAdapter(*this, "DefaultAdapter");
+        DBusClientCall1<DBusObject_t> getAdapter(*this, "DefaultAdapter");
         getAdapter(boost::bind(&BluezManager::defaultAdapterCb, this, _1, _2 ));
-        m_adapterChanged.reset(new SignalWatch1<DBusObject_t>(*this, "DefaultAdapterChanged"));
-        (*m_adapterChanged)(boost::bind(&BluezManager::defaultAdapterChanged, this, _1));
+        m_adapterChanged.activate(boost::bind(&BluezManager::defaultAdapterChanged, this, _1));
     } else {
         m_done = true;
     }
@@ -4535,13 +5323,10 @@ BluezManager::BluezAdapter::BluezAdapter(BluezManager &manager, const string &pa
     : m_manager(manager), m_path(path), m_devNo(0), m_devReplies(0),
       m_deviceRemoved(*this,  "DeviceRemoved"), m_deviceAdded(*this, "DeviceCreated")
 {
-    DBusClientCall0<std::vector<DBusObject_t> > listDevices(*this, "ListDevices");
+    DBusClientCall1<std::vector<DBusObject_t> > listDevices(*this, "ListDevices");
     listDevices(boost::bind(&BluezAdapter::listDevicesCb, this, _1, _2));
-    //m_deviceRemoved.reset(new SignalWatch1<DBusObject_t>(*this, "DeviceRemoved"));
-    m_deviceRemoved(boost::bind(&BluezAdapter::deviceRemoved, this, _1));
-
-    //m_deviceAdded.reset(new SignalWatch1<DBusObject_t>(*this, "DeviceCreated"));
-    m_deviceAdded(boost::bind(&BluezAdapter::deviceCreated, this, _1));
+    m_deviceRemoved.activate(boost::bind(&BluezAdapter::deviceRemoved, this, _1));
+    m_deviceAdded.activate(boost::bind(&BluezAdapter::deviceCreated, this, _1));
 }
 
 void BluezManager::BluezAdapter::listDevicesCb(const std::vector<DBusObject_t> &devices, const string &error)
@@ -4587,10 +5372,10 @@ void BluezManager::BluezAdapter::deviceCreated(const DBusObject_t &object)
 BluezManager::BluezDevice::BluezDevice (BluezAdapter &adapter, const string &path)
     : m_adapter(adapter), m_path(path), m_reply(false), m_propertyChanged(*this, "PropertyChanged")
 {
-    DBusClientCall0<PropDict> getProperties(*this, "GetProperties");
+    DBusClientCall1<PropDict> getProperties(*this, "GetProperties");
     getProperties(boost::bind(&BluezDevice::getPropertiesCb, this, _1, _2));
 
-    m_propertyChanged(boost::bind(&BluezDevice::propertyChanged, this, _1, _2));
+    m_propertyChanged.activate(boost::bind(&BluezDevice::propertyChanged, this, _1, _2));
 }
 
 void BluezManager::BluezDevice::checkSyncService(const std::vector<std::string> &uuids)
@@ -4664,6 +5449,346 @@ void BluezManager::BluezDevice::propertyChanged(const string &name,
     }
 }
 
+/************************ AutoSyncManager ******************/
+void AutoSyncManager::init()
+{
+    m_peerMap.clear();
+    SyncConfig::ConfigList list = SyncConfig::getConfigs();
+    BOOST_FOREACH(const SyncConfig::ConfigList::value_type &server, list) {
+        initConfig(server.first);
+    }
+}
+
+void AutoSyncManager::initConfig(const string &configName)
+{
+    SyncConfig config (configName);
+    if(!config.exists()) {
+        return;
+    }
+    vector<string> urls = config.getSyncURL();
+    string autoSync = config.getAutoSync();
+
+    //enable http and bt?
+    bool http = false, bt = false;
+    if(autoSync.empty() || boost::iequals(autoSync, "0")
+            || boost::iequals(autoSync, "f")) {
+        http = false;
+        bt = false;
+    } else if(boost::iequals(autoSync, "1") || boost::iequals(autoSync, "t")) {
+        http = true;
+        bt = true;
+    } else {
+        vector<string> options;
+        boost::split(options, autoSync, boost::is_any_of(",")); 
+        BOOST_FOREACH(string op, options) {
+            if(boost::iequals(op, "http")) {
+                http = true;
+            } else if(boost::iequals(op, "obex-bt")) {
+                bt = true;
+            }
+        }
+    }
+
+    unsigned int interval = config.getAutoSyncInterval();
+    unsigned int duration = config.getAutoSyncDelay();
+
+    BOOST_FOREACH(string url, urls) {
+        if((boost::istarts_with(url, "http") && http)
+                || (boost::istarts_with(url, "obex-bt") && bt)) {
+            AutoSyncTask syncTask(configName, duration, url);
+            PeerMap::iterator it = m_peerMap.find(interval);
+            if(it != m_peerMap.end()) {
+                it->second->push_back(syncTask);
+            } else {
+                boost::shared_ptr<AutoSyncTaskList> list(new AutoSyncTaskList(*this, interval));
+                list->push_back(syncTask);
+                list->createTimeoutSource();
+                m_peerMap.insert(std::make_pair(interval, list));
+            }
+        }
+    }
+}
+
+void AutoSyncManager::remove(const string &configName)
+{
+    //wipe out tasks in the m_peerMap
+    PeerMap::iterator it = m_peerMap.begin();
+    while(it != m_peerMap.end()) {
+        boost::shared_ptr<AutoSyncTaskList> &list = it->second;
+        AutoSyncTaskList::iterator taskIt = list->begin();
+        while(taskIt != list->end()) {
+            if(boost::iequals(taskIt->m_peer, configName)) {
+                taskIt = list->erase(taskIt);
+            } else {
+                ++taskIt;
+            }
+        }
+        //if list is empty, remove the list from map
+        if(list->empty()) {
+            PeerMap::iterator erased = it++;
+            m_peerMap.erase(erased);
+        } else {
+            ++it;
+        }
+    }
+
+    //wipe out scheduled tasks in the working queue based on configName
+    list<AutoSyncTask>::iterator qit = m_workQueue.begin();
+    while(qit != m_workQueue.end()) {
+        if(boost::iequals(qit->m_peer, configName)) {
+            qit = m_workQueue.erase(qit);
+        } else {
+            ++qit;
+        }
+    }
+}
+
+void AutoSyncManager::update(const string &configName)
+{
+    // remove task from m_peerMap and tasks in the working queue for this config
+    remove(configName);
+    // re-load the config and re-init peer map
+    initConfig(configName);
+
+    //don't clear if the task is running
+    if(m_session && !hasActiveSession()
+            && boost::iequals(m_session->getConfigName(), configName)) {
+        m_server.dequeue(m_session.get());
+        m_session.reset();
+        m_activeTask.reset();
+        startTask();
+    }
+}
+
+void AutoSyncManager::scheduleAll()
+{
+    BOOST_FOREACH(PeerMap::value_type &elem, m_peerMap) {
+        elem.second->scheduleTaskList();
+    }
+}
+
+bool AutoSyncManager::addTask(const AutoSyncTask &syncTask)
+{
+    if(taskLikelyToRun(syncTask)) {
+        m_workQueue.push_back(syncTask);
+        return true;
+    }
+    return false;
+}
+
+bool AutoSyncManager::findTask(const AutoSyncTask &syncTask)
+{
+    if(m_activeTask && *m_activeTask == syncTask) {
+        return true;
+    }
+    BOOST_FOREACH(const AutoSyncTask &task, m_workQueue) {
+        if(task == syncTask) {
+            return true;
+        }
+    }
+    return false;
+}
+
+bool AutoSyncManager::taskLikelyToRun(const AutoSyncTask &syncTask)
+{
+    PresenceStatus &status = m_server.getPresenceStatus(); 
+    // avoid doing any checking of task list if http and bt presence are false
+    if(!status.getHttpPresence() && !status.getBtPresence()) {
+        return false;
+    }
+
+    if(boost::istarts_with(syncTask.m_url, "http") && status.getHttpPresence()) {
+        // don't add duplicate tasks
+        if(!findTask(syncTask)) {
+            Timer& timer = status.getHttpTimer();
+            // if the time peer have been around is longer than 'autoSyncDelay',
+            // then return true
+            if (timer.timeout(syncTask.m_delay * 1000 /* seconds to milliseconds */)) {
+                return true;
+            }
+        } 
+    } else if (boost::istarts_with(syncTask.m_url, "obex-bt") && status.getBtPresence()) {
+        // don't add duplicate tasks
+        if(!findTask(syncTask)) {
+            return true;
+        }
+    }
+    return false;
+}
+
+void AutoSyncManager::startTask()
+{
+    // get the front task and run a sync
+    // if there has been a session for the front task, do nothing
+    if(hasTask() && !m_session) {
+        m_activeTask.reset(new AutoSyncTask(m_workQueue.front()));
+        m_workQueue.pop_front();
+        string newSession = m_server.getNextSession();   
+        m_session.reset(new Session(m_server,
+                                    "",
+                                    m_activeTask->m_peer,
+                                    newSession));
+        m_session->setPriority(Session::PRI_AUTOSYNC);
+        m_session->addListener(this);
+        m_server.enqueue(m_session);
+    }
+}
+
+bool AutoSyncManager::hasActiveSession()
+{
+    return m_session && m_session->getActive();
+}
+
+void AutoSyncManager::prepare()
+{
+    if(m_session && m_session->getActive()) {
+        // now a config may contain many urls, so replace it with our own temporarily
+        // otherwise it only picks the first one
+        ReadOperations::Config_t config;
+        StringMap stringMap;
+        stringMap["syncURL"] = m_activeTask->m_url;
+        config[""] = stringMap;
+        m_session->setConfig(true, true, config);
+
+        string mode;
+        Session::SourceModes_t sourceModes;
+        m_session->sync(mode, sourceModes);
+    }
+}
+
+void AutoSyncManager::syncSuccessStart()
+{
+    m_syncSuccessStart = true;
+    SE_LOG_INFO(NULL, NULL,"Automatic sync for '%s' has been successfully started.\n", m_activeTask->m_peer.c_str());
+#ifdef HAS_NOTIFY
+    string summary = StringPrintf(_("%s is syncing"), m_activeTask->m_peer.c_str());
+    string body = StringPrintf(_("We have just started to sync your computer with the %s sync service."), m_activeTask->m_peer.c_str());
+    //TODO: set config information for 'sync-ui'
+    m_notify.send(summary.c_str(), body.c_str());
+#endif
+}
+
+void AutoSyncManager::syncDone(SyncMLStatus status)
+{
+    SE_LOG_INFO(NULL, NULL,"Automatic sync for '%s' has been done.\n", m_activeTask->m_peer.c_str());
+#ifdef HAS_NOTIFY
+    // send a notification to notification server
+    string summary, body;
+    if(m_syncSuccessStart && status == STATUS_OK) {
+        // if sync is successfully started and done
+        summary = StringPrintf(_("%s sync complete"), m_activeTask->m_peer.c_str());
+        body = StringPrintf(_("We have just finished syncing your computer with the %s sync service."), m_activeTask->m_peer.c_str());
+        //TODO: set config information for 'sync-ui'
+        m_notify.send(summary.c_str(), body.c_str());
+    } else if(m_syncSuccessStart || (!m_syncSuccessStart && status == STATUS_FATAL)) {
+        //if sync is successfully started and has errors, or not started successful with a fatal problem
+        summary = StringPrintf(_("Sync problem."));
+        body = StringPrintf(_("Sorry, there's a problem with your sync that you need to attend to."));
+        //TODO: set config information for 'sync-ui'
+        m_notify.send(summary.c_str(), body.c_str());
+    } 
+#endif
+    m_session.reset();
+    m_activeTask.reset();
+    m_syncSuccessStart = false;
+}
+
+#ifdef HAS_NOTIFY
+AutoSyncManager::Notification::Notification()
+{
+    bindtextdomain (GETTEXT_PACKAGE, SYNCEVOLUTION_LOCALEDIR);
+    bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+    textdomain (GETTEXT_PACKAGE);
+    m_init = notify_init("SyncEvolution");
+    m_actions = false;
+    m_notification = NULL;
+    // check whether 'actions' are supported by notification server 
+    if(m_init) {
+        GList *list = notify_get_server_caps();
+        if(list) {
+            for(; list != NULL; list = list->next) {
+                if(boost::iequals((char *)list->data, "actions")) {
+                    m_actions = true;
+                }
+            }
+        }
+    }
+}
+
+AutoSyncManager::Notification::~Notification()
+{
+    if(m_init) {
+        notify_uninit();
+    }
+}
+
+void AutoSyncManager::Notification::notifyAction(NotifyNotification *notify,
+                                                 gchar *action,
+                                                 gpointer userData)
+{
+    if(boost::iequals("view", action)) {
+        pid_t pid;
+        if((pid = fork()) == 0) {
+            //search sync-ui from $PATH
+            if(execlp("sync-ui", "sync-ui", (const char*)0) < 0) {
+                exit(0);
+            }
+        }
+    } 
+    //if dismiss, ignore
+}
+
+void AutoSyncManager::Notification::send(const char *summary,
+                                         const char *body,
+                                         const char *viewParams)
+{
+    if(!m_init)
+        return;
+
+    if(m_notification) {
+        notify_notification_clear_actions(m_notification);
+        notify_notification_close(m_notification, NULL);
+    }
+    m_notification = notify_notification_new(summary, body, NULL, NULL);
+    //if actions are not supported, don't add actions
+    //An example is Ubuntu Notify OSD. It uses an alert box
+    //instead of a bubble when a notification is appended with actions.
+    //the alert box won't be closed until user inputs.
+    //so disable it in case of no support of actions
+    if(m_actions) {
+        notify_notification_add_action(m_notification, "view", _("View"), notifyAction, (gpointer)viewParams, NULL);
+        // Use "default" as ID because that is what mutter-moblin
+        // recognizes: it then skips the action instead of adding it
+        // in addition to its own "Dismiss" button (always added).
+        notify_notification_add_action(m_notification, "default", _("Dismiss"), notifyAction, (gpointer)viewParams, NULL);
+    }
+    notify_notification_show(m_notification, NULL);
+}
+#endif
+
+void AutoSyncManager::AutoSyncTaskList::createTimeoutSource()
+{
+    //if interval is 0, only run auto sync when changes are detected.
+    if(m_interval) {
+        m_source = g_timeout_add_seconds(m_interval, taskListTimeoutCb, static_cast<gpointer>(this));
+    }
+}
+
+gboolean AutoSyncManager::AutoSyncTaskList::taskListTimeoutCb(gpointer data)
+{
+    AutoSyncTaskList *list = static_cast<AutoSyncTaskList*>(data);
+    list->scheduleTaskList();
+    return TRUE;
+}
+
+void AutoSyncManager::AutoSyncTaskList::scheduleTaskList()
+{
+    BOOST_FOREACH(AutoSyncTask &syncTask, *this) {
+        m_manager.addTask(syncTask);
+    }
+    g_main_loop_quit(m_manager.m_server.getLoop());
+}
+
 /**************************** main *************************/
 
 void niam(int sig)
@@ -4720,7 +5845,11 @@ int main(int argc, char **argv)
         signal(SIGTERM, niam);
         signal(SIGINT, niam);
 
-        LoggerBase::instance().setLevel(LoggerBase::DEBUG);
+        LogRedirect redirect(true);
+        redirectPtr = &redirect;
+
+        // make daemon less chatty - long term this should be a command line option
+        LoggerBase::instance().setLevel(LoggerBase::INFO);
 
         DBusErrorCXX err;
         DBusConnectionPtr conn = g_dbus_setup_bus(DBUS_BUS_SESSION,
@@ -4728,13 +5857,13 @@ int main(int argc, char **argv)
                                                   true,
                                                   &err);
         if (!conn) {
-            err.throwFailure("g_dbus_setup_bus()");
+            err.throwFailure("g_dbus_setup_bus()", " failed - server already running?");
         }
 
         DBusServer server(loop, conn, duration);
         server.activate();
 
-        std::cout << argv[0] << " ready to run\n" << std::flush;
+        SE_LOG_INFO(NULL, NULL, "%s: ready to run",  argv[0]);
         server.run();
        return 0;
     } catch ( const std::exception &ex ) {
diff --git a/src/syncevo-dbus-server.desktop.in b/src/syncevo-dbus-server.desktop.in
new file mode 100644 (file)
index 0000000..2bd8abb
--- /dev/null
@@ -0,0 +1,6 @@
+[Desktop Entry]
+Type=Application
+Hidden=false
+Name=syncevo-dbus-server
+Comment=SyncEvolution D-Bus Server
+Exec=@libexecdir@/syncevo-dbus-server-startup.sh 
index fd3d03f..7d17470 100644 (file)
@@ -34,6 +34,7 @@
 #include <sstream>
 #include <memory>
 #include <set>
+#include <list>
 #include <algorithm>
 using namespace std;
 
@@ -54,10 +55,38 @@ Cmdline::Cmdline(int argc, const char * const * argv, ostream &out, ostream &err
     m_validSourceProps(SyncSourceConfig::getRegistry())
 {}
 
+Cmdline::Cmdline(const vector<string> &args, ostream &out, ostream &err) :
+    m_args(args),
+    m_out(out),
+    m_err(err),
+    m_validSyncProps(SyncConfig::getRegistry()),
+    m_validSourceProps(SyncSourceConfig::getRegistry())
+{
+    m_argc = args.size();
+    m_argvArray.reset(new const char *[args.size()]);
+    for(int i = 0; i < m_argc; i++) {
+        m_argvArray[i] = m_args[i].c_str();
+    }
+    m_argv = m_argvArray.get();
+}
+
 bool Cmdline::parse()
 {
+    vector<string> parsed;
+    return parse(parsed);
+}
+
+bool Cmdline::parse(vector<string> &parsed)
+{
+    parsed.clear();
+    if (m_argc) {
+        parsed.push_back(m_argv[0]);
+    }
+
     int opt = 1;
+    bool ok;
     while (opt < m_argc) {
+        parsed.push_back(m_argv[opt]);
         if (m_argv[opt][0] != '-') {
             break;
         }
@@ -71,6 +100,7 @@ bool Cmdline::parse()
                            SyncSourceConfig::m_sourcePropSync.getName().c_str())) {
                 return false;
             }
+            parsed.push_back(m_argv[opt]);
 
             // disable requirement to add --run explicitly in order to
             // be compatible with traditional command lines
@@ -82,6 +112,7 @@ bool Cmdline::parse()
                                m_argv[opt - 1], opt == m_argc ? NULL : m_argv[opt])) {
                     return false;
                 }
+                parsed.push_back(m_argv[opt]);
         } else if(boost::iequals(m_argv[opt], "--source-property") ||
                   boost::iequals(m_argv[opt], "-z")) {
             opt++;
@@ -89,6 +120,7 @@ bool Cmdline::parse()
                            m_argv[opt - 1], opt == m_argc ? NULL : m_argv[opt])) {
                 return false;
             }
+            parsed.push_back(m_argv[opt]);
         }else if(boost::iequals(m_argv[opt], "--template") ||
                   boost::iequals(m_argv[opt], "-l")) {
             opt++;
@@ -96,6 +128,7 @@ bool Cmdline::parse()
                 usage(true, string("missing parameter for ") + cmdOpt(m_argv[opt - 1]));
                 return false;
             }
+            parsed.push_back(m_argv[opt]);
             m_template = m_argv[opt];
             m_configure = true;
             string temp = boost::trim_copy (m_template);
@@ -132,10 +165,12 @@ bool Cmdline::parse()
                 usage(true, string("missing parameter for ") + cmdOpt(m_argv[opt - 1]));
                 return false;
             }
-            if (!isDir(m_restore)) {
+            //if can't convert it successfully, it's an invalid path
+            if (!relToAbs(m_restore)) {
                 usage(true, string("parameter '") + m_restore + "' for " + cmdOpt(m_argv[opt - 1]) + " must be log directory");
                 return false;
             }
+            parsed.push_back(m_restore);
         } else if(boost::iequals(m_argv[opt], "--before")) {
             m_before = true;
         } else if(boost::iequals(m_argv[opt], "--after")) {
@@ -155,9 +190,17 @@ bool Cmdline::parse()
             m_usage = true;
         } else if(boost::iequals(m_argv[opt], "--version")) {
             m_version = true;
-        } else if(boost::iequals(m_argv[opt], "--keyring")||
-                boost::iequals(m_argv[opt], "-k")) {
-            m_keyring = true;
+        } else if (parseBool(opt, "--keyring", "-k", true, m_keyring, ok)) {
+            if (!ok) {
+                return false;
+            }
+        } else if (parseBool(opt, "--daemon", NULL, true, m_useDaemon, ok)) {
+            if (!ok) {
+                return false;
+            }
+        } else if(boost::iequals(m_argv[opt], "--monitor")||
+                boost::iequals(m_argv[opt], "-m")) {
+            m_monitor = true;
         } else {
             usage(false, string(m_argv[opt]) + ": unknown parameter");
             return false;
@@ -168,6 +211,7 @@ bool Cmdline::parse()
     if (opt < m_argc) {
         m_server = m_argv[opt++];
         while (opt < m_argc) {
+            parsed.push_back(m_argv[opt]);
             m_sources.insert(m_argv[opt++]);
         }
     }
@@ -175,6 +219,85 @@ bool Cmdline::parse()
     return true;
 }
 
+bool Cmdline::parseBool(int opt, const char *longName, const char *shortName,
+                        bool def, Bool &value,
+                        bool &ok)
+{
+    string option = m_argv[opt];
+    string param;
+    size_t pos = option.find('=');
+    if (pos != option.npos) {
+        param = option.substr(pos + 1);
+        option.resize(pos);
+    }
+    if ((longName && boost::iequals(option, longName)) ||
+        (shortName && boost::iequals(option, shortName))) {
+        ok = true;
+        if (param.empty()) {
+            value = def;
+        } else if (boost::iequals(param, "t") ||
+                   boost::iequals(param, "1") ||
+                   boost::iequals(param, "true") ||
+                   boost::iequals(param, "yes")) {
+            value = true;
+        } else if (boost::iequals(param, "f") ||
+              boost::iequals(param, "0") ||
+              boost::iequals(param, "false") ||
+              boost::iequals(param, "no")) {
+            value = false;
+        } else {
+            usage(true, string("parameter in '") + m_argv[opt] + "' must be 1/t/true/yes or 0/f/false/no");
+            ok = false;
+        }
+        // was our option
+        return true;
+    } else {
+        // keep searching for match
+        return false;
+    }
+}
+
+bool Cmdline::isSync()
+{
+    //make sure command line arguments really try to run sync
+    if(m_usage || m_version) {
+        return false;
+    } else if(m_printServers || boost::trim_copy(m_server) == "?")  {
+        return false;
+    } else if(m_printTemplates || m_dontrun) {
+        return false;
+    } else if(m_argc == 1 || (m_useDaemon.wasSet() && m_argc == 2)) {
+        return false;
+    } else if(m_printConfig || m_remove) {
+        return false;
+    } else if (m_server == "" && m_argc > 1) {
+        return false;
+    } else if(m_configure || m_migrate) {
+        return false;
+    } else if(m_status || m_printSessions) {
+        return false;
+    } else if(!m_restore.empty()) {
+        return false;
+    } else if(m_dryrun) {
+        return false;
+    } else if(!m_run && (m_syncProps.size() || m_sourceProps.size())) {
+        return false;
+    }
+    return true;
+}
+
+bool Cmdline::dontRun() const
+{
+    // this mimics the if() checks in run()
+    if (m_usage || m_version ||
+        m_printServers || boost::trim_copy(m_server) == "?" ||
+        m_printTemplates) {
+        return false;
+    } else {
+        return m_dontrun;
+    }
+}
+
 bool Cmdline::run() {
     // --dry-run is only supported by some operations.
     // Be very strict about it and make sure it is off in all
@@ -203,7 +326,7 @@ bool Cmdline::run() {
         }
     } else if (m_dontrun) {
         // user asked for information
-    } else if (m_argc == 1) {
+    } else if (m_argc == 1 || (m_useDaemon.wasSet() && m_argc == 2)) {
         // no parameters: list databases and short usage
         const SourceRegistry &registry(SyncSource::getSourceRegistry());
         boost::shared_ptr<FilterConfigNode> sharedNode(new VolatileConfigNode());
@@ -211,7 +334,7 @@ bool Cmdline::run() {
         boost::shared_ptr<FilterConfigNode> hiddenNode(new VolatileConfigNode());
         boost::shared_ptr<FilterConfigNode> trackingNode(new VolatileConfigNode());
         boost::shared_ptr<FilterConfigNode> serverNode(new VolatileConfigNode());
-        SyncSourceNodes nodes(sharedNode, configNode, hiddenNode, trackingNode, serverNode);
+        SyncSourceNodes nodes(true, sharedNode, configNode, hiddenNode, trackingNode, serverNode, "");
         SyncSourceParams params("list", nodes);
         
         BOOST_FOREACH(const RegisterSyncSource *source, registry) {
@@ -259,11 +382,20 @@ bool Cmdline::run() {
             getFilters(context, syncFilter, sourceFilters);
         }
 
+        // determine whether we dump a peer or a context
+        int flags = DUMP_PROPS_NORMAL;
+        string peer, context;
+        SyncConfig::splitConfigString(config->getConfigName(), peer, context);
+        if (peer.empty()) {
+            flags |= HIDE_PER_PEER;
+            checkForPeerProps();
+        } 
+
         if (m_sources.empty() ||
             m_sources.find("main") != m_sources.end()) {
             boost::shared_ptr<FilterConfigNode> syncProps(config->getProperties());
             syncProps->setFilter(syncFilter);
-            dumpProperties(*syncProps, config->getRegistry(), false);
+            dumpProperties(*syncProps, config->getRegistry(), flags);
         }
 
         list<string> sources = config->getSyncSources();
@@ -281,7 +413,7 @@ bool Cmdline::run() {
                     sourceProps->setFilter(sourceFilters[""]);
                 }
                 dumpProperties(*sourceProps, SyncSourceConfig::getRegistry(),
-                               name != *(--sources.end()));
+                               flags | ((name != *(--sources.end())) ? HIDE_LEGEND : DUMP_PROPS_NORMAL));
             }
         }
     } else if (m_server == "" && m_argc > 1) {
@@ -304,6 +436,9 @@ bool Cmdline::run() {
         bool fromScratch = false;
         string peer, context;
         SyncConfig::splitConfigString(SyncConfig::normalizeConfigString(m_server), peer, context);
+        if (peer.empty()) {
+            checkForPeerProps();
+        }
 
         // Both config changes and migration are implemented as copying from
         // another config (template resp. old one). Migration also moves
@@ -353,8 +488,22 @@ bool Cmdline::run() {
             if (!from->exists()) {
                 // creating from scratch, look for template
                 fromScratch = true;
-                string configTemplate = m_template.empty() ? m_server : m_template;
-                SyncConfig::splitConfigString(SyncConfig::normalizeConfigString(configTemplate), peer, context);
+                string configTemplate;
+                if (m_template.empty()) {
+                    // template is the peer name
+                    configTemplate = m_server;
+                    SyncConfig::splitConfigString(SyncConfig::normalizeConfigString(configTemplate), peer, context);
+                } else {
+                    // Template is specified explicitly. It must not contain a context,
+                    // because the context comes from the config name.
+                    configTemplate = m_template;
+                    if (SyncConfig::splitConfigString(SyncConfig::normalizeConfigString(configTemplate), peer, context)) {
+                        m_err << "ERROR: template " << configTemplate << " must not specify a context." << endl;
+                        return false;
+                    }
+                    string tmp;
+                    SyncConfig::splitConfigString(SyncConfig::normalizeConfigString(m_server), tmp, context);
+                }
                 from = SyncConfig::createPeerTemplate(peer);
                 if (!from.get()) {
                     m_err << "ERROR: no configuration template for '" << configTemplate << "' available." << endl;
@@ -363,18 +512,26 @@ bool Cmdline::run() {
                     return false;
                 }
 
-                // Templates no longer contain these strings, because
-                // GUIs would have to localize them. For configs created
-                // via the command line, the extra hint that these
-                // properties need to be set is useful, so set these
-                // strings here. They'll get copied into the new
-                // config only if no other value was given on the
-                // command line.
-                if (!from->getUsername()[0]) {
-                    from->setUsername("your SyncML server account name");
-                }
-                if (!from->getPassword()[0]) {
-                    from->setPassword("your SyncML server password");
+                if (!from->getPeerIsClient()) {
+                    // Templates no longer contain these strings, because
+                    // GUIs would have to localize them. For configs created
+                    // via the command line, the extra hint that these
+                    // properties need to be set is useful, so set these
+                    // strings here. They'll get copied into the new
+                    // config only if no other value was given on the
+                    // command line.
+                    if (!from->getUsername()[0]) {
+                        from->setUsername("your SyncML server account name");
+                    }
+                    if (!from->getPassword()[0]) {
+                        from->setPassword("your SyncML server password");
+                    }
+                } else {
+                    // uncomment SyncURL, so that it can be shown by
+                    // sync-ui
+                    if (from->getSyncURL().size() == 0) {
+                        from->setSyncURL ("input your peer address here");
+                    }
                 }
             }
         }
@@ -422,7 +579,7 @@ bool Cmdline::run() {
 
                     // check whether the sync source works
                     SyncSourceParams params("list", to->getSyncSourceNodes(source));
-                    auto_ptr<SyncSource> syncSource(SyncSource::createSource(params, false));
+                    auto_ptr<SyncSource> syncSource(SyncSource::createSource(params, false, to.get()));
                     if (syncSource.get() == NULL) {
                         disable = "no backend available";
                     } else {
@@ -498,6 +655,7 @@ bool Cmdline::run() {
         context->setQuiet(m_quiet);
         context->setDryRun(m_dryrun);
         context->setConfigFilter(true, "", m_syncProps);
+        context->setOutput(&m_out);
         if (m_sources.empty()) {
             if (m_sourceProps.empty()) {
                 // empty source list, empty source filter => run with
@@ -569,13 +727,13 @@ bool Cmdline::run() {
                 if (first) {
                     first = false;
                 } else if(!m_quiet) {
-                    cout << endl;
+                    m_out << endl;
                 }
-                cout << dir << endl;
+                m_out << dir << endl;
                 if (!m_quiet) {
                     SyncReport report;
                     context->readSessionInfo(dir, report);
-                    cout << report;
+                    m_out << report;
                 }
             }
         } else if (!m_restore.empty()) {
@@ -763,6 +921,32 @@ void Cmdline::getFilters(const string &context,
     sourceFilters[""] = m_sourceProps;
 }
 
+static void findPeerProps(FilterConfigNode::ConfigFilter &filter,
+                          ConfigPropertyRegistry &registry,
+                          list<string> &peerProps)
+{
+    BOOST_FOREACH(StringPair entry, filter) {
+        const ConfigProperty *prop = registry.find(entry.first);
+        if (prop &&
+            prop->getSharing() == ConfigProperty::NO_SHARING &&
+            !(prop->getFlags() & ConfigProperty::SHARED_AND_UNSHARED)) {
+            peerProps.push_back(entry.first);
+        }
+    }
+}
+
+void Cmdline::checkForPeerProps()
+{
+    list<string> peerProps;
+
+    findPeerProps(m_syncProps, SyncConfig::getRegistry(), peerProps);
+    findPeerProps(m_sourceProps, SyncSourceConfig::getRegistry(), peerProps);
+    if (!peerProps.empty()) {
+        SyncContext::throwError(string("per-peer (unshared) properties not allowed: ") +
+                                boost::join(peerProps, ", "));
+    }
+}
+
 void Cmdline::listSources(SyncSource &syncSource, const string &header)
 {
     m_out << header << ":\n";
@@ -794,10 +978,16 @@ void Cmdline::dumpConfigTemplates(const string &preamble,
                                        bool printRank)
 {
     m_out << preamble << endl;
+    m_out << "   "  << "template name" << " = " << "template description";
+    if (printRank) {
+        m_out << "    " << "matching score in percent (100% = exact match)";
+    }
+    m_out << endl;
+
     BOOST_FOREACH(const SyncConfig::TemplateList::value_type server,templates) {
-        m_out << "   "  << server->m_name << " = " << server->m_description;
+        m_out << "   "  << server->m_templateId << " = " << server->m_description;
         if (printRank){
-            m_out << "    " << server->m_rank;
+            m_out << "    " << server->m_rank *20 << "%";
         }
         m_out << endl;
     }
@@ -808,12 +998,15 @@ void Cmdline::dumpConfigTemplates(const string &preamble,
 
 void Cmdline::dumpProperties(const ConfigNode &configuredProps,
                              const ConfigPropertyRegistry &allProps,
-                             bool hideLegend)
+                             int flags)
 {
     list<string> perPeer, perContext, global;
 
     BOOST_FOREACH(const ConfigProperty *prop, allProps) {
-        if (prop->isHidden()) {
+        if (prop->isHidden() ||
+            ((flags & HIDE_PER_PEER) &&
+             prop->getSharing() == ConfigProperty::NO_SHARING &&
+             !(prop->getFlags() & ConfigProperty::SHARED_AND_UNSHARED))) {
             continue;
         }
         if (!m_quiet) {
@@ -847,7 +1040,7 @@ void Cmdline::dumpProperties(const ConfigNode &configuredProps,
         }
     }
 
-    if (!m_quiet && !hideLegend) {
+    if (!m_quiet && !(flags & HIDE_LEGEND)) {
         if (!perPeer.empty() ||
             !perContext.empty() ||
             !global.empty()) {
@@ -1019,11 +1212,14 @@ void Cmdline::usage(bool full, const string &error, const string &param)
             "  shown without starting a new one. This can be used to see in advance" << endl <<
             "  whether the local data needs to be synchronized with the peer." << endl <<
             "" << endl <<
+            "  When used without configuration name, it shows the status of the background" << endl <<
+            "  sync daemon or an error if no such daemon exists." << endl <<
+            "" << endl <<
             "--quiet|-q" << endl <<
             "  Suppresses most of the normal output during a synchronization. The" << endl <<
             "  log file still contains all the information." << endl <<
             "" << endl <<
-            "--keyring|-k" << endl <<
+            "--keyring|-k[=yes/no/...]" << endl <<
             "  Save or retrieve passwords from the GNOME keyring when modifying the" << endl <<
             "  configuration or running a synchronization. Note that using this option" << endl <<
             "  applies to *all* passwords in a configuration, so setting a single" << endl <<
@@ -1037,6 +1233,10 @@ void Cmdline::usage(bool full, const string &error, const string &param)
             "  interactively. The --print-config output always shows '-' instead of" << endl <<
             "  retrieving the password from the keyring." << endl <<
             "" << endl <<
+            "--daemon[=yes/no/...]" << endl <<
+            "  Run operations in cooperation with the background sync daemon;" << endl <<
+            "  enabled by default if it is installed." << endl <<
+            "" << endl <<
             "--help|-h" << endl <<
             "  Prints usage information." << endl <<
             "" << endl <<
@@ -1345,21 +1545,25 @@ public:
                               "peers/scheduleworld/config.ini:# loglevel = 0\n"
                               "peers/scheduleworld/config.ini:# printChanges = 1\n"
                               "config.ini:# maxlogdirs = 10\n"
-                              "peers/scheduleworld/config.ini:# preventSlowSync = 0\n"
+                              "peers/scheduleworld/config.ini:# autoSync = 0\n"
+                              "peers/scheduleworld/config.ini:# autoSyncInterval = 30M\n"
+                              "peers/scheduleworld/config.ini:# autoSyncDelay = 5M\n"
+                              "peers/scheduleworld/config.ini:# preventSlowSync = 1\n"
                               "peers/scheduleworld/config.ini:# useProxy = 0\n"
                               "peers/scheduleworld/config.ini:# proxyHost = \n"
                               "peers/scheduleworld/config.ini:# proxyUsername = \n"
                               "peers/scheduleworld/config.ini:# proxyPassword = \n"
                               "peers/scheduleworld/config.ini:# clientAuthType = md5\n"
-                              "peers/scheduleworld/config.ini:# RetryDuration = 300\n"
-                              "peers/scheduleworld/config.ini:# RetryInterval = 60\n"
+                              "peers/scheduleworld/config.ini:# RetryDuration = 5M\n"
+                              "peers/scheduleworld/config.ini:# RetryInterval = 2M\n"
                               "peers/scheduleworld/config.ini:# remoteIdentifier = \n"
                               "peers/scheduleworld/config.ini:# PeerIsClient = 0\n"
+                              "peers/scheduleworld/config.ini:# SyncMLVersion = \n"
                               "peers/scheduleworld/config.ini:# PeerName = \n"
                               "config.ini:deviceId = fixed-devid\n" /* this is not the default! */
                               "peers/scheduleworld/config.ini:# remoteDeviceId = \n"
                               "peers/scheduleworld/config.ini:# enableWBXML = 1\n"
-                              "peers/scheduleworld/config.ini:# maxMsgSize = 20000\n"
+                              "peers/scheduleworld/config.ini:# maxMsgSize = 150000\n"
                               "peers/scheduleworld/config.ini:# maxObjSize = 4000000\n"
                               "peers/scheduleworld/config.ini:# enableCompression = 0\n"
                               "peers/scheduleworld/config.ini:# SSLServerCertificates = \n"
@@ -1445,7 +1649,7 @@ protected:
     }
 
     void removeRandomUUID(string &buffer) {
-        string uuidstr = "deviceId = sc-pim-";
+        string uuidstr = "deviceId = syncevolution-";
         size_t uuid = buffer.find(uuidstr);
         CPPUNIT_ASSERT(uuid != buffer.npos);
         size_t end = buffer.find("\n", uuid + uuidstr.size());
@@ -1630,12 +1834,14 @@ protected:
         TestCmdline help("--template", "? ", NULL);
         help.doit();
         CPPUNIT_ASSERT_EQUAL_DIFF("Available configuration templates:\n"
+                                  "   template name = template description\n"
                                   "   Funambol = http://my.funambol.com\n"
                                   "   Google = http://m.google.com/sync\n"
                                   "   Goosync = http://www.goosync.com/\n"
                                   "   Memotoo = http://www.memotoo.com\n"
                                   "   Mobical = http://www.mobical.net\n"
                                   "   Oracle = http://www.oracle.com/technology/products/beehive/index.html\n"
+                                  "   Ovi = http://www.ovi.com\n"
                                   "   ScheduleWorld = http://www.scheduleworld.com\n"
                                   "   SyncEvolution = http://www.syncevolution.org\n"
                                   "   Synthesis = http://www.synthesis.ch\n"
@@ -1647,36 +1853,36 @@ protected:
     void testMatchTemplate() {
         ScopedEnvChange templates("SYNCEVOLUTION_TEMPLATE_DIR", "testcases/templates");
 
-        TestCmdline help1("--template", "?nokia_7210c", NULL);
+        TestCmdline help1("--template", "?nokia 7210c", NULL);
         help1.doit();
         CPPUNIT_ASSERT_EQUAL_DIFF("Available configuration templates:\n"
-                "   Nokia_7210c = Template for Nokia 7210c phone and as default template for all Nokia phones    5\n"
-                "   SyncEvolutionClient = SyncEvolution server side template    2\n"
-                "   ServerDefault = server side default template    1\n",
+                "   template name = template description    matching score in percent (100% = exact match)\n"
+                "   Nokia 7210c = Template for Nokia S40 series Phone    100%\n"
+                "   SyncEvolution Client = SyncEvolution server side template    40%\n",
                 help1.m_out.str());
         CPPUNIT_ASSERT_EQUAL_DIFF("", help1.m_err.str());
         TestCmdline help2("--template", "?nokia", NULL);
         help2.doit();
         CPPUNIT_ASSERT_EQUAL_DIFF("Available configuration templates:\n"
-                "   Nokia_7210c = Template for Nokia 7210c phone and as default template for all Nokia phones    5\n"
-                "   SyncEvolutionClient = SyncEvolution server side template    2\n"
-                "   ServerDefault = server side default template    1\n",
+                "   template name = template description    matching score in percent (100% = exact match)\n"
+                "   Nokia 7210c = Template for Nokia S40 series Phone    100%\n"
+                "   SyncEvolution Client = SyncEvolution server side template    40%\n",
                 help2.m_out.str());
         CPPUNIT_ASSERT_EQUAL_DIFF("", help2.m_err.str());
         TestCmdline help3("--template", "?7210c", NULL);
         help3.doit();
         CPPUNIT_ASSERT_EQUAL_DIFF("Available configuration templates:\n"
-                "   Nokia_7210c = Template for Nokia 7210c phone and as default template for all Nokia phones    3\n"
-                "   ServerDefault = server side default template    1\n"
-                "   SyncEvolutionClient = SyncEvolution server side template    1\n",
+                "   template name = template description    matching score in percent (100% = exact match)\n"
+                "   Nokia 7210c = Template for Nokia S40 series Phone    60%\n"
+                "   SyncEvolution Client = SyncEvolution server side template    20%\n",
                 help3.m_out.str());
         CPPUNIT_ASSERT_EQUAL_DIFF("", help3.m_err.str());
-        TestCmdline help4("--template", "?syncevolution", NULL);
+        TestCmdline help4("--template", "?syncevolution client", NULL);
         help4.doit();
         CPPUNIT_ASSERT_EQUAL_DIFF("Available configuration templates:\n"
-                "   SyncEvolutionClient = SyncEvolution server side template    5\n"
-                "   Nokia_7210c = Template for Nokia 7210c phone and as default template for all Nokia phones    2\n"
-                "   ServerDefault = server side default template    2\n",
+                "   template name = template description    matching score in percent (100% = exact match)\n"
+                "   SyncEvolution Client = SyncEvolution server side template    100%\n"
+                "   Nokia 7210c = Template for Nokia S40 series Phone    40%\n",
                 help4.m_out.str());
         CPPUNIT_ASSERT_EQUAL_DIFF("", help4.m_err.str());
     }
@@ -1751,6 +1957,15 @@ protected:
         }
 
         {
+            TestCmdline cmdline("--print-config", "--template", "scheduleworld@nosuchcontext", NULL);
+            cmdline.doit();
+            CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_err.str());
+            string actual = cmdline.m_out.str();
+            // deviceId must *not* be the one from Funambol because of the new context
+            CPPUNIT_ASSERT(!boost::contains(actual, "deviceId = fixed-devid"));
+        }
+
+        {
             TestCmdline cmdline("--print-config", "--template", "Default", NULL);
             cmdline.doit();
             CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_err.str());
@@ -1832,6 +2047,39 @@ protected:
             CPPUNIT_ASSERT_EQUAL_DIFF(expected,
                                       actual);
         }
+
+        {
+            // print config => must not use settings from default context
+            TestCmdline cmdline("--print-config", "--template", "scheduleworld@nosuchcontext", NULL);
+            cmdline.doit();
+            CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_err.str());
+            // source settings *not* from modified Funambol config
+            string expected = filterConfig(internalToIni(ScheduleWorldConfig()));
+            string actual = injectValues(filterConfig(cmdline.m_out.str()));
+            CPPUNIT_ASSERT(!boost::contains(actual, "deviceId = fixed-devid"));
+            removeRandomUUID(actual);
+            CPPUNIT_ASSERT_EQUAL_DIFF(expected,
+                                      actual);
+        }
+
+        {
+            // create config => again, must not use settings from default context
+            TestCmdline cmdline("--configure", "--template", "scheduleworld", "other@other", NULL);
+            cmdline.doit();
+            CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_err.str());
+        }
+        {
+            TestCmdline cmdline("--print-config", "other@other", NULL);
+            cmdline.doit();
+            CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_err.str());
+            // source settings *not* from modified Funambol config
+            string expected = filterConfig(internalToIni(ScheduleWorldConfig()));
+            string actual = injectValues(filterConfig(cmdline.m_out.str()));
+            CPPUNIT_ASSERT(!boost::contains(actual, "deviceId = fixed-devid"));
+            removeRandomUUID(actual);
+            CPPUNIT_ASSERT_EQUAL_DIFF(expected,
+                                      actual);
+        }
     }
 
     void testPrintFileTemplates() {
@@ -1954,7 +2202,40 @@ protected:
 
         rm_r(m_testDir);
         testSetupScheduleWorld();
-        doConfigure(ScheduleWorldConfig(), "sources/addressbook/config.ini:");
+        string expected = doConfigure(ScheduleWorldConfig(), "sources/addressbook/config.ini:");
+
+        {
+            // updating type for peer must also update type for context
+            TestCmdline cmdline("--configure",
+                                "--source-property", "type=file:text/vcard:3.0",
+                                "scheduleworld", "addressbook",
+                                NULL);
+            cmdline.doit();
+            CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_err.str());
+            CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_out.str());
+            boost::replace_all(expected,
+                               "type = addressbook:text/vcard",
+                               "type = file:text/vcard:3.0");
+            CPPUNIT_ASSERT_EQUAL_DIFF(expected,
+                                      filterConfig(printConfig("scheduleworld")));
+            string shared = filterConfig(printConfig("@default"));
+            CPPUNIT_ASSERT(shared.find("type = file:text/vcard:3.0") != shared.npos);
+        }
+
+        {
+            // updating type for context must not affect peer
+            TestCmdline cmdline("--configure",
+                                "--source-property", "type=file:text/vcard:2.1",
+                                "@default", "addressbook",
+                                NULL);
+            cmdline.doit();
+            CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_err.str());
+            CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_out.str());
+            CPPUNIT_ASSERT_EQUAL_DIFF(expected,
+                                      filterConfig(printConfig("scheduleworld")));
+            string shared = filterConfig(printConfig("@default"));
+            CPPUNIT_ASSERT(shared.find("type = file:text/vcard:2.1") != shared.npos);
+        }
 
         string syncProperties("syncURL:\n"
                               "\n"
@@ -1970,6 +2251,12 @@ protected:
                               "\n"
                               "maxlogdirs:\n"
                               "\n"
+                              "autoSync:\n"
+                              "\n"
+                              "autoSyncInterval:\n"
+                              "\n"
+                              "autoSyncDelay:\n"
+                              "\n"
                               "preventSlowSync:\n"
                               "\n"
                               "useProxy:\n"
@@ -1990,6 +2277,8 @@ protected:
                               "\n"
                               "PeerIsClient:\n"
                               "\n"
+                              "SyncMLVersion:\n"
+                              "\n"
                               "PeerName:\n"
                               "\n"
                               "deviceId:\n"
@@ -2093,7 +2382,7 @@ protected:
         doConfigure(oldConfig, "spds/sources/addressbook/config.txt:");
     }
 
-    void doConfigure(const string &SWConfig, const string &addressbookPrefix) {
+    string doConfigure(const string &SWConfig, const string &addressbookPrefix) {
         string expected;
 
         {
@@ -2162,6 +2451,8 @@ protected:
             CPPUNIT_ASSERT_EQUAL_DIFF(expected,
                                       filterConfig(printConfig("scheduleworld")));
         }
+
+        return expected;
     }
 
     void testListSources() {
@@ -2355,7 +2646,7 @@ private:
             success = m_cmdline->parse() &&
                 m_cmdline->run();
             if (m_err.str().size()) {
-                cout << endl << m_err.str();
+                m_out << endl << m_err.str();
             }
             CPPUNIT_ASSERT(success);
         }
@@ -2400,21 +2691,25 @@ private:
             "spds/syncml/config.txt:# loglevel = 0\n"
             "spds/syncml/config.txt:# printChanges = 1\n"
             "spds/syncml/config.txt:# maxlogdirs = 10\n"
-            "spds/syncml/config.txt:# preventSlowSync = 0\n"
+            "spds/syncml/config.txt:# autoSync = 0\n"
+            "spds/syncml/config.txt:# autoSyncInterval = 30M\n"
+            "spds/syncml/config.txt:# autoSyncDelay = 5M\n"
+            "spds/syncml/config.txt:# preventSlowSync = 1\n"
             "spds/syncml/config.txt:# useProxy = 0\n"
             "spds/syncml/config.txt:# proxyHost = \n"
             "spds/syncml/config.txt:# proxyUsername = \n"
             "spds/syncml/config.txt:# proxyPassword = \n"
             "spds/syncml/config.txt:# clientAuthType = md5\n"
-            "spds/syncml/config.txt:# RetryDuration = 300\n"
-            "spds/syncml/config.txt:# RetryInterval = 60\n"
+            "spds/syncml/config.txt:# RetryDuration = 5M\n"
+            "spds/syncml/config.txt:# RetryInterval = 2M\n"
             "spds/syncml/config.txt:# remoteIdentifier = \n"
             "spds/syncml/config.txt:# PeerIsClient = 0\n"
+            "spds/syncml/config.txt:# SyncMLVersion = \n"
             "spds/syncml/config.txt:# PeerName = \n"
             "spds/syncml/config.txt:deviceId = fixed-devid\n" /* this is not the default! */
             "spds/syncml/config.txt:# remoteDeviceId = \n"
             "spds/syncml/config.txt:# enableWBXML = 1\n"
-            "spds/syncml/config.txt:# maxMsgSize = 20000\n"
+            "spds/syncml/config.txt:# maxMsgSize = 150000\n"
             "spds/syncml/config.txt:# maxObjSize = 4000000\n"
             "spds/syncml/config.txt:# enableCompression = 0\n"
 #ifdef ENABLE_LIBSOUP
@@ -2473,6 +2768,10 @@ private:
                              "enableWBXML = 0");
 
         boost::replace_first(config,
+                             "# RetryInterval = 2M",
+                             "RetryInterval = 0");
+
+        boost::replace_first(config,
                              "addressbook/config.ini:uri = card3",
                              "addressbook/config.ini:uri = card");
         boost::replace_all(config,
index d3f4261..55c1a35 100644 (file)
@@ -27,6 +27,7 @@
 using namespace std;
 
 #include <boost/shared_ptr.hpp>
+#include <boost/scoped_array.hpp>
 
 #include <syncevo/declarations.h>
 SE_BEGIN_CXX
@@ -42,6 +43,7 @@ public:
      * @param err      stderr stream for error messages
      */
     Cmdline(int argc, const char * const *argv, ostream &out, ostream &err);
+    Cmdline(const vector<string> &args, ostream &out, ostream &err);
 
     /**
      * parse the command line options
@@ -50,22 +52,63 @@ public:
      */
     bool parse();
 
+    /**
+     * parse the command line options
+     * relative paths in the arguments are converted to absolute paths
+     * if it returns false, then the content of args is undefined.
+     *
+     * @retval true if command line was okay
+     */
+    bool parse(vector<string> &args);
+
+    /**
+     * @return false if run() still needs to be invoked, true when parse() already did
+     *         the job (like --sync-property ?)
+     */
+    bool dontRun() const;
+
     bool run();
 
-protected:
+    /**
+     * Acts like a boolean, but in addition, can also tell whether the
+     * value was explicitly set.
+     */
     class Bool { 
     public:
-        Bool(bool val = false) : m_value(val) {}
-        operator bool () { return m_value; }
-        Bool & operator = (bool val) { m_value = val; return *this; }
+    Bool(bool val = false) : m_value(val), m_wasSet(false) {}
+        operator bool () const { return m_value; }
+        Bool & operator = (bool val) { m_value = val; m_wasSet = true; return *this; }
+        bool wasSet() const { return m_wasSet; }
     private:
         bool m_value;
+        bool m_wasSet;
     };
 
+    Bool useDaemon() { return m_useDaemon; }
+
+    /** whether '--monitor' is set */
+    bool monitor() { return m_monitor; }
+
+    /** whether 'status' is set */
+    bool status() { return m_status; }
+
+    /* server name */
+    string getConfigName() { return m_server; }
+
+    /* check whether command line runs sync. It should be called after parsing. */
+    bool isSync();
+
+protected:
+    // vector to store strings for arguments 
+    vector<string> m_args;
+
     int m_argc;
     const char * const * m_argv;
     ostream &m_out, &m_err;
 
+    //array to store pointers of arguments
+    boost::scoped_array<const char *> m_argvArray;
+
     Bool m_quiet;
     Bool m_dryrun;
     Bool m_status;
@@ -81,6 +124,8 @@ protected:
     Bool m_printSessions;
     Bool m_dontrun;
     Bool m_keyring;
+    Bool m_monitor;
+    Bool m_useDaemon;
     FilterConfigNode::ConfigFilter m_syncProps, m_sourceProps;
     const ConfigPropertyRegistry &m_validSyncProps;
     const ConfigPropertyRegistry &m_validSourceProps;
@@ -132,6 +177,13 @@ protected:
                     SourceFilters_t &sourceFilters);
 
     /**
+     * check that m_syncProps and m_sourceProps don't contain
+     * properties which only apply to peers, throw error
+     * if found
+     */
+    void checkForPeerProps();
+
+    /**
      * list all known data sources of a certain type
      */
     void listSources(SyncSource &syncSource, const string &header);
@@ -143,9 +195,20 @@ protected:
                      const SyncConfig::TemplateList &templates,
                      bool printRank = false);
 
+    enum DumpPropertiesFlags {
+        DUMP_PROPS_NORMAL = 0,
+        HIDE_LEGEND = 1<<0,       /**<
+                                   * do not show the explanation which properties are shared,
+                                   * used while dumping any source which is not the last one
+                                   */
+        HIDE_PER_PEER = 1<<1      /**<
+                                   * config is for a context, not a peer, so do not show those
+                                   * properties which are only per-peer
+                                   */
+    };
     void dumpProperties(const ConfigNode &configuredProps,
                         const ConfigPropertyRegistry &allProps,
-                        bool hideLegend);
+                        int flags);
 
     void copyProperties(const ConfigNode &fromProps,
                         ConfigNode &toProps,
@@ -170,6 +233,22 @@ protected:
     virtual SyncContext* createSyncClient();
 
     friend class CmdlineTest;
+
+ private:
+    /**
+     * Utility function to check m_argv[opt] against a specific boolean
+     * parameter of the form "<longName|shortName>[=yes/1/t/true/no/0/f/false].
+     *
+     * @param opt        current index in m_argv
+     * @param longName   long form of the parameter, including --, may be NULL
+     * @param shortName  short form, including -, may be NULL
+     * @param  def       default value if m_argv[opt] contains no explicit value
+     * @retval value     if and only if m_argv[opt] matches, then this is set to to true or false
+     * @retval ok        true if parsing succeeded, false if not and error message was printed
+     */
+    bool parseBool(int opt, const char *longName, const char *shortName,
+                   bool def, Bool &value,
+                   bool &ok);
 };
 
 
index 7dbc1e5..eb17d7b 100644 (file)
@@ -21,6 +21,7 @@
 #include "config.h"
 #include <syncevo/LogRedirect.h>
 #include <syncevo/Logging.h>
+#include <syncevo/SyncContext.h>
 #include "test.h"
 #include <syncevo/util.h>
 #include <sys/types.h>
@@ -49,7 +50,8 @@ LogRedirect *LogRedirect::m_redirect;
 
 void LogRedirect::abortHandler(int sig) throw()
 {
-    SE_LOG_ERROR(NULL, NULL, "caught signal %d, shutting down", sig);
+    // Don't know state of logging system, don't log here!
+    // SE_LOG_ERROR(NULL, NULL, "caught signal %d, shutting down", sig);
 
     // shut down redirection, also flushes to log
     if (m_redirect) {
@@ -62,12 +64,13 @@ void LogRedirect::abortHandler(int sig) throw()
     raise(sig);
 }
 
-LogRedirect::LogRedirect(bool both) throw()
+void LogRedirect::init()
 {
     m_processing = false;
     m_buffer = NULL;
     m_len = 0;
     m_out = NULL;
+    m_streams = false;
     m_stderr.m_original =
         m_stderr.m_read =
         m_stderr.m_write =
@@ -76,6 +79,11 @@ LogRedirect::LogRedirect(bool both) throw()
         m_stdout.m_read =
         m_stdout.m_write =
         m_stdout.m_copy = -1;
+}
+
+LogRedirect::LogRedirect(bool both) throw()
+{
+    init();
     if (!getenv("SYNCEVOLUTION_DEBUG")) {
         redirect(STDERR_FILENO, m_stderr);
         if (both) {
@@ -109,9 +117,26 @@ LogRedirect::LogRedirect(bool both) throw()
     }
 }
 
+LogRedirect::LogRedirect(ExecuteFlags flags)
+{
+    init();
+
+    m_streams = true;
+    if (!(flags & EXECUTE_NO_STDERR)) {
+        redirect(STDERR_FILENO, m_stderr);
+    }
+    if (!(flags & EXECUTE_NO_STDOUT)) {
+        redirect(STDOUT_FILENO, m_stdout);
+    }
+}
+
 LogRedirect::~LogRedirect() throw()
 {
-    m_redirect = NULL;
+    bool pop = false;
+    if (m_redirect == this) {
+        m_redirect = NULL;
+        pop = true;
+    }
     process();
     restore();
     if (m_out) {
@@ -120,7 +145,9 @@ LogRedirect::~LogRedirect() throw()
     if (m_buffer) {
         free(m_buffer);
     }
-    LoggerBase::popLogger();
+    if (pop) {
+        LoggerBase::popLogger();
+    }
 }
 
 void LogRedirect::restore() throw()
@@ -153,57 +180,66 @@ void LogRedirect::redirect(int original, FDs &fds) throw()
     fds.m_write = fds.m_read = -1;
     fds.m_copy = dup(fds.m_original);
     if (fds.m_copy >= 0) {
-#ifdef USE_LOGREDIRECT_UNIX_DOMAIN
-        int sockets[2];
-
-        if (!socketpair(AF_LOCAL, SOCK_DGRAM, 0, sockets)) {
-            if (dup2(sockets[0], fds.m_original) >= 0) {
+        if (m_streams) {
+            // According to Stevens, Unix Network Programming, "Unix
+            // domain datagram sockets are similar to UDP sockets: the
+            // provide an *unreliable* datagram service that preserves
+            // record boundaries." (14.4 Socket Functions,
+            // p. 378). But unit tests showed that they do block on
+            // Linux and thus seem reliable. Not sure what the official
+            // spec is.
+            //
+            // To avoid the deadlock risk, we must use UDP. But when we
+            // want "reliable" behavior *and* detect that all output was
+            // processed, we have to use streams despite loosing
+            // the write() boundaries, because Unix domain datagram sockets
+            // do not flag "end of data".
+            int sockets[2];
+#define USE_UNIX_DOMAIN_DGRAM 0
+            if (!socketpair(AF_LOCAL,
+                            USE_UNIX_DOMAIN_DGRAM ? SOCK_DGRAM : SOCK_STREAM,
+                            0, sockets)) {
                 // success
                 fds.m_write = sockets[0];
                 fds.m_read = sockets[1];
                 return;
             } else {
-                perror("LogRedirect::redirect() dup2");
+                perror("LogRedirect::redirect() socketpair");
             }
-            close(sockets[0]);
-            close(sockets[1]);
         } else {
-            perror("LogRedirect::redirect() socketpair");
-        }
-#else
-        int write = socket(AF_INET, SOCK_DGRAM, 0);
-        if (write >= 0) {
-            int read = socket(AF_INET, SOCK_DGRAM, 0);
-            if (read >= 0) {
-                struct sockaddr_in addr;
-                memset(&addr, 0, sizeof(addr));
-                addr.sin_family = AF_INET;
-                addr.sin_addr.s_addr = inet_addr("127.0.0.1");
-                bool bound = false;
-                for (int port = 1025; !bound && port < 10000; port++) {
-                    addr.sin_port = htons(port);
-                    if (!bind(read, (struct sockaddr *)&addr, sizeof(addr))) {
-                        bound = true;
+            int write = socket(AF_INET, SOCK_DGRAM, 0);
+            if (write >= 0) {
+                int read = socket(AF_INET, SOCK_DGRAM, 0);
+                if (read >= 0) {
+                    struct sockaddr_in addr;
+                    memset(&addr, 0, sizeof(addr));
+                    addr.sin_family = AF_INET;
+                    addr.sin_addr.s_addr = inet_addr("127.0.0.1");
+                    bool bound = false;
+                    for (int port = 1025; !bound && port < 10000; port++) {
+                        addr.sin_port = htons(port);
+                        if (!bind(read, (struct sockaddr *)&addr, sizeof(addr))) {
+                            bound = true;
+                        }
                     }
-                }
 
-                if (bound) {
-                    if (!connect(write, (struct sockaddr *)&addr, sizeof(addr))) {
-                        if (dup2(write, fds.m_original) >= 0) {
-                            // success
-                            fds.m_write = write;
-                            fds.m_read = read;
-                            return;
+                    if (bound) {
+                        if (!connect(write, (struct sockaddr *)&addr, sizeof(addr))) {
+                            if (dup2(write, fds.m_original) >= 0) {
+                                // success
+                                fds.m_write = write;
+                                fds.m_read = read;
+                                return;
+                            }
+                            perror("LogRedirect::redirect() dup2");
                         }
-                        perror("LogRedirect::redirect() dup2");
+                        perror("LogRedirect::redirect connect");
                     }
-                    perror("LogRedirect::redirect connect");
+                    close(read);
                 }
-                close(read);
+                close(write);
             }
-            close(write);
         }
-#endif
         close(fds.m_copy);
         fds.m_copy = -1;
     } else {
@@ -213,35 +249,41 @@ void LogRedirect::redirect(int original, FDs &fds) throw()
 
 void LogRedirect::restore(FDs &fds) throw()
 {
-    if (fds.m_copy < 0) {
-        return;
-    }
+    if (!m_streams && fds.m_copy >= 0) {
+        // flush our own redirected output and process what they might have written
+        if (fds.m_original == STDOUT_FILENO) {
+            fflush(stdout);
+            std::cout << std::flush;
+        } else {
+            fflush(stderr);
+            std::cerr << std::flush;
+        }
+        process(fds);
 
-    // flush streams and process what they might have written
-    if (fds.m_original == STDOUT_FILENO) {
-        fflush(stdout);
-        std::cout << std::flush;
-    } else {
-        fflush(stderr);
-        std::cerr << std::flush;
+        dup2(fds.m_copy, fds.m_original);
     }
-    process(fds);
 
-    dup2(fds.m_copy, fds.m_original);
-    close(fds.m_copy);
-    close(fds.m_write);
-    close(fds.m_read);
+    if (fds.m_copy >= 0) {
+        close(fds.m_copy);
+    }
+    if (fds.m_write >= 0) {
+        close(fds.m_write);
+    }
+    if (fds.m_read >= 0) {
+        close(fds.m_read);
+    }
     fds.m_copy =
         fds.m_write =
         fds.m_read = -1;
 }
 
-void LogRedirect::process(FDs &fds) throw()
+bool LogRedirect::process(FDs &fds) throw()
 {
     bool have_message;
+    bool data_read = false;
 
     if (fds.m_read <= 0) {
-        return;
+        return data_read;
     }
 
     do {
@@ -262,9 +304,30 @@ void LogRedirect::process(FDs &fds) throw()
                     m_len = newlen;
                 }
             }
-            // read, but leave space for nul byte
-            available = recv(fds.m_read, m_buffer, m_len - 1, MSG_PEEK|MSG_DONTWAIT);
-            have_message = available >= 0;
+            // read, but leave space for nul byte;
+            // when using datagrams, we only peek here and remove the
+            // datagram below, without rereading the data
+            if (!USE_UNIX_DOMAIN_DGRAM && m_streams) {
+                available = recv(fds.m_read, m_buffer, m_len - 1, MSG_DONTWAIT);
+                if (available == 0) {
+                    return data_read;
+                } else if (available == -1) {
+                    if (errno == EAGAIN) {
+                        // pretend that data was read, so that caller invokes us again
+                        return true;
+                    } else {
+                        SyncContext::throwError("reading output", errno);
+                        return false;
+                    }
+                } else {
+                    // data read, process it
+                    data_read = true;
+                    break;
+                }
+            } else {
+                available = recv(fds.m_read, m_buffer, m_len - 1, MSG_DONTWAIT|MSG_PEEK);
+                have_message = available >= 0;
+            }
             if (available < (ssize_t)m_len - 1) {
                 break;
             } else {
@@ -275,6 +338,7 @@ void LogRedirect::process(FDs &fds) throw()
         if (have_message) {
             // swallow packet, even if empty or we couldn't receive it
             recv(fds.m_read, NULL, 0, MSG_DONTWAIT);
+            data_read = true;
         }
 
         if (available > 0) {
@@ -284,11 +348,44 @@ void LogRedirect::process(FDs &fds) throw()
             // out known noise.
             const char *prefix = NULL;
             Logger::Level level = Logger::DEV;
-            const char *text = m_buffer;
+            char *text = m_buffer;
 
             if (fds.m_original == STDOUT_FILENO) {
                 // stdout: not sure what this could be, so show it
-                level = Logger::INFO;
+                level = Logger::SHOW;
+                char *eol = strchr(text, '\n');
+                if (!m_stdoutData.empty()) {
+                    // try to complete previous line, can be done
+                    // if text contains a line break
+                    if (eol) {
+                        m_stdoutData.append(text, eol - text);
+                        text = eol + 1;
+                        LoggerBase::instance().message(level, prefix,
+                                                       NULL, 0, NULL,
+                                                       "%s", m_stdoutData.c_str());
+                        m_stdoutData.clear();
+                    }
+                }
+
+                // avoid sending incomplete line at end of text,
+                // must be done when there is no line break or
+                // it is not at the end of the buffer
+                eol = strrchr(text, '\n');
+                if (eol != m_buffer + available - 1) {
+                    if (eol) {
+                        m_stdoutData.append(eol + 1);
+                        *eol = 0;
+                    } else {
+                        m_stdoutData.append(text);
+                        *text = 0;
+                    }
+                }
+
+                // output might have been processed as part of m_stdoutData,
+                // don't log empty string below
+                if (!*text) {
+                    continue;
+                }
             } else if (fds.m_original == STDERR_FILENO) {
                 // stderr: not normally useful for users, so we
                 // can filter it more aggressively. For example,
@@ -320,11 +417,80 @@ void LogRedirect::process(FDs &fds) throw()
                                            "%s", text);
         }
     } while(have_message);
+
+    return data_read;
 }
 
 
-void LogRedirect::process() throw()
+void LogRedirect::process()
 {
+    if (m_streams) {
+        // iterate until both sockets are closed by peer
+        while (true) {
+            fd_set readfds;
+            fd_set errfds;
+            int maxfd = 0;
+            FD_ZERO(&readfds);
+            FD_ZERO(&errfds);
+            if (m_stdout.m_read >= 0) {
+                FD_SET(m_stdout.m_read, &readfds);
+                FD_SET(m_stdout.m_read, &errfds);
+                maxfd = m_stdout.m_read;
+            }
+            if (m_stderr.m_read >= 0) {
+                FD_SET(m_stderr.m_read, &readfds);
+                FD_SET(m_stderr.m_read, &errfds);
+                if (m_stderr.m_read > maxfd) {
+                    maxfd = m_stderr.m_read;
+                }
+            }
+            if (maxfd == 0) {
+                // both closed
+                return;
+            }
+
+            int res = select(maxfd + 1, &readfds, NULL, &errfds, NULL);
+            switch (res) {
+            case -1:
+                // fatal, cannot continue
+                SyncContext::throwError("waiting for output", errno);
+                return;
+                break;
+            case 0:
+                // None ready? Try again.
+                break;
+            default:
+                if (m_stdout.m_read >= 0 && FD_ISSET(m_stdout.m_read, &readfds)) {
+                    if (!process(m_stdout)) {
+                        // Exact status of a Unix domain datagram socket upon close
+                        // of the remote end is a bit uncertain. For TCP, we would end
+                        // up here: marked by select as "ready for read", but no data -> EOF.
+                        close(m_stdout.m_read);
+                        m_stdout.m_read = -1;
+                    }
+                }
+                if (m_stdout.m_read >= 0 && FD_ISSET(m_stdout.m_read, &errfds)) {
+                    // But in practice, Unix domain sockets don't mark the stream
+                    // as "closed". This is an attempt to detect that situation
+                    // via the FDs exception status, but that also doesn't work.
+                    close(m_stdout.m_read);
+                    m_stdout.m_read = -1;
+                }
+                if (m_stderr.m_read >= 0 && FD_ISSET(m_stderr.m_read, &readfds)) {
+                    if (!process(m_stderr)) {
+                        close(m_stderr.m_read);
+                        m_stderr.m_read = -1;
+                    }
+                }
+                if (m_stderr.m_read >= 0 && FD_ISSET(m_stderr.m_read, &errfds)) {
+                    close(m_stderr.m_read);
+                    m_stderr.m_read = -1;
+                }
+                break;
+            }
+        }
+    }
+
     if (m_processing) {
         return;
     }
@@ -344,6 +510,19 @@ void LogRedirect::process() throw()
 }
 
 
+
+void LogRedirect::flush() throw()
+{
+    process();
+    if (!m_stdoutData.empty()) {
+        LoggerBase::instance().message(Logger::SHOW, NULL,
+                                       NULL, 0, NULL,
+                                       "%s", m_stdoutData.c_str());
+        m_stdoutData.clear();
+    }
+}
+
+
 #ifdef ENABLE_UNIT_TESTS
 
 class LogRedirectTest : public CppUnit::TestFixture {
@@ -398,9 +577,9 @@ public:
 
         static const char *simpleMessage = "hello world";
         CPPUNIT_ASSERT_EQUAL((ssize_t)strlen(simpleMessage), write(STDOUT_FILENO, simpleMessage, strlen(simpleMessage)));
-        buffer.m_redirect->process();
+        buffer.m_redirect->flush();
 
-        CPPUNIT_ASSERT_EQUAL(buffer.m_streams[Logger::INFO].str(), std::string(simpleMessage));
+        CPPUNIT_ASSERT_EQUAL(buffer.m_streams[Logger::SHOW].str(), std::string(simpleMessage));
     }
 
     void largeChunk()
@@ -410,10 +589,10 @@ public:
         std::string large;
         large.append(60 * 1024, 'h');
         CPPUNIT_ASSERT_EQUAL((ssize_t)large.size(), write(STDOUT_FILENO, large.c_str(), large.size()));
-        buffer.m_redirect->process();
+        buffer.m_redirect->flush();
 
-        CPPUNIT_ASSERT_EQUAL(large.size(), buffer.m_streams[Logger::INFO].str().size());
-        CPPUNIT_ASSERT_EQUAL(large, buffer.m_streams[Logger::INFO].str());
+        CPPUNIT_ASSERT_EQUAL(large.size(), buffer.m_streams[Logger::SHOW].str().size());
+        CPPUNIT_ASSERT_EQUAL(large, buffer.m_streams[Logger::SHOW].str());
     }
 
     void streams()
@@ -424,10 +603,16 @@ public:
         CPPUNIT_ASSERT_EQUAL((ssize_t)strlen(simpleMessage), write(STDOUT_FILENO, simpleMessage, strlen(simpleMessage)));
         static const char *errorMessage = "such a cruel place";
         CPPUNIT_ASSERT_EQUAL((ssize_t)strlen(errorMessage), write(STDERR_FILENO, errorMessage, strlen(errorMessage)));
+
+        // process() keeps unfinished STDOUT lines buffered
         buffer.m_redirect->process();
+        CPPUNIT_ASSERT_EQUAL(std::string(errorMessage), buffer.m_streams[Logger::DEV].str());
+        CPPUNIT_ASSERT_EQUAL(string(""), buffer.m_streams[Logger::SHOW].str());
 
-        CPPUNIT_ASSERT_EQUAL(std::string(simpleMessage), buffer.m_streams[Logger::INFO].str());
+        // flush() makes them available
+        buffer.m_redirect->flush();
         CPPUNIT_ASSERT_EQUAL(std::string(errorMessage), buffer.m_streams[Logger::DEV].str());
+        CPPUNIT_ASSERT_EQUAL(std::string(simpleMessage), buffer.m_streams[Logger::SHOW].str());
     }
 
     void overload()
@@ -439,9 +624,9 @@ public:
         for (int i = 0; i < 4000; i++) {
             CPPUNIT_ASSERT_EQUAL((ssize_t)large.size(), write(STDOUT_FILENO, large.c_str(), large.size()));
         }
-        buffer.m_redirect->process();
+        buffer.m_redirect->flush();
 
-        CPPUNIT_ASSERT(buffer.m_streams[Logger::INFO].str().size() > large.size());
+        CPPUNIT_ASSERT(buffer.m_streams[Logger::SHOW].str().size() > large.size());
     }
 
 #ifdef HAVE_GLIB
index 9e79e9c..30f3e09 100644 (file)
@@ -21,6 +21,7 @@
 #define INCL_LOGREDIRECT
 
 #include <syncevo/LogStdout.h>
+#include <syncevo/util.h>
 
 #include <syncevo/declarations.h>
 SE_BEGIN_CXX
@@ -76,19 +77,30 @@ SE_BEGIN_CXX
  *
  * Redirection and signal handlers are disabled if the environment
  * variable SYNCEVOLUTION_DEBUG is set (regardless of its value).
+ *
+ * In contrast to stderr, stdout is only passed into the logging
+ * system as complete lines. That's because it may include data (like
+ * synccompare output) which is not printed line-oriented and
+ * inserting line breaks (as the logging system does) is undesirable.
+ * If an output packet does not end in a line break, that last line
+ * is buffered and written together with the next packet, or in flush().
  */
-
-
 class LogRedirect : public LoggerStdout
 {
+ public:
     struct FDs {
         int m_original;     /** the original output FD, 2 for stderr */
         int m_copy;         /** a duplicate of the original output file descriptor */
         int m_write;        /** the write end of the replacement */
         int m_read;         /** the read end of the replacement */
-    } m_stdout, m_stderr;
+    };
+
+ private:
+    FDs m_stdout, m_stderr;
+    bool m_streams;         /**< using reliable streams instead of UDP */
     FILE *m_out;            /** a stream for the normal LogStdout which isn't redirected */
     char *m_buffer;         /** typically fairly small buffer for reading */
+    std::string m_stdoutData;  /**< incomplete stdout line */
     size_t m_len;           /** total length of buffer */
     bool m_processing;      /** flag to detect recursive process() calls */
     static LogRedirect *m_redirect; /**< single active instance, for signal handler */
@@ -98,15 +110,51 @@ class LogRedirect : public LoggerStdout
     void redirect(int original, FDs &fds) throw();
     void restore(FDs &fds) throw();
     void restore() throw();
-    void process(FDs &fds) throw();
+    /** @return true if data was available */
+    bool process(FDs &fds) throw();
     static void abortHandler(int sig) throw();
 
+    void init();
+
  public:
-    /** redirect both stderr and stdout or just stderr */
+    /** 
+     * Redirect both stderr and stdout or just stderr,
+     * using UDP so that we don't block when not reading
+     * redirected output.
+     */
     LogRedirect(bool both = true) throw();
     ~LogRedirect() throw();
 
-    void process() throw();
+    /**
+     * Meant to be used for redirecting output of a specific command
+     * via fork()/exec(). Prepares reliable streams, as determined by
+     * ExecuteFlags, without touch file descriptor 1 and 2 and without
+     * installing itself as logger. In such an instance, process()
+     * will block until both streams get closed on the writing end.
+     */
+    LogRedirect(ExecuteFlags flags);
+
+    /** true if stdout is redirected */
+    static bool redirectingStdout() { return m_redirect && m_redirect->m_stdout.m_read > 0; }
+
+    /** true if stderr is redirected */
+    static bool redirectingStderr() { return m_redirect && m_redirect->m_stderr.m_read > 0; }
+
+    const FDs &getStdout() { return m_stdout; }
+    const FDs &getStderr() { return m_stderr; }
+
+    /**
+     * Read currently available redirected output and handle it.
+     *
+     * When using unreliable output redirection, it will always
+     * keep going without throwing exceptions. When using reliable
+     * redirection and a fatal error occurs, then and exception
+     * is thrown.
+     */
+    void process();
+
+    /** same as process(), but also dump all cached output */
+    void flush() throw();
 
     /** format log messages via normal LogStdout and print to a valid stream owned by us */
     virtual void messagev(Level level,
index 59570e8..c01d3a2 100644 (file)
@@ -60,9 +60,12 @@ void LoggerStdout::messagev(FILE *file,
     if (file &&
         msglevel <= filelevel) {
         // TODO: print time
-        fprintf(file, "[%s] ", levelToStr(msglevel));
-        if (prefix) {
-            fprintf(file, "%s: ", prefix);
+        if(msglevel != SHOW) {
+            // in case of 'SHOW' level, don't print level and prefix information
+            fprintf(file, "[%s] ", levelToStr(msglevel));
+            if (prefix) {
+                fprintf(file, "%s: ", prefix);
+            }
         }
         // TODO: print debugging information, perhaps only in log file
         vfprintf(file, format, args);
index 1b89a93..d3cf3a2 100644 (file)
@@ -22,6 +22,7 @@
 #include <syncevo/LogStdout.h>
 
 #include <vector>
+#include <string.h>
 
 #include <syncevo/declarations.h>
 SE_BEGIN_CXX
@@ -69,6 +70,7 @@ void Logger::message(Level level,
 const char *Logger::levelToStr(Level level)
 {
     switch (level) {
+    case SHOW: return "SHOW";
     case ERROR: return "ERROR";
     case WARNING: return "WARNING";
     case INFO: return "INFO";
@@ -78,4 +80,25 @@ const char *Logger::levelToStr(Level level)
     }
 }
 
+Logger::Level Logger::strToLevel(const char *str)
+{
+    // order is based on a rough estimate of message frequency of the
+    // corresponding type
+    if (!str || !strcmp(str, "DEBUG")) {
+        return DEBUG;
+    } else if (!strcmp(str, "INFO")) {
+        return INFO;
+    } else if (!strcmp(str, "SHOW")) {
+        return SHOW;
+    } else if (!strcmp(str, "ERROR")) {
+        return ERROR;
+    } else if (!strcmp(str, "WARNING")) {
+        return WARNING;
+    } else if (!strcmp(str, "DEV")) {
+        return DEV;
+    } else {
+        return DEBUG;
+    }
+}
+
 SE_END_CXX
index 532c51c..4902a65 100644 (file)
@@ -59,6 +59,7 @@ class Logger
      * - a non-fatal error: => WARNING
      * - it changes during each sync or marks important steps
      *   in the sync: INFO
+     * - same as before, but without the [INFO] prefix added to each line: => SHOW
      * - small, non-recurring message which is important for developers
      *   who read a log produced at LOG_LEVEL_INFO: DEVELOPER
      * - everything else: DEBUG
@@ -73,6 +74,11 @@ class Logger
          */
         WARNING,
         /**
+         * "Normal" stdout output which is meant to be seen by a
+         * user.
+         */
+        SHOW,
+        /**
          * errors and info messages for users and developers will be
          * printed: use this to keep the output consise and small
          */
@@ -89,6 +95,9 @@ class Logger
     } Level;
     static const char *levelToStr(Level level);
 
+    /** always returns a valid level, also for NULL, by falling back to DEBUG */
+    static Level strToLevel(const char *str);
+    
     virtual ~Logger() {}
 
     /**
@@ -195,6 +204,7 @@ class LoggerBase : public Logger
         } \
     } while(false)
 
+#define SE_LOG_SHOW(_instance, _prefix, _format, _args...) SE_LOG(Logger::SHOW, _instance, _prefix, _format, ##_args)
 #define SE_LOG_ERROR(_instance, _prefix, _format, _args...) SE_LOG(Logger::ERROR, _instance, _prefix, _format, ##_args)
 #define SE_LOG_WARNING(_instance, _prefix, _format, _args...) SE_LOG(Logger::WARNING, _instance, _prefix, _format, ##_args)
 #define SE_LOG_INFO(_instance, _prefix, _format, _args...) SE_LOG(Logger::INFO, _instance, _prefix, _format, ##_args)
index 6ce69da..360a970 100644 (file)
@@ -260,6 +260,8 @@ LDFLAGS = @LDFLAGS@
 LIBEXECDIR = @LIBEXECDIR@
 LIBICAL_AVAILABLE_CFLAGS = @LIBICAL_AVAILABLE_CFLAGS@
 LIBICAL_AVAILABLE_LIBS = @LIBICAL_AVAILABLE_LIBS@
+LIBNOTIFY_CFLAGS = @LIBNOTIFY_CFLAGS@
+LIBNOTIFY_LIBS = @LIBNOTIFY_LIBS@
 LIBOBJS = @LIBOBJS@
 LIBOPENOBEX_CFLAGS = @LIBOPENOBEX_CFLAGS@
 LIBOPENOBEX_LIBS = @LIBOPENOBEX_LIBS@
@@ -278,6 +280,8 @@ MODIFY_SYNCCOMPARE = @MODIFY_SYNCCOMPARE@
 MSGFMT = @MSGFMT@
 MSGFMT_OPTS = @MSGFMT_OPTS@
 MSGMERGE = @MSGMERGE@
+MX_GTK_0_99_1_CFLAGS = @MX_GTK_0_99_1_CFLAGS@
+MX_GTK_0_99_1_LIBS = @MX_GTK_0_99_1_LIBS@
 NMEDIT = @NMEDIT@
 NSS_CFLAGS = @NSS_CFLAGS@
 NSS_LIBS = @NSS_LIBS@
@@ -320,6 +324,7 @@ SYNTHESIS_LIB = @SYNTHESIS_LIB@
 SYNTHESIS_LIBS = @SYNTHESIS_LIBS@
 SYNTHESIS_SRC = @SYNTHESIS_SRC@
 SYNTHESIS_SUBDIR = @SYNTHESIS_SUBDIR@
+SYNTHESIS_SUBDIR_INCLUDES = @SYNTHESIS_SUBDIR_INCLUDES@
 TRANSPORT_CFLAGS = @TRANSPORT_CFLAGS@
 TRANSPORT_LIBS = @TRANSPORT_LIBS@
 UNIQUE_CFLAGS = @UNIQUE_CFLAGS@
index 3aa1341..05222c0 100644 (file)
@@ -36,9 +36,10 @@ MultiplexConfigNode::getNode(const string &property,
                 m_nodes[prop->isHidden()][prop->getSharing()].get();
 
             // special case: fall back to shared node if no unshared
-            // node, and property isprimarily stored unshared, but
-            // also in the shared node
-            if (!node &&
+            // node or only dummy one, and property is primarily
+            // stored unshared, but also in the shared node
+            if ((!node || !m_havePeerNodes) &&
+                prop->getSharing() == ConfigProperty::NO_SHARING &&
                 (prop->getFlags() & ConfigProperty::SHARED_AND_UNSHARED)) {
                 node = m_nodes[prop->isHidden()][ConfigProperty::SOURCE_SET_SHARING].get();
             }
index 960dea8..1fe2acf 100644 (file)
@@ -36,6 +36,7 @@ class MultiplexConfigNode : public FilterConfigNode
     const std::string m_name;
     boost::shared_ptr<FilterConfigNode> m_nodes[2][3];
     const ConfigPropertyRegistry &m_registry;
+    bool m_havePeerNodes;
     int m_hiddenLower, m_hiddenUpper;
 
     FilterConfigNode *getNode(const string &property,
@@ -48,6 +49,7 @@ class MultiplexConfigNode : public FilterConfigNode
         FilterConfigNode(boost::shared_ptr<ConfigNode>()),
         m_name(name),
         m_registry(registry),
+        m_havePeerNodes(true),
         m_hiddenLower(0), m_hiddenUpper(1) {}
 
     /** only join hidden or user-visible properties */
@@ -57,8 +59,13 @@ class MultiplexConfigNode : public FilterConfigNode
         FilterConfigNode(boost::shared_ptr<ConfigNode>()),
         m_name(name),
         m_registry(registry),
+        m_havePeerNodes(true),
         m_hiddenLower(hidden), m_hiddenUpper(hidden) {}
 
+    /** true when peer nodes are used (default), false when they are dummy nodes */
+    bool getHavePeerNodes() const { return m_havePeerNodes; }
+    void setHavePeerNodes(bool havePeerNodes) { m_havePeerNodes = havePeerNodes; }
+
     /** configure the nodes to use */
     void setNode(bool hidden, ConfigProperty::Sharing sharing,
                  const boost::shared_ptr<FilterConfigNode> &node) {
index d264d82..eda86ce 100644 (file)
@@ -57,9 +57,6 @@ ObexTransportAgent::ObexTransportAgent (OBEX_TRANS_TYPE type, GMainLoop *loop) :
 
 ObexTransportAgent::~ObexTransportAgent()
 {
-    if(m_buffer){
-        free (m_buffer);
-    }
 }
 
 /*
@@ -176,6 +173,7 @@ void ObexTransportAgent::connectInit () {
         // blocking.
         sockaddr_rc any;
         bdaddr_t anyaddr ={{0,0,0,0,0,0}};
+        memset(&any, 0, sizeof(any));
         any.rc_family = AF_BLUETOOTH;
         bacpy (&any.rc_bdaddr, &anyaddr);
         any.rc_channel = 0;
@@ -195,6 +193,7 @@ void ObexTransportAgent::connectInit () {
         cxxptr<ObexEvent> obexEvent (new ObexEvent (obexEventSource));
         //connect to remote device
         sockaddr_rc peer;
+        memset(&peer, 0, sizeof(peer));
         peer.rc_family = AF_BLUETOOTH;
         bacpy (&peer.rc_bdaddr , &bdaddr);
         peer.rc_channel = m_port;
@@ -252,6 +251,7 @@ void ObexTransportAgent::connectReq() {
     header.bs = (unsigned char *) "SYNCML-SYNC";
     OBEX_ObjectAddHeader(m_handle->get(), connect, OBEX_HDR_TARGET, header, strlen ((char *) header.bs), OBEX_FL_FIT_ONE_PACKET);
     m_obexReady = false;
+    m_requestStart = time (NULL);
     if (OBEX_Request (m_handle->get(), connect) <0) {
         SE_THROW_EXCEPTION (TransportException, "ObexTransport: OBEX connect init failed");
     }
@@ -703,7 +703,8 @@ void ObexTransportAgent::obex_callback (obex_object_t *object, int mode, int eve
                                         m_connectId = header.bq4;
                                     } else if (headertype == OBEX_HDR_WHO) { 
                                         SE_LOG_DEV (NULL, NULL, 
-                                                "OBEX Transport: get header who from connect response with value %s", header.bs);
+                                                "OBEX Transport: get header who from connect response with value %.*s",
+                                                len, header.bs);
                                     } else {
                                         SE_LOG_WARNING (NULL, NULL, 
                                                 "OBEX Transport: Unknow header from connect response");
@@ -747,19 +748,9 @@ void ObexTransportAgent::obex_callback (obex_object_t *object, int mode, int eve
                                             SE_LOG_ERROR (NULL, NULL, 
                                                     "ObexTransport: Get zero sized response body for Get");
                                         }
-                                        if(!m_buffer) {
-                                            free (m_buffer);
-                                            m_buffer = NULL;
-                                        }
-                                        m_buffer = new char[length];
+                                        m_buffer.set(new char[length], "buffer");
                                         m_bufferSize = length;
-                                        if(m_buffer) {
-                                            memcpy (m_buffer, header.bs, length);
-                                        } else {
-                                            m_status = FAILED;
-                                            SE_LOG_ERROR (NULL, NULL, "Allocating buffer failed");
-                                            return;
-                                        }
+                                        memcpy (m_buffer, header.bs, length);
                                     } else {
                                         SE_LOG_WARNING (NULL, NULL, "Unknow header received for Get cmd");
                                     }
@@ -780,6 +771,8 @@ void ObexTransportAgent::obex_callback (obex_object_t *object, int mode, int eve
                         //disconnct event
                         m_connectStatus = END;
                         OBEX_TransportDisconnect (m_handle->get());
+                        //a normal case, same as OBEX_EV_DONE
+                        m_obexReady = true;
                         m_status = CLOSED;
                     } else if (obex_rsp !=0) {
                         SE_LOG_ERROR (NULL, NULL, "ObexTransport Error %d", obex_rsp);
index 78c6369..690928b 100644 (file)
@@ -169,7 +169,7 @@ class ObexTransportAgent : public TransportAgent
         cxxptr<Channel> m_channel;
 
         std::string m_contentType;
-        char *m_buffer;
+        arrayptr<char> m_buffer;
         int m_bufferSize;
 
         sdp_session_t *m_sdp;
index 7506069..cdf2776 100644 (file)
@@ -115,15 +115,17 @@ string SyncConfig::normalizeConfigString(const string &config)
     return normal;
 }
 
-void SyncConfig::splitConfigString(const string &config, string &peer, string &context)
+bool SyncConfig::splitConfigString(const string &config, string &peer, string &context)
 {
     string::size_type at = config.rfind('@');
     if (at != config.npos) {
         peer = config.substr(0, at);
         context = config.substr(at + 1);
+        return true;
     } else {
         peer = config;
         context = "default";
+        return false;
     }    
 }
 
@@ -284,6 +286,7 @@ SyncConfig::SyncConfig(const string &peer,
         mnode.reset(new MultiplexConfigNode(m_peerNode->getName(),
                                             getRegistry(),
                                             false));
+        mnode->setHavePeerNodes(!m_peerPath.empty());
         m_props[false] = mnode;
         mnode->setNode(false, ConfigProperty::GLOBAL_SHARING,
                        m_globalNode);
@@ -295,6 +298,7 @@ SyncConfig::SyncConfig(const string &peer,
         mnode.reset(new MultiplexConfigNode(m_hiddenPeerNode->getName(),
                                             getRegistry(),
                                             true));
+        mnode->setHavePeerNodes(!m_peerPath.empty());
         m_props[true] = mnode;
         mnode->setNode(true, ConfigProperty::SOURCE_SET_SHARING,
                        m_contextHiddenNode);
@@ -369,7 +373,7 @@ SyncConfig::TemplateList SyncConfig::getBuiltInTemplates()
         public:
             void addDefaultTemplate(const string &server, const string &url) {
                 BOOST_FOREACH(const boost::shared_ptr<TemplateDescription> entry, static_cast<TemplateList &>(*this)) {
-                    if (boost::iequals(entry->m_name, server)) {
+                    if (boost::iequals(entry->m_templateId, server)) {
                         //already present 
                         return;
                     }
@@ -389,6 +393,7 @@ SyncConfig::TemplateList SyncConfig::getBuiltInTemplates()
     result.addDefaultTemplate("Oracle", "http://www.oracle.com/technology/products/beehive/index.html");
     result.addDefaultTemplate("Goosync", "http://www.goosync.com/");
     result.addDefaultTemplate("SyncEvolution", "http://www.syncevolution.org");
+    result.addDefaultTemplate("Ovi", "http://www.ovi.com");
 
     result.sort (TemplateDescription::compare_op);
     return result;
@@ -432,13 +437,28 @@ SyncConfig::TemplateList SyncConfig::matchPeerTemplates(const DeviceList &peers,
                 if (fuzzyMatch){
                     if (rank > TemplateConfig::NO_MATCH) {
                         result.push_back (boost::shared_ptr<TemplateDescription>(
-                                    new TemplateDescription(templateConf.getName(),
-                                        templateConf.getDescription(), rank, entry.m_deviceId, entry.m_fingerprint, sDir, templateConf.getFingerprint())));
+                                    new TemplateDescription(templateConf.getTemplateId(),
+                                                            templateConf.getDescription(),
+                                                            rank,
+                                                            entry.m_deviceId,
+                                                            entry.m_fingerprint,
+                                                            sDir,
+                                                            templateConf.getFingerprint(),
+                                                            templateConf.getTemplateName()
+                                                            )
+                                    ));
                     }
                 } else if (rank == TemplateConfig::BEST_MATCH){
                     result.push_back (boost::shared_ptr<TemplateDescription>(
-                                new TemplateDescription(templateConf.getName(),
-                                    templateConf.getDescription(), rank, entry.m_deviceId, entry.m_fingerprint, sDir, templateConf.getFingerprint())));
+                                new TemplateDescription(templateConf.getTemplateId(),
+                                                        templateConf.getDescription(),
+                                                        rank,
+                                                        entry.m_deviceId,
+                                                        entry.m_fingerprint,
+                                                        sDir, 
+                                                        templateConf.getFingerprint(),
+                                                        templateConf.getTemplateName())
+                                ));
                     break;
                 }
             }
@@ -576,6 +596,7 @@ boost::shared_ptr<SyncConfig> SyncConfig::createPeerTemplate(const string &serve
         config->setSyncURL("http://my.funambol.com/sync");
         config->setWebURL("http://my.funambol.com");
         config->setWBXML(false);
+        config->setRetryInterval(0);
         config->setConsumerReady(true);
         source = config->getSyncSourceConfig("calendar");
         source->setSync("two-way");
@@ -674,6 +695,40 @@ boost::shared_ptr<SyncConfig> SyncConfig::createPeerTemplate(const string &serve
         source->setURI("./calendar/tasks");
         source = config->getSyncSourceConfig("memo");
         source->setURI("./notes");
+    } else if (boost::iequals(server, "Ovi")) {
+        config->setSyncURL("https://sync.ovi.com/services/syncml");
+        config->setWebURL("http://www.ovi.com");
+#ifndef ENABLE_SSL_CERTIFICATE_CHECK
+        // temporarily (?) disabled certificate checking because
+        // libsoup/gnutls do not accept the Verisign certificate
+        // (GNOME Bugzilla #589323)
+        config->setSSLVerifyServer(false);
+        config->setSSLVerifyHost(false);
+#endif
+        //prefer vcard 3.0
+        source = config->getSyncSourceConfig("addressbook");
+        source->setSourceType("addressbook:text/vcard");
+        source->setURI("./Contact/Unfiled");
+        source = config->getSyncSourceConfig("calendar");
+        source->setSync("none");
+        source->setURI("");
+        //prefer vcalendar 1.0
+        source->setSourceType("calendar:text/x-vcalendar");
+        source = config->getSyncSourceConfig("todo");
+        source->setSync("none");
+        source->setURI("");
+        //prefer vcalendar 1.0
+        source->setSourceType("todo:text/x-vcalendar");
+        //A virtual datastore combining calendar and todo
+        source = config->getSyncSourceConfig("calendar+todo");
+        source->setURI("./EventTask/Tasks");
+        source->setSourceType("virtual:text/x-vcalendar");
+        source->setDatabaseID("calendar,todo");
+        source->setSync("two-way");
+        //Memo is disabled
+        source = config->getSyncSourceConfig("memo");
+        source->setSync("none");
+        source->setURI("");
     } else if (boost::iequals(server, "goosync")) {
         config->setSyncURL("http://sync2.goosync.com/");
         config->setWebURL("http://www.goosync.com/");
@@ -816,6 +871,7 @@ SyncSourceNodes SyncConfig::getSyncSourceNodes(const string &name,
     boost::shared_ptr<ConfigNode> hiddenPeerNode,
         serverNode,
         trackingNode;
+    string cacheDir;
 
     // store configs lower case even if the UI uses mixed case
     string lower = name;
@@ -845,6 +901,10 @@ SyncSourceNodes SyncConfig::getSyncSourceNodes(const string &name,
             trackingNode =
             serverNode = node;
     } else {
+        // Here we assume that m_tree is a FileConfigTree. Otherwise getRootPath()
+        // will not point into a normal file system.
+        cacheDir = m_tree->getRootPath() + "/" + peerPath + "/.cache";
+
         node = m_tree->open(peerPath, ConfigTree::visible);
         peerNode.reset(new FilterConfigNode(node, m_sourceFilter));
         SourceFilters_t::const_iterator filter = m_sourceFilters.find(name);
@@ -869,7 +929,7 @@ SyncSourceNodes SyncConfig::getSyncSourceNodes(const string &name,
         }
     }
 
-    return SyncSourceNodes(sharedNode, peerNode, hiddenPeerNode, trackingNode, serverNode);
+    return SyncSourceNodes(!peerPath.empty(), sharedNode, peerNode, hiddenPeerNode, trackingNode, serverNode, cacheDir);
 }
 
 ConstSyncSourceNodes SyncConfig::getSyncSourceNodes(const string &name,
@@ -994,14 +1054,14 @@ static ConfigProperty syncPropLogDir("logdir",
                                      "usually expands to ${HOME}/.cache/...) will be used;\n"
                                      "if \"none\", then no backups of the databases are made and any\n"
                                      "output is printed directly to the screen");
-static IntConfigProperty syncPropMaxLogDirs("maxlogdirs",
+static UIntConfigProperty syncPropMaxLogDirs("maxlogdirs",
                                             "Unless this option is set, SyncEvolution will never delete\n"
                                             "anything in the \"logdir\". If set, the oldest directories and\n"
                                             "all their content will be removed after a successful sync\n"
                                             "to prevent the number of log directories from growing beyond\n"
                                             "the given limit.",
                                             "10");
-static IntConfigProperty syncPropLogLevel("loglevel",
+static UIntConfigProperty syncPropLogLevel("loglevel",
                                           "level of detail for log messages:\n"
                                           "- 0 (or unset) = INFO messages without log file, DEBUG with log file\n"
                                           "- 1 = only ERROR messages\n"
@@ -1012,7 +1072,7 @@ static BoolConfigProperty syncPropPrintChanges("printChanges",
                                                "enables or disables the detailed (and sometimes slow) comparison\n"
                                                "of database content before and after a sync session",
                                                "1");
-static UIntConfigProperty syncPropRetryDuration("RetryDuration",
+static SecondsConfigProperty syncPropRetryDuration("RetryDuration",
                                           "The total amount of time in seconds in which the client\n"
                                           "tries to get a response from the server.\n"
                                           "During this time, the client will resend messages\n"
@@ -1025,8 +1085,8 @@ static UIntConfigProperty syncPropRetryDuration("RetryDuration",
                                           "When acting as server, this setting controls how long\n"
                                           "a client is allowed to not send a message before the\n"
                                           "synchronization is aborted."
-                                          ,"300");
-static UIntConfigProperty syncPropRetryInterval("RetryInterval",
+                                          ,"5M");
+static SecondsConfigProperty syncPropRetryInterval("RetryInterval",
                                           "The number of seconds between the start of message sending\n"
                                           "and the start of the retransmission. If the interval has\n"
                                           "already passed when a message send returns, the\n"
@@ -1036,7 +1096,7 @@ static UIntConfigProperty syncPropRetryInterval("RetryInterval",
                                           "\n"
                                           "Servers cannot resend messages, so this setting has no\n"
                                           "effect in that case."
-                                          ,"60");
+                                          ,"2M");
 static BoolConfigProperty syncPropPeerIsClient("PeerIsClient",
                                           "Indicates whether this configuration is about a\n"
                                           "client peer or server peer.\n",
@@ -1045,6 +1105,22 @@ static SafeConfigProperty syncPropPeerName("PeerName",
                                            "An arbitrary name for the peer referenced by this config.\n"
                                            "Might be used by a GUI. The command line tool always uses the\n"
                                            "the configuration name.");
+static StringConfigProperty syncPropSyncMLVersion("SyncMLVersion",
+                                           "On a client, the latest commonly supported SyncML version \n"
+                                           "is used when contacting a server. one of '1.0/1.1/1.2' can\n"
+                                           "be used to pick a specific version explicitly.\n"
+                                           "\n"
+                                           "On a server, this option controls what kind of Server Alerted \n"
+                                           "Notification is sent to the client to start a synchronization.\n"
+                                           "By default, first the format from 1.2 is tried, then in case \n"
+                                           "of failure, the older one from 1.1. 1.2/1.1 can be choosen \n"
+                                           "explictely which disables the automatism\n",
+                                           "",
+                                           "",
+                                           Values() +
+                                           Aliases("") + Aliases("1.0") + Aliases ("1.1") + Aliases ("1.2")
+                                           );
+
 static ConfigProperty syncPropRemoteIdentifier("remoteIdentifier",
                                       "the identifier sent to the remote peer for a server initiated sync.\n"
                                       "if not set, deviceId will be used instead\n",
@@ -1117,6 +1193,53 @@ static SafeConfigProperty syncPropDeviceData("deviceData",
 static SafeConfigProperty syncPropDefaultPeer("defaultPeer",
                                               "the peer which is used by default in some frontends, like the sync-UI");
 
+static StringConfigProperty syncPropAutoSync("autoSync",
+                                             "Controls automatic synchronization. Currently,\n"
+                                             "automatic synchronization is done by running\n"
+                                             "a synchronization at regular intervals. This\n"
+                                             "may drain the battery, in particular when\n"
+                                             "using Bluetooth!\n"
+                                             "Because a peer might be reachable via different\n"
+                                             "transports at some point, this option provides\n"
+                                             "detailed control over which transports may\n"
+                                             "be used for automatic synchronization:\n"
+                                             "0 - don't do auto sync\n"
+                                             "1 - do automatic sync, using whatever transport\n"
+                                             "    is available\n"
+                                             "http - only via HTTP transport\n"
+                                             "obex-bt - only via Bluetooth transport\n"
+                                             "http,obex-bt - pick one of these\n",
+                                             "0");
+
+static SecondsConfigProperty syncPropAutoSyncInterval("autoSyncInterval",
+                                                      "This is the minimum number of seconds between two\n"
+                                                      "synchronizations that has to pass before starting\n"
+                                                      "an automatic synchronization. Can be specified using\n"
+                                                      "a 1h30m5s format.\n"
+                                                      "\n"
+                                                      "Before reducing this interval, consider that it will\n"
+                                                      "increase resource consumption on the local and remote\n"
+                                                      "side. Some SyncML server operators only allow a\n"
+                                                      "certain number of sessions per day.\n"
+                                                      "The value 0 has the effect of only running automatic\n"
+                                                      "synchronization when changes are detected (not\n"
+                                                      "implemented yet, therefore it basically disables\n"
+                                                      "automatic synchronization).\n",
+                                                      "30M");
+
+static SecondsConfigProperty syncPropAutoSyncDelay("autoSyncDelay",
+                                                   "An automatic sync will not be started unless the peer\n"
+                                                   "has been available for this duration, specified in seconds\n"
+                                                   "or 1h30m5s format.\n"
+                                                   "\n"
+                                                   "This prevents running a sync when network connectivity\n"
+                                                   "is unreliable or was recently established for some\n"
+                                                   "other purpose. It is also a heuristic that attempts\n"
+                                                   "to predict how long connectivity be available in the\n"
+                                                   "future, because it should better be available long\n"
+                                                   "enough to complete the synchronization.\n",
+                                                   "5M");
+
 ConfigPropertyRegistry &SyncConfig::getRegistry()
 {
     static ConfigPropertyRegistry registry;
@@ -1130,6 +1253,9 @@ ConfigPropertyRegistry &SyncConfig::getRegistry()
         registry.push_back(&syncPropLogLevel);
         registry.push_back(&syncPropPrintChanges);
         registry.push_back(&syncPropMaxLogDirs);
+        registry.push_back(&syncPropAutoSync);
+        registry.push_back(&syncPropAutoSyncInterval);
+        registry.push_back(&syncPropAutoSyncDelay);
         registry.push_back(&syncPropPreventSlowSync);
         registry.push_back(&syncPropUseProxy);
         registry.push_back(&syncPropProxyHost);
@@ -1140,6 +1266,7 @@ ConfigPropertyRegistry &SyncConfig::getRegistry()
         registry.push_back(&syncPropRetryInterval);
         registry.push_back(&syncPropRemoteIdentifier);
         registry.push_back(&syncPropPeerIsClient);
+        registry.push_back(&syncPropSyncMLVersion);
         registry.push_back(&syncPropPeerName);
         registry.push_back(&syncPropDevID);
         registry.push_back(&syncPropRemoteDevID);
@@ -1388,10 +1515,12 @@ void SyncConfig::setProxyPassword(const string &value, bool temporarily) { m_cac
 vector<string> SyncConfig::getSyncURL() const { 
     string s = m_stringCache.getProperty(*getNode(syncPropSyncURL), syncPropSyncURL);
     vector<string> urls;
-    // workaround for g++ 4.3/4.4:
-    // http://stackoverflow.com/questions/1168525/c-gcc4-4-warning-array-subscript-is-above-array-bounds
-    static const string sep(" \t");
-    boost::split(urls, s, boost::is_any_of(sep));
+    if (!s.empty()) {
+        // workaround for g++ 4.3/4.4:
+        // http://stackoverflow.com/questions/1168525/c-gcc4-4-warning-array-subscript-is-above-array-bounds
+        static const string sep(" \t");
+        boost::split(urls, s, boost::is_any_of(sep));
+    }
     return urls;
 }
 void SyncConfig::setSyncURL(const string &value, bool temporarily) { syncPropSyncURL.setProperty(*getNode(syncPropSyncURL), value, temporarily); }
@@ -1432,6 +1561,9 @@ void SyncConfig::setRemoteIdentifier (const string &value, bool temporarily) { r
 bool SyncConfig::getPeerIsClient() const { return syncPropPeerIsClient.getPropertyValue(*getNode(syncPropPeerIsClient)); }
 void SyncConfig::setPeerIsClient(bool value, bool temporarily) { syncPropPeerIsClient.setProperty(*getNode(syncPropPeerIsClient), value, temporarily); }
 
+const char* SyncConfig::getSyncMLVersion() const { return m_stringCache.getProperty(*getNode(syncPropSyncMLVersion), syncPropSyncMLVersion); }
+void SyncConfig::setSyncMLVersion(const string &value, bool temporarily) { syncPropSyncMLVersion.setProperty(*getNode(syncPropSyncMLVersion), value, temporarily); }
+
 string SyncConfig::getPeerName() const { return syncPropPeerName.getProperty(*getNode(syncPropPeerName)); }
 void SyncConfig::setPeerName(const string &name) { syncPropPeerName.setProperty(*getNode(syncPropPeerName), name); }
 
@@ -1470,6 +1602,13 @@ void SyncConfig::setDeviceData(const string &value) { syncPropDeviceData.setProp
 string SyncConfig::getDefaultPeer() const { return syncPropDefaultPeer.getProperty(*getNode(syncPropDefaultPeer)); }
 void SyncConfig::setDefaultPeer(const string &value) { syncPropDefaultPeer.setProperty(*getNode(syncPropDefaultPeer), value); }
 
+string SyncConfig::getAutoSync() const { return syncPropAutoSync.getProperty(*getNode(syncPropAutoSync)); }
+void SyncConfig::setAutoSync(const string &value, bool temporarily) { syncPropAutoSync.setProperty(*getNode(syncPropAutoSync), value, temporarily); }
+unsigned int SyncConfig::getAutoSyncInterval() const { return syncPropAutoSyncInterval.getPropertyValue(*getNode(syncPropAutoSyncInterval)); }
+void SyncConfig::setAutoSyncInterval(unsigned int value, bool temporarily) { syncPropAutoSyncInterval.setProperty(*getNode(syncPropAutoSyncInterval), value, temporarily); }
+unsigned int SyncConfig::getAutoSyncDelay() const { return syncPropAutoSyncDelay.getPropertyValue(*getNode(syncPropAutoSyncDelay)); }
+void SyncConfig::setAutoSyncDelay(unsigned int value, bool temporarily) { syncPropAutoSyncDelay.setProperty(*getNode(syncPropAutoSyncDelay), value, temporarily); }
+
 std::string SyncConfig::findSSLServerCertificate()
 {
     std::string paths = getSSLServerCertificates();
@@ -1626,7 +1765,9 @@ static void copyProperties(const ConfigNode &fromProps,
 {
     BOOST_FOREACH(const ConfigProperty *prop, allProps) {
         if (prop->isHidden() == hidden &&
-            (unshared || prop->getSharing() != ConfigProperty::NO_SHARING)) {
+            (unshared ||
+             prop->getSharing() != ConfigProperty::NO_SHARING ||
+             (prop->getFlags() & ConfigProperty::SHARED_AND_UNSHARED))) {
             string name = prop->getName();
             bool isDefault;
             string value = prop->getProperty(fromProps, &isDefault);
@@ -1933,21 +2074,25 @@ ConfigPropertyRegistry &SyncSourceConfig::getRegistry()
     return registry;
 }
 
-SyncSourceNodes::SyncSourceNodes(const boost::shared_ptr<FilterConfigNode> &sharedNode,
+SyncSourceNodes::SyncSourceNodes(bool havePeerNode,
+                                 const boost::shared_ptr<FilterConfigNode> &sharedNode,
                                  const boost::shared_ptr<FilterConfigNode> &peerNode,
                                  const boost::shared_ptr<ConfigNode> &hiddenPeerNode,
                                  const boost::shared_ptr<ConfigNode> &trackingNode,
-                                 const boost::shared_ptr<ConfigNode> &serverNode) :
+                                 const boost::shared_ptr<ConfigNode> &serverNode,
+                                 const string &cacheDir) :
     m_sharedNode(sharedNode),
     m_peerNode(peerNode),
     m_hiddenPeerNode(hiddenPeerNode),
     m_trackingNode(trackingNode),
-    m_serverNode(serverNode)
+    m_serverNode(serverNode),
+    m_cacheDir(cacheDir)
 {
     boost::shared_ptr<MultiplexConfigNode> mnode;
     mnode.reset(new MultiplexConfigNode(m_peerNode->getName(),
                                         SyncSourceConfig::getRegistry(),
                                         false));
+    mnode->setHavePeerNodes(havePeerNode);
     m_props[false] = mnode;
     mnode->setNode(false, ConfigProperty::SOURCE_SET_SHARING,
                    m_sharedNode);
@@ -2050,7 +2195,7 @@ ConfigPasswordKey EvolutionPasswordConfigProperty::getPasswordKey(const string &
 
 // Used for built-in templates
 SyncConfig::TemplateDescription::TemplateDescription (const std::string &name, const std::string &description)
-:   m_name (name), m_description (description)
+:   m_templateId (name), m_description (description)
 {
     m_rank = TemplateConfig::LEVEL3_MATCH;
     m_fingerprint = "";
@@ -2071,13 +2216,14 @@ bool SyncConfig::TemplateDescription::compare_op (boost::shared_ptr<SyncConfig::
     if (right->m_rank != left->m_rank) {
         return (right->m_rank < left->m_rank);
     }
-    // sort against the config name
-    return (left->m_name < right->m_name);
+    // sort against the template id
+    return (left->m_templateId < right->m_templateId);
 }
 
 TemplateConfig::TemplateConfig (const string &path)
     : m_metaNode (new FileConfigNode (path, "template.ini", true)),
-    m_name("")
+    m_id(""),
+    m_path(path)
 {
     m_metaNode->readProperties(m_metaProps);
 }
@@ -2089,8 +2235,10 @@ bool TemplateConfig::isTemplateConfig (const string &dir)
 
 int TemplateConfig::serverModeMatch (SyncConfig::MatchMode mode)
 {
-    std::string peerIsClient = m_metaProps["peerIsClient"];
 
+    FileConfigNode configNode (m_path, "config.ini", true);
+    std::string peerIsClient = configNode.readProperty ("peerIsClient");
+    
     //not a match if serverMode does not match
     if ((peerIsClient.empty() || peerIsClient == "0") && mode == SyncConfig::MATCH_FOR_SERVER_MODE) {
         return NO_MATCH;
@@ -2155,22 +2303,110 @@ string TemplateConfig::getFingerprint(){
     return m_metaProps["fingerprint"];
 }
 
-string TemplateConfig::getName(){
-    if (m_name.empty()){
+string TemplateConfig::getTemplateName() {
+    return m_metaProps["templateName"];
+}
+
+/*
+ * A unique identifier for this template, it must be unique and retrieveable.
+ * We use the first entry in the "fingerprint" property for cmdline.
+ **/
+string TemplateConfig::getTemplateId(){
+    if (m_id.empty()){
         std::string fingerprintProp = m_metaProps["fingerprint"];
         if (!fingerprintProp.empty()){
             std::vector<std::string> subfingerprints = unescapeJoinedString (fingerprintProp, ',');
-            m_name = subfingerprints[0];
+            m_id = subfingerprints[0];
         }
     }
-    return m_name;
+    return m_id;
+}
+
+bool SecondsConfigProperty::checkValue(const string &value, string &error) const
+{
+    unsigned int seconds;
+    return parseDuration(value, error, seconds);
 }
 
+unsigned int SecondsConfigProperty::getPropertyValue(const ConfigNode &node, bool *isDefault) const
+{
+    string name = getName();
+    string value = node.readProperty(name);
+    if (value.empty()) {
+        if (isDefault) {
+            *isDefault = true;
+        }
+        value = getDefValue();
+    }
+    string error;
+    unsigned int seconds;
+    if (!parseDuration(value, error, seconds)) {
+        throwValueError(node, name, value, error);
+    }
+    return seconds;
+}
+
+bool SecondsConfigProperty::parseDuration(const string &value, string &error, unsigned int &seconds)
+{
+    seconds = 0;
+    if (value.empty()) {
+        // ambiguous - zero seconds?!
+        error = "duration expected, empty string not valid";
+        return false;
+    }
+
+    unsigned int current = 0;
+    bool haveDigit = false;
+    BOOST_FOREACH(char c, value) {
+        if (isdigit(c)) {
+            current = current * 10 + (c - '0');
+            haveDigit = true;
+        } else {
+            unsigned int multiplier = 1;
+            switch (toupper(c)) {
+            case 'Y':
+                multiplier = 365 * 24 * 60 * 60;
+                break;
+            case 'D':
+                multiplier = 24 * 60 * 60;
+                break;
+            case 'H':
+                multiplier = 60 * 60;
+                break;
+            case 'M':
+                multiplier = 60;
+                break;
+            case 'S':
+                break;
+            case ' ':
+            case '\t':
+                continue;
+            case '+':
+                break;
+            default:
+                error = StringPrintf("invalid character '%c'", c);
+                return false;
+            }
+            if (!haveDigit && c != '+') {
+                error = StringPrintf("unit character without preceeding number: %c", c);
+                return false;
+            }
+            seconds += current * multiplier;
+            current = 0;
+            haveDigit = false;
+        }
+    }
+    seconds += current;
+    return true;
+}
+
+
 #ifdef ENABLE_UNIT_TESTS
 
 class SyncConfigTest : public CppUnit::TestFixture {
     CPPUNIT_TEST_SUITE(SyncConfigTest);
     CPPUNIT_TEST(normalize);
+    CPPUNIT_TEST(parseDuration);
     CPPUNIT_TEST_SUITE_END();
 
 private:
@@ -2192,6 +2428,38 @@ private:
         CPPUNIT_ASSERT_EQUAL(std::string("foo_bar_x_y_z"),
                              SyncConfig::normalizeConfigString("Foo/bar\\x:y:z"));
     }
+
+    void parseDuration()
+    {
+        string error;
+        unsigned int seconds;
+        unsigned int expected;
+
+        CPPUNIT_ASSERT(!SecondsConfigProperty::parseDuration("foo", error, seconds));
+        CPPUNIT_ASSERT_EQUAL(error, string("invalid character 'f'"));
+        CPPUNIT_ASSERT(!SecondsConfigProperty::parseDuration("1g", error, seconds));
+        CPPUNIT_ASSERT_EQUAL(error, string("invalid character 'g'"));
+        CPPUNIT_ASSERT(!SecondsConfigProperty::parseDuration("", error, seconds));
+        CPPUNIT_ASSERT_EQUAL(error, string("duration expected, empty string not valid"));
+
+        expected = 5;
+        CPPUNIT_ASSERT(SecondsConfigProperty::parseDuration("5", error, seconds));
+        CPPUNIT_ASSERT_EQUAL(expected, seconds);
+        CPPUNIT_ASSERT(SecondsConfigProperty::parseDuration("05", error, seconds));
+        CPPUNIT_ASSERT_EQUAL(expected, seconds);
+        CPPUNIT_ASSERT(SecondsConfigProperty::parseDuration("05s", error, seconds));
+        CPPUNIT_ASSERT_EQUAL(expected, seconds);
+        CPPUNIT_ASSERT(SecondsConfigProperty::parseDuration("5s", error, seconds));
+        CPPUNIT_ASSERT_EQUAL(expected, seconds);
+
+        expected = (((1 * 365 + 2) * 24 + 3) * 60 + 4) * 60 + 5;
+        CPPUNIT_ASSERT(SecondsConfigProperty::parseDuration("1y2d3H4M5s", error, seconds));
+        CPPUNIT_ASSERT_EQUAL(expected, seconds);
+        CPPUNIT_ASSERT(SecondsConfigProperty::parseDuration("5 + 1y+2d + 3 H4M", error, seconds));
+        CPPUNIT_ASSERT_EQUAL(expected, seconds);
+
+        CPPUNIT_ASSERT(!SecondsConfigProperty::parseDuration("m", error, seconds));
+    }
 };
 
 SYNCEVOLUTION_TEST_SUITE_REGISTRATION(SyncConfigTest);
index 4459816..ea4a4ad 100644 (file)
@@ -521,6 +521,31 @@ typedef ScalarConfigProperty<long, LONG_MIN, LONG_MAX, long, LONG_MIN, LONG_MAX,
 typedef ScalarConfigProperty<unsigned long, 0, ULONG_MAX, unsigned long, 0, ULONG_MAX, strtoul> ULongConfigProperty;
 
 /**
+ * Time interval >= 0. Values are formatted as number of seconds
+ * and accepted in a variety of formats, following ISO 8601:
+ * - x = x seconds
+ * - d = x[YyWwDdHhMmSs] = x years/weeks/days/hours/minutes/seconds
+ * - d[+]d... = combination of the previous durations
+ *
+ * As an extension of ISO 8601, white spaces are silently ignored,
+ * suffix checks are case-insensitive and s (or S) for seconds
+ * can be omitted.
+ */
+class SecondsConfigProperty : public UIntConfigProperty
+{
+ public:
+    SecondsConfigProperty(const string &name, const string &comment,
+                          const string &defValue = string("0"), const string &descr = "") :
+        UIntConfigProperty(name, comment, defValue, descr)
+        {}
+
+    virtual bool checkValue(const string &value, string &error) const;
+    unsigned int getPropertyValue(const ConfigNode &node, bool *isDefault = NULL) const;
+
+    static bool parseDuration(const string &value, string &error, unsigned int &seconds);
+};
+
+/**
  * This struct wraps keys for storing passwords
  * in configuration system. Some fields might be empty
  * for some passwords. Each field might have different 
@@ -843,8 +868,8 @@ class SyncConfig {
      * template. The rank field is used to indicate how good it matches the
      * user input <MacAddress, DeviceName> */
     struct TemplateDescription {
-        // The name of the template
-        std::string m_name;
+        // The unique identifier of the template
+        std::string m_templateId;
         // The description of the template (eg. the web server URL for a
         // SyncML server. This is not used for UI, only CMD line used this.
         std::string m_description;
@@ -852,7 +877,7 @@ class SyncConfig {
         int m_rank;
 
         //a unique identity of the device that the template is for, used by caller
-        std::string m_id;
+        std::string m_deviceId;
 
         // A string identify which fingerprint the template is matched with.
         std::string m_fingerprint;
@@ -865,15 +890,19 @@ class SyncConfig {
         // will not necessarily the same with m_fingerprint
         std::string m_matchedModel;
 
-        TemplateDescription (const std::string &name, const std::string &description, 
-                const int rank, const std::string id, const std::string &fingerprint, const std::string &path, const std::string &model)
-            :   m_name (name),
+        // The template name (device class) presented
+        std::string m_templateName;
+
+        TemplateDescription (const std::string &templateId, const std::string &description, 
+                const int rank, const std::string deviceId, const std::string &fingerprint, const std::string &path, const std::string &model, const std::string &templateName)
+            :   m_templateId (templateId),
                 m_description (description),
                 m_rank (rank),
-                m_id (id),
+                m_deviceId (deviceId),
                 m_fingerprint (fingerprint),
                 m_path (path),
-                m_matchedModel(model)
+                m_matchedModel(model),
+                m_templateName (templateName)
         {
         }
 
@@ -1007,8 +1036,10 @@ class SyncConfig {
      * Split a config string (normalized or not) into the peer part
      * (before final @) and the context (after that @, not including
      * it), return "default" as context if not specified otherwise.
+     *
+     * @return true when the context was specified explicitly
      */
-    static void splitConfigString(const string &config, string &peer, string &context);
+    static bool splitConfigString(const string &config, string &peer, string &context);
 
     /**
      * Replaces the property filter of either the sync properties or
@@ -1256,10 +1287,12 @@ class SyncConfig {
     virtual void setDevID(const string &value, bool temporarily = false);
 
     /*Used for Server Alerted Sync*/
-    virtual const char*  getRemoteIdentifier() const;
+    virtual const char* getRemoteIdentifier() const;
     virtual void setRemoteIdentifier (const string &value, bool temporaritly = false);
     virtual bool getPeerIsClient () const;
     virtual void setPeerIsClient (bool value, bool temporarily = false);
+    virtual const char* getSyncMLVersion() const;
+    virtual void setSyncMLVersion (const string &value, bool temporarily = false);
 
     /**
      * An arbitrary name assigned to the peer configuration,
@@ -1292,6 +1325,16 @@ class SyncConfig {
     virtual void setDeviceData(const string &value);
 
     /**
+     * Automatic sync related properties, used to control its behaviors
+     */
+    virtual string getAutoSync() const; 
+    virtual void setAutoSync(const string &value, bool temporarily = false);
+    virtual unsigned int getAutoSyncInterval() const;
+    virtual void setAutoSyncInterval(unsigned int value, bool temporarily = false);
+    virtual unsigned int getAutoSyncDelay() const;
+    virtual void setAutoSyncDelay(unsigned int value, bool temporarily = false);
+
+    /**
      * Specifies whether WBXML is to be used (default).
      * Otherwise XML is used.
      */
@@ -1416,6 +1459,9 @@ class SyncSourceNodes {
     SyncSourceNodes() {}
 
     /**
+     * @param havePeerNode    false when peerNode is a dummy instance which has to
+     *                        be ignored for properties which may exist there as
+     *                        well as in the shared node (for example, "type")
      * @param sharedNode      node for user-visible properties, shared between peers
      * @param peerNode        node for user-visible, per-peer properties (the same
      *                        as sharedNode in SYNC4J_LAYOUT and HTTP_SERVER_LAYOUT)
@@ -1425,12 +1471,17 @@ class SyncSourceNodes {
      *                        other nodes)
      * @param serverNode      node for tracking items in a server (always different
      *                        than the other nodes)
+     * @param cacheDir        a per-peer, per-source directory for exclusive use by
+     *                        the SyncSource, must be created if needed; not available
+     *                        when source is accessed independently of peer
      */
-    SyncSourceNodes(const boost::shared_ptr<FilterConfigNode> &sharedNode,
+    SyncSourceNodes(bool havePeerNode,
+                    const boost::shared_ptr<FilterConfigNode> &sharedNode,
                     const boost::shared_ptr<FilterConfigNode> &peerNode,
                     const boost::shared_ptr<ConfigNode> &hiddenPeerNode,
                     const boost::shared_ptr<ConfigNode> &trackingNode,
-                    const boost::shared_ptr<ConfigNode> &serverNode);
+                    const boost::shared_ptr<ConfigNode> &serverNode,
+                    const string &cacheDir);
 
     /** true if the peer-specific config node exists */
     bool exists() const { return m_peerNode->exists(); }
@@ -1454,12 +1505,15 @@ class SyncSourceNodes {
     /** read-write access to backend specific tracking node */
     boost::shared_ptr<ConfigNode> getTrackingNode() const { return m_trackingNode; }
 
+    string getCacheDir() const { return m_cacheDir; }
+
  protected:
     const boost::shared_ptr<FilterConfigNode> m_sharedNode;
     const boost::shared_ptr<FilterConfigNode> m_peerNode;
     const boost::shared_ptr<ConfigNode> m_hiddenPeerNode;
     const boost::shared_ptr<ConfigNode> m_trackingNode;
     const boost::shared_ptr<ConfigNode> m_serverNode;
+    const string m_cacheDir;
 
     /** multiplexer for the other nodes */
     boost::shared_ptr<FilterConfigNode> m_props[2];
@@ -1514,6 +1568,13 @@ class SyncSourceConfig {
     virtual const char*  getName() const { return m_name.c_str(); }
 
     /**
+     * Directory to be used by source when it needs to store
+     * something per-peer in the file system. Currently not
+     * configurable, set via SyncSourceNodes.
+     */
+    string getCacheDir() const { return m_nodes.getCacheDir(); }
+
+    /**
      * Returns the right config node for a certain property,
      * depending on visibility and sharing.
      */
@@ -1626,7 +1687,9 @@ class TemplateConfig
 {
     boost::shared_ptr<FileConfigNode> m_metaNode;
     ConfigProps m_metaProps;
-    string m_name;
+    string m_id;
+    string m_templateName;
+    string m_path;
 public:
     TemplateConfig (const string &path);
     enum {
@@ -1641,9 +1704,10 @@ public:
     virtual int metaMatch (const string &fingerprint, SyncConfig::MatchMode mode);
     virtual int serverModeMatch (SyncConfig::MatchMode mode);
     virtual int fingerprintMatch (const string &fingerprint);
-    virtual string getName();
+    virtual string getTemplateId ();
     virtual string getDescription();
     virtual string getFingerprint();
+    virtual string getTemplateName();
 };
 
 
index f431f99..0b8f0f9 100644 (file)
@@ -147,12 +147,20 @@ SyncContext::SyncContext(const string &server,
     m_doLogging = doLogging;
 }
 
+void SyncContext::setOutput(ostream *out)
+{
+    m_out = out ? out : &std::cout;
+}
+
 void SyncContext::init()
 {
+    m_out = &std::cout;
     m_doLogging = false;
     m_quiet = false;
     m_dryrun = false;
     m_serverMode = false;
+    m_firstSourceAccess = true;
+    m_remoteInitiated = false;
 }
 
 SyncContext::~SyncContext()
@@ -317,13 +325,19 @@ public:
         }
     }
 
+    enum SessionMode {
+        SESSION_USE_PATH,      /**< write directly into path, don't create and manage subdirectories */
+        SESSION_READ_ONLY,     /**< access an existing session directory identified with path */
+        SESSION_CREATE         /**< create a new session directory inside the given path */
+    };
+
     // setup log directory and redirect logging into it
     // @param path        path to configured backup directy, empty for using default, "none" if not creating log file
+    // @param mode        determines how path is interpreted and which session is accessed
     // @param maxlogdirs  number of backup dirs to preserve in path, 0 if unlimited
     // @param logLevel    0 = default, 1 = ERROR, 2 = INFO, 3 = DEBUG
-    // @param usePath     write directly into path, don't create and manage subdirectories
     // @param report      record information about session here (may be NULL)
-    void startSession(const char *path, int maxlogdirs, int logLevel, bool usePath, SyncReport *report) {
+    void startSession(const char *path, SessionMode mode, int maxlogdirs, int logLevel, SyncReport *report) {
         m_maxlogdirs = maxlogdirs;
         m_report = report;
         m_logfile = "";
@@ -331,7 +345,7 @@ public:
             m_path = "";
         } else {
             setLogdir(path);
-            if (!usePath) {
+            if (mode == SESSION_CREATE) {
                 // create unique directory name in the given directory
                 time_t ts = time(NULL);
                 struct tm *tm = localtime(&ts);
@@ -363,10 +377,10 @@ public:
                             }
                             int sequence;
                             if (off != dateTime.npos) {
-                                sequence = atoi(dateTime.substr(off + 1).c_str());
+                                sequence = dateTime[off + 1] - 'a';
                                 dateTime.resize(off);
                             } else {
-                                sequence = 0;
+                                sequence = -1;
                             }
                             pair <SeqMap_t::iterator, bool> entry = dateTimes2Seq.insert(make_pair(dateTime, sequence));
                             if (sequence > entry.first->second) {
@@ -379,7 +393,7 @@ public:
                 path << base.str();
                 SeqMap_t::iterator it = dateTimes2Seq.find(path.str());
                 if (it != dateTimes2Seq.end()) {
-                    path << "-" << it->second + 1;
+                    path << "-" << (char)('a' + it->second + 1);
                 }
                 m_path = m_logdir + "/";
                 m_path += m_prefix;
@@ -420,7 +434,7 @@ public:
             }
             break;
         }
-        if (!usePath) {
+        if (mode != SESSION_USE_PATH) {
             LoggerBase::instance().setLevel(level);
         }
         setLevel(level);
@@ -430,15 +444,18 @@ public:
         if (m_report) {
             m_report->setStart(start);
         }
+        m_readonly = mode == SESSION_READ_ONLY;
         if (!m_path.empty()) {
-            boost::shared_ptr<ConfigNode> filenode(new FileConfigNode(m_path, "status.ini", false));
+            boost::shared_ptr<ConfigNode> filenode(new FileConfigNode(m_path, "status.ini", m_readonly));
             m_info = new SafeConfigNode(filenode);
             m_info->setMode(false);
-            // Create a status.ini which contains an error.
-            // Will be overwritten later on, unless we crash.
-            m_info->setProperty("status", STATUS_DIED_PREMATURELY);
-            m_info->setProperty("error", "synchronization process died prematurely");
-            writeTimestamp("start", start);
+            if (mode != SESSION_READ_ONLY) {
+                // Create a status.ini which contains an error.
+                // Will be overwritten later on, unless we crash.
+                m_info->setProperty("status", STATUS_DIED_PREMATURELY);
+                m_info->setProperty("error", "synchronization process died prematurely");
+                writeTimestamp("start", start);
+            }
         }
     }
 
@@ -870,7 +887,7 @@ private:
             char buffer[160];
             struct tm tm;
             // be nice and store a human-readable date in addition the seconds since the epoch
-            strftime(buffer, sizeof(buffer), "%s, %Y-%m-%d %H:%m:%S %z", localtime_r(&val, &tm));
+            strftime(buffer, sizeof(buffer), "%s, %Y-%m-%d %H:%M:%S %z", localtime_r(&val, &tm));
             m_info->setProperty(key, buffer);
             if (flush) {
                 m_info->flush();
@@ -1109,16 +1126,24 @@ public:
         m_logdir.setLogdir(logDirPath);
         m_previousLogdir = m_logdir.previousLogdir();
         if (m_doLogging) {
-            m_logdir.startSession(logDirPath, maxlogdirs, logLevel, false, report);
+            m_logdir.startSession(logDirPath, LogDir::SESSION_CREATE, maxlogdirs, logLevel, report);
         } else {
             // Run debug session without paying attention to
             // the normal logdir handling. The log level here
             // refers to stdout. The log file will be as complete
             // as possible.
-            m_logdir.startSession(logDirPath, 0, 1, true, report);
+            m_logdir.startSession(logDirPath, LogDir::SESSION_USE_PATH, 0, 1, report);
         }
     }
 
+    /** read-only access to existing session, identified in logDirPath */
+    void accessSession(const char *logDirPath) {
+        m_logdir.setLogdir(logDirPath);
+        m_previousLogdir = m_logdir.previousLogdir();
+        m_logdir.startSession(logDirPath, LogDir::SESSION_READ_ONLY, 0, 0, NULL);
+    }
+
+
     /** return log directory, empty if not enabled */
     const string &getLogdir() {
         return m_logdir.getLogdir();
@@ -1155,6 +1180,7 @@ public:
             m_logdir.previousLogdirs(dirs);
         }
 
+        ostream &out = m_client.getOutput();
         BOOST_FOREACH(SyncSource *source, *this) {
             if ((!excludeSource.empty() && excludeSource != source->getName()) ||
                 (newSuffix == "after" && m_prepared.find(source->getName()) == m_prepared.end())) {
@@ -1163,7 +1189,7 @@ public:
 
             // dump only if not done before or changed
             if (m_intro != intro) {
-                cout << intro;
+                m_client.getOutput() << intro;
                 m_intro = intro;
             }
 
@@ -1190,22 +1216,24 @@ public:
                 oldDir = databaseName(*source, oldSuffix, oldSession);
             }
             string newDir = databaseName(*source, newSuffix);
-            cout << "*** " << source->getName() << " ***\n" << flush;
-            string cmd = string("env CLIENT_TEST_COMPARISON_FAILED=10 " + config + " synccompare 2>/dev/null '" ) +
+            out << "*** " << source->getName() << " ***\n" << flush;
+            string cmd = string("env CLIENT_TEST_COMPARISON_FAILED=10 " + config + " synccompare '" ) +
                 oldDir + "' '" + newDir + "'";
-            int ret = system(cmd.c_str());
-            switch (ret == -1 ? ret : WEXITSTATUS(ret)) {
+            int ret = Execute(cmd, EXECUTE_NO_STDERR);
+            switch (ret == -1 ? ret :
+                    WIFEXITED(ret) ? WEXITSTATUS(ret) :
+                    -1) {
             case 0:
-                cout << "no changes\n";
+                out << "no changes\n";
                 break;
             case 10:
                 break;
             default:
-                cout << "Comparison was impossible.\n";
+                out << "Comparison was impossible.\n";
                 break;
             }
         }
-        cout << "\n";
+        out << "\n";
         return true;
     }
 
@@ -1257,28 +1285,28 @@ public:
                 m_reportTodo = false;
 
                 string logfile = m_logdir.getLogfile();
-                cout << flush;
-                cerr << flush;
-                cout << "\n";
+                ostream &out = m_client.getOutput();
+                out << flush;
+                out << "\n";
                 if (status == STATUS_OK) {
-                    cout << "Synchronization successful.\n";
+                    out << "Synchronization successful.\n";
                 } else if (logfile.size()) {
-                    cout << "Synchronization failed, see "
-                         << logfile
-                         << " for details.\n";
+                    out << "Synchronization failed, see "
+                        << logfile
+                        << " for details.\n";
                 } else {
-                    cout << "Synchronization failed.\n";
+                    out << "Synchronization failed.\n";
                 }
 
                 // pretty-print report
                 if (m_logLevel > LOGGING_QUIET) {
-                    cout << "\nChanges applied during synchronization:\n";
+                    out << "\nChanges applied during synchronization:\n";
                 }
                 if (m_logLevel > LOGGING_QUIET && report) {
-                    cout << *report;
+                    out << *report;
                     std::string slowSync = report->slowSyncExplanation(m_client.getPeer());
                     if (!slowSync.empty()) {
-                        cout << endl << slowSync;
+                        out << endl << slowSync;
                     }
                 }
 
@@ -1395,17 +1423,32 @@ string SyncContext::getUsedSyncURL() {
 boost::shared_ptr<TransportAgent> SyncContext::createTransportAgent(void *gmainloop)
 {
     string url = getUsedSyncURL();
+    m_retryInterval = getRetryInterval();
+    m_retryDuration = getRetryDuration();
+    int timeout = m_serverMode ? m_retryDuration : m_retryInterval;
+
     if (boost::starts_with(url, "http://") ||
         boost::starts_with(url, "https://")) {
 #ifdef ENABLE_LIBSOUP
         
         boost::shared_ptr<SoupTransportAgent> agent(new SoupTransportAgent(static_cast<GMainLoop *>(gmainloop)));
         agent->setConfig(*this);
+
+        if (timeout) {
+            agent->setCallback(transport_cb,
+                        reinterpret_cast<void *>(static_cast<uintptr_t>(timeout)),
+                        timeout);
+        }
         return agent;
 #elif defined(ENABLE_LIBCURL)
         if (!gmainloop) {
             boost::shared_ptr<CurlTransportAgent> agent(new CurlTransportAgent());
             agent->setConfig(*this);
+            if (timeout) {
+                agent->setCallback(transport_cb,
+                        reinterpret_cast<void *>(static_cast<uintptr_t>(timeout)),
+                        timeout);
+            }
             return agent;
         }
 #endif
@@ -1415,6 +1458,11 @@ boost::shared_ptr<TransportAgent> SyncContext::createTransportAgent(void *gmainl
         boost::shared_ptr<ObexTransportAgent> agent(new ObexTransportAgent(ObexTransportAgent::OBEX_BLUETOOTH,
                                                                            static_cast<GMainLoop *>(gmainloop)));
         agent->setURL (btUrl);
+        if (timeout) {
+            agent->setCallback(transport_cb,
+                    reinterpret_cast<void *>(static_cast<uintptr_t>(timeout)),
+                    timeout);
+        }
         agent->connect();
         return agent;
 #endif
@@ -1902,6 +1950,10 @@ void SyncContext::initSources(SourceList &sourceList)
 
 void SyncContext::startSourceAccess(SyncSource *source)
 {
+    if(m_firstSourceAccess) {
+        syncSuccessStart();
+        m_firstSourceAccess = false;
+    }
     if (m_serverMode) {
         // source is active in sync, now open it
         source->open();
@@ -1921,13 +1973,6 @@ bool SyncContext::transport_cb (void *udata)
     return true;
 }
 
-void SyncContext::setTransportCallback(int seconds)
-{
-    m_agent->setCallback(transport_cb,
-                         reinterpret_cast<void *>(static_cast<uintptr_t>(seconds)),
-                         seconds);
-}
-
 // XML configuration converted to C string constants
 extern "C" {
     // including all known fragments for a client
@@ -2140,6 +2185,8 @@ void SyncContext::getConfigXML(string &xml, string &configname)
     size_t index;
     unsigned long hash = 0;
 
+
+    const char *noctcap = getenv("SYNCEVOLUTION_NOCTCAP");
     const char *sessioninitscript =
         "    <sessioninitscript><![CDATA[\n"
         "      // these variables are possibly modified by rule scripts\n"
@@ -2149,6 +2196,8 @@ void SyncContext::getConfigXML(string &xml, string &configname)
         "      retransfer_body=FALSE; // normally, do not retransfer email body (and attachments) when moving items to sent box\n"
         "      INTEGER delayedabort;\n"
         "      delayedabort = FALSE;\n"
+        "      INTEGER alarmTimeToUTC;\n"
+        "      alarmTimeToUTC = FALSE;\n"
         "    ]]></sessioninitscript>\n";
 
     ostringstream clientorserver;
@@ -2161,8 +2210,17 @@ void SyncContext::getConfigXML(string &xml, string &configname)
             "\n" <<
             sessioninitscript <<
             "    <sessiontimeout>300</sessiontimeout>\n"
-            "\n"
-            "    <defaultauth/>\n"
+            "\n";
+        //do not send respuri if over bluetooth
+        if (boost::starts_with (getUsedSyncURL(), "obex-bt://")) {
+            clientorserver << "    <sendrespuri>no</sendrespuri>\n"
+            "\n";
+        }
+        if (noctcap) {
+            clientorserver << "    <showctcapproperties>no</showctcapproperties>\n"
+            "\n";
+        }
+        clientorserver<<"    <defaultauth/>\n"
             "\n"
             "    <datastore/>\n"
             "\n"
@@ -2173,8 +2231,19 @@ void SyncContext::getConfigXML(string &xml, string &configname)
             "  <client type='plugin'>\n"
             "    <binfilespath>$(binfilepath)</binfilespath>\n"
             "    <defaultauth/>\n"
-            "\n" <<
-            sessioninitscript <<
+            "\n" ;
+         string syncMLVersion (getSyncMLVersion());
+         if (!syncMLVersion.empty()) {
+             clientorserver << "<defaultsyncmlversion>"
+                 <<syncMLVersion.c_str()<<"</defaultsyncmlversion>\n";
+         }
+
+         if (noctcap) {
+             clientorserver << "    <showctcapproperties>no</showctcapproperties>\n"
+                 "\n";
+         }
+
+         clientorserver << sessioninitscript <<
             // SyncEvolution has traditionally not folded long lines in
             // vCard.  Testing showed that servers still have problems with
             // it, so avoid it by default
@@ -2266,6 +2335,12 @@ void SyncContext::getConfigXML(string &xml, string &configname)
                 "      <dbtypeid>" << source->getSynthesisID() << "</dbtypeid>\n" <<
                 fragment;
 
+            datastores << "      <resumesupport>on</resumesupport>\n";
+            if (source->getOperations().m_writeBlob) {
+                // BLOB support is essential for caching partially received items.
+                datastores << "      <resumeitemsupport>on</resumeitemsupport>\n";
+            }
+
             string mode = source->getSync();
             if (source->getForceSlowSync()) {
                 // we *want* a slow sync, but couldn't tell the client -> force it server-side
@@ -2274,6 +2349,9 @@ void SyncContext::getConfigXML(string &xml, string &configname)
                        mode != "refresh-from-server" && // is implemented as "delete local data" + "slow sync",
                                                         // so a slow sync is acceptable in this case
                        !m_serverMode &&
+                       // The forceSlow should be disabled if the sync session is
+                       // initiated by a remote peer (eg. Server Alerted Sync)
+                       !m_remoteInitiated &&
                        getPreventSlowSync() &&
                        (!source->getOperations().m_isEmpty ||    // check is only relevant if we have local data;
                         !source->getOperations().m_isEmpty())) { // if we cannot check, assume we have data
@@ -2315,8 +2393,14 @@ void SyncContext::getConfigXML(string &xml, string &configname)
                 //check the data type
                 SyncSource *subSource = (*m_sourceListPtr)[source];
                 SourceType subType = subSource->getSourceType();
-                if (sourceType.m_format != subType.m_format ||
-                    sourceType.m_forceFormat != subType.m_forceFormat) {
+
+                //If there is no format explictly selected in sub SyncSource, we
+                //have no way to determine whether it works with the format
+                //specific in the virtual SyncSource, thus no warning in this
+                //case.
+                if (!subType.m_format.empty() && (
+                    sourceType.m_format != subType.m_format ||
+                    sourceType.m_forceFormat != subType.m_forceFormat)) {
                     SE_LOG_WARNING(NULL, NULL, 
                                    "Virtual data source \"%s\" and sub data source \"%s\" have different data format. Will use the format in virtual data source.",
                                    vSource->getName(), source.c_str());
@@ -2345,6 +2429,11 @@ void SyncContext::getConfigXML(string &xml, string &configname)
                 }
             }
 
+            if (vSource->getForceSlowSync()) {
+                // we *want* a slow sync, but couldn't tell the client -> force it server-side
+                datastores << "      <alertscript> FORCESLOWSYNC(); </alertscript>\n";
+            }
+
             std::string typesupport;
             typesupport = vSource->getDataTypeSupport();
             datastores << "      <typesupport>\n"
@@ -2606,6 +2695,12 @@ SyncMLStatus SyncContext::sync(SyncReport *report)
          * */
         if ( getPeerIsClient()) {
             m_serverMode = true;
+            /* Do not check username/pwd if this is a server session over
+             * bluetooth transport*/
+            if (boost::starts_with (getUsedSyncURL(), "obex-bt")) {
+                setUsername ("", true);
+                setPassword ("", true);
+            }
         }
 
         // create a Synthesis engine, used purely for logging purposes
@@ -2680,6 +2775,12 @@ SyncMLStatus SyncContext::sync(SyncReport *report)
     }
 
  report:
+    if (status == SyncMLStatus(sysync::LOCERR_DATASTORE_ABORT)) {
+        // this can mean only one thing in SyncEvolution: unexpected slow sync
+        status = STATUS_UNEXPECTED_SLOW_SYNC;
+    }
+                            
+
     try {
         // Print final report before cleaning up.
         // Status was okay only if all sources succeeded.
@@ -2712,23 +2813,22 @@ SyncMLStatus SyncContext::sync(SyncReport *report)
     return status;
 }
 
-bool SyncContext::initSAN(
+bool SyncContext::sendSAN(uint16_t version
 {
     sysync::SanPackage san;
+    bool legacy = version < 12;
     /* Should be nonce sent by the server in the preceeding sync session */
     string nonce = "SyncEvolution";
-    /* SyncML Version 1.2 */
-    uint16_t protoVersion = 12;
     string uauthb64 = san.B64_H (getUsername(), getPassword());
     /* Client is expected to conduct the sync in the backgroud */
     sysync::UI_Mode mode = sysync::UI_not_specified;
 
-    uint16_t sessionId = 0;
+    uint16_t sessionId = 1;
     string serverId = getRemoteIdentifier();
     if(serverId.empty()) {
         serverId = getDevID();
     }
-    san.PreparePackage( uauthb64, nonce, protoVersion, mode, 
+    san.PreparePackage( uauthb64, nonce, version, mode, 
             sysync::Initiator_Server, sessionId, serverId);
 
     san.CreateEmptyNotificationBody();
@@ -2753,6 +2853,10 @@ bool SyncContext::initSAN()
             }
             dataSources.insert (vSource->getName());
     }
+
+    int syncMode = 0;
+    vector<pair <string, string> > alertedSources;
+
     /* For each source to be notified do the following: */
     BOOST_FOREACH (string name, dataSources) {
         boost::shared_ptr<PersistentSyncSourceConfig> sc(getSyncSourceConfig(name));
@@ -2766,6 +2870,7 @@ bool SyncContext::initSAN()
             SE_LOG_DEV (NULL, NULL, "Ignoring data source %s with an invalid sync mode", name.c_str());
             continue;
         }
+        syncMode = mode;
         hasSource = true;
         string uri = sc->getURI();
 
@@ -2775,16 +2880,20 @@ bool SyncContext::initSAN()
         if(sourceType.m_format.empty()) {
             sourceType.m_format = (*m_sourceListPtr)[name]->getPeerMimeType();
         }
-        /*If user did not use force type, we will always use the older type as
-         * this is what most phones support*/
-        int contentTypeB = StringToContentType (sourceType.m_format, sourceType.m_forceFormat);
-        if (contentTypeB == WSPCTC_UNKNOWN) {
-            contentTypeB = 0;
-            SE_LOG_DEBUG (NULL, NULL, "Unknown datasource mimetype, use 0 as default");
+        if (!legacy) {
+            /*If user did not use force type, we will always use the older type as
+             * this is what most phones support*/
+            int contentTypeB = StringToContentType (sourceType.m_format, sourceType.m_forceFormat);
+            if (contentTypeB == WSPCTC_UNKNOWN) {
+                contentTypeB = 0;
+                SE_LOG_DEBUG (NULL, NULL, "Unknown datasource mimetype, use 0 as default");
+            }
+            if ( san.AddSync(mode, (uInt32) contentTypeB, uri.c_str())) {
+                SE_LOG_ERROR(NULL, NULL, "SAN: adding server alerted sync element failed");
+            };
+        } else {
+            alertedSources.push_back (std::make_pair (GetLegacyMIMEType (sourceType.m_format, sourceType.m_forceFormat), uri));
         }
-        if ( san.AddSync(mode, (uInt32) contentTypeB, uri.c_str())) {
-            SE_LOG_ERROR(NULL, NULL, "SAN: adding server alerted sync element failed");
-        };
     }
 
     if (!hasSource) {
@@ -2794,50 +2903,51 @@ bool SyncContext::initSAN()
     /* Generate the SAN Package */
     void *buffer;
     size_t sanSize;
-    if (san.GetPackage(buffer, sanSize)){
-        SE_LOG_ERROR (NULL, NULL, "SAN package generating faield");
-        return false;
+    if (!legacy) {
+        if (san.GetPackage(buffer, sanSize)){
+            SE_LOG_ERROR (NULL, NULL, "SAN package generating failed");
+            return false;
+        }
+        //TODO log the binary SAN content
+    } else {
+        if (san.GetPackageLegacy(buffer, sanSize, alertedSources, syncMode, getWBXML())){
+            SE_LOG_ERROR (NULL, NULL, "SAN package generating failed");
+            return false;
+        }
+        //SE_LOG_DEBUG (NULL, NULL, "SAN package content: %s", (char*)buffer);
     }
 
-    try {
-        m_agent = createTransportAgent();
-        // Time out after the complete retry duration. This is the
-        // initial message of a sync, so we don't resend it (just as
-        // in a HTTP SyncML client trying to contact server).
-        if (m_retryDuration) {
-            setTransportCallback(m_retryDuration);
-        }
-
-        SE_LOG_INFO (NULL, NULL, "Server sending SAN");
-        m_agent->setContentType(TransportAgent::m_contentTypeServerAlertedNotificationDS);
-        m_agent->send(reinterpret_cast <char *> (buffer), sanSize);
-        //change content type
-        m_agent->setContentType(getWBXML() ? TransportAgent::m_contentTypeSyncWBXML :
-                                TransportAgent::m_contentTypeSyncML);
-
-        TransportAgent::Status status;
-        do {
-            status = m_agent->wait();
-        } while(status == TransportAgent::ACTIVE);
-        if (status == TransportAgent::GOT_REPLY) {
-            const char *reply;
-            size_t replyLen;
-            string contentType;
-            m_agent->getReply (reply, replyLen, contentType);
-
-            //sanity check for the reply 
-            if (contentType.empty() || 
-                contentType.find(TransportAgent::m_contentTypeSyncML) != contentType.npos ||
-                contentType.find(TransportAgent::m_contentTypeSyncWBXML) != contentType.npos) {
-                SharedBuffer request (reply, replyLen);
-                //TODO should generate more reasonable sessionId here
-                string sessionId ="";
-                initServer (sessionId, request, contentType);
-                return true;
-            }
+    m_agent = createTransportAgent();
+    SE_LOG_INFO (NULL, NULL, "Server sending SAN");
+    m_agent->setContentType(!legacy ? 
+                           TransportAgent::m_contentTypeServerAlertedNotificationDS
+                           : (getWBXML() ? TransportAgent::m_contentTypeSyncWBXML :
+                            TransportAgent::m_contentTypeSyncML));
+    m_agent->send(reinterpret_cast <char *> (buffer), sanSize);
+    //change content type
+    m_agent->setContentType(getWBXML() ? TransportAgent::m_contentTypeSyncWBXML :
+                            TransportAgent::m_contentTypeSyncML);
+
+    TransportAgent::Status status;
+    do {
+        status = m_agent->wait();
+    } while(status == TransportAgent::ACTIVE);
+    if (status == TransportAgent::GOT_REPLY) {
+        const char *reply;
+        size_t replyLen;
+        string contentType;
+        m_agent->getReply (reply, replyLen, contentType);
+
+        //sanity check for the reply 
+        if (contentType.empty() || 
+            contentType.find(TransportAgent::m_contentTypeSyncML) != contentType.npos ||
+            contentType.find(TransportAgent::m_contentTypeSyncWBXML) != contentType.npos) {
+            SharedBuffer request (reply, replyLen);
+            //TODO should generate more reasonable sessionId here
+            string sessionId ="";
+            initServer (sessionId, request, contentType);
+            return true;
         }
-    } catch (...) {
-       throw;
     }
     return false;
 }
@@ -2893,9 +3003,40 @@ SyncMLStatus SyncContext::doSync()
 
     if (m_serverMode && !m_initialMessage.size()) {
         //This is a server alerted sync !
-        if (! initSAN ()) {
-            // return a proper error code 
-            throwError ("Server Alerted Sync init failed");
+        string sanFormat (getSyncMLVersion());
+        uint16_t version = 12;
+        if (boost::iequals (sanFormat, "1.2") ||
+            sanFormat == "") {
+            version = 12;
+        } else if (boost::iequals (sanFormat, "1.1")) {
+            version = 11;
+        } else {
+            version = 10;
+        }
+
+        bool status = true;
+        try {
+            status = sendSAN (version);
+        } catch (TransportException e) {
+            if (!sanFormat.empty()){
+                throw;
+            }
+            status = false;
+            //by pass the exception if we will try again with legacy SANFormat
+        }
+
+        if (! status) {
+            if (sanFormat.empty()) {
+                SE_LOG_DEBUG (NULL, NULL, "Server Alerted Sync init with SANFormat %d failed, trying with legacy format", version);
+                version = 11;
+                if (!sendSAN (version)) {
+                    // return a proper error code 
+                    throwError ("Server Alerted Sync init failed");
+                }
+            } else {
+                // return a proper error code 
+                throwError ("Server Alerted Sync init failed");
+            }
         }
     }
 
@@ -2972,7 +3113,11 @@ SyncMLStatus SyncContext::doSync()
                 m_engine.SetInt32Value(target, "forceslow", slow);
                 m_engine.SetInt32Value(target, "syncmode", direction);
 
-                m_engine.SetStrValue(target, "remotepath", source->getURI());
+                string uri = source->getURI();
+                if (uri.empty()) {
+                    source->throwError("uri not configured");
+                }
+                m_engine.SetStrValue(target, "remotepath", uri);
             } else {
                 m_engine.SetInt32Value(target, "enabled", 0);
             }
@@ -2993,8 +3138,6 @@ SyncMLStatus SyncContext::doSync()
         targets = m_engine.OpenKeyByPath(profile, "targets");
     }
 
-    m_retryInterval = getRetryInterval();
-    m_retryDuration = getRetryDuration();
     m_retries = 0;
 
     //Create the transport agent if not already created
@@ -3095,7 +3238,13 @@ SyncMLStatus SyncContext::doSync()
                 // to handle this. Skip the SessionStep() call
                 // and wait for response.
             } else {
+                if (getLogLevel() > 4) {
+                    SE_LOG_DEBUG(NULL, NULL, "before SessionStep: %s", Step2String(stepCmd).c_str());
+                }
                 m_engine.SessionStep(session, stepCmd, &progressInfo);
+                if (getLogLevel() > 4) {
+                    SE_LOG_DEBUG(NULL, NULL, "after SessionStep: %s", Step2String(stepCmd).c_str());
+                }
                 reportStepCmd(stepCmd);
             }
 
@@ -3218,10 +3367,6 @@ SyncMLStatus SyncContext::doSync()
                 sessionKey.reset();
                 
                 sendStart = resendStart = time (NULL);
-                int timeout = m_serverMode ? m_retryDuration : m_retryInterval;
-                if (timeout) {
-                    setTransportCallback(timeout);
-                }
                 requestNum ++;
                 // use GetSyncMLBuffer()/RetSyncMLBuffer() to access the data to be
                 // sent or have it copied into caller's buffer using
@@ -3232,7 +3377,7 @@ SyncMLStatus SyncContext::doSync()
                 break;
             }
             case sysync::STEPCMD_RESENDDATA: {
-                SE_LOG_INFO (NULL, NULL, "SyncContext: resend previous request #%d", m_retries);
+                SE_LOG_INFO (NULL, NULL, "resend previous message, retry #%d", m_retries);
                 resendStart = time(NULL);
                 /* We are resending previous message, just read from the
                  * previous buffer */
@@ -3253,8 +3398,9 @@ SyncMLStatus SyncContext::doSync()
                     // reply.  Other server transports could in theory
                     // resend, but don't have the necessary D-Bus APIs
                     // (MB #6370).
+                    // Same if() as below for FAILED.
                     if (m_serverMode ||
-                        duration > m_retryDuration){
+                        !m_retryInterval || duration > m_retryDuration || requestNum == 1) {
                         SE_LOG_INFO(NULL, NULL,
                                     "Transport giving up after %d retries and %ld:%02ldmin",
                                     m_retries,
@@ -3305,6 +3451,7 @@ SyncMLStatus SyncContext::doSync()
                 case TransportAgent::FAILED: {
                     time_t curTime = time(NULL);
                     time_t duration = curTime - sendStart;
+                    // same if() as above for TIME_OUT
                     if (m_serverMode ||
                         !m_retryInterval || duration > m_retryDuration || requestNum == 1) {
                         SE_LOG_INFO(NULL, NULL,
@@ -3437,7 +3584,7 @@ void SyncContext::status()
     SE_LOG_INFO(NULL, NULL, "Local item changes:\n%s",
                 out.str().c_str());
 
-    sourceList.startSession(getLogDir(), 0, 0, NULL);
+    sourceList.accessSession(getLogDir());
     LoggerBase::instance().setLevel(Logger::INFO);
     string prevLogdir = sourceList.getPrevLogdir();
     bool found = access(prevLogdir.c_str(), R_OK|X_OK) == 0;
@@ -3451,9 +3598,10 @@ void SyncContext::status()
             Exception::handle();
         }
     } else {
-        cout << "Previous log directory not found.\n";
+        ostream &out = getOutput();
+        out << "Previous log directory not found.\n";
         if (!getLogDir() || !getLogDir()[0]) {
-            cout << "Enable the 'logdir' option and synchronize to use this feature.\n";
+            out << "Enable the 'logdir' option and synchronize to use this feature.\n";
         }
     }
 }
@@ -3542,7 +3690,7 @@ void SyncContext::restore(const string &dirname, RestoreDatabase database)
     }
 
     SourceList sourceList(*this, false);
-    sourceList.startSession(dirname.c_str(), 0, 0, NULL);
+    sourceList.accessSession(dirname.c_str());
     LoggerBase::instance().setLevel(Logger::INFO);
     initSources(sourceList);
     BOOST_FOREACH(SyncSource *source, sourceList) {
@@ -3625,7 +3773,9 @@ public:
     LogDirTest() :
         SyncContext("nosuchconfig@nosuchcontext"),
         m_maxLogDirs(10)
-    {}
+    {
+        setOutput(&m_out);
+    }
 
     void setUp() {
         static const char *vcard_1 =
@@ -3706,6 +3856,8 @@ public:
 
         mkdir_p(getLogDir());
         m_maxLogDirs = 0;
+        m_out.clear();
+        m_out.str("");
     }
 
 private:
@@ -3714,6 +3866,8 @@ private:
     virtual const char *getLogDir() { return "LogDirTest/cache/syncevolution"; }
     int m_maxLogDirs;
 
+    ostringstream m_out;
+
     void dump(const char *dir, const char *file, const char *data) {
         string name = getLogData();
         name += "/";
@@ -3731,7 +3885,6 @@ private:
     CPPUNIT_TEST(testSessionChanges);
     CPPUNIT_TEST(testMultipleSessions);
     CPPUNIT_TEST(testExpire);
-    CPPUNIT_TEST(testExpire2);
     CPPUNIT_TEST_SUITE_END();
 
     /**
@@ -3976,20 +4129,6 @@ private:
         sessions = listSessions();
         CPPUNIT_ASSERT_EQUAL((size_t)1, sessions.size());
         CPPUNIT_ASSERT_EQUAL(dirs[0], sessions[0]);
-    }
-
-    void testExpire2() {
-        ScopedEnvChange config("XDG_CONFIG_HOME", "LogDirTest/config");
-        ScopedEnvChange cache("XDG_CACHE_HOME", "LogDirTest/cache");
-        string dirs[5];
-        Sessions_t sessions;
-
-        // Have to restart with clean log dir because our sequence counter
-        // runs over after 10 sessions. Continue where testExpire() stopped.
-        dirs[0] = session(false, STATUS_OK,
-                          "ical20", ".two", ".one",
-                          "vcard30", ".two", ".one",
-                          (char *)0);
 
         // when doing multiple failed syncs without dumps, keep the sessions
         // which have database dumps
index 8929785..8eacb4b 100644 (file)
@@ -158,6 +158,11 @@ class SyncContext : public SyncConfig, public ConfigUserInterface {
      * urls in the configuration.
      * */
     string m_usedSyncURL;
+
+    /* Indicates whether current sync session is triggered by remote peer
+     * (such as server alerted sync)
+     */
+    bool m_remoteInitiated;
   public:
     /**
      * SyncContext using a volatile config
@@ -173,6 +178,13 @@ class SyncContext : public SyncConfig, public ConfigUserInterface {
                 bool doLogging = false);
     ~SyncContext();
 
+    /**
+     * Output channel to be used by this context. NULL means "use std::cout", the default.
+     * Owned by caller, must remain valid as long as SyncContext exists.
+     */
+    void setOutput(ostream *out);
+    ostream &getOutput() const { return *m_out; }
+
     bool getQuiet() { return m_quiet; }
     void setQuiet(bool quiet) { m_quiet = quiet; }
 
@@ -187,14 +199,15 @@ class SyncContext : public SyncConfig, public ConfigUserInterface {
     static const SuspendFlags &getSuspendFlags() { return s_flags; }
 
     /*
-     * Use initSAN as the first step is sync() if this is a server alerted sync.
+     * Use sendSAN as the first step is sync() if this is a server alerted sync.
      * Prepare the san package and send the SAN request to the peer.
      * Returns false if failed to get a valid client sync request
      * otherwise put the client sync request into m_initialMessage which will
      * be used to initalze the server via initServer(), then continue sync() to
      * start the real sync serssion.
+     * @version indicates the SAN protocal version used (1.2 or 1.1/1.0)
      */
-    bool initSAN();
+    bool sendSAN(uint16_t version);
 
     /**
      * Initializes the session so that it runs as SyncML server once
@@ -408,6 +421,17 @@ class SyncContext : public SyncConfig, public ConfigUserInterface {
      */
     static void resetSignals() { s_flags = SuspendFlags(); }
 
+    /**
+     * handleSignals() is called in a signal handler,
+     * which can only call reentrant functions. Our
+     * logging code is not reentrant and thus has
+     * to be called outside of the signal handler.
+     */
+    static void printSignals();
+
+    bool getRemoteInitiated() {return m_remoteInitiated;}
+    void setRemoteInitiated(bool remote) {m_remoteInitiated = remote;}
+
   protected:
     /** exchange active Synthesis engine */
     SharedEngine swapEngine(SharedEngine newengine) {
@@ -564,7 +588,7 @@ class SyncContext : public SyncConfig, public ConfigUserInterface {
     /**
      * instantiate transport agent
      *
-     * Called by engine when it needs to do HTTP POST requests.  The
+     * Called by engine when it needs to exchange messages.  The
      * transport agent will be used throughout the sync session and
      * unref'ed when no longer needed. At most one agent will be
      * requested at a time. The transport agent is intentionally
@@ -573,6 +597,12 @@ class SyncContext : public SyncConfig, public ConfigUserInterface {
      * keeping a reference or by returning a shared_ptr where the
      * destructor doesn't do anything.
      *
+     * The agent must be ready for use:
+     * - HTTP specific settings must have been applied
+     * - the current SyncContect's transport_cb() must have been
+     *   installed via TransportAgent::setCallback(), with a suitable
+     *   timeout for the agent
+     *
      * The default implementation instantiates one of the builtin
      * transport agents, depending on how it was compiled.
      *
@@ -681,6 +711,14 @@ class SyncContext : public SyncConfig, public ConfigUserInterface {
     void checkSourceChanges(SourceList &sourceList, SyncReport &changes);
 
     /**
+     * A method to report sync is really successfully started.
+     * It happens at the same time SynthesDBPlugin starts to access source.
+     * For each sync, it is only called at most one time.
+     * The default action is nothing.
+     */
+    virtual void syncSuccessStart() { }
+
+    /**
      * sets up Synthesis session and executes it
      */
     SyncMLStatus doSync();
@@ -693,14 +731,6 @@ class SyncContext : public SyncConfig, public ConfigUserInterface {
     string getSynthesisDatadir() { return getRootPath() + "/.synthesis"; }
 
     /**
-     * handleSignals() is called in a signal handler,
-     * which can only call reentrant functions. Our
-     * logging code is not reentrant and thus has
-     * to be called outside of the signal handler.
-     */
-    static void printSignals();
-
-    /**
      * return true if "delayedabort" session variable is true
      */
     bool checkForScriptAbort(SharedSession session);
@@ -712,9 +742,15 @@ class SyncContext : public SyncConfig, public ConfigUserInterface {
     // Current retry count
     int m_retries;
 
+    //a flag indicating whether it is the first time to start source access.
+    //It can be used to report infomation about a sync is successfully started.
+    bool m_firstSourceAccess;
+
+    // output stream to be used by this context, never NULL (uses cout as fallback)
+    ostream *m_out;
+
 public:
     static bool transport_cb (void *data);
-    void setTransportCallback(int seconds);
 
     string getUsedSyncURL();
 };
index ff21900..3475ed5 100644 (file)
@@ -108,6 +108,24 @@ ContentType StringToContentType(const std::string &type, bool force) {
     }
 }
 
+std::string GetLegacyMIMEType (const std::string &type, bool force) {
+    if (boost::iequals (type, "text/x-vcard") || boost::iequals (type, "text/x-vcard:2.1")) {
+        return  "text/x-vcard";
+    } else if (boost::iequals (type, "text/vcard") ||boost::iequals (type, "text/vcard:3.0")) {
+        return force ? "text/vcard" : "text/x-vcard";
+    } else if (boost::iequals (type, "text/x-vcalendar") ||boost::iequals (type, "text/x-vcalendar:1.0")
+              ||boost::iequals (type, "text/x-calendar") || boost::iequals (type, "text/x-calendar:1.0")) {
+        return "text/x-vcalendar";
+    } else if (boost::iequals (type, "text/calendar") ||boost::iequals (type, "text/calendar:2.0")) {
+        return force ? "text/vcalendar" : "text/x-calendar";
+    } else if (boost::iequals (type, "text/plain") ||boost::iequals (type, "text/plain:1.0")) {
+        return "text/plain";
+    } else {
+        return "";
+    }
+}
+
+
 std::string Status2String(SyncMLStatus status)
 {
     string error;
@@ -163,6 +181,10 @@ std::string Status2String(SyncMLStatus status)
         error = "some changes could not be transferred";
         break;
 
+    case STATUS_PASSWORD_TIMEOUT:
+        error = "password request timed out";
+        break;
+
     case sysync::LOCERR_BADPROTO:
         error = "bad or unknown protocol";
         break;
index f1070d7..642476c 100644 (file)
@@ -87,6 +87,12 @@ SyncMode StringToSyncMode(const std::string &str, bool serverAlerted = false);
  */
 ContentType StringToContentType (const std::string &str, bool forceType);
 
+/*
+ * return string based MIME Type for PIM, always use legacy type unless
+ * forceType is set.
+ * */
+std::string GetLegacyMIMEType (const std::string &str, bool forceType);
+
 /**
  * result of SyncML operations, same codes as in HTTP and the Synthesis engine
  */
@@ -134,6 +140,12 @@ enum SyncMLStatus {
      */
     STATUS_DIED_PREMATURELY = 22002,
 
+    /**
+     * Set by dbus server when it asks password from dbus clients
+     * and no responsble is gotten in a specific time.
+     */
+    STATUS_PASSWORD_TIMEOUT = 22003,
+
     STATUS_MAX = 0x7FFFFFF
 };
 
index 35e1157..e29f91f 100644 (file)
@@ -407,6 +407,20 @@ std::string VirtualSyncSource::getDataTypeSupport()
     return datatypes;
 }
 
+SyncSource::Databases VirtualSyncSource::getDatabases()
+{
+    SyncSource::Databases dbs;
+    BOOST_FOREACH (boost::shared_ptr<SyncSource> &source, m_sources) {
+        SyncSource::Databases sub = source->getDatabases();
+        if (sub.empty()) {
+            return dbs;
+        }
+    }
+    Database db ("calendar+todo", "");
+    dbs.push_back (db);
+    return dbs;
+}
+
 void SyncSourceSession::init(SyncSource::Operations &ops)
 {
     ops.m_startDataRead = boost::bind(&SyncSourceSession::startDataRead, this, _1, _2);
@@ -1186,25 +1200,35 @@ void SyncSourceAdmin::mapid2entry(sysync::cMapID mID, string &key, string &value
     key = StringPrintf ("%s-%x",
                          SafeConfigNode::escape(mID->localID ? mID->localID : "", true, false).c_str(),
                          mID->ident);
-    value = StringPrintf("%s %x",
-                         SafeConfigNode::escape(mID->remoteID ? mID->remoteID : "", true, false).c_str(),
-                         mID->flags);
+    if (mID->remoteID && mID->remoteID[0]) {
+        value = StringPrintf("%s %x",
+                             SafeConfigNode::escape(mID->remoteID ? mID->remoteID : "", true, false).c_str(),
+                             mID->flags);
+    } else {
+        value = StringPrintf("%x", mID->flags);
+    }
 }
 
 void SyncSourceAdmin::entry2mapid(const string &key, const string &value, sysync::MapID mID)
 {
-    std::string rawkey = SafeConfigNode::unescape(key);
-    size_t found = rawkey.find_last_of ("-");
-    mID->localID = StrAlloc(rawkey.substr(0,found).c_str());
-    if (found != rawkey.npos) {
-        mID->ident =  strtol(rawkey.substr(found+1).c_str(), NULL, 16);
+    size_t found = key.rfind('-');
+    mID->localID = StrAlloc(SafeConfigNode::unescape(key.substr(0,found)).c_str());
+    if (found != key.npos) {
+        mID->ident =  strtol(key.substr(found+1).c_str(), NULL, 16);
     } else {
         mID->ident = 0;
     }
     std::vector< std::string > tokens;
     boost::split(tokens, value, boost::is_from_range(' ', ' '));
-    mID->remoteID = tokens.size() > 0 ? StrAlloc(tokens[0].c_str()) : NULL;
-    mID->flags = tokens.size() > 1 ? strtol(tokens[1].c_str(), NULL, 16) : 0;
+    if (tokens.size() >= 2) {
+        // if branch from mapid2entry above
+        mID->remoteID = StrAlloc(SafeConfigNode::unescape(tokens[0]).c_str());
+        mID->flags = strtol(tokens[1].c_str(), NULL, 16);
+    } else {
+        // else branch from above
+        mID->remoteID = NULL;
+        mID->flags = strtol(tokens[0].c_str(), NULL, 16);
+    }
 }
 
 void SyncSourceAdmin::init(SyncSource::Operations &ops,
@@ -1242,5 +1266,19 @@ void SyncSourceAdmin::init(SyncSource::Operations &ops,
          source->getServerNode());
 }
 
+void SyncSourceBlob::init(SyncSource::Operations &ops,
+                          const std::string &dir)
+{
+    m_blob.Init(getSynthesisAPI(),
+                getName(),
+                dir, "", "", "");
+    ops.m_readBlob = boost::bind(&SyncSourceBlob::readBlob, this,
+                                 _1, _2, _3, _4, _5, _6, _7);
+    ops.m_writeBlob = boost::bind(&SyncSourceBlob::writeBlob, this,
+                                  _1, _2, _3, _4, _5, _6, _7);
+    ops.m_deleteBlob = boost::bind(&SyncSourceBlob::deleteBlob, this,
+                                   _1, _2);
+}
+
 SE_END_CXX
 
index be6305d..555a892 100644 (file)
@@ -27,6 +27,7 @@
 
 #include <synthesis/sync_declarations.h>
 #include <synthesis/syerror.h>
+#include <synthesis/blobs.h>
 
 #include <boost/function.hpp>
 
@@ -991,6 +992,21 @@ class SyncSource : virtual public SyncSourceBase, public SyncSourceConfig, publi
 
         typedef sysync::TSyError (DeleteMapItem_t)(sysync::cMapID mID);
         boost::function<DeleteMapItem_t> m_deleteMapItem;
+
+        typedef sysync::TSyError (ReadBlob_t)(sysync::cItemID aID, const char *aBlobID,
+                                              void **aBlkPtr, size_t *aBlkSize,
+                                              size_t *aTotSize,
+                                              bool aFirst, bool *aLast);
+        boost::function<ReadBlob_t> m_readBlob;
+
+        typedef sysync::TSyError (WriteBlob_t)(sysync::cItemID aID, const char *aBlobID,
+                                               void *aBlkPtr, size_t aBlkSize,
+                                               size_t aTotSize,
+                                               bool aFirst, bool aLast);
+        boost::function<WriteBlob_t> m_writeBlob;
+
+        typedef sysync::TSyError (DeleteBlob_t)(sysync::cItemID aID, const char *aBlobID);
+        boost::function<DeleteBlob_t> m_deleteBlob;
         /**@}*/
     };
     const Operations &getOperations() { return m_operations; }
@@ -1069,8 +1085,8 @@ class SyncSource : virtual public SyncSourceBase, public SyncSourceConfig, publi
     static string backendsDebug();
 
     /**
-     * Mime type a backend provides by default, this is used to alert the
-     * remote peer in SAN during server alerted sync.
+     * Mime type a backend communicates with the remote peer by default,
+     * this is used to alert the remote peer in SAN during server alerted sync.
      */
     virtual const char *getPeerMimeType() const =0;
 
@@ -1171,6 +1187,14 @@ public:
      */
     std::string getDataTypeSupport();
     using SyncSourceBase::getDataTypeSupport;
+
+
+   /*
+    * If any of the sub datasource has no databases associated, return an empty
+    * database list to indicate a possibly error condition; otherwise return a
+    * dummy database to identify "calendar+todo" combined datasource.
+    **/
+    virtual Databases getDatabases();
 };
 
 /**
@@ -1675,6 +1699,46 @@ class SyncSourceAdmin : public virtual SyncSourceBase
 };
 
 /**
+ * Implements Read/Write/DeleteBlob. Blobs are stored inside a
+ * configurable directory, which has to be unique for the current
+ * peer.
+ */
+class SyncSourceBlob : public virtual SyncSourceBase
+{
+    /**
+     * Only one blob is active at a time.
+     * This utility class provides the actual implementation.
+     */
+    sysync::TBlob m_blob;
+
+    sysync::TSyError readBlob(sysync::cItemID aID, const char *aBlobID,
+                              void **aBlkPtr, size_t *aBlkSize,
+                              size_t *aTotSize,
+                              bool aFirst, bool *aLast) {
+        return m_blob.ReadBlob(aID, aBlobID, aBlkPtr, aBlkSize, aTotSize, aFirst, aLast);
+    }
+    sysync::TSyError writeBlob(sysync::cItemID aID, const char *aBlobID,
+                               void *aBlkPtr, size_t aBlkSize,
+                               size_t aTotSize,
+                               bool aFirst, bool aLast) {
+        mkdir_p(m_blob.getBlobPath());
+        return m_blob.WriteBlob(aID, aBlobID, aBlkPtr, aBlkSize, aTotSize, aFirst, aLast);
+    }
+    sysync::TSyError deleteBlob(sysync::cItemID aID, const char *aBlobID) {
+        return m_blob.DeleteBlob(aID, aBlobID);
+    }
+
+    sysync::TSyError loadAdminData(sysync::cItemID aID, const char *aBlobID,
+                                   void **aBlkPtr, size_t *aBlkSize, size_t *aTotSize,
+                                   bool aFirst, bool *aLast);
+
+ public:
+    void init(SyncSource::Operations &ops,
+              const std::string &dir);
+};
+
+
+/**
  * This is an interface definition that is expected by the client-test
  * program. Part of the reason for this requirement is that the test
  * program was originally written for the Funambol SyncSource API.
index ea91a07..089a687 100644 (file)
@@ -112,7 +112,10 @@ TSyError SyncEvolution_Module_Capabilities( CContext mContext, appCharP *mCapabi
       << Plugin_DS_Data_Str << ":no\n"
       << Plugin_DS_Data_Key << ":yes\n"
       << CA_ItemAsKey << ":yes\n"
-      << Plugin_DS_Blob << ":no\n";
+      << Plugin_DS_Blob <<
+        ((source && source->getOperations().m_readBlob) ?
+         ":yes\n" :
+         ":no\n");
 
     if (source && source->getOperations().m_loadAdminData) {
         s << Plugin_DS_Admin << ":yes\n";
@@ -448,8 +451,8 @@ TSyError SyncEvolution_LoadAdminData( CContext aContext, cAppCharP aLocDB,
         res = source->handleException();
     }
 
-    SE_LOG_DEBUG(source, NULL, "LoadAdminData '%s' '%s', res=%d",
-                 aLocDB, aRemDB, res);
+    SE_LOG_DEBUG(source, NULL, "LoadAdminData '%s' '%s', '%s' res=%d",
+                 aLocDB, aRemDB, *adminData ? *adminData : "", res);
     return res;
 } /* LoadAdminData */
 
@@ -704,34 +707,34 @@ TSyError SyncEvolution_ReadItemAsKey( CContext aContext, cItemID aID, KeyH aItem
     return res;
 }
 
-#if 0
 extern "C"
-TSyError SyncEvolution_ReadBlob( CContext aContext, cItemID  aID,  cAppCharP  aBlobID,
-                                 appPointer *aBlkPtr, uInt32 *aBlkSize, 
-                                 uInt32 *aTotSize,
-                                 bool  aFirst,    bool *aLast )
+sysync::TSyError SyncEvolution_ReadBlob(CContext aContext, cItemID  aID,  cAppCharP  aBlobID,
+                                        appPointer *aBlkPtr, memSize *aBlkSize, 
+                                        memSize *aTotSize,
+                                        bool  aFirst,    bool *aLast)
 {
-  /**** CAN BE ADAPTED BY USER ****/ 
   SyncSource *source = DBC( aContext );
   if (!source) {
       return LOCERR_WRONGUSAGE;
   }
-  TSyError res = LOCERR_OK;
-  const int sz= sizeof(int);
-  
-  int* ip = (int*)malloc( sz ); /* example BLOB structure for test (=4 bytes) */ 
-      *ip = 231;
 
-  *aBlkPtr = (appPointer)ip; if (*aBlkSize==0 || *aBlkSize>=sz) *aBlkSize= sz;
-  *aTotSize= *aBlkSize;
-  *aLast   = true;
+  TSyError res;
+  if (source->getOperations().m_readBlob) {
+      try {
+          res = source->getOperations().m_readBlob(aID, aBlobID, (void **)aBlkPtr, aBlkSize,
+                                                   aTotSize, aFirst, aLast);
+      } catch (...) {
+          res = source->handleException();
+      }
+  } else {
+      res = LOCERR_NOTIMP;
+  }
 
-  SE_LOG_DEBUG(source, NULL, "ReadBlob aID=(%s,%s) aBlobID=(%s) aBlkPtr=%08X aBlkSize=%d aTotSize=%d aFirst=%s aLast=%s res=%d",
-               aID->item,aID->parent, aBlobID, aBlkPtr, *aBlkSize, *aTotSize,
+  SE_LOG_DEBUG(source, NULL, "ReadBlob aID=(%s,%s) aBlobID=(%s) aBlkPtr=%p aBlkSize=%lu aTotSize=%lu aFirst=%s aLast=%s res=%d",
+               aID->item,aID->parent, aBlobID, aBlkPtr, (unsigned long)*aBlkSize, (unsigned long)*aTotSize,
                aFirst? "true" : "false", *aLast ? "true" : "false", res);
   return res;
 } /* ReadBlob */
-#endif
 
 
 extern "C"
@@ -878,21 +881,31 @@ TSyError SyncEvolution_DeleteSyncSet( CContext aContext )
 }
 
 
-#if 0
 extern "C"
-TSyError SyncEvolution_WriteBlob( CContext aContext, cItemID aID,  cAppCharP aBlobID,
-                                  appPointer aBlkPtr, uInt32 aBlkSize, 
-                                  uInt32 aTotSize,
-                                  bool aFirst,    bool aLast )
+TSyError SyncEvolution_WriteBlob(CContext aContext, cItemID aID,  cAppCharP aBlobID,
+                                 appPointer aBlkPtr, memSize aBlkSize, 
+                                 memSize aTotSize,
+                                 bool aFirst,    bool aLast)
 {
     SyncSource *source = DBC( aContext );
     if (!source) {
         return LOCERR_WRONGUSAGE;
     }
-    TSyError res = LOCERR_NOTIMP;
-  
-    SE_LOG_DEBUG(source, NULL, "WriteBlob aID=(%s,%s) aBlobID=(%s) aBlkPtr=%08X aBlkSize=%d aTotSize=%d aFirst=%s aLast=%s res=%d",
-                 aID->item,aID->parent, aBlobID, aBlkPtr, aBlkSize, aTotSize, 
+
+    TSyError res;
+    if (source->getOperations().m_writeBlob) {
+        try {
+            res = source->getOperations().m_writeBlob(aID, aBlobID, aBlkPtr, aBlkSize,
+                                                      aTotSize, aFirst, aLast);
+        } catch (...) {
+            res = source->handleException();
+        }
+    } else {
+        res = LOCERR_NOTIMP;
+    }
+    
+    SE_LOG_DEBUG(source, NULL, "WriteBlob aID=(%s,%s) aBlobID=(%s) aBlkPtr=%p aBlkSize=%lu aTotSize=%lu aFirst=%s aLast=%s res=%d",
+                 aID->item,aID->parent, aBlobID, aBlkPtr, (unsigned long)aBlkSize, (unsigned long)aTotSize, 
                  aFirst ? "true" : "false", aLast ? "true" : "false", res);
     return res;
 } /* WriteBlob */
@@ -905,16 +918,23 @@ TSyError SyncEvolution_DeleteBlob( CContext aContext, cItemID aID, cAppCharP aBl
     if (!source) {
         return LOCERR_WRONGUSAGE;
     }
-    TSyError res = LOCERR_NOTIMP;
 
-    SE_LOG_DEBUG(source "DeleteBlob aID=(%s,%s) aBlobID=(%s) res=%d",
+    TSyError res;
+    if (source->getOperations().m_deleteBlob) {
+        try {
+            res = source->getOperations().m_deleteBlob(aID, aBlobID);
+        } catch (...) {
+            res = source->handleException();
+        }
+    } else {
+        res = LOCERR_NOTIMP;
+    }
+
+    SE_LOG_DEBUG(source, NULL, "DeleteBlob aID=(%s,%s) aBlobID=(%s) res=%d",
                  aID->item,aID->parent, aBlobID, res);
     return res;
 } /* DeleteBlob */
 
-#endif
-
-
 extern "C"
 TSyError SyncEvolution_EndDataWrite( CContext aContext, bool success, appCharP *newToken )
 {
index e95922f..d2c871a 100644 (file)
@@ -31,7 +31,7 @@ void SharedEngine::Connect(const string &aEngineName,
 {
     sysync::TSyError err = m_engine->Connect(aEngineName, aPrgVersion, aDebugFlags);
     if (err) {
-        throw BadSynthesisResult(std::string("cannot connect to engine '") + aEngineName + "'", static_cast<sysync::TSyErrorEnum>(err));
+        SE_THROW_EXCEPTION_STATUS(BadSynthesisResult, std::string("cannot connect to engine '") + aEngineName + "'", static_cast<sysync::TSyErrorEnum>(err));
     }
 }
 
@@ -39,7 +39,7 @@ void SharedEngine::Disconnect()
 {
     sysync::TSyError err = m_engine->Disconnect();
     if (err) {
-        throw BadSynthesisResult("cannot disconnect engine", static_cast<sysync::TSyErrorEnum>(err));
+        SE_THROW_EXCEPTION_STATUS(BadSynthesisResult, "cannot disconnect engine", static_cast<sysync::TSyErrorEnum>(err));
     }
 }
 
@@ -47,7 +47,7 @@ void SharedEngine::InitEngineXML(const string &aConfigXML)
 {
     sysync::TSyError err = m_engine->InitEngineXML(aConfigXML.c_str());
     if (err) {
-        throw BadSynthesisResult("Synthesis XML config parser error", static_cast<sysync::TSyErrorEnum>(err));
+        SE_THROW_EXCEPTION_STATUS(BadSynthesisResult, "Synthesis XML config parser error", static_cast<sysync::TSyErrorEnum>(err));
     }
 }
 
@@ -72,7 +72,7 @@ SharedSession SharedEngine::OpenSession(const string &aSessionID)
     sysync::TSyError err = m_engine->OpenSession(sessionH, 0,
                                                  aSessionID.empty() ? NULL : aSessionID.c_str());
     if (err) {
-        throw BadSynthesisResult("opening session failed", static_cast<sysync::TSyErrorEnum>(err));
+        SE_THROW_EXCEPTION_STATUS(BadSynthesisResult, "opening session failed", static_cast<sysync::TSyErrorEnum>(err));
     }
     return SharedSession(sessionH, FreeEngineItem(*this));
 }
@@ -82,7 +82,7 @@ SharedKey SharedEngine::OpenSessionKey(SharedSession &aSessionH)
     sysync::KeyH key;
     sysync::TSyError err = m_engine->OpenSessionKey(aSessionH.get(), key, 0);
     if (err) {
-        throw BadSynthesisResult("opening session key failed", static_cast<sysync::TSyErrorEnum>(err));
+        SE_THROW_EXCEPTION_STATUS(BadSynthesisResult, "opening session key failed", static_cast<sysync::TSyErrorEnum>(err));
     }
     return SharedKey(key, FreeEngineItem(*this));
 }
@@ -95,7 +95,7 @@ void SharedEngine::SessionStep(const SharedSession &aSessionH,
                                                  aStepCmd,
                                                  aInfoP);
     if (err) {
-        throw BadSynthesisResult("proceeding with session failed", static_cast<sysync::TSyErrorEnum>(err));
+        SE_THROW_EXCEPTION_STATUS(BadSynthesisResult, "proceeding with session failed", static_cast<sysync::TSyErrorEnum>(err));
     }
 }
 
@@ -127,7 +127,7 @@ SharedBuffer SharedEngine::GetSyncMLBuffer(const SharedSession &aSessionH, bool
                                                      aForSend,
                                                      buffer, bufSize);
     if (err) {
-        throw BadSynthesisResult("acquiring SyncML buffer failed", static_cast<sysync::TSyErrorEnum>(err));
+        SE_THROW_EXCEPTION_STATUS(BadSynthesisResult,"acquiring SyncML buffer failed", static_cast<sysync::TSyErrorEnum>(err));
     }
 
     return SharedBuffer((char *)buffer, (size_t)bufSize,
@@ -138,7 +138,7 @@ void SharedEngine::WriteSyncMLBuffer(const SharedSession &aSessionH, const char
 {
     sysync::TSyError err = m_engine->WriteSyncMLBuffer(aSessionH.get(), const_cast<char *>(data), len);
     if (err) {
-        throw BadSynthesisResult("writing SyncML buffer failed", static_cast<sysync::TSyErrorEnum>(err));
+        SE_THROW_EXCEPTION_STATUS(BadSynthesisResult, "writing SyncML buffer failed", static_cast<sysync::TSyErrorEnum>(err));
     }
 }
 
@@ -155,9 +155,9 @@ SharedKey SharedEngine::OpenKeyByPath(const SharedKey &aParentKeyH,
         string what = "opening key ";
         what += aPath;
         if (err == sysync::DB_NoContent) {
-            throw NoSuchKey(what);
+            SE_THROW_EXCEPTION(NoSuchKey, what);
         } else {
-            throw BadSynthesisResult(what, static_cast<sysync::TSyErrorEnum>(err));
+            SE_THROW_EXCEPTION_STATUS(BadSynthesisResult, what, static_cast<sysync::TSyErrorEnum>(err));
         }
     }
     return SharedKey(key, FreeEngineItem(*this));
@@ -175,9 +175,9 @@ SharedKey SharedEngine::OpenSubkey(const SharedKey &aParentKeyH,
     if (err) {
         string what = "opening sub key";
         if (err == sysync::DB_NoContent) {
-            throw NoSuchKey(what);
+            SE_THROW_EXCEPTION(NoSuchKey, what);
         } else {
-            throw BadSynthesisResult(what, static_cast<sysync::TSyErrorEnum>(err));
+            SE_THROW_EXCEPTION_STATUS(BadSynthesisResult, what, static_cast<sysync::TSyErrorEnum>(err));
         }
     }
     return SharedKey(key, FreeEngineItem(*this));
@@ -188,7 +188,7 @@ string SharedEngine::GetStrValue(const SharedKey &aKeyH, const string &aValName)
     std::string s;
     sysync::TSyError err = m_engine->GetStrValue(aKeyH.get(), aValName.c_str(), s);
     if (err) {
-        throw BadSynthesisResult(string("error reading value ") + aValName, static_cast<sysync::TSyErrorEnum>(err));
+        SE_THROW_EXCEPTION_STATUS(BadSynthesisResult, string("error reading value ") + aValName, static_cast<sysync::TSyErrorEnum>(err));
     }
     return s;
 }
@@ -197,7 +197,7 @@ void SharedEngine::SetStrValue(const SharedKey &aKeyH, const string &aValName, c
 {
     sysync::TSyError err = m_engine->SetStrValue(aKeyH.get(), aValName.c_str(), aValue);
     if (err) {
-        throw BadSynthesisResult(string("error writing value ") + aValName, static_cast<sysync::TSyErrorEnum>(err));
+        SE_THROW_EXCEPTION_STATUS(BadSynthesisResult, string("error writing value ") + aValName, static_cast<sysync::TSyErrorEnum>(err));
     }
 }
 
@@ -206,7 +206,7 @@ sysync::sInt32 SharedEngine::GetInt32Value(const SharedKey &aKeyH, const string
     sysync::sInt32 v;
     sysync::TSyError err = m_engine->GetInt32Value(aKeyH.get(), aValName.c_str(), v);
     if (err) {
-        throw BadSynthesisResult(string("error reading value ") + aValName, static_cast<sysync::TSyErrorEnum>(err));
+        SE_THROW_EXCEPTION_STATUS(BadSynthesisResult, string("error reading value ") + aValName, static_cast<sysync::TSyErrorEnum>(err));
     }
     return v;
 }
@@ -215,7 +215,7 @@ void SharedEngine::SetInt32Value(const SharedKey &aKeyH, const string &aValName,
 {
     sysync::TSyError err = m_engine->SetInt32Value(aKeyH.get(), aValName.c_str(), aValue);
     if (err) {
-        throw BadSynthesisResult(string("error writing value ") + aValName, static_cast<sysync::TSyErrorEnum>(err));
+        SE_THROW_EXCEPTION_STATUS(BadSynthesisResult, string("error writing value ") + aValName, static_cast<sysync::TSyErrorEnum>(err));
     }
 }
 
index 11f643f..b429c3a 100644 (file)
@@ -39,6 +39,7 @@
 #include <stdexcept>
 
 #include <syncevo/declarations.h>
+#include <syncevo/util.h>
 SE_BEGIN_CXX
 
 typedef boost::shared_ptr<sysync::SessionType> SharedSession;
@@ -126,17 +127,17 @@ class SharedEngine {
 /**
  * thrown when a function returns a non-okay error code
  */
-class BadSynthesisResult : public std::runtime_error
+class BadSynthesisResult : public StatusException
 {
-    sysync::TSyErrorEnum m_result;
-
  public:
-    BadSynthesisResult(const string &what, sysync::TSyErrorEnum result) :
-    std::runtime_error(what),
-    m_result(result)
-        {}
-
-    sysync::TSyErrorEnum result() const { return m_result; }
+    BadSynthesisResult(const std::string &file,
+                       int line,
+                       const string &what,
+                       sysync::TSyErrorEnum result) 
+        : StatusException(file, line, what, SyncMLStatus(result))
+    {}
+
+    sysync::TSyErrorEnum result() const { return sysync::TSyErrorEnum(syncMLStatus()); }
 };
 
 /**
@@ -145,8 +146,8 @@ class BadSynthesisResult : public std::runtime_error
 class NoSuchKey : public BadSynthesisResult
 {
  public:
-    NoSuchKey(const string &what) :
-    BadSynthesisResult(what, sysync::DB_NoContent)
+    NoSuchKey(const std::string &file, int line, const string &what) :
+    BadSynthesisResult(file, line, what, sysync::DB_NoContent)
         {}
 };
 
index 559e002..076e08d 100644 (file)
@@ -103,6 +103,7 @@ void TrackingSyncSource::deleteItem(const std::string &luid)
 void TrackingSyncSource::enableServerMode()
 {
     SyncSourceAdmin::init(m_operations, this);
+    SyncSourceBlob::init(m_operations, getCacheDir());
 }
 
 bool TrackingSyncSource::serverModeEnabled() const
index fe58d70..519e243 100644 (file)
@@ -65,6 +65,7 @@ using namespace std;
  */
 class TrackingSyncSource : public TestingSyncSource,
     virtual public SyncSourceRevisions,
+    virtual public SyncSourceBlob,
     virtual public SyncSourceAdmin
 {
   public:
index 2a696fd..133047a 100644 (file)
@@ -154,6 +154,8 @@ LDFLAGS = @LDFLAGS@
 LIBEXECDIR = @LIBEXECDIR@
 LIBICAL_AVAILABLE_CFLAGS = @LIBICAL_AVAILABLE_CFLAGS@
 LIBICAL_AVAILABLE_LIBS = @LIBICAL_AVAILABLE_LIBS@
+LIBNOTIFY_CFLAGS = @LIBNOTIFY_CFLAGS@
+LIBNOTIFY_LIBS = @LIBNOTIFY_LIBS@
 LIBOBJS = @LIBOBJS@
 LIBOPENOBEX_CFLAGS = @LIBOPENOBEX_CFLAGS@
 LIBOPENOBEX_LIBS = @LIBOPENOBEX_LIBS@
@@ -172,6 +174,8 @@ MODIFY_SYNCCOMPARE = @MODIFY_SYNCCOMPARE@
 MSGFMT = @MSGFMT@
 MSGFMT_OPTS = @MSGFMT_OPTS@
 MSGMERGE = @MSGMERGE@
+MX_GTK_0_99_1_CFLAGS = @MX_GTK_0_99_1_CFLAGS@
+MX_GTK_0_99_1_LIBS = @MX_GTK_0_99_1_LIBS@
 NMEDIT = @NMEDIT@
 NSS_CFLAGS = @NSS_CFLAGS@
 NSS_LIBS = @NSS_LIBS@
@@ -209,6 +213,7 @@ SYNTHESIS_LIB = @SYNTHESIS_LIB@
 SYNTHESIS_LIBS = @SYNTHESIS_LIBS@
 SYNTHESIS_SRC = @SYNTHESIS_SRC@
 SYNTHESIS_SUBDIR = @SYNTHESIS_SUBDIR@
+SYNTHESIS_SUBDIR_INCLUDES = @SYNTHESIS_SUBDIR_INCLUDES@
 TRANSPORT_CFLAGS = @TRANSPORT_CFLAGS@
 TRANSPORT_LIBS = @TRANSPORT_LIBS@
 UNIQUE_CFLAGS = @UNIQUE_CFLAGS@
index db3e852..0c6dc1c 100644 (file)
               <enum name="X-EVOLUTION-TELEX" value="B11"/>
               <enum name="X-EVOLUTION-TTYTDD" value="B12"/>
 
-              <enum mode="prefix" name="X-CustomLabel-" value="1.L"/>
-              <enum mode="prefix" name="X-Synthesis-Ref" value="2.L"/>
+              <!-- enum mode="prefix" name="X-CustomLabel-" value="1.L"/ -->
+              <!-- enum mode="prefix" name="X-Synthesis-Ref" value="2.L"/ -->
             </value>
           </parameter>
-          <parameter name="X-EVOLUTION-UI-SLOT" positional="no" show="yes">
+          <parameter name="X-EVOLUTION-UI-SLOT" positional="no" show="no">
             <value field="TEL_SLOT"/>
           </parameter>
         </property>
               <enum mode="ignore"   value="B2"/> <!-- OTHER -->
               <enum name="INTERNET" value="B3"/>
 
-              <enum mode="prefix" name="X-CustomLabel-" value="1.L"/>
-              <enum mode="prefix" name="X-Synthesis-Ref" value="2.L"/>
+              <!-- enum mode="prefix" name="X-CustomLabel-" value="1.L"/ -->
+              <!-- enum mode="prefix" name="X-Synthesis-Ref" value="2.L"/ -->
             </value>
           </parameter>
-          <parameter name="X-EVOLUTION-UI-SLOT" positional="no" show="yes">
+          <parameter name="X-EVOLUTION-UI-SLOT" positional="no" show="no">
             <value field="EMAIL_SLOT"/>
           </parameter>
         </property>
               <enum mode="ignore"   value="B2"/> <!-- OTHER -->
               <enum name="PREF"     value="B3"/>
 
-              <enum mode="prefix" name="X-CustomLabel-" value="1.L"/>
-              <enum mode="prefix" name="X-Synthesis-Ref" value="2.L"/>
+              <!-- enum mode="prefix" name="X-CustomLabel-" value="1.L"/ -->
+              <!-- enum mode="prefix" name="X-Synthesis-Ref" value="2.L"/ -->
             </value>
           </parameter>
         </property>
 
         <property name="X-AIM" suppressempty="yes">
           <value field="AIM_HANDLE"/>
-          <parameter name="X-EVOLUTION-UI-SLOT" positional="no" show="yes">
+          <parameter name="X-EVOLUTION-UI-SLOT" positional="no" show="no">
             <value field="AIM_SLOT"/>
           </parameter>
         </property>
         <property name="X-GADUGADU" suppressempty="yes">
           <value field="GADUGADU_HANDLE"/>
-          <parameter name="X-EVOLUTION-UI-SLOT" positional="no" show="yes">
+          <parameter name="X-EVOLUTION-UI-SLOT" positional="no" show="no">
             <value field="GADUGADU_SLOT"/>
           </parameter>
         </property>
         <property name="X-GROUPWISE" suppressempty="yes">
           <value field="GROUPWISE_HANDLE"/>
-          <parameter name="X-EVOLUTION-UI-SLOT" positional="no" show="yes">
+          <parameter name="X-EVOLUTION-UI-SLOT" positional="no" show="no">
             <value field="GROUPWISE_SLOT"/>
           </parameter>
         </property>
         <property name="X-ICQ" suppressempty="yes">
           <value field="ICQ_HANDLE"/>
-          <parameter name="X-EVOLUTION-UI-SLOT" positional="no" show="yes">
+          <parameter name="X-EVOLUTION-UI-SLOT" positional="no" show="no">
             <value field="ICQ_SLOT"/>
           </parameter>
         </property>
         <property name="X-JABBER" suppressempty="yes">
           <value field="JABBER_HANDLE"/>
-          <parameter name="X-EVOLUTION-UI-SLOT" positional="no" show="yes">
+          <parameter name="X-EVOLUTION-UI-SLOT" positional="no" show="no">
             <value field="JABBER_SLOT"/>
           </parameter>
         </property>
         <property name="X-MSN" suppressempty="yes">
           <value field="MSN_HANDLE"/>
-          <parameter name="X-EVOLUTION-UI-SLOT" positional="no" show="yes">
+          <parameter name="X-EVOLUTION-UI-SLOT" positional="no" show="no">
             <value field="MSN_SLOT"/>
           </parameter>
         </property>
         <property name="X-YAHOO" suppressempty="yes">
           <value field="YAHOO_HANDLE"/>
-          <parameter name="X-EVOLUTION-UI-SLOT" positional="no" show="yes">
+          <parameter name="X-EVOLUTION-UI-SLOT" positional="no" show="no">
             <value field="YAHOO_SLOT"/>
           </parameter>
         </property>
 
         <property name="X-SKYPE" suppressempty="yes"> 
           <value field="SKYPE_HANDLE"/>
-          <parameter name="X-EVOLUTION-UI-SLOT" positional="no" show="yes">
+          <parameter name="X-EVOLUTION-UI-SLOT" positional="no" show="no">
             <value field="SKYPE_SLOT"/>
           </parameter>
         </property>
 
         <property name="X-SIP" suppressempty="yes">
           <value field="SIP_HANDLE"/>
-          <parameter name="X-EVOLUTION-UI-SLOT" positional="no" show="yes">
+          <parameter name="X-EVOLUTION-UI-SLOT" positional="no" show="no">
             <value field="SIP_SLOT"/>
           </parameter>
         </property>
               <enum name="WORK"     value="B1"/>
               <enum mode="ignore"   value="B2"/> <!-- OTHER -->
 
-              <enum mode="prefix" name="X-CustomLabel-" value="1.L"/>
-              <enum mode="prefix" name="X-Synthesis-Ref" value="2.L"/>
+              <!-- enum mode="prefix" name="X-CustomLabel-" value="1.L"/ -->
+              <!-- enum mode="prefix" name="X-Synthesis-Ref" value="2.L"/ -->
             </value>
           </parameter>
         </property>
index f27f20f..a7443e1 100644 (file)
         <!-- sub-profile for event -->
         <subprofile name="VEVENT" nummandatory="1" showifselectedonly="yes" field="ISEVENT" value="1">
 
+            <property rule='needsTZinVEVENT' name="TZ" filter="false" suppressempty="yes">
+                <value field="DTSTART" conversion="tz"/>
+            </property>
+
             <property name="STATUS"  suppressempty="yes" onlyformode="old">
                 <value field="STATUS" conversion="emptyonly">
                     <enum name="COMPLETED"      value="0"/>
diff --git a/src/syncevo/configs/remoterules/00_need_tz_in_event.xml b/src/syncevo/configs/remoterules/00_need_tz_in_event.xml
new file mode 100644 (file)
index 0000000..196becd
--- /dev/null
@@ -0,0 +1 @@
+<subrule name="needsTZInVEVENT"></subrule>
diff --git a/src/syncevo/configs/remoterules/client/01mobical.xml b/src/syncevo/configs/remoterules/client/01mobical.xml
new file mode 100644 (file)
index 0000000..f1433da
--- /dev/null
@@ -0,0 +1,8 @@
+      <remoterule name="Mobical">
+          <manufacturer>Tactel AB</manufacturer>
+          <model>Mobical Sync Server</model>
+          <rulescript><![CDATA[
+              alarmTimeToUTC = TRUE;
+              ]]></rulescript>
+      </remoterule>
+
diff --git a/src/syncevo/configs/remoterules/server/45_N7210c.xml b/src/syncevo/configs/remoterules/server/45_N7210c.xml
new file mode 100644 (file)
index 0000000..6327105
--- /dev/null
@@ -0,0 +1,8 @@
+<remoterule name="N7210c">
+    <manufacturer>NOKIA</manufacturer> 
+    <model>Nokia 7210c</model>
+    <descriptivename>Nokia 7210c</descriptivename>
+    <forceutc>yes</forceutc>
+    <limitedfieldlengths>yes</limitedfieldlengths>
+    <include rule= "needsTZInVEVENT"/>
+</remoterule>
index 53c6852..d1d4a5c 100644 (file)
         }
       }
       // a workaround for funambol: adding 'action' for 'alarm'
-      if (ITEMDATATYPE()=="iCalendar20") {
-        if (ALARM_TIME!=EMPTY && ALARM_ACTION==EMPTY) {
-            ALARM_ACTION = "DISPLAY";
-        }
+      // if item data type is vCalendar1.0, also add 'action' for 'alarm'.
+      // This is a workaround for Mobical.net, which uses vCalendar1.0.
+      if (ALARM_TIME!=EMPTY && ALARM_ACTION==EMPTY) {
+          ALARM_ACTION = "DISPLAY";
       }
     ]]></macro>
 
           if (ALARM_MSG==EMPTY) ALARM_MSG="alarm";
         }
       }
+
+      // for 'ALARM_TIME', convert duration time to UTC time
+      // This workaround is for Mobical.net can't understand duration time
+      if (SESSIONVAR("alarmTimeToUTC") && ITEMDATATYPE()=="vCalendar10"
+            && ALARM_TIME!=EMPTY && ISDURATION(ALARM_TIME)) {
+        TIMESTAMP ts;
+        if (ALARM_REL==2)
+          ts = DTEND; // relative to end
+        else {
+          if (ISEVENT)
+            ts = DTSTART; // relative to start for events
+          else
+            ts = DUE; // relative to due for todos
+        }
+
+        ALARM_TIME = CONVERTTOUSERZONE(POINTINTIME(ts), TRUE) + ALARM_TIME;
+        ALARM_TIME = CONVERTTOZONE(ALARM_TIME, "UTC");
+      }
     ]]></macro>
index acbee8f..05c6c80 100644 (file)
 #define SE_BEGIN_CXX namespace SyncEvo {
 #define SE_END_CXX }
 
+SE_BEGIN_CXX
+/*
+ * SyncEvolution should never use standard IO directly. Either use the
+ * logging facilities or use variables that point towards the real
+ * output channels.  In particular the command line code then can be
+ * run as pointing towards real std::cout, a string stream, or redirected
+ * via D-Bus.
+ *
+ * These dummy declarations trip up code inside SyncEvo namespace or using it
+ * which use plain "cout << something" after a "using namespace std".
+ * They don't help catching code which references std::cout.
+ */
+struct DontUseStandardIO;
+extern DontUseStandardIO *cout;
+extern DontUseStandardIO *cerr;
+SE_END_CXX
+
 #endif /** INCL_DECLARATIONS */
index 756822b..1c380b8 100644 (file)
@@ -115,7 +115,7 @@ void *findSymbols(const char *libname, int minver, int maxver,
         va_start(ap, realver);
         void **funcptr = va_arg(ap, void **);
         const char *symname = NULL;
-        while (funcptr && allfound) {
+        while (funcptr) {
             symname = va_arg(ap, const char *);
             *funcptr = dlsym(dlhandle, symname);
             if (!*funcptr) {
index 656eb49..9d3d835 100644 (file)
 #include <syncevo/TransportAgent.h>
 #include <syncevo/SynthesisEngine.h>
 #include <syncevo/Logging.h>
+#include <syncevo/LogRedirect.h>
 
 #include <synthesis/syerror.h>
 
 #include <boost/scoped_array.hpp>
 #include <boost/foreach.hpp>
 #include <fstream>
+#include <iostream>
 
 #include <errno.h>
 #include <unistd.h>
+#include <sys/wait.h>
 #include <sys/stat.h>
 #include <sys/types.h>
+#include <fcntl.h>
 #include <dirent.h>
+#include <limits.h>
+#include <stdlib.h>
 
 #if USE_SHA256 == 1
 # include <glib.h>
@@ -80,6 +86,17 @@ string normalizePath(const string &path)
     return res;
 }
 
+bool relToAbs(string &path)
+{
+    char buffer[PATH_MAX+1];
+    if (realpath(path.c_str(), buffer)) {
+        path = buffer;
+        return true;
+    } else {
+        return false; 
+    }
+}
+
 void mkdir_p(const string &path)
 {
     boost::scoped_array<char> dirs(new char[path.size() + 1]);
@@ -176,6 +193,91 @@ bool isDir(const string &path)
     return false;
 }
 
+int Execute(const std::string &cmd, ExecuteFlags flags) throw()
+{
+    int ret = -1;
+
+    try {
+        // use simpler system() calls whenever we don't want to capture
+        // output, because it means that output is sent to the user
+        // directly
+        if (((flags & EXECUTE_NO_STDERR) || !LogRedirect::redirectingStderr()) &&
+            ((flags & EXECUTE_NO_STDOUT) || !LogRedirect::redirectingStdout())) {
+            string fullcmd = cmd;
+            if (flags & EXECUTE_NO_STDERR) {
+                fullcmd += " 2>/dev/null";
+            }
+            if (flags & EXECUTE_NO_STDOUT) {
+                fullcmd += " >/dev/null";
+            }
+            ret = system(fullcmd.c_str());
+        } else {
+            // Need to catch at least one of stdout or stderr. A
+            // low-tech solution would be to use temporary files which
+            // are read after system() returns. But we want true
+            // streaming of the output, so use fork()/exec() plus
+            // reliable output redirection.
+            LogRedirect io(flags);
+            pid_t child = fork();
+            switch (child) {
+            case 0: {
+                // child process:
+                // - close unused end of the pipes
+                if (io.getStdout().m_read >= 0) {
+                    close(io.getStdout().m_read);
+                }
+                if (io.getStderr().m_read >= 0) {
+                    close(io.getStderr().m_read);
+                }
+                // - replace file descriptors 1 and 2 with the ones
+                //   prepared for us or /dev/null
+                int fd;
+                int fd_null = open("/dev/null", O_WRONLY);
+                fd = io.getStdout().m_write;
+                if (fd <= 0) {
+                    fd = fd_null;
+                }
+                dup2(fd, STDOUT_FILENO);
+                fd = io.getStderr().m_write;
+                if (fd <= 0) {
+                    fd = fd_null;
+                }
+                dup2(fd, STDERR_FILENO);
+                // - run command
+                execl("/bin/sh", "sh", "-c", cmd.c_str(), NULL);
+                // - error handling if execl() failed (= returned)
+                std::cerr << cmd << ": execl() failed: " << strerror(errno);
+                exit(1);
+                break;
+            }
+            case -1:
+                // error handling in parent when fork() fails
+                SE_LOG_ERROR(NULL, NULL, "%s: fork() failed: %s",
+                             cmd.c_str(), strerror(errno));
+                break;
+            default:
+                // parent:
+                // - close write side so that we can detect "end of data"
+                if (io.getStdout().m_write >= 0) {
+                    close(io.getStdout().m_write);
+                }
+                if (io.getStderr().m_write >= 0) {
+                    close(io.getStderr().m_write);
+                }
+                // - read until no more data or error triggers exception
+                io.process();
+                // - wait for child, without caring about errors
+                waitpid(child, &ret, 0);
+                break;
+            }
+        }
+    } catch (...) {
+        Exception::handle();
+    }
+
+    return ret;
+}
+
 UUID::UUID()
 {
     static class InitSRand {
@@ -386,6 +488,10 @@ SyncMLStatus Exception::handle(SyncMLStatus *status, Logger *logger)
         new_status = SyncMLStatus(ex.result());
         SE_LOG_DEBUG(logger, NULL, "error code from Synthesis engine %s",
                      Status2String(new_status).c_str());
+    } catch (const StatusException &ex) {
+        new_status = ex.syncMLStatus();
+        SE_LOG_DEBUG(logger, NULL, "error code from SyncEvolution %s and exception thrown at %s:%d",
+                     Status2String(new_status).c_str(), ex.m_file.c_str(), ex.m_line);
     } catch (const Exception &ex) {
         SE_LOG_DEBUG(logger, NULL, "exception thrown at %s:%d",
                      ex.m_file.c_str(), ex.m_line);
@@ -494,4 +600,13 @@ ScopedEnvChange::~ScopedEnvChange()
     } 
 }
 
+std::string getCurrentTime()
+{
+    time_t seconds = time (NULL);
+    tm *data = localtime (&seconds);
+    arrayptr<char> buffer (new char [13]);
+    strftime (buffer.get(), 13, "%y%m%d%H%M%S", data);
+    return buffer.get();
+}
+
 SE_END_CXX
index 4953262..2302f60 100644 (file)
@@ -64,6 +64,13 @@ typedef map<string, string> StringMap;
  */
 string normalizePath(const string &path);
 
+/**
+ * convert relative path to canonicalized absolute path
+ * @param path will be turned into absolute path if possible, otherwise left unchanged
+ * @return true if conversion is successful, false otherwise(errno will be set)
+ */
+bool relToAbs(string &path);
+
 /** ensure that m_path is writable, otherwise throw error */
 void mkdir_p(const string &path);
 
@@ -107,6 +114,30 @@ bool isDir(const string &path);
  */
 bool ReadFile(const string &filename, string &content);
 
+enum ExecuteFlags {
+    EXECUTE_NO_STDERR = 1<<0,       /**< suppress stderr of command */
+    EXECUTE_NO_STDOUT = 1<<1        /**< suppress stdout of command */
+};
+
+/**
+ * system() replacement
+ *
+ * If called without output redirection active (see LogRedirect),
+ * then it will simply call system(). If output redirection is
+ * active, the command is executed in a forked process without
+ * blocking the parent process and the parent reads the output,
+ * passing it through LogRedirect for processing.
+ *
+ * This is necessary to capture all output reliably: LogRedirect
+ * ensures that we don't deadlock, but to achieve that, it drops
+ * data when the child prints too much of it.
+ *
+ * @param cmd      command including parameters, without output redirection
+ * @param flags    see ExecuteFlags
+ * @return same as in system(): use WEXITSTATUS() et.al. to decode it
+ */
+int Execute(const std::string &cmd, ExecuteFlags flags) throw();
+
 /**
  * Simple string hash function, derived from Dan Bernstein's algorithm.
  */
@@ -231,6 +262,24 @@ class Exception : public std::runtime_error
 };
 
 /**
+ * StatusException by wrapping a SyncML status
+ */
+class StatusException : public Exception
+{
+public:
+    StatusException(const std::string &file,
+                    int line,
+                    const std::string &what,
+                    SyncMLStatus status)
+        : Exception(file, line, what), m_status(status)
+    {}
+
+    SyncMLStatus syncMLStatus() const { return m_status; }
+protected:
+    SyncMLStatus m_status;
+};
+
+/**
  * replace ${} with environment variables, with
  * XDG_DATA_HOME, XDG_CACHE_HOME and XDG_CONFIG_HOME having their normal
  * defaults
@@ -262,6 +311,8 @@ class ScopedEnvChange
     bool m_oldvalset;
 };
 
+std::string getCurrentTime();
+
 /** throw a normal SyncEvolution Exception, including source information */
 #define SE_THROW(_what) \
     SE_THROW_EXCEPTION(Exception, _what)
@@ -270,5 +321,9 @@ class ScopedEnvChange
 #define SE_THROW_EXCEPTION(_class,  _what) \
     throw _class(__FILE__, __LINE__, _what)
 
+/** throw a class which accepts file, line, what parameters and status parameters*/
+#define SE_THROW_EXCEPTION_STATUS(_class,  _what, _status) \
+    throw _class(__FILE__, __LINE__, _what, _status)
+
 SE_END_CXX
 #endif // INCL_SYNCEVOLUTION_UTIL
index d7bc87a..2af50f2 100644 (file)
@@ -36,8 +36,27 @@ using namespace std;
 #include "CmdlineSyncClient.h"
 
 #include <dlfcn.h>
+#include <signal.h>
 
 #include <syncevo/declarations.h>
+
+#ifdef DBUS_SERVICE
+
+#include <gdbus-cxx-bridge.h>
+
+struct SourceStatus {
+    string m_mode;
+    string m_status;
+    uint32_t m_error;
+};
+template<> struct dbus_traits<SourceStatus> :
+public dbus_struct_traits<SourceStatus,
+       dbus_member<SourceStatus, string, &SourceStatus::m_mode,
+       dbus_member<SourceStatus, string, &SourceStatus::m_status,
+       dbus_member_single<SourceStatus, uint32_t, &SourceStatus::m_error> > > >
+{};
+#endif
+
 SE_BEGIN_CXX
 
 #if defined(ENABLE_MAEMO) && defined (ENABLE_EBOOK)
@@ -83,6 +102,348 @@ class KeyringSyncCmdline : public Cmdline {
     }
 };
 
+#ifdef DBUS_SERVICE
+class RemoteSession;
+typedef map<string, StringMap> Config_t;
+
+/**
+ * Act as a dbus server. All requests to dbus server
+ * are passed through this class.
+ */
+class RemoteDBusServer : public DBusRemoteObject
+{
+public:
+    RemoteDBusServer();
+
+    virtual const char *getDestination() const {return "org.syncevolution";}
+    virtual const char *getPath() const {return "/org/syncevolution/Server";}
+    virtual const char *getInterface() const {return "org.syncevolution.Server";}
+    virtual DBusConnection *getConnection() const {return m_conn.get();}
+    GMainLoop *getLoop() { return m_loop; }
+
+    /** 
+     * Check whether the server is started and can be attached.
+     * Printing an error message is optional, some callers might
+     * prefer a different kind of error handling.
+     */
+    bool checkStarted(bool printError = true);
+
+    /**
+     * execute arguments from command line
+     * @param args the arguments of command line
+     * @param config the config name parsed from arguments if has
+     * @param runSync arguments to run a sync
+     * @return true if successfully
+     */
+    bool execute(const vector<string> &args, const string &config, bool runSync);
+
+    /**
+     * To implement the feature of '--monitor' option, monitor a
+     * given config if there is a session running.
+     * If config is empty, then peak a running session to monitor.
+     * @param config the config name parsed from arguments if has
+     * @return true if successfully
+     */ 
+    bool monitor(const string &config);
+
+    /**
+     * To implement the feature of '--status' without a server.
+     * get and print all running sessions in the dbus server
+     */
+    bool runningSessions();
+
+    /** whether the dbus call(s) has/have completed */
+    bool done() { return m_replyTotal == m_replyCounter; }
+
+    /** one reply returns. Increase reply counter. */
+    void replyInc();
+
+    /** set whether there is an error */
+    void setResult(bool result) { m_result = result; }
+
+    /** call 'Server.InfoResponse' */
+    void infoResponse(const string &id, const string &state, const StringMap &resp);
+
+private:
+    /** call 'Attach' until it returns */
+    void attachSync();
+
+    /** 
+     * callback of 'Server.Attach'
+     * also set up a watch and add watch callback when the daemon is gone
+     */
+    void attachCb(const boost::shared_ptr<Watch> &watch, const string &error);
+
+    /** callback of 'Server.GetSessions' */
+    void getSessionsCb(const vector<string> &sessions, const string &error);
+
+    /** callback of 'Server.SessionChanged' */
+    void sessionChangedCb(const DBusObject_t &object, bool active);
+
+    /** callback of 'Server.LogOutput' */
+    void logOutputCb(const DBusObject_t &object, const string &level, const string &log);
+
+    /** callback of 'Server.InfoRequest' */
+    void infoReqCb(const string &,
+                   const DBusObject_t &,
+                   const string &,
+                   const string &,
+                   const string &,
+                   const StringMap &);
+
+    /** callback of Server.InfoResponse */
+    void infoResponseCb(const string &error);
+
+    /** callback of calling 'Server.StartSession' */
+    void startSessionCb(const DBusObject_t &session, const string &error);
+
+    /** update active session vector according to 'SessionChanged' signal */
+    void updateSessions(const string &session, bool active);
+
+    /** check m_session is active */
+    bool isActive();
+
+    /** get all running sessions. Used internally. */
+    void getRunningSessions();
+
+    /** called when daemon has gone */
+    void daemonGone();
+
+    /** set the total number of replies we must wait */
+    void resetReplies(int total = 1) 
+    { 
+        m_replyTotal = total;
+        m_replyCounter = 0; 
+    }
+
+    /** signal handler for 'CTRL-C' */
+    static void handleSignal(int sig);
+
+    // session used for signal handler, 
+    // used to call 'suspend' and 'abort'
+    static boost::weak_ptr<RemoteSession> g_session;
+
+    // the main loop
+    GMainLoop *m_loop;
+    // connection
+    DBusConnectionPtr m_conn;
+    // whether client can attach to the daemon. 
+    // It is also used to indicate whether daemon is ready to use.
+    bool m_attached;
+    // error flag
+    bool m_result;
+    // config name
+    string m_configName;
+    // active session object path
+    boost::shared_ptr<string> m_activeSession;
+    // session created or monitored
+    boost::shared_ptr<RemoteSession> m_session;
+    // active sessions after listening to 'SessionChanged' signals
+    vector<string> m_activeSessions;
+    // all sessions in dbus server
+    vector<boost::shared_ptr<RemoteSession> >  m_sessions;
+    // the number of total dbus calls  
+    unsigned int m_replyTotal;
+    // the number of returned dbus calls 
+    unsigned int m_replyCounter;
+    // sessions which are running
+    vector<boost::weak_ptr<RemoteSession> > m_runSessions;
+    // listen to dbus server signal 'SessionChanged'
+    SignalWatch2<DBusObject_t, bool> m_sessionChanged;
+    // listen to dbus server signal 'LogOutput'
+    SignalWatch3<DBusObject_t, string, string> m_logOutput;
+    // listen to dbus server signal 'InfoRequest'
+    SignalWatch6<string, 
+                 DBusObject_t,
+                 string,
+                 string,
+                 string,
+                 StringMap > m_infoReq; 
+
+    /** watch daemon whether it is gone */
+    boost::shared_ptr<Watch> m_daemonWatch;
+};
+
+/**
+ * Act as a session. All requests to a session are passed
+ * through this class.
+ */
+class RemoteSession : public DBusRemoteObject
+{
+public:
+    RemoteSession(RemoteDBusServer &server, const std::string &path);
+    virtual const char *getDestination() const {return "org.syncevolution";}
+    virtual const char *getPath() const {return m_path.c_str();}
+    virtual const char *getInterface() const {return "org.syncevolution.Session";}
+    virtual DBusConnection *getConnection() const {return m_server.getConnection();}
+    RemoteDBusServer &getServer() { return m_server; }
+
+    /**
+     * call 'Execute' method of 'Session' in dbus server
+     * without waiting for return
+     */
+    void executeAsync(const vector<string> &args);
+
+    /**
+     * call 'GetStatus' method of 'Session' in dbus server
+     * without waiting for return
+     */
+    void getStatusAsync();
+
+    /**
+     * call 'Suspend' method of 'Session' in dbus server
+     * without waiting for return
+     */
+    void suspendAsync();
+
+    /**
+     * call 'Abort' method of 'Session' in dbus server
+     * without waiting for return
+     */
+    void abortAsync();
+
+    /**
+     * call 'GetConfig' method of 'Session' in dbus server
+     * without waiting for return
+     */
+    void getConfigAsync();
+
+    /** get config name of this session */
+    string configName() { return m_configName; }
+
+    /** status 'done' is sent by session */
+    bool statusDone() { return boost::iequals(m_status, "done"); }
+
+    /** get current status */
+    string status() { return m_status; }
+
+    /** set the flag to indicate the session is running sync */
+    void setRunSync(bool runSync) { m_runSync = runSync; }
+
+    /** monitor status of the sesion until it is done */
+    void monitorSync();
+
+    /** pass through logoutput and print them if m_output is true */
+    void logOutput(Logger::Level level, const string &log);
+
+    /** set whether to print output */
+    void setOutput(bool output) { m_output = output; }
+
+    /** process signals from daemon */
+    void infoReq(const string &id,
+                 const DBusObject_t &session,
+                 const string &state,
+                 const string &handler,
+                 const string &type,
+                 const StringMap &params);
+
+    /** remove InfoReq objects from map */
+    void removeInfoReq(const string &id);
+
+    typedef std::map<std::string, SourceStatus> SourceStatuses_t;
+
+private:
+    /**
+     * InfoReq to handle info requests from daemon and
+     * call 'Server.InfoResponse' to send its response
+     */
+    class InfoReq
+    {
+        /** the session reference */
+        RemoteSession &m_session;
+        /** the id of InfoRequest */
+        string m_id;
+        /** the type of InfoRequest */
+        string m_type;
+        /** the response map sent to the daemon*/
+        StringMap m_resp;
+
+        /** InfoRequest state */
+        enum State {
+            INIT, // init
+            WORKING, //'working'
+            RESPONSE, // 'response'
+            DONE // 'done'
+        };
+        /** the current state of InfoRequest */
+        State m_state;
+    public:
+        InfoReq(RemoteSession &session, const string &id, const string &type);
+
+        /**
+         * process the info request dispatched by session
+         */
+        void process(const string &id,
+                     const DBusObject_t &session,
+                     const string &state,
+                     const string &handler,
+                     const string &type,
+                     const StringMap &params);
+    };
+
+    /** callback of calling 'Session.Execute' */
+    void executeCb(const string &error);
+
+    /** callback of 'Session.GetStatus' */
+    void getStatusCb(const string &status,
+                     uint32_t errorCode,
+                     const SourceStatuses_t &sourceStatus,
+                     const string &error);
+
+    /** callback of 'Session.GetConfig' */
+    void getConfigCb(const Config_t &config, const string &error);
+
+    /** callback of 'Session.StatusChanged' */
+    void statusChangedCb(const string &status,
+                         uint32_t errorCode,
+                         const SourceStatuses_t &sourceStatus);
+
+    /** callback of 'Session.Suspend' */
+    void suspendCb(const string &);
+
+    /** callback of 'Session.Abort' */
+    void abortCb(const string &);
+
+    /**
+     * implement requirements from info req. Called by InfoReq.
+     */
+    void handleInfoReq(const string &type, const StringMap &params, StringMap &resp);
+
+    /** dbus server */
+    RemoteDBusServer &m_server;
+
+    /* whether to log output */
+    bool m_output;
+
+    /** object path */
+    string m_path;
+
+    /** config name of the session */
+    string m_configName;
+
+    /** current status */
+    string m_status;
+    
+    /** session is running sync */
+    bool m_runSync;
+
+    /** signal watch 'StatusChanged' */
+    SignalWatch3<std::string, uint32_t, SourceStatuses_t> m_statusChanged;
+
+    /** InfoReq map. store all infoReq belongs to this session */
+    map<string, boost::shared_ptr<InfoReq> > m_infoReqs;
+};
+
+/**
+ * Get current known environment variables, which might be used
+ * in executing command line arguments. This is only necessary
+ * when using dbus daemon.
+ * @param vars the returned environment variables
+ */
+static void getEnvVars(map<string, string> &vars);
+
+#endif
+
 extern "C"
 int main( int argc, char **argv )
 {
@@ -108,6 +469,7 @@ int main( int argc, char **argv )
     // this is required when using glib directly or indirectly
     g_type_init();
     g_thread_init(NULL);
+    g_set_prgname("syncevolution");
 #endif
 
     setvbuf(stderr, NULL, _IONBF, 0);
@@ -130,20 +492,93 @@ int main( int argc, char **argv )
     free(exe);
 
     try {
-        EDSAbiWrapperInit();
-
         /*
          * don't log errors to cerr: LogRedirect cannot distinguish
          * between our valid error messages and noise from other
          * libs, therefore it would get suppressed (logged at
          * level DEVELOPER, while output is at most INFO)
          */
-        KeyringSyncCmdline cmdline(argc, argv, cout, cout);
-        if (cmdline.parse() &&
-            cmdline.run()) {
+        KeyringSyncCmdline cmdline(argc, argv, std::cout, std::cout);
+        vector<string> parsedArgs;
+        if(!cmdline.parse(parsedArgs)) {
+            return 1;
+        }
+
+        if (cmdline.dontRun()) {
             return 0;
-        } else {
+        }
+
+        Cmdline::Bool useDaemon = cmdline.useDaemon();
+
+        if(cmdline.monitor()) {
+
+#ifdef DBUS_SERVICE
+            // monitor a session
+            RemoteDBusServer server;
+            if(server.checkStarted() && server.monitor(cmdline.getConfigName())) {
+                return 0;
+            }
+            return 1;
+#else
+            SE_LOG_ERROR(NULL, NULL, "this syncevolution binary was compiled without support for monitoring a background sync");
             return 1;
+#endif
+        } else if(cmdline.status() && 
+                  cmdline.getConfigName().empty()) {
+
+#ifdef DBUS_SERVICE
+            // '--status' and no server name, try to get running sessions 
+            RemoteDBusServer server;
+            if(server.checkStarted() && server.runningSessions()) {
+                return 0;
+            }
+            return 1;
+#else
+            SE_LOG_SHOW(NULL, NULL, "this syncevolution binary was compiled without support for monitoring a background sync");
+            return 1;
+#endif
+        } else if (useDaemon ||
+                   !useDaemon.wasSet()) {
+#ifdef DBUS_SERVICE
+            RemoteDBusServer server;
+
+            // Running execute() without the server available will print errors.
+            // Avoid that unless the user explicitly asked for the daemon.
+            bool result = server.checkStarted(false);
+            if (useDaemon.wasSet() || result) {
+                return !server.execute(parsedArgs, cmdline.getConfigName(), cmdline.isSync());
+            } else {
+                // User didn't select --use-daemon and thus doesn't need to know about it
+                // not being available.
+                // SE_LOG_SHOW(NULL, NULL, "WARNING: cannot run syncevolution as daemon. "
+                //             "Trying to run it without daemon.");
+            }
+#else
+            if (useDaemon.wasSet()) {
+                SE_LOG_SHOW(NULL, NULL, "ERROR: this syncevolution binary was compiled without support of daemon. "
+                            "Either run syncevolution with '--use-daemon=no' or without that option."); 
+                return 1;
+            }
+#endif
+        } 
+
+        // if forcing not using daemon or trying to use daemon with failures,
+        // run arguments in the process
+        if (!useDaemon.wasSet() ||
+            !useDaemon) {
+            EDSAbiWrapperInit();
+
+            /*
+             * don't log errors to cerr: LogRedirect cannot distinguish
+             * between our valid error messages and noise from other
+             * libs, therefore it would get suppressed (logged at
+             * level DEVELOPER, while output is at most INFO)
+             */
+            if (cmdline.run()) {
+                return 0;
+            } else {
+                return 1;
+            }
         }
     } catch ( const std::exception &ex ) {
         SE_LOG_ERROR(NULL, NULL, "%s", ex.what());
@@ -154,4 +589,676 @@ int main( int argc, char **argv )
     return 1;
 }
 
+#ifdef DBUS_SERVICE
+/********************** RemoteDBusServer implementation **************************/
+RemoteDBusServer::RemoteDBusServer()
+    :m_attached(false), m_result(true),
+     m_replyTotal(0), m_replyCounter(0),
+     m_sessionChanged(*this,"SessionChanged"),
+     m_logOutput(*this, "LogOutput"),
+     m_infoReq(*this, "InfoRequest")
+{
+    m_loop = g_main_loop_new (NULL, FALSE);
+    m_conn = g_dbus_setup_bus(DBUS_BUS_SESSION, NULL, true, NULL);
+
+    if(m_conn) {
+        //check whether we can attach to the daemon
+        //also set up the daemon watch when attaching to server
+        attachSync();
+        if(m_attached) {
+            m_sessionChanged.activate(boost::bind(&RemoteDBusServer::sessionChangedCb, this, _1, _2));
+            m_logOutput.activate(boost::bind(&RemoteDBusServer::logOutputCb, this, _1, _2, _3));
+            m_infoReq.activate(boost::bind(&RemoteDBusServer::infoReqCb, this, _1, _2, _3, _4, _5, _6));
+        }
+    }
+}
+
+bool RemoteDBusServer::checkStarted(bool printError)
+{
+    if(!m_attached) {
+        if (printError) {
+            SE_LOG_ERROR(NULL, NULL, "SyncEvolution D-Bus server not available.");
+        }
+        return false;
+    }
+    return true;
+}
+
+void RemoteDBusServer::attachSync()
+{
+    resetReplies();
+    DBusClientCall1<boost::shared_ptr<Watch> > attach(*this, "Attach");
+    attach(boost::bind(&RemoteDBusServer::attachCb, this, _1, _2));
+    while(!done()) {
+        g_main_loop_run(m_loop);
+    }
+}
+
+void RemoteDBusServer::attachCb(const boost::shared_ptr<Watch> &watch, const string &error)
+{
+    replyInc();
+    if(error.empty()) {
+        // don't print error information, leave it to caller
+        m_attached = true;
+        //if attach is successful, watch server whether it is gone
+        m_daemonWatch = watch;
+        m_daemonWatch->setCallback(boost::bind(&RemoteDBusServer::daemonGone,this));
+    }
+}
+
+void RemoteDBusServer::logOutputCb(const DBusObject_t &object,
+                                   const string &level,
+                                   const string &log)
+{
+    if (m_session && 
+        (boost::equals(object, getPath()) ||
+         boost::equals(object, m_session->getPath()))) {
+        m_session->logOutput(Logger::strToLevel(level.c_str()), log);
+    }
+}
+
+void RemoteDBusServer::infoReqCb(const string &id,
+                                 const DBusObject_t &session,
+                                 const string &state,
+                                 const string &handler,
+                                 const string &type,
+                                 const StringMap &params)
+{
+    // if m_session is null, just ignore
+    if(m_session) {
+        m_session->infoReq(id, session, state, handler, type, params);
+    }
+}
+
+void RemoteDBusServer::infoResponse(const string &id,
+                                    const string &state,
+                                    const StringMap &resp)
+{
+    //call Server.InfoResponse
+    DBusClientCall0 call(*this, "InfoResponse");
+    call(id, state, resp, boost::bind(&RemoteDBusServer::infoResponseCb, this, _1));
+}
+
+void RemoteDBusServer::infoResponseCb(const string &error)
+{
+    replyInc();
+    if(!error.empty()) {
+        SE_LOG_ERROR(NULL, NULL, "information response failed.");
+        m_result = false;
+    }
+    g_main_loop_quit(m_loop);
+}
+
+void RemoteDBusServer::sessionChangedCb(const DBusObject_t &object, bool active)
+{
+    // update active sessions if needed
+    updateSessions(object, active);
+    g_main_loop_quit(m_loop);
+}
+
+void RemoteDBusServer::daemonGone()
+{
+    //print error info and exit
+    SE_LOG_ERROR(NULL, NULL, "Background sync daemon has gone.");
+    exit(1);
+}
+
+/**
+ * Don't hang onto a shared_ptr here!
+ *
+ * RemoteSessions contain a reference to the
+ * RemoteDBusServer which created them. Once that
+ * server destructs, all sessions must have been
+ * deleted earlier, otherwise they'll call a destructed
+ * object.
+ */
+boost::weak_ptr<RemoteSession> RemoteDBusServer::g_session;
+void RemoteDBusServer::handleSignal(int sig)
+{
+    SyncContext::handleSignal(sig);
+    boost::shared_ptr<RemoteSession> session = g_session.lock();
+    if (session) {
+        const SuspendFlags &flags = SyncContext::getSuspendFlags(); 
+        if(flags.state == SuspendFlags::CLIENT_SUSPEND) {
+            session->suspendAsync();
+        } else if(flags.state == SuspendFlags::CLIENT_ABORT) {
+            session->abortAsync();
+        }
+    }
+}
+
+bool RemoteDBusServer::execute(const vector<string> &args, const string &peer, bool runSync)
+{
+    //the basic workflow is:
+    //1) start a session 
+    //2) waiting for the session becomes active
+    //3) execute 'arguments' once it is active
+
+    // start a new session
+    DBusClientCall1<DBusObject_t> call(*this, "StartSession");
+    call(peer, boost::bind(&RemoteDBusServer::startSessionCb, this, _1, _2));
+
+    // wait until 'StartSession' returns
+    resetReplies();
+    while(!done()) {
+        g_main_loop_run(m_loop);
+    }
+
+    if(m_session) {
+        m_session->setRunSync(true);
+
+        //if session is not active, just wait
+        while(!isActive()) {
+            g_main_loop_run(m_loop);
+        }
+        // Logger::Level level = LoggerBase::instance().getLevel();
+        // LoggerBase::instance().setLevel(Logger::DEBUG);
+        resetReplies();
+        m_session->executeAsync(args);
+
+        while(!done()) {
+            g_main_loop_run(m_loop);
+        }
+
+        //if encoutering errors, return
+        if(!m_result) {
+            return m_result;
+        }
+
+        //g_session is used to pass 'abort' or 'suspend' commands
+        //make sure session is ready to run
+        g_session = m_session;
+
+        //set up signal handlers to send 'suspend' or 'abort' to dbus server
+        //only do this once session is executing and can suspend and abort
+        struct sigaction new_action, old_action;
+        struct sigaction old_term_action;
+
+        if(runSync) {
+            memset(&new_action, 0, sizeof(new_action));
+            new_action.sa_handler = handleSignal;
+            sigemptyset(&new_action.sa_mask);
+            sigaction(SIGINT, NULL, &old_action);
+            if (old_action.sa_handler == SIG_DFL) {
+                sigaction(SIGINT, &new_action, NULL);
+            }
+
+            sigaction(SIGTERM, NULL, &old_term_action);
+            if (old_term_action.sa_handler == SIG_DFL) {
+                sigaction(SIGTERM, &new_action, NULL);
+            }   
+        }
+
+        //wait until status is 'done'
+        while(!m_session->statusDone()) {
+            g_main_loop_run(m_loop);
+        }
+
+        if(runSync) {
+            sigaction (SIGINT, &old_action, NULL);
+            sigaction (SIGTERM, &old_term_action, NULL);
+        }
+
+        //reset session
+        g_session.reset();
+        //restore logging level
+        // LoggerBase::instance().setLevel(level);
+        m_session->setRunSync(false);
+    }
+    return m_result;
+}
+
+void RemoteDBusServer::startSessionCb(const DBusObject_t &sessionPath, const string &error)
+{
+    replyInc();
+    if(!error.empty()) {
+        SE_LOG_ERROR(NULL, NULL, "starting D-Bus session failed: %s", error.c_str());
+        m_result = false;
+        g_main_loop_quit(m_loop);
+        return;
+    }
+    m_session.reset(new RemoteSession(*this, sessionPath));
+    g_main_loop_quit(m_loop);
+}
+
+bool RemoteDBusServer::isActive()
+{
+    /** if current session is active and then start to call 'Execute' method */
+    if(m_session) {
+        BOOST_FOREACH(const string &session, m_activeSessions) {
+            if(boost::equals(m_session->getPath(), session.c_str())) {
+                return true;
+            }
+        }
+    }
+    return false;
+}
+
+void RemoteDBusServer::getRunningSessions()
+{
+    //get all sessions
+    DBusClientCall1<vector<string> > sessions(*this, "GetSessions");
+    sessions(boost::bind(&RemoteDBusServer::getSessionsCb, this, _1, _2));
+    resetReplies();
+    while(!done()) {
+        g_main_loop_run(m_loop);
+    }
+
+    // get status of each session
+    resetReplies(m_sessions.size());
+    BOOST_FOREACH(boost::shared_ptr<RemoteSession> &session, m_sessions) {
+        session->getStatusAsync();
+    }
+
+    // waiting for all sessions 'GetStatus'
+    while(!done()) {
+        g_main_loop_run(m_loop);
+    }
+
+    // collect running sessions
+    BOOST_FOREACH(boost::shared_ptr<RemoteSession> &session, m_sessions) {
+        if(boost::istarts_with(session->status(), "running")) {
+            m_runSessions.push_back(boost::weak_ptr<RemoteSession>(session));
+        }
+    }
+}
+
+bool RemoteDBusServer::runningSessions()
+{
+    //the basic working flow is:
+    //1) get all sessions
+    //2) check each session and collect running sessions
+    //3) get config name of running sessions and print them
+    getRunningSessions();
+
+    if(m_runSessions.empty()) {
+        SE_LOG_SHOW(NULL, NULL, "Background sync daemon is idle.");
+    } else {
+        SE_LOG_SHOW(NULL, NULL, "Running session(s): ");
+
+        resetReplies(m_runSessions.size());
+        BOOST_FOREACH(boost::weak_ptr<RemoteSession> &session, m_runSessions) {
+            boost::shared_ptr<RemoteSession> lock = session.lock();
+            if(lock) {
+                lock->getConfigAsync();
+            }
+        }
+
+        //wait for 'GetConfig' returns
+        while(!done()) {
+            g_main_loop_run(m_loop);
+        }
+
+        // print all running sessions
+        BOOST_FOREACH(boost::weak_ptr<RemoteSession> &session, m_runSessions) {
+            boost::shared_ptr<RemoteSession> lock = session.lock();
+            if(!lock->configName().empty()) {
+                SE_LOG_SHOW(NULL, NULL, "   %s (%s)", lock->configName().c_str(), lock->getPath());
+            }
+        }
+    }
+    return m_result;
+}
+
+void RemoteDBusServer::getSessionsCb(const vector<string> &sessions, const string &error)
+{
+    replyInc();
+    if(!error.empty()) {
+        SE_LOG_ERROR(NULL, NULL, "getting session failed: %s", error.c_str());
+        m_result = false;
+        g_main_loop_quit(m_loop);
+        return;
+    }
+
+    //create local objects for sessions
+    BOOST_FOREACH(const DBusObject_t &value, sessions) {
+        boost::shared_ptr<RemoteSession> session(new RemoteSession(*this, value));
+        m_sessions.push_back(session);
+    }
+}
+
+void RemoteDBusServer::updateSessions(const string &session, bool active)
+{
+    if(active) {
+        //add it into active list
+        m_activeSessions.push_back(session);
+    } else {
+        //if inactive, remove it from active list
+        for(vector<string>::iterator it = m_activeSessions.begin();
+                it != m_activeSessions.end(); ++it) {
+            if(boost::equals(session, *it)) {
+                m_activeSessions.erase(it);
+                break;
+            }
+        }
+    }
+}
+
+void RemoteDBusServer::replyInc()
+{
+    // increase counter and check whether all replies are returned
+    m_replyCounter++;
+    if(done()) {
+        g_main_loop_quit(m_loop);
+    }
+}
+
+bool RemoteDBusServer::monitor(const string &peer)
+{
+    //the basic working flow is:
+    //1) get all sessions
+    //2) check each session and collect running sessions
+    //3) peak one session with the given peer and monitor it
+    getRunningSessions();
+    if(peer.empty()) {
+        //peak the first running sessions
+        BOOST_FOREACH(boost::weak_ptr<RemoteSession> &session, m_runSessions) {
+            boost::shared_ptr<RemoteSession> lock = session.lock();
+            if(lock) {
+                m_session = lock;
+                resetReplies();
+                m_session->getConfigAsync();
+                while(!done()) {
+                    g_main_loop_run(m_loop);
+                }
+                m_session->monitorSync();
+                return m_result;
+            }
+        }
+        //if no running session
+        SE_LOG_SHOW(NULL, NULL, "Background sync daemon is idle, no session available to be be monitored.");
+    } else {
+        string peerNorm = SyncConfig::normalizeConfigString(peer);
+
+        // get config names of running sessions
+        resetReplies(m_runSessions.size());
+        BOOST_FOREACH(boost::weak_ptr<RemoteSession> &session, m_runSessions) {
+            boost::shared_ptr<RemoteSession> lock = session.lock();
+            lock->getConfigAsync();
+        }
+        //wait for 'GetConfig' returns
+        while(!done()) {
+            g_main_loop_run(m_loop);
+        }
+
+        //find a session with the given name
+        vector<boost::shared_ptr<RemoteSession> >::iterator it = m_sessions.begin();
+        while(it != m_sessions.end()) {
+            string tempNorm = (*it)->configName();
+            if (peerNorm == tempNorm) {
+                m_session = *it;
+                //monitor the session status
+                m_session->monitorSync();
+                return m_result;
+            }
+            it++;
+        }
+        SE_LOG_SHOW(NULL, NULL, "'%s' is not running.", peer.c_str());
+    }
+    return m_result;
+}
+
+
+/********************** RemoteSession implementation **************************/
+RemoteSession::RemoteSession(RemoteDBusServer &server,
+        const string &path)
+    :m_server(server), m_output(false), m_path(path), m_runSync(false),
+    m_statusChanged(*this, "StatusChanged")
+{
+    m_statusChanged.activate(boost::bind(&RemoteSession::statusChangedCb, this, _1, _2, _3));
+}
+
+void RemoteSession::executeAsync(const vector<string> &args)
+{
+    //start to print outputs
+    m_output = true;
+    map<string, string> vars;
+    getEnvVars(vars);
+    DBusClientCall0 call(*this, "Execute");
+    call(args, vars, boost::bind(&RemoteSession::executeCb, this, _1));
+}
+
+void RemoteSession::executeCb(const string &error)
+{
+    m_server.replyInc();
+    if(!error.empty()) {
+        SE_LOG_ERROR(NULL, NULL, "running the command line inside the D-Bus server failed");
+        m_server.setResult(false);
+        //end to print outputs
+        m_output = false;
+        return;
+    }
+}
+
+void RemoteSession::statusChangedCb(const string &status,
+        uint32_t errorCode,
+        const SourceStatuses_t &sourceStatus)
+{
+    m_status = status;
+
+    if (errorCode) {
+        m_server.setResult(false);
+        g_main_loop_quit(m_server.getLoop());
+    }
+
+    if(status == "done") {
+        //if session is done, quit the loop
+        g_main_loop_quit(m_server.getLoop());
+        m_output = false;
+    }
+}
+
+void RemoteSession::getStatusAsync()
+{
+    DBusClientCall3<string, uint32_t, SourceStatuses_t> call(*this, "GetStatus");
+    call(boost::bind(&RemoteSession::getStatusCb, this, _1, _2, _3, _4));
+}
+
+void RemoteSession::getStatusCb(const string &status,
+        uint32_t errorCode,
+        const SourceStatuses_t &sourceStatus,
+        const string &error)
+{
+    m_server.replyInc();
+    if(!error.empty()) {
+        //ignore the error
+        return;
+    }
+    m_status = status;
+}
+
+void RemoteSession::getConfigAsync()
+{
+    DBusClientCall1<Config_t> call(*this, "GetConfig");
+    call(false, boost::bind(&RemoteSession::getConfigCb, this, _1, _2));
+}
+
+void RemoteSession::getConfigCb(const Config_t &config, const string &error)
+{
+    m_server.replyInc();
+    if(!error.empty()) {
+        //ignore the error
+        return;
+    }
+    // set config name
+    Config_t::const_iterator it = config.find("");
+    if(it != config.end()) {
+        StringMap global = it->second;
+        StringMap::iterator git = global.find("configName");
+        if(git != global.end()) {
+            m_configName = git->second;
+        }
+    }
+}
+
+void RemoteSession::suspendAsync()
+{
+    DBusClientCall0 suspend(*this, "Suspend");
+    suspend(boost::bind(&RemoteSession::suspendCb, this, _1));
+}
+
+void RemoteSession::suspendCb(const string &error)
+{
+    //avoid logging messages in handleSignal
+    SyncContext::printSignals();
+    if(!error.empty()) {
+        m_server.setResult(false);
+    }
+}
+
+void RemoteSession::abortCb(const string &error)
+{
+    //avoid logging messages in handleSignal
+    SyncContext::printSignals();
+    if(!error.empty()) {
+        m_server.setResult(false);
+    }
+}
+
+void RemoteSession::abortAsync()
+{
+    DBusClientCall0 abort(*this, "Abort");
+    abort(boost::bind(&RemoteSession::abortCb, this, _1));
+}
+
+void RemoteSession::logOutput(Logger::Level level, const string &log)
+{
+    if(m_output) {
+        SE_LOG(level, NULL, NULL, "%s", log.c_str());
+    }
+}
+
+void RemoteSession::monitorSync()
+{
+    m_output = true;
+    // Logger::Level level = LoggerBase::instance().getLevel();
+    // LoggerBase::instance().setLevel(Logger::DEBUG);
+    SE_LOG(Logger::SHOW, NULL, NULL, "Monitoring '%s' (%s)\n", m_configName.c_str(), getPath());
+
+    while(!statusDone()) {
+        g_main_loop_run(m_server.getLoop());
+    }
+
+    SE_LOG(Logger::SHOW, NULL, NULL, "Monitoring done");
+    // LoggerBase::instance().setLevel(level);
+    m_output = false;
+}
+
+void RemoteSession::infoReq(const string &id,
+                            const DBusObject_t &session,
+                            const string &state,
+                            const string &handler,
+                            const string &type,
+                            const StringMap &params)
+{
+    //if command line runs a sync, then try to handle req
+    if (m_runSync && boost::iequals(session, getPath())) {
+        //only handle password now
+        if (boost::iequals("password", type)) {
+            map<string, boost::shared_ptr<InfoReq> >::iterator it = m_infoReqs.find(id);
+            if (it != m_infoReqs.end()) {
+                it->second->process(id, session, state, handler, type, params);
+            } else {
+                boost::shared_ptr<InfoReq> passwd(new InfoReq(*this, id, type));
+                m_infoReqs[id] = passwd;
+                passwd->process(id, session, state, handler, type, params);
+            }
+        } 
+    }
+}
+
+void RemoteSession::handleInfoReq(const string &type, const StringMap &params, StringMap &resp)
+{
+    if (boost::iequals(type, "password")) {
+        char buffer[256];
+
+        string descr;
+        StringMap::const_iterator it = params.find("description");
+        if (it != params.end()) {
+            descr = it->second;
+        }
+        printf("Enter password for %s: ", descr.c_str());
+        fflush(stdout);
+        if (fgets(buffer, sizeof(buffer), stdin) &&
+                strcmp(buffer, "\n")) {
+            size_t len = strlen(buffer);
+            if (len && buffer[len - 1] == '\n') {
+                buffer[len - 1] = 0;
+            }
+            resp["password"] = string(buffer);
+        } else {
+            SE_LOG_ERROR(NULL, NULL, "could not read password for %s", descr.c_str());
+        }
+    }
+}
+
+void RemoteSession::removeInfoReq(const string &id) 
+{
+    map<string, boost::shared_ptr<InfoReq> >::iterator it = m_infoReqs.find(id);
+    if (it != m_infoReqs.end()) {
+        m_infoReqs.erase(it);
+    }
+}
+
+/********************** InfoReq implementation **************************/
+RemoteSession::InfoReq::InfoReq(RemoteSession &session,
+                                const string &id,
+                                const string &type)
+    :m_session(session), m_id(id), m_type(type), m_state(INIT)
+{
+}
+
+void RemoteSession::InfoReq::process(const string &id,
+                                     const DBusObject_t &session,
+                                     const string &state,
+                                     const string &handler,
+                                     const string &type,
+                                     const StringMap &params)
+{
+    //only handle info belongs to this InfoReq
+    if (boost::equals(m_id, id)) {
+        //check the state and response if necessary
+        if (m_state == INIT && boost::iequals("request", state)) {
+            m_session.getServer().infoResponse(m_id, "working", StringMap());
+            m_state = WORKING;
+            m_session.handleInfoReq(type, params, m_resp);
+        } else if ((m_state == WORKING) && boost::iequals("waiting", state)) {
+            m_session.getServer().infoResponse(m_id, "response", m_resp);
+            m_state = RESPONSE;
+        } else if (boost::iequals("done", state)) {
+            //if request is 'done', remove it
+            m_session.removeInfoReq(m_id);
+        }
+    }
+}
+
+void getEnvVars(map<string, string> &vars)
+{
+    //environment variables used to run command line
+    static const char *varNames[] = {
+        "http_proxy",
+        "HOME",
+        "PATH",
+        "SYNCEVOLUTION_BACKEND_DIR",
+        "SYNCEVOLUTION_DEBUG",
+        "SYNCEVOLUTION_GNUTLS_DEBUG",
+        "SYNCEVOLUTION_TEMPLATE_DIR",
+        "SYNCEVOLUTION_XML_CONFIG_DIR",
+        "SYNC_EVOLUTION_EVO_CALENDAR_DELAY",
+        "XDG_CACHE_HOME",
+        "XDG_CONFIG_HOME",
+        "XDG_DATA_HOME"
+    };
+
+    for (unsigned int i = 0; i < sizeof(varNames) / sizeof(const char*); i++) {
+        const char *value;
+        //get values of environment variables if they are set
+        if ((value = getenv(varNames[i])) != NULL) {
+            vars.insert(make_pair(varNames[i], value));
+        }
+    }
+}
+
+#endif
+
 SE_END_CXX
diff --git a/src/synthesis-includes/Makefile.am b/src/synthesis-includes/Makefile.am
new file mode 100644 (file)
index 0000000..6e180be
--- /dev/null
@@ -0,0 +1,9 @@
+# The only purpose of this Makefile is to build
+# the synthesis header files if
+# a) the Synthesis source is bundled with SyncEvolution and
+# b) the core engine (which includes Synthesis) is disabled
+#
+# The GTK GUI needs some of the headers (syerror.h).
+
+all:
+       cd $(SYNTHESIS_SUBDIR)/src && $(MAKE) synthesis/syerror.h synthesis/generic_types.h
diff --git a/src/synthesis-includes/Makefile.in b/src/synthesis-includes/Makefile.in
new file mode 100644 (file)
index 0000000..d9295a4
--- /dev/null
@@ -0,0 +1,447 @@
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# The only purpose of this Makefile is to build
+# the synthesis header files if
+# a) the Synthesis source is bundled with SyncEvolution and
+# b) the core engine (which includes Synthesis) is disabled
+#
+# The GTK GUI needs some of the headers (syerror.h).
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = src/synthesis-includes
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4-repo/ax_boost_base.m4 \
+       $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ADDRESSBOOK_CFLAGS = @ADDRESSBOOK_CFLAGS@
+ADDRESSBOOK_LIBS = @ADDRESSBOOK_LIBS@
+ALL_LINGUAS = @ALL_LINGUAS@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BACKEND_CPPFLAGS = @BACKEND_CPPFLAGS@
+BACKEND_DEFINES = @BACKEND_DEFINES@
+BLUEZ_CFLAGS = @BLUEZ_CFLAGS@
+BLUEZ_LIBS = @BLUEZ_LIBS@
+BOOST_CPPFLAGS = @BOOST_CPPFLAGS@
+BOOST_LDFLAGS = @BOOST_LDFLAGS@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CORE_LDADD_DEP = @CORE_LDADD_DEP@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CPPUNIT_CXXFLAGS = @CPPUNIT_CXXFLAGS@
+CPPUNIT_LDFLAGS = @CPPUNIT_LDFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DBUS_BINDING_TOOL = @DBUS_BINDING_TOOL@
+DBUS_CFLAGS = @DBUS_CFLAGS@
+DBUS_GLIB_CFLAGS = @DBUS_GLIB_CFLAGS@
+DBUS_GLIB_LIBS = @DBUS_GLIB_LIBS@
+DBUS_LIBS = @DBUS_LIBS@
+DBUS_SERVICES_DIR = @DBUS_SERVICES_DIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DSYMUTIL = @DSYMUTIL@
+EBOOK_CFLAGS = @EBOOK_CFLAGS@
+EBOOK_LIBS = @EBOOK_LIBS@
+ECAL_CFLAGS = @ECAL_CFLAGS@
+ECAL_LIBS = @ECAL_LIBS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EPACKAGE_CFLAGS = @EPACKAGE_CFLAGS@
+EPACKAGE_LIBS = @EPACKAGE_LIBS@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+FILE_CFLAGS = @FILE_CFLAGS@
+FILE_LIBS = @FILE_LIBS@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB216_CFLAGS = @GLIB216_CFLAGS@
+GLIB216_LIBS = @GLIB216_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_LIBS = @GLIB_LIBS@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+GNOMEBLUETOOTH_CFLAGS = @GNOMEBLUETOOTH_CFLAGS@
+GNOMEBLUETOOTH_DIR = @GNOMEBLUETOOTH_DIR@
+GNOMEBLUETOOTH_LIBS = @GNOMEBLUETOOTH_LIBS@
+GOBJECT_CFLAGS = @GOBJECT_CFLAGS@
+GOBJECT_LIBS = @GOBJECT_LIBS@
+GREP = @GREP@
+GTHREAD_CFLAGS = @GTHREAD_CFLAGS@
+GTHREAD_LIBS = @GTHREAD_LIBS@
+GTK_2_18_CFLAGS = @GTK_2_18_CFLAGS@
+GTK_2_18_LIBS = @GTK_2_18_LIBS@
+GTK_BUILDER_CONV = @GTK_BUILDER_CONV@
+GUI_CFLAGS = @GUI_CFLAGS@
+GUI_DESKTOP_FILES = @GUI_DESKTOP_FILES@
+GUI_LIBS = @GUI_LIBS@
+GUI_PROGRAMS = @GUI_PROGRAMS@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLLIBS = @INTLLIBS@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+INTLTOOL_MERGE = @INTLTOOL_MERGE@
+INTLTOOL_PERL = @INTLTOOL_PERL@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+KEYRING_2_20_CFLAGS = @KEYRING_2_20_CFLAGS@
+KEYRING_2_20_LIBS = @KEYRING_2_20_LIBS@
+KEYRING_CFLAGS = @KEYRING_CFLAGS@
+KEYRING_LIBS = @KEYRING_LIBS@
+LDFLAGS = @LDFLAGS@
+LIBEXECDIR = @LIBEXECDIR@
+LIBICAL_AVAILABLE_CFLAGS = @LIBICAL_AVAILABLE_CFLAGS@
+LIBICAL_AVAILABLE_LIBS = @LIBICAL_AVAILABLE_LIBS@
+LIBNOTIFY_CFLAGS = @LIBNOTIFY_CFLAGS@
+LIBNOTIFY_LIBS = @LIBNOTIFY_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBOPENOBEX_CFLAGS = @LIBOPENOBEX_CFLAGS@
+LIBOPENOBEX_LIBS = @LIBOPENOBEX_LIBS@
+LIBS = @LIBS@
+LIBSOUP_CFLAGS = @LIBSOUP_CFLAGS@
+LIBSOUP_LIBS = @LIBSOUP_LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MCALB_CFLAGS = @MCALB_CFLAGS@
+MCALB_LIBS = @MCALB_LIBS@
+MKDIR_P = @MKDIR_P@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MODIFY_SYNCCOMPARE = @MODIFY_SYNCCOMPARE@
+MSGFMT = @MSGFMT@
+MSGFMT_OPTS = @MSGFMT_OPTS@
+MSGMERGE = @MSGMERGE@
+MX_GTK_0_99_1_CFLAGS = @MX_GTK_0_99_1_CFLAGS@
+MX_GTK_0_99_1_LIBS = @MX_GTK_0_99_1_LIBS@
+NMEDIT = @NMEDIT@
+NSS_CFLAGS = @NSS_CFLAGS@
+NSS_LIBS = @NSS_LIBS@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+POFILES = @POFILES@
+POSUB = @POSUB@
+PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
+PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SQLITE_CFLAGS = @SQLITE_CFLAGS@
+SQLITE_LIBS = @SQLITE_LIBS@
+STABLE_VERSION = @STABLE_VERSION@
+STRIP = @STRIP@
+SYNCEVOLUTION_CXXFLAGS = @SYNCEVOLUTION_CXXFLAGS@
+SYNCEVOLUTION_LDADD = @SYNCEVOLUTION_LDADD@
+SYNCEVOLUTION_LOCALEDIR = @SYNCEVOLUTION_LOCALEDIR@
+SYNCSOURCES = @SYNCSOURCES@
+SYNTHESIS = @SYNTHESIS@
+SYNTHESISSRC = @SYNTHESISSRC@
+SYNTHESIS_CFLAGS = @SYNTHESIS_CFLAGS@
+SYNTHESIS_DEP = @SYNTHESIS_DEP@
+SYNTHESIS_ENGINE = @SYNTHESIS_ENGINE@
+SYNTHESIS_LIB = @SYNTHESIS_LIB@
+SYNTHESIS_LIBS = @SYNTHESIS_LIBS@
+SYNTHESIS_SRC = @SYNTHESIS_SRC@
+SYNTHESIS_SUBDIR = @SYNTHESIS_SUBDIR@
+SYNTHESIS_SUBDIR_INCLUDES = @SYNTHESIS_SUBDIR_INCLUDES@
+TRANSPORT_CFLAGS = @TRANSPORT_CFLAGS@
+TRANSPORT_LIBS = @TRANSPORT_LIBS@
+UNIQUE_CFLAGS = @UNIQUE_CFLAGS@
+UNIQUE_LIBS = @UNIQUE_LIBS@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+XMLRPC_CFLAGS = @XMLRPC_CFLAGS@
+XMLRPC_LIBS = @XMLRPC_LIBS@
+XSLT = @XSLT@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_F77 = @ac_ct_F77@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+backenddir = @backenddir@
+backendsearchdir = @backendsearchdir@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+               && exit 0; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  src/synthesis-includes/Makefile'; \
+       cd $(top_srcdir) && \
+         $(AUTOMAKE) --gnu  src/synthesis-includes/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+mostlyclean-libtool:
+       -rm -f *.lo
+
+clean-libtool:
+       -rm -rf .libs _libs
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+           fi; \
+           cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+         else \
+           test -f $(distdir)/$$file \
+           || cp -p $$d/$$file $(distdir)/$$file \
+           || exit 1; \
+         fi; \
+       done
+check-am: all-am
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+         install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+         `test -z '$(STRIP)' || \
+           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+       -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+       distclean distclean-generic distclean-libtool distdir dvi \
+       dvi-am html html-am info info-am install install-am \
+       install-data install-data-am install-dvi install-dvi-am \
+       install-exec install-exec-am install-html install-html-am \
+       install-info install-info-am install-man install-pdf \
+       install-pdf-am install-ps install-ps-am install-strip \
+       installcheck installcheck-am installdirs maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-generic \
+       mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am
+
+
+all:
+       cd $(SYNTHESIS_SUBDIR)/src && $(MAKE) synthesis/syerror.h synthesis/generic_types.h
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
index 6083f03..11fa360 100644 (file)
@@ -7,6 +7,7 @@ src/EXCLUDE_FILES
 src/EXTRA_FILES
 src/SDK_FILES
 src/SERVER_FILES
+src/SDK_EXCLUDE_FILES
 Makefile.in
 configure
 m4
index 7ee7858..0a4095c 100644 (file)
@@ -1,6 +1,259 @@
 # Generated by configure.  Do no edit.
-# git revision 904d1fb47ecd39c58f349012fd4c343d6fcf63e9
-# git tag libsynthesis_3.4.0.5+syncevolution-1-0-beta-2
+# git revision 3b2633efd048dec92f5f12102f80cc4c470c7363
+# git tag libsynthesis_3.4.0.6+syncevolution-1-0-beta-3
+
+2010-04-08  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/sysync/configelement.cpp:
+
+       TConfigElement::endElement(): fixed invalid memory read
+
+2010-03-24  Chen Congwu  <congwu.chen@intel.com>
+
+       * src/syncml_tk/src/sml/xlt/all/xltdevinf.c:
+
+       smltk+DevInf decoding: avoid a possible infinite loop
+
+2010-03-24  Chen Congwu  <congwu.chen@intel.com>
+
+       * src/syncml_tk/src/sml/xlt/all/xltdevinf.c:
+
+       smltk: DevInf decoding
+
+2010-03-22  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * .gitignore:
+
+       .gitignore: add SDK_EXCLUDE_FILES
+
+2010-03-19  Chen Congwu  <congwu.chen@intel.com>
+
+       * src/gen-makefile-am.sh:
+
+       Build: pull blob.h/blob.cpp in libsynthesissdk dynamic build
+
+2010-03-18  Lukas Zeller  <luz@synthesis.ch>
+
+       * src/sysync/syserial.h:
+
+       syserial.h: New SYSER_PRODFLAG_CLIENT_APP flag
+
+2010-03-18  Lukas Zeller  <luz@synthesis.ch>
+
+       * src/DB_interfaces/odbc_db/odbcapiagent.cpp:
+       * src/sysync/dataobjtype.cpp:
+       * src/sysync/mimedirprofile.cpp:
+       * src/sysync/syncagent.cpp:
+       * src/sysync/syncitemtype.cpp:
+       * src/sysync/syncsession.cpp:
+       * src/sysync_SDK/Sources/san.cpp:
+       * src/sysync_SDK/Sources/sysync_b64.cpp:
+       * src/sysync_SDK/Sources/sysync_b64.h:
+       * src/sysync_SDK/Sources/sysync_utils.cpp:
+
+       sysync_b64: added b64::free() that can be called to dispose
+       blocks allocated by b64::decode/encode
+
+2010-03-16  Lukas Zeller  <luz@synthesis.ch>
+
+       * src/sysync/mimedirprofile.cpp:
+
+       MIME-DIR "group" feature: fixed extra increment of array index in
+       some cases
+
+2010-03-15  Lukas Zeller  <luz@synthesis.ch>
+
+       * src/DB_interfaces/api_db/pluginapids.cpp:
+
+       engine: compilable again without engineinterface and AsKey
+
+2010-03-09  Lukas Zeller  <luz@synthesis.ch>
+
+       * src/DB_interfaces/api_db/pluginapids.cpp:
+       * src/sysync/syncsession.cpp:
+
+       pluginapids: ReadNextItem can now return error without causing
+       exceptions.
+
+2010-03-18  Lukas Zeller  <luz@synthesis.ch>
+
+
+       Merge remote branch 'moblin/master' into luz
+
+2010-03-18  Lukas Zeller  <luz@synthesis.ch>
+
+       * src/global_options.h:
+
+       engine 3.4.0.5: new version for SAN 1.1 related changes in file
+       location etc.
+
+2010-03-18  Lukas Zeller  <luz@synthesis.ch>
+
+       * src/sysync/sysync_globs.h:
+
+       SAN 1.1: fix needed to compile Synthesis internal projects again
+       with changes related to SAN 1.1
+
+2010-03-18  Lukas Zeller  <luz@synthesis.ch>
+
+
+       Merge remote branch 'moblin/san11' into luz
+
+2010-03-18  Lukas Zeller  <luz@synthesis.ch>
+
+       * src/sysync/cp936_tables_inc.cpp:
+       * src/sysync/gb2312_tables_inc.cpp:
+       * src/sysync_SDK/Sources/cp936_tables_inc.cpp:
+       * src/sysync_SDK/Sources/gb2312_tables_inc.cpp:
+
+       SAN 1.1 preparation: when moving sysync_utils, these (included)
+       files need to be moved as well to support the Chinese character
+       set (CHINESE_SUPPORT #defineD)
+
+2010-03-17  Lukas Zeller  <luz@synthesis.ch>
+
+       * src/sysync/localengineds.cpp:
+
+       engine: fix for very late suspend
+
+2010-03-17  Lukas Zeller  <luz@synthesis.ch>
+
+       * src/sysync/customimplds.cpp:
+
+       engine: getItemByID: made sure newly inserted items can be
+       retrieved
+
+2010-03-16  Lukas Zeller  <luz@synthesis.ch>
+
+
+       Merge remote branch 'refs/remotes/moblin/subdatastores-devinf'
+       into luz
+
+2010-03-15  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/sysync/synccommand.cpp:
+
+       resume + pending item fix in SyncML server
+
+2010-03-11  Chen Congwu  <congwu.chen@intel.com>
+
+       * src/sysync/syncsession.cpp:
+
+       Valgrind warning fixed: initialize the conditonal variables
+
+2010-03-08  Chen Congwu  <congwu.chen@intel.com>
+
+       * src/gen-makefile-am.sh:
+       * src/synthesis-linker.map:
+       * src/sysync/sysync.h:
+       * src/sysync_SDK/Sources/lineartime.cpp:
+       * src/sysync_SDK/Sources/stringutil.cpp:
+       * src/sysync_SDK/Sources/stringutil.h:
+       * src/sysync_SDK/Sources/syncexception.cpp:
+       * src/sysync_SDK/Sources/sysync_utils.cpp:
+       * src/sysync_SDK/Sources/sysync_utils.h:
+
+       Build script and code changes for the new moved utility code.
+
+2010-03-08  Chen Congwu  <congwu.chen@intel.com>
+
+       * src/sysync/lineartime.cpp:
+       * src/sysync/lineartime.h:
+       * src/sysync/syncexception.cpp:
+       * src/sysync/syncexception.h:
+       * src/sysync/sysync_utils.cpp:
+       * src/sysync/sysync_utils.h:
+       * src/sysync_SDK/Sources/lineartime.cpp:
+       * src/sysync_SDK/Sources/lineartime.h:
+       * src/sysync_SDK/Sources/syncexception.cpp:
+       * src/sysync_SDK/Sources/syncexception.h:
+       * src/sysync_SDK/Sources/sysync_utils.cpp:
+       * src/sysync_SDK/Sources/sysync_utils.h:
+
+       SAN 1.1 generation support: Moved utility code from engine to sdk
+
+2010-03-09  Chen Congwu  <congwu.chen@intel.com>
+
+       * src/sysync_SDK/Sources/san.cpp:
+
+       SAN parsing version check fix: should be && instead of ||
+
+2010-03-08  Chen Congwu  <congwu.chen@intel.com>
+
+       * src/sysync_SDK/Sources/SDK_util.c:
+       * src/sysync_SDK/Sources/san.cpp:
+
+       San1.1 : compiler warning fixed
+
+2010-03-05  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/sysync_SDK/Sources/blobs.h:
+
+       TBlob: export Init() properties read-only
+
+2010-03-02  Chen Congwu  <congwu.chen@intel.com>
+
+       * src/sysync_SDK/Sources/san.cpp:
+       * src/sysync_SDK/Sources/san.h:
+
+       SAN 1.0/1.1 generation: check for invalid SAN package
+
+2010-02-26  Chen Congwu  <congwu.chen@intel.com>
+
+       * src/synthesis-linker.map:
+       * src/sysync_SDK/Sources/san.cpp:
+       * src/sysync_SDK/Sources/san.h:
+
+       SAN 1.0/1.1 generation support
+
+2010-02-23  Chen Congwu  <congwu.chen@intel.com>
+
+       * configure.in:
+       * src/Makefile.am.in:
+       * src/Targets/ReleasedProducts/SDK/define.h:
+       * src/Targets/ReleasedProducts/SDK/target_options.h:
+       * src/synthesis-linker.map:
+       * src/sysync_SDK/Sources/stringutil.cpp:
+
+       Accept SAN 1.0 pacakge (only wbxml is supported)
+
+2010-03-01  Chen Congwu  <congwu.chen@intel.com>
+
+       * src/sysync/syncagent.cpp:
+
+       Server: made silently swallow garbage after end of incoming
+       SyncML message
+
+2010-03-04  Lukas Zeller  <luz@synthesis.ch>
+
+       * src/sysync/customimplds.cpp:
+       * src/sysync/stdlogicds.cpp:
+
+       server engine: added missing check for re-sent <Add> during
+       resume.
+
+2010-03-04  Lukas Zeller  <luz@synthesis.ch>
+
+       * src/Transport_interfaces/engine/enginesessiondispatch.cpp:
+       * src/Transport_interfaces/engine/enginesessiondispatch.h:
+       * src/sysync/syncagent.cpp:
+
+       server engine: added option to implement client resent message
+       handling.
+
+2010-03-04  Lukas Zeller  <luz@synthesis.ch>
+
+       * src/sysync/superdatastore.cpp:
+
+       Fixed server case of superdatastore which was broken by
+       6626a57e9e (Engine 3.4.0.5: implemented client-side
+       superdatastores...)
+
+2010-02-25  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/sysync/debuglogger.cpp:
+
+       debuglogger: avoid segfault when log file cannot be reopened
 
 2010-02-23  Patrick Ohly  <patrick.ohly@intel.com>
 
 
        .so version bumped to 0.3.1 (minor revision increased)
 
+2010-02-22  Patrick Ohly  <patrick.ohly@intel.com>
+
+       * src/sysync/localengineds.cpp:
+
+       DevInf + superdatastore: avoid redundant <DataStore>
+
 2010-02-18  Lukas Zeller  <luz@synthesis.ch>
 
 
index 8007984..47d2ba1 100644 (file)
@@ -89,6 +89,3 @@
 
 /* Version number of package */
 #undef VERSION
-
-/* support for Server Alerted Notifications according to SyncML 1.1 */
-#undef WITHOUT_SAN_1_1
index ec56fb3..100f64b 100755 (executable)
 
 # Disable unconditionally at the moment. Would add dependency of SDK
 # on SyncML Toolkit.
-
-cat >>confdefs.h <<\_ACEOF
-#define WITHOUT_SAN_1_1 1
-_ACEOF
-
+#AC_DEFINE(WITHOUT_SAN_1_1, 1,
+#          [support for Server Alerted Notifications according to SyncML 1.1])
 
 ac_config_files="$ac_config_files Makefile src/Makefile synthesis.pc synthesis-sdk.pc"
 
index 23a78b1..7febe48 100644 (file)
@@ -161,8 +161,8 @@ AM_CONDITIONAL([COND_STATIC], [test "$enable_shared" = "no"])
 
 # Disable unconditionally at the moment. Would add dependency of SDK
 # on SyncML Toolkit.
-AC_DEFINE(WITHOUT_SAN_1_1, 1,
-          [support for Server Alerted Notifications according to SyncML 1.1])
+#AC_DEFINE(WITHOUT_SAN_1_1, 1,
+#          [support for Server Alerted Notifications according to SyncML 1.1])
 
 AC_CONFIG_FILES(Makefile src/Makefile synthesis.pc synthesis-sdk.pc)
 AC_OUTPUT
index bc4a230..17c49f8 100755 (executable)
@@ -1032,6 +1032,9 @@ bool TPluginApiDS::dsFilteredFetchesFromDB(bool aFilterChanged)
 localstatus TPluginApiDS::apiReadSyncSet(bool aNeedAll)
 {
        TSyError dberr=LOCERR_OK;
+  #ifdef SYDEBUG
+  string ts1,ts2;
+  #endif
 
   #ifdef BASED_ON_BINFILE_CLIENT
   if (binfileDSActive()) {
@@ -1052,12 +1055,13 @@ localstatus TPluginApiDS::apiReadSyncSet(bool aNeedAll)
     else if (dberr==LOCERR_NOTIMP)
       dberr=LOCERR_OK; // we just don't have a data plugin, that's ok, inherited (SQL) will handle data
     if (dberr!=LOCERR_OK)
-      return dberr;
+       goto endread;
   } // binfile active
   #endif // BASED_ON_BINFILE_CLIENT
   #ifndef SDK_ONLY_SUPPORT
   // only handle here if we are in charge - otherwise let ancestor handle it
-  if (!fDBApi_Data.Created()) return inherited::apiReadSyncSet(aNeedAll);
+  if (!fDBApi_Data.Created())
+       return inherited::apiReadSyncSet(aNeedAll);
   #endif
 
   // just let plugin know if we want data (if it actually does is the plugin's choice)
@@ -1078,14 +1082,15 @@ localstatus TPluginApiDS::apiReadSyncSet(bool aNeedAll)
   fParentKey.erase();
   fWriting=false;
   fPluginAgentP->fScriptContextDatastore=this;
-  if (!TScriptContext::executeTest(true,fScriptContextP,fPluginDSConfigP->fFieldMappings.fInitScript,fPluginDSConfigP->getDSFuncTableP(),fPluginAgentP))
-    SYSYNC_THROW(TSyncException("<initscript> failed"));
+  if (!TScriptContext::executeTest(true,fScriptContextP,fPluginDSConfigP->fFieldMappings.fInitScript,fPluginDSConfigP->getDSFuncTableP(),fPluginAgentP)) {
+       PDEBUGPRINTFX(DBG_ERROR,("<initscript> failed"));
+    goto endread;
+  }
   #endif
   // start reading
   // - read list of all local IDs that are in the current sync set
   DeleteSyncSet();
   #ifdef SYDEBUG
-  string ts1,ts2;
   StringObjTimestamp(ts1,getPreviousToRemoteSyncCmpRef());
   StringObjTimestamp(ts2,getPreviousSuspendCmpRef());
   PDEBUGPRINTFX(DBG_DATA,(
@@ -1096,8 +1101,10 @@ localstatus TPluginApiDS::apiReadSyncSet(bool aNeedAll)
   #endif
   // start the reading phase anyway (to make sure call order is always StartRead/EndRead/StartWrite/EndWrite)
   dberr = fDBApi_Data.StartDataRead(fPreviousToRemoteSyncIdentifier.c_str(),fPreviousSuspendIdentifier.c_str());
-  if (dberr!=LOCERR_OK)
-    SYSYNC_THROW(TSyncException("DBapi::StartDataRead fatal error",dberr));
+  if (dberr!=LOCERR_OK) {
+       PDEBUGPRINTFX(DBG_ERROR,("DBapi::StartDataRead fatal error: %hd",dberr));
+    goto endread;
+  }
   // we don't need to load the syncset if we are only refreshing from remote
   // but we also must load it if we can't zap without it on slow refresh
   if (!fRefreshOnly || (fSlowSync && apiNeedSyncSetToZap()) || implNeedSyncSetToRetrieve()) {
@@ -1158,8 +1165,13 @@ localstatus TPluginApiDS::apiReadSyncSet(bool aNeedAll)
         #else
         return LOCERR_WRONGUSAGE; // completely wrong usage - should never happen as compatibility is tested at module connect
         #endif
-        if (dberr!=LOCERR_OK)
-          SYSYNC_THROW(TSyncException("DBapi::ReadNextItem fatal error",dberr));
+        if (dberr!=LOCERR_OK) {
+          PDEBUGPRINTFX(DBG_ERROR,("DBapi::ReadNextItem fatal error = %hd",dberr));
+                     #if defined(DBAPI_ASKEYITEMS) && defined(ENGINEINTERFACE_SUPPORT)
+          if (mfitemP) delete mfitemP;
+          #endif
+          goto endread;
+        }
         // check if we have seen all items
         if (itemstatus==ReadNextItem_EOF)
           break;
@@ -1225,6 +1237,7 @@ localstatus TPluginApiDS::apiReadSyncSet(bool aNeedAll)
       dberr=LOCERR_EXCEPTION;
     SYSYNC_ENDCATCH
   } // if we need the syncset at all
+endread:
   // then end read here
   if (dberr==LOCERR_OK) {
     dberr=fDBApi_Data.EndDataRead();
@@ -1397,8 +1410,10 @@ localstatus TPluginApiDS::apiAddItem(TMultiFieldItem &aItem, string &aLocalID)
     fInserting=true;
     fDeleting=false;
     fPluginAgentP->fScriptContextDatastore=this;
-    if (!TScriptContext::execute(fScriptContextP,fPluginDSConfigP->fFieldMappings.fAfterWriteScript,fPluginDSConfigP->getDSFuncTableP(),fPluginAgentP,&aItem,true))
-      SYSYNC_THROW(TSyncException("<afterwritescript> failed"));
+    if (!TScriptContext::execute(fScriptContextP,fPluginDSConfigP->fFieldMappings.fAfterWriteScript,fPluginDSConfigP->getDSFuncTableP(),fPluginAgentP,&aItem,true)) {
+      PDEBUGPRINTFX(DBG_ERROR,("<afterwritescript> failed"));
+      dberr = LOCERR_WRONGUSAGE;
+    }
     #endif
   }
   // return status
@@ -1500,8 +1515,10 @@ localstatus TPluginApiDS::apiUpdateItem(TMultiFieldItem &aItem)
     fInserting=false;
     fDeleting=false;
     fPluginAgentP->fScriptContextDatastore=this;
-    if (!TScriptContext::execute(fScriptContextP,fPluginDSConfigP->fFieldMappings.fAfterWriteScript,fPluginDSConfigP->getDSFuncTableP(),fPluginAgentP,&aItem,true))
-      SYSYNC_THROW(TSyncException("<afterwritescript> failed"));
+    if (!TScriptContext::execute(fScriptContextP,fPluginDSConfigP->fFieldMappings.fAfterWriteScript,fPluginDSConfigP->getDSFuncTableP(),fPluginAgentP,&aItem,true)) {
+      PDEBUGPRINTFX(DBG_ERROR,("<afterwritescript> failed"));
+      dberr = LOCERR_WRONGUSAGE;
+    }
     #endif
   }
   // return status
@@ -1529,8 +1546,10 @@ localstatus TPluginApiDS::apiDeleteItem(TMultiFieldItem &aItem)
     fInserting=false;
     fDeleting=true;
     fPluginAgentP->fScriptContextDatastore=this;
-    if (!TScriptContext::execute(fScriptContextP,fPluginDSConfigP->fFieldMappings.fAfterWriteScript,fPluginDSConfigP->getDSFuncTableP(),fPluginAgentP,&aItem,true))
-      SYSYNC_THROW(TSyncException("<afterwritescript> failed"));
+    if (!TScriptContext::execute(fScriptContextP,fPluginDSConfigP->fFieldMappings.fAfterWriteScript,fPluginDSConfigP->getDSFuncTableP(),fPluginAgentP,&aItem,true)) {
+      PDEBUGPRINTFX(DBG_ERROR,("<afterwritescript> failed"));
+      dberr = LOCERR_WRONGUSAGE;
+    }
     #endif
   } // if
 
@@ -1988,7 +2007,7 @@ localstatus TPluginApiDS::apiLoadAdminData(
 
   const char* PIStored = "PIStored"; // blob name field
 
-  TSyError err= LOCERR_OK;
+  TSyError err = LOCERR_OK;
 
   // In any case - this is the time to create the contexts for the datastore
   // - admin if selected
index 58aa9e8..a7f1978 100644 (file)
@@ -3718,7 +3718,7 @@ bool TODBCApiAgent::CheckLogin(const char *aOriginalUserName, const char *aModif
           }
           p = b64::encode(&md5[0],16);
           secret = p; // save converted string
-          sysync_free((void *)p);
+          b64::free((void *)p);
         }
         col++;
         #ifdef SCRIPT_SUPPORT
index e0eb2ea..9e17923 100644 (file)
@@ -2,8 +2,6 @@ admindata.cpp
 admindata.h
 dbitem.cpp
 dbitem.h
-blobs.cpp
-blobs.h
 enginesessiondispatch.cpp
 syncserver.cpp
 binfile.cpp
index 7c4cc95..f006c86 100644 (file)
@@ -29,7 +29,7 @@ CLEANFILES =
 EXTRA_DIST =
 
 lib_LTLIBRARIES = libsmltk.la libsynthesis.la libsynthesissdk.la libsynthesisstubs.la
-nobase_include_HEADERS = synthesis/sysync_b64.h synthesis/enginemodulebridge.h synthesis/SDK_util.h synthesis/prefix_file.h synthesis/sync_dbapi.h synthesis/enginemodulebase.h synthesis/SDK_support.h synthesis/stringutil.h synthesis/sync_declarations.h synthesis/sync_dbapidef.h synthesis/generic_types.h synthesis/engine_defs.h synthesis/sync_include.h synthesis/timeutil.h synthesis/dbitem.h synthesis/san.h synthesis/blobs.h synthesis/sync_uiapi.h synthesis/admindata.h synthesis/dataconversion.h synthesis/sysync_md5.h synthesis/syerror.h synthesis/UI_util.h synthesis/target_options.h
+nobase_include_HEADERS = synthesis/sysync_b64.h synthesis/enginemodulebridge.h synthesis/SDK_util.h synthesis/prefix_file.h synthesis/sync_dbapi.h synthesis/enginemodulebase.h synthesis/SDK_support.h synthesis/stringutil.h synthesis/sync_declarations.h synthesis/sync_dbapidef.h synthesis/lineartime.h synthesis/generic_types.h synthesis/engine_defs.h synthesis/sync_include.h synthesis/timeutil.h synthesis/dbitem.h synthesis/syncexception.h synthesis/san.h synthesis/blobs.h synthesis/sync_uiapi.h synthesis/admindata.h synthesis/dataconversion.h synthesis/sysync_md5.h synthesis/sysync_utils.h synthesis/syerror.h synthesis/UI_util.h synthesis/target_options.h
 
 # Configuration header files are searched in this order:
 # - Targets/ReleasedProducts/autotools: files only used when compiling with autotools
@@ -42,7 +42,7 @@ nobase_include_HEADERS = synthesis/sysync_b64.h synthesis/enginemodulebridge.h s
 # Included as needed:
 # - define.h: hard-coded SyncML Toolkit config (from search path above)
 
-libsynthesis_la_SOURCES = sysync/binfileimplclient.cpp sysync/syncclientbase.h sysync/syncagent.cpp sysync/syncml_globs.h sysync/stdlogicagent.cpp sysync/syncappbase.cpp sysync/customimplds.cpp sysync/syncsession.h sysync/syncitem.cpp sysync/textitemtype.cpp sysync/textitemtype.h sysync/localengineds.h sysync/syncexception.cpp sysync/clientprovisioning_inc.h sysync/global_progress.h sysync/textprofile.cpp sysync/stringutils.cpp sysync/customimplagent.cpp sysync/debuglogger.cpp sysync/vtimezone.cpp sysync/iso8601.h sysync/vcalendaritemtype.cpp sysync/scriptcontext.h sysync/syncitemtype.h sysync/smltk_precomp.h sysync/sysync_globs.h sysync/sysync_debug.h sysync/syncsessiondispatch.h sysync/sysync_utils.cpp sysync/mimediritemtype.h sysync/dataobjtype.cpp sysync/multifielditem.cpp sysync/sysync_precomp_xpt.h sysync/iso8601.cpp sysync/syncclientbase.cpp sysync/itemfield.h sysync/remotedatastore.h sysync/engineentry.h sysync/itemfield.cpp sysync/stringutils.h sysync/lineartime.h sysync/syncml_tk.h sysync/mimediritemtype.cpp sysync/configelement.h sysync/clientautosync_inc.cpp sysync/binfilebase.cpp sysync/synccommand.cpp sysync/mimedirprofile.h sysync/tz_table.h sysync/binfileimplds.cpp sysync/sysync_crc16.cpp sysync/simpleitem.h sysync/timezones.h sysync/sysync_precomp.h sysync/sysync.h sysync/binfileimplclient.h sysync/syncitem.h sysync/localengineds.cpp sysync/dataobjtype.h sysync/customimplagent.h sysync/synccommand.h sysync/binfilebase.h sysync/textprofile.h sysync/vcarditemtype.h sysync/binfileimplds.h sysync/vcalendaritemtype.h sysync/syncexception.h sysync/multifielditemtype.cpp sysync/lineartime.cpp sysync/clientautosync_inc.h sysync/debuglogger.h sysync/smltk_precomp_xpt.h sysync/syncsession.cpp sysync/multifielditemtype.h sysync/stdlogicds.h sysync/rrules.h sysync/remotedatastore.cpp sysync/engineentry.cpp sysync/simpleitem.cpp sysync/superdatastore.h sysync/uiapi.h sysync/vcarditemtype.cpp sysync/engineinterface.cpp sysync/syncappbase.h sysync/sysync_crc16.h sysync/syncdatastore.cpp sysync/multifielditem.h sysync/scriptcontext.cpp sysync/syncitemtype.cpp sysync/stdlogicds.cpp sysync/vtimezone.h sysync/uiapi.cpp sysync/syncagent.h sysync/dataconversion.cpp sysync/timezones.cpp sysync/engineinterface.h sysync/superdatastore.cpp sysync/sysync_utils.h sysync/customimplds.h sysync/rrules.cpp sysync/configelement.cpp sysync/syserial.h sysync/syncdatastore.h sysync/mimedirprofile.cpp sysync/stdlogicagent.h DB_interfaces/odbc_db/odbcapids.cpp DB_interfaces/odbc_db/odbcapiagent.h DB_interfaces/odbc_db/odbcapiagent.cpp DB_interfaces/odbc_db/odbcdb_precomp.h DB_interfaces/odbc_db/odbcapids.h DB_interfaces/odbc_db/odbcdb.h DB_interfaces/api_db/plugindb.h DB_interfaces/api_db/dbapi.h DB_interfaces/api_db/pluginapiagent.cpp DB_interfaces/api_db/dbapi_include.h DB_interfaces/api_db/sync_dbapiconnect.h DB_interfaces/api_db/pluginapiagent.h DB_interfaces/api_db/sync_dbapiconnect.cpp DB_interfaces/api_db/pluginapids.cpp DB_interfaces/api_db/plugindb_precomp.h DB_interfaces/api_db/dbapi.cpp DB_interfaces/api_db/DLL_interface.h DB_interfaces/api_db/DLL_interface.cpp DB_interfaces/api_db/pluginapids.h sysync_SDK/Sources/sysync_b64.cpp sysync_SDK/Sources/sysync_md5.cpp sysync_SDK/Sources/sysync_b64.h sysync_SDK/Sources/SDK_util.h sysync_SDK/Sources/prefix_file.h sysync_SDK/Sources/sync_dbapi.h sysync_SDK/Sources/enginemodulebase.h sysync_SDK/Sources/SDK_support.h sysync_SDK/Sources/sync_declarations.h sysync_SDK/Sources/sync_dbapidef.h sysync_SDK/Sources/generic_types.h sysync_SDK/Sources/engine_defs.h sysync_SDK/Sources/sync_include.h sysync_SDK/Sources/SDK_support.cpp sysync_SDK/Sources/SDK_util.c sysync_SDK/Sources/dbitem.h sysync_SDK/Sources/dbitem.cpp sysync_SDK/Sources/blobs.h sysync_SDK/Sources/enginemodulebase.cpp sysync_SDK/Sources/sync_uiapi.h sysync_SDK/Sources/admindata.h sysync_SDK/Sources/dataconversion.h sysync_SDK/Sources/admindata.cpp sysync_SDK/Sources/blobs.cpp sysync_SDK/Sources/sysync_md5.h sysync_SDK/Sources/syerror.h Transport_interfaces/engine/engine_client_precomp.h Transport_interfaces/engine/enginesessiondispatch.h Transport_interfaces/engine/engine_server_precomp.h Transport_interfaces/engine/enginesessiondispatch.cpp Transport_interfaces/engine/engine_server.h Transport_interfaces/engine/engineclientbase.cpp Transport_interfaces/engine/engineclientbase.h Transport_interfaces/engine/engine_client.h platform_adapters/sysync_glob_vars.h platform_adapters/configfiles.h platform_adapters/binfile.cpp platform_adapters/sysyncinit.cpp platform_adapters/profiling.h platform_adapters/linux/platform_DLL.cpp platform_adapters/linux/profiling.cpp platform_adapters/linux/platform_exec.h platform_adapters/linux/configfiles.cpp platform_adapters/linux/platform_time.cpp platform_adapters/linux/platform_exec.c platform_adapters/linux/platform_headers.h platform_adapters/linux/platform_timezones.cpp platform_adapters/linux/platform_time.h platform_adapters/binfile.h platform_adapters/platform_thread.h platform_adapters/platform_DLL.h platform_adapters/unix_common/platform_pipe.c platform_adapters/unix_common/platform_file.cpp platform_adapters/unix_common/platform_pipe.h platform_adapters/unix_common/platform_mutex.cpp platform_adapters/platform_file.h platform_adapters/platform_headers.h platform_adapters/platform_mutex.h syncapps/clientEngine_custom/clientengine_custom_Base.h syncapps/clientEngine_custom/clientengine_custom_Base.cpp syncapps/clientEngine_custom/product_options.h syncapps/clientEngine_custom/clientengine_custom_precomp.h syncapps/clientEngine_custom/clientengine_custom.h syncapps/serverEngine_custom/serverengine_custom.h syncapps/serverEngine_custom/serverengine_custom_Base.cpp syncapps/serverEngine_custom/serverengine_custom_Base.h syncapps/serverEngine_custom/combi_product_options.h syncapps/serverEngine_custom/product_options.h syncapps/serverEngine_custom/serverengine_custom_precomp.h sysync_SDK/DB_Interfaces/text_db/sync_dbapi_text.cpp \
+libsynthesis_la_SOURCES = sysync/binfileimplclient.cpp sysync/syncclientbase.h sysync/syncagent.cpp sysync/syncml_globs.h sysync/stdlogicagent.cpp sysync/syncappbase.cpp sysync/customimplds.cpp sysync/syncsession.h sysync/syncitem.cpp sysync/textitemtype.cpp sysync/textitemtype.h sysync/localengineds.h sysync/clientprovisioning_inc.h sysync/global_progress.h sysync/textprofile.cpp sysync/stringutils.cpp sysync/customimplagent.cpp sysync/debuglogger.cpp sysync/vtimezone.cpp sysync/iso8601.h sysync/vcalendaritemtype.cpp sysync/scriptcontext.h sysync/syncitemtype.h sysync/smltk_precomp.h sysync/sysync_globs.h sysync/sysync_debug.h sysync/syncsessiondispatch.h sysync/mimediritemtype.h sysync/dataobjtype.cpp sysync/multifielditem.cpp sysync/sysync_precomp_xpt.h sysync/iso8601.cpp sysync/syncclientbase.cpp sysync/itemfield.h sysync/remotedatastore.h sysync/engineentry.h sysync/itemfield.cpp sysync/stringutils.h sysync/syncml_tk.h sysync/mimediritemtype.cpp sysync/configelement.h sysync/clientautosync_inc.cpp sysync/binfilebase.cpp sysync/synccommand.cpp sysync/mimedirprofile.h sysync/tz_table.h sysync/binfileimplds.cpp sysync/sysync_crc16.cpp sysync/simpleitem.h sysync/timezones.h sysync/sysync_precomp.h sysync/sysync.h sysync/binfileimplclient.h sysync/syncitem.h sysync/localengineds.cpp sysync/dataobjtype.h sysync/customimplagent.h sysync/synccommand.h sysync/binfilebase.h sysync/textprofile.h sysync/vcarditemtype.h sysync/binfileimplds.h sysync/vcalendaritemtype.h sysync/multifielditemtype.cpp sysync/clientautosync_inc.h sysync/debuglogger.h sysync/smltk_precomp_xpt.h sysync/syncsession.cpp sysync/multifielditemtype.h sysync/stdlogicds.h sysync/rrules.h sysync/remotedatastore.cpp sysync/engineentry.cpp sysync/simpleitem.cpp sysync/superdatastore.h sysync/uiapi.h sysync/vcarditemtype.cpp sysync/engineinterface.cpp sysync/syncappbase.h sysync/sysync_crc16.h sysync/syncdatastore.cpp sysync/multifielditem.h sysync/scriptcontext.cpp sysync/syncitemtype.cpp sysync/stdlogicds.cpp sysync/vtimezone.h sysync/uiapi.cpp sysync/syncagent.h sysync/dataconversion.cpp sysync/timezones.cpp sysync/engineinterface.h sysync/superdatastore.cpp sysync/customimplds.h sysync/rrules.cpp sysync/configelement.cpp sysync/syserial.h sysync/syncdatastore.h sysync/mimedirprofile.cpp sysync/stdlogicagent.h DB_interfaces/odbc_db/odbcapids.cpp DB_interfaces/odbc_db/odbcapiagent.h DB_interfaces/odbc_db/odbcapiagent.cpp DB_interfaces/odbc_db/odbcdb_precomp.h DB_interfaces/odbc_db/odbcapids.h DB_interfaces/odbc_db/odbcdb.h DB_interfaces/api_db/plugindb.h DB_interfaces/api_db/dbapi.h DB_interfaces/api_db/pluginapiagent.cpp DB_interfaces/api_db/dbapi_include.h DB_interfaces/api_db/sync_dbapiconnect.h DB_interfaces/api_db/pluginapiagent.h DB_interfaces/api_db/sync_dbapiconnect.cpp DB_interfaces/api_db/pluginapids.cpp DB_interfaces/api_db/plugindb_precomp.h DB_interfaces/api_db/dbapi.cpp DB_interfaces/api_db/DLL_interface.h DB_interfaces/api_db/DLL_interface.cpp DB_interfaces/api_db/pluginapids.h sysync_SDK/Sources/sysync_b64.cpp sysync_SDK/Sources/sysync_md5.cpp sysync_SDK/Sources/sysync_b64.h sysync_SDK/Sources/SDK_util.h sysync_SDK/Sources/syncexception.cpp sysync_SDK/Sources/prefix_file.h sysync_SDK/Sources/sync_dbapi.h sysync_SDK/Sources/enginemodulebase.h sysync_SDK/Sources/sysync_utils.cpp sysync_SDK/Sources/SDK_support.h sysync_SDK/Sources/sync_declarations.h sysync_SDK/Sources/sync_dbapidef.h sysync_SDK/Sources/lineartime.h sysync_SDK/Sources/generic_types.h sysync_SDK/Sources/engine_defs.h sysync_SDK/Sources/sync_include.h sysync_SDK/Sources/SDK_support.cpp sysync_SDK/Sources/SDK_util.c sysync_SDK/Sources/dbitem.h sysync_SDK/Sources/dbitem.cpp sysync_SDK/Sources/syncexception.h sysync_SDK/Sources/lineartime.cpp sysync_SDK/Sources/blobs.h sysync_SDK/Sources/enginemodulebase.cpp sysync_SDK/Sources/sync_uiapi.h sysync_SDK/Sources/admindata.h sysync_SDK/Sources/dataconversion.h sysync_SDK/Sources/admindata.cpp sysync_SDK/Sources/blobs.cpp sysync_SDK/Sources/sysync_md5.h sysync_SDK/Sources/sysync_utils.h sysync_SDK/Sources/syerror.h Transport_interfaces/engine/engine_client_precomp.h Transport_interfaces/engine/enginesessiondispatch.h Transport_interfaces/engine/engine_server_precomp.h Transport_interfaces/engine/enginesessiondispatch.cpp Transport_interfaces/engine/engine_server.h Transport_interfaces/engine/engineclientbase.cpp Transport_interfaces/engine/engineclientbase.h Transport_interfaces/engine/engine_client.h platform_adapters/sysync_glob_vars.h platform_adapters/configfiles.h platform_adapters/binfile.cpp platform_adapters/sysyncinit.cpp platform_adapters/profiling.h platform_adapters/linux/platform_DLL.cpp platform_adapters/linux/profiling.cpp platform_adapters/linux/platform_exec.h platform_adapters/linux/configfiles.cpp platform_adapters/linux/platform_time.cpp platform_adapters/linux/platform_exec.c platform_adapters/linux/platform_headers.h platform_adapters/linux/platform_timezones.cpp platform_adapters/linux/platform_time.h platform_adapters/binfile.h platform_adapters/platform_thread.h platform_adapters/platform_DLL.h platform_adapters/unix_common/platform_pipe.c platform_adapters/unix_common/platform_file.cpp platform_adapters/unix_common/platform_pipe.h platform_adapters/unix_common/platform_mutex.cpp platform_adapters/platform_file.h platform_adapters/platform_headers.h platform_adapters/platform_mutex.h syncapps/clientEngine_custom/clientengine_custom_Base.h syncapps/clientEngine_custom/clientengine_custom_Base.cpp syncapps/clientEngine_custom/product_options.h syncapps/clientEngine_custom/clientengine_custom_precomp.h syncapps/clientEngine_custom/clientengine_custom.h syncapps/serverEngine_custom/serverengine_custom.h syncapps/serverEngine_custom/serverengine_custom_Base.cpp syncapps/serverEngine_custom/serverengine_custom_Base.h syncapps/serverEngine_custom/combi_product_options.h syncapps/serverEngine_custom/product_options.h syncapps/serverEngine_custom/serverengine_custom_precomp.h sysync_SDK/DB_Interfaces/text_db/sync_dbapi_text.cpp \
        $(XMLPARSE_SOURCES)
 libsynthesis_la_CPPFLAGS = -I$(srcdir)/sysync_SDK/Sources
 libsynthesis_la_CFLAGS = \
@@ -108,16 +108,24 @@ XMLPARSE_CFLAGS_BUILTIN = -I$(srcdir)/Targets/ReleasedProducts/clientEngine_auto
 endif
 
 libsynthesissdk_la_LDFLAGS = -static
-libsynthesissdk_la_SOURCES = synthesis/sysync_b64.h synthesis/enginemodulebridge.h synthesis/SDK_util.h synthesis/prefix_file.h synthesis/sync_dbapi.h synthesis/enginemodulebase.h synthesis/SDK_support.h synthesis/stringutil.h synthesis/sync_declarations.h synthesis/sync_dbapidef.h synthesis/generic_types.h synthesis/engine_defs.h synthesis/sync_include.h synthesis/timeutil.h synthesis/dbitem.h synthesis/san.h synthesis/blobs.h synthesis/sync_uiapi.h synthesis/admindata.h synthesis/dataconversion.h synthesis/sysync_md5.h synthesis/syerror.h synthesis/UI_util.h
+libsynthesissdk_la_SOURCES = synthesis/sysync_b64.h synthesis/enginemodulebridge.h synthesis/SDK_util.h synthesis/prefix_file.h synthesis/sync_dbapi.h synthesis/enginemodulebase.h synthesis/SDK_support.h synthesis/stringutil.h synthesis/sync_declarations.h synthesis/sync_dbapidef.h synthesis/lineartime.h synthesis/generic_types.h synthesis/engine_defs.h synthesis/sync_include.h synthesis/timeutil.h synthesis/dbitem.h synthesis/syncexception.h synthesis/san.h synthesis/blobs.h synthesis/sync_uiapi.h synthesis/admindata.h synthesis/dataconversion.h synthesis/sysync_md5.h synthesis/sysync_utils.h synthesis/syerror.h synthesis/UI_util.h
 if COND_STATIC
-libsynthesissdk_la_SOURCES += sysync_SDK/Sources/timeutil.cpp sysync_SDK/Sources/san.cpp sysync_SDK/Sources/enginemodulebridge.cpp sysync_SDK/Sources/UI_util.cpp sysync_SDK/Sources/stringutil.cpp
+libsynthesissdk_la_SOURCES += sysync_SDK/Sources/timeutil.cpp sysync_SDK/Sources/san.cpp sysync_SDK/Sources/enginemodulebridge.cpp sysync_SDK/Sources/UI_util.cpp
 else
-libsynthesissdk_la_SOURCES += sysync_SDK/Sources/sysync_b64.cpp sysync_SDK/Sources/timeutil.cpp sysync_SDK/Sources/sysync_md5.cpp sysync_SDK/Sources/san.cpp sysync_SDK/Sources/enginemodulebridge.cpp sysync_SDK/Sources/SDK_support.cpp sysync_SDK/Sources/SDK_util.c sysync_SDK/Sources/UI_util.cpp sysync_SDK/Sources/enginemodulebase.cpp sysync_SDK/Sources/stringutil.cpp
+libsynthesissdk_la_SOURCES += sysync_SDK/Sources/sysync_b64.cpp sysync_SDK/Sources/timeutil.cpp sysync_SDK/Sources/sysync_md5.cpp sysync_SDK/Sources/syncexception.cpp sysync_SDK/Sources/san.cpp sysync_SDK/Sources/sysync_utils.cpp sysync_SDK/Sources/enginemodulebridge.cpp sysync_SDK/Sources/SDK_support.cpp sysync_SDK/Sources/SDK_util.c sysync_SDK/Sources/lineartime.cpp sysync_SDK/Sources/UI_util.cpp sysync_SDK/Sources/enginemodulebase.cpp sysync_SDK/Sources/stringutil.cpp sysync_SDK/Sources/blobs.cpp
 endif
 libsynthesissdk_la_CPPFLAGS = \
        -D_GNU_SOURCE=1 \
+       -include $(top_builddir)/config.h \
+       -I$(srcdir)/Targets/ReleasedProducts/SDK \
        -I$(srcdir)/sysync_SDK/Sources \
-       -I$(srcdir)/Targets/ReleasedProducts/SDK
+       -I$(srcdir)/platform_adapters/linux/ \
+       -I$(srcdir)/platform_adapters/unix_common/ \
+       -I$(srcdir)/platform_adapters/ \
+       -I$(srcdir)/sysync/ \
+       -I$(srcdir)/syncml_tk/src/sml/inc/ \
+       -I$(srcdir)/syncml_tk/src/sml/lib/inc/ \
+       -I$(srcdir)/syncml_tk/src/sml/mgr/inc/ 
 
 libsynthesisstubs_la_LDFLAGS = -static
 libsynthesisstubs_la_SOURCES = sysync_SDK/Sources/enginestubs.c
@@ -130,7 +138,7 @@ libsynthesisstubs_la_CPPFLAGS = $(libsynthesissdk_la_CPPFLAGS)
 vpath %.cpp $(srcdir)/sysync_SDK/Sources $(srcdir)/sysync_SDK/SDK
 vpath %.c $(srcdir)/sysync_SDK/Sources $(srcdir)/sysync_SDK/SDK
 vpath %.h $(srcdir)/sysync_SDK/Sources $(srcdir)/sysync_SDK/SDK
-synthesis/sysync_b64.h synthesis/enginemodulebridge.h synthesis/SDK_util.h synthesis/prefix_file.h synthesis/sync_dbapi.h synthesis/enginemodulebase.h synthesis/SDK_support.h synthesis/stringutil.h synthesis/sync_declarations.h synthesis/sync_dbapidef.h synthesis/generic_types.h synthesis/engine_defs.h synthesis/sync_include.h synthesis/timeutil.h synthesis/dbitem.h synthesis/san.h synthesis/blobs.h synthesis/sync_uiapi.h synthesis/admindata.h synthesis/dataconversion.h synthesis/sysync_md5.h synthesis/syerror.h synthesis/UI_util.h: synthesis/%: %
+synthesis/sysync_b64.h synthesis/enginemodulebridge.h synthesis/SDK_util.h synthesis/prefix_file.h synthesis/sync_dbapi.h synthesis/enginemodulebase.h synthesis/SDK_support.h synthesis/stringutil.h synthesis/sync_declarations.h synthesis/sync_dbapidef.h synthesis/lineartime.h synthesis/generic_types.h synthesis/engine_defs.h synthesis/sync_include.h synthesis/timeutil.h synthesis/dbitem.h synthesis/syncexception.h synthesis/san.h synthesis/blobs.h synthesis/sync_uiapi.h synthesis/admindata.h synthesis/dataconversion.h synthesis/sysync_md5.h synthesis/sysync_utils.h synthesis/syerror.h synthesis/UI_util.h: synthesis/%: %
        mkdir -p synthesis
        sed -e 's;# *include  *";#include "synthesis/;' -e 's/defined(HAVE_STDINT_H)/1/' $< >$@
 
index 0a8afe6..fd6bac0 100644 (file)
@@ -116,8 +116,16 @@ libsynthesissdk_la_SOURCES += @LIBSYNTHESISSDK_SOURCES_BOTH@
 endif
 libsynthesissdk_la_CPPFLAGS = \
        -D_GNU_SOURCE=1 \
+       -include $(top_builddir)/config.h \
+       -I$(srcdir)/Targets/ReleasedProducts/SDK \
        -I$(srcdir)/sysync_SDK/Sources \
-       -I$(srcdir)/Targets/ReleasedProducts/SDK
+       -I$(srcdir)/platform_adapters/linux/ \
+       -I$(srcdir)/platform_adapters/unix_common/ \
+       -I$(srcdir)/platform_adapters/ \
+       -I$(srcdir)/sysync/ \
+       -I$(srcdir)/syncml_tk/src/sml/inc/ \
+       -I$(srcdir)/syncml_tk/src/sml/lib/inc/ \
+       -I$(srcdir)/syncml_tk/src/sml/mgr/inc/ 
 
 libsynthesisstubs_la_LDFLAGS = -static
 libsynthesisstubs_la_SOURCES = sysync_SDK/Sources/enginestubs.c
index 1f11838..b9617b4 100644 (file)
@@ -37,8 +37,8 @@ host_triplet = @host@
 @COND_XMLPARSE_TRUE@   expat/xmltok/xmltok_impl.c \
 @COND_XMLPARSE_TRUE@   expat/xmltok/xmltok_ns.c
 
-@COND_STATIC_TRUE@am__append_2 = sysync_SDK/Sources/timeutil.cpp sysync_SDK/Sources/san.cpp sysync_SDK/Sources/enginemodulebridge.cpp sysync_SDK/Sources/UI_util.cpp sysync_SDK/Sources/stringutil.cpp
-@COND_STATIC_FALSE@am__append_3 = sysync_SDK/Sources/sysync_b64.cpp sysync_SDK/Sources/timeutil.cpp sysync_SDK/Sources/sysync_md5.cpp sysync_SDK/Sources/san.cpp sysync_SDK/Sources/enginemodulebridge.cpp sysync_SDK/Sources/SDK_support.cpp sysync_SDK/Sources/SDK_util.c sysync_SDK/Sources/UI_util.cpp sysync_SDK/Sources/enginemodulebase.cpp sysync_SDK/Sources/stringutil.cpp
+@COND_STATIC_TRUE@am__append_2 = sysync_SDK/Sources/timeutil.cpp sysync_SDK/Sources/san.cpp sysync_SDK/Sources/enginemodulebridge.cpp sysync_SDK/Sources/UI_util.cpp
+@COND_STATIC_FALSE@am__append_3 = sysync_SDK/Sources/sysync_b64.cpp sysync_SDK/Sources/timeutil.cpp sysync_SDK/Sources/sysync_md5.cpp sysync_SDK/Sources/syncexception.cpp sysync_SDK/Sources/san.cpp sysync_SDK/Sources/sysync_utils.cpp sysync_SDK/Sources/enginemodulebridge.cpp sysync_SDK/Sources/SDK_support.cpp sysync_SDK/Sources/SDK_util.c sysync_SDK/Sources/lineartime.cpp sysync_SDK/Sources/UI_util.cpp sysync_SDK/Sources/enginemodulebase.cpp sysync_SDK/Sources/stringutil.cpp sysync_SDK/Sources/blobs.cpp
 subdir = src
 DIST_COMMON = $(nobase_include_HEADERS) $(srcdir)/Makefile.am \
        $(srcdir)/Makefile.in
@@ -81,21 +81,19 @@ am__libsynthesis_la_SOURCES_DIST = sysync/binfileimplclient.cpp \
        sysync/syncappbase.cpp sysync/customimplds.cpp \
        sysync/syncsession.h sysync/syncitem.cpp \
        sysync/textitemtype.cpp sysync/textitemtype.h \
-       sysync/localengineds.h sysync/syncexception.cpp \
-       sysync/clientprovisioning_inc.h sysync/global_progress.h \
-       sysync/textprofile.cpp sysync/stringutils.cpp \
-       sysync/customimplagent.cpp sysync/debuglogger.cpp \
-       sysync/vtimezone.cpp sysync/iso8601.h \
+       sysync/localengineds.h sysync/clientprovisioning_inc.h \
+       sysync/global_progress.h sysync/textprofile.cpp \
+       sysync/stringutils.cpp sysync/customimplagent.cpp \
+       sysync/debuglogger.cpp sysync/vtimezone.cpp sysync/iso8601.h \
        sysync/vcalendaritemtype.cpp sysync/scriptcontext.h \
        sysync/syncitemtype.h sysync/smltk_precomp.h \
        sysync/sysync_globs.h sysync/sysync_debug.h \
-       sysync/syncsessiondispatch.h sysync/sysync_utils.cpp \
-       sysync/mimediritemtype.h sysync/dataobjtype.cpp \
-       sysync/multifielditem.cpp sysync/sysync_precomp_xpt.h \
-       sysync/iso8601.cpp sysync/syncclientbase.cpp \
-       sysync/itemfield.h sysync/remotedatastore.h \
-       sysync/engineentry.h sysync/itemfield.cpp sysync/stringutils.h \
-       sysync/lineartime.h sysync/syncml_tk.h \
+       sysync/syncsessiondispatch.h sysync/mimediritemtype.h \
+       sysync/dataobjtype.cpp sysync/multifielditem.cpp \
+       sysync/sysync_precomp_xpt.h sysync/iso8601.cpp \
+       sysync/syncclientbase.cpp sysync/itemfield.h \
+       sysync/remotedatastore.h sysync/engineentry.h \
+       sysync/itemfield.cpp sysync/stringutils.h sysync/syncml_tk.h \
        sysync/mimediritemtype.cpp sysync/configelement.h \
        sysync/clientautosync_inc.cpp sysync/binfilebase.cpp \
        sysync/synccommand.cpp sysync/mimedirprofile.h \
@@ -107,8 +105,7 @@ am__libsynthesis_la_SOURCES_DIST = sysync/binfileimplclient.cpp \
        sysync/customimplagent.h sysync/synccommand.h \
        sysync/binfilebase.h sysync/textprofile.h \
        sysync/vcarditemtype.h sysync/binfileimplds.h \
-       sysync/vcalendaritemtype.h sysync/syncexception.h \
-       sysync/multifielditemtype.cpp sysync/lineartime.cpp \
+       sysync/vcalendaritemtype.h sysync/multifielditemtype.cpp \
        sysync/clientautosync_inc.h sysync/debuglogger.h \
        sysync/smltk_precomp_xpt.h sysync/syncsession.cpp \
        sysync/multifielditemtype.h sysync/stdlogicds.h \
@@ -122,9 +119,8 @@ am__libsynthesis_la_SOURCES_DIST = sysync/binfileimplclient.cpp \
        sysync/stdlogicds.cpp sysync/vtimezone.h sysync/uiapi.cpp \
        sysync/syncagent.h sysync/dataconversion.cpp \
        sysync/timezones.cpp sysync/engineinterface.h \
-       sysync/superdatastore.cpp sysync/sysync_utils.h \
-       sysync/customimplds.h sysync/rrules.cpp \
-       sysync/configelement.cpp sysync/syserial.h \
+       sysync/superdatastore.cpp sysync/customimplds.h \
+       sysync/rrules.cpp sysync/configelement.cpp sysync/syserial.h \
        sysync/syncdatastore.h sysync/mimedirprofile.cpp \
        sysync/stdlogicagent.h DB_interfaces/odbc_db/odbcapids.cpp \
        DB_interfaces/odbc_db/odbcapiagent.h \
@@ -147,23 +143,29 @@ am__libsynthesis_la_SOURCES_DIST = sysync/binfileimplclient.cpp \
        sysync_SDK/Sources/sysync_b64.cpp \
        sysync_SDK/Sources/sysync_md5.cpp \
        sysync_SDK/Sources/sysync_b64.h sysync_SDK/Sources/SDK_util.h \
+       sysync_SDK/Sources/syncexception.cpp \
        sysync_SDK/Sources/prefix_file.h \
        sysync_SDK/Sources/sync_dbapi.h \
        sysync_SDK/Sources/enginemodulebase.h \
+       sysync_SDK/Sources/sysync_utils.cpp \
        sysync_SDK/Sources/SDK_support.h \
        sysync_SDK/Sources/sync_declarations.h \
        sysync_SDK/Sources/sync_dbapidef.h \
+       sysync_SDK/Sources/lineartime.h \
        sysync_SDK/Sources/generic_types.h \
        sysync_SDK/Sources/engine_defs.h \
        sysync_SDK/Sources/sync_include.h \
        sysync_SDK/Sources/SDK_support.cpp \
        sysync_SDK/Sources/SDK_util.c sysync_SDK/Sources/dbitem.h \
-       sysync_SDK/Sources/dbitem.cpp sysync_SDK/Sources/blobs.h \
+       sysync_SDK/Sources/dbitem.cpp \
+       sysync_SDK/Sources/syncexception.h \
+       sysync_SDK/Sources/lineartime.cpp sysync_SDK/Sources/blobs.h \
        sysync_SDK/Sources/enginemodulebase.cpp \
        sysync_SDK/Sources/sync_uiapi.h sysync_SDK/Sources/admindata.h \
        sysync_SDK/Sources/dataconversion.h \
        sysync_SDK/Sources/admindata.cpp sysync_SDK/Sources/blobs.cpp \
-       sysync_SDK/Sources/sysync_md5.h sysync_SDK/Sources/syerror.h \
+       sysync_SDK/Sources/sysync_md5.h \
+       sysync_SDK/Sources/sysync_utils.h sysync_SDK/Sources/syerror.h \
        Transport_interfaces/engine/engine_client_precomp.h \
        Transport_interfaces/engine/enginesessiondispatch.h \
        Transport_interfaces/engine/engine_server_precomp.h \
@@ -220,12 +222,11 @@ am_libsynthesis_la_OBJECTS = libsynthesis_la-binfileimplclient.lo \
        libsynthesis_la-syncagent.lo libsynthesis_la-stdlogicagent.lo \
        libsynthesis_la-syncappbase.lo libsynthesis_la-customimplds.lo \
        libsynthesis_la-syncitem.lo libsynthesis_la-textitemtype.lo \
-       libsynthesis_la-syncexception.lo \
        libsynthesis_la-textprofile.lo libsynthesis_la-stringutils.lo \
        libsynthesis_la-customimplagent.lo \
        libsynthesis_la-debuglogger.lo libsynthesis_la-vtimezone.lo \
        libsynthesis_la-vcalendaritemtype.lo \
-       libsynthesis_la-sysync_utils.lo libsynthesis_la-dataobjtype.lo \
+       libsynthesis_la-dataobjtype.lo \
        libsynthesis_la-multifielditem.lo libsynthesis_la-iso8601.lo \
        libsynthesis_la-syncclientbase.lo libsynthesis_la-itemfield.lo \
        libsynthesis_la-mimediritemtype.lo \
@@ -235,7 +236,7 @@ am_libsynthesis_la_OBJECTS = libsynthesis_la-binfileimplclient.lo \
        libsynthesis_la-sysync_crc16.lo \
        libsynthesis_la-localengineds.lo \
        libsynthesis_la-multifielditemtype.lo \
-       libsynthesis_la-lineartime.lo libsynthesis_la-syncsession.lo \
+       libsynthesis_la-syncsession.lo \
        libsynthesis_la-remotedatastore.lo \
        libsynthesis_la-engineentry.lo libsynthesis_la-simpleitem.lo \
        libsynthesis_la-vcarditemtype.lo \
@@ -252,8 +253,10 @@ am_libsynthesis_la_OBJECTS = libsynthesis_la-binfileimplclient.lo \
        libsynthesis_la-sync_dbapiconnect.lo \
        libsynthesis_la-pluginapids.lo libsynthesis_la-dbapi.lo \
        libsynthesis_la-DLL_interface.lo libsynthesis_la-sysync_b64.lo \
-       libsynthesis_la-sysync_md5.lo libsynthesis_la-SDK_support.lo \
+       libsynthesis_la-sysync_md5.lo libsynthesis_la-syncexception.lo \
+       libsynthesis_la-sysync_utils.lo libsynthesis_la-SDK_support.lo \
        libsynthesis_la-SDK_util.lo libsynthesis_la-dbitem.lo \
+       libsynthesis_la-lineartime.lo \
        libsynthesis_la-enginemodulebase.lo \
        libsynthesis_la-admindata.lo libsynthesis_la-blobs.lo \
        libsynthesis_la-enginesessiondispatch.lo \
@@ -280,36 +283,44 @@ am__libsynthesissdk_la_SOURCES_DIST = synthesis/sysync_b64.h \
        synthesis/prefix_file.h synthesis/sync_dbapi.h \
        synthesis/enginemodulebase.h synthesis/SDK_support.h \
        synthesis/stringutil.h synthesis/sync_declarations.h \
-       synthesis/sync_dbapidef.h synthesis/generic_types.h \
-       synthesis/engine_defs.h synthesis/sync_include.h \
-       synthesis/timeutil.h synthesis/dbitem.h synthesis/san.h \
+       synthesis/sync_dbapidef.h synthesis/lineartime.h \
+       synthesis/generic_types.h synthesis/engine_defs.h \
+       synthesis/sync_include.h synthesis/timeutil.h \
+       synthesis/dbitem.h synthesis/syncexception.h synthesis/san.h \
        synthesis/blobs.h synthesis/sync_uiapi.h synthesis/admindata.h \
        synthesis/dataconversion.h synthesis/sysync_md5.h \
-       synthesis/syerror.h synthesis/UI_util.h \
-       sysync_SDK/Sources/timeutil.cpp sysync_SDK/Sources/san.cpp \
+       synthesis/sysync_utils.h synthesis/syerror.h \
+       synthesis/UI_util.h sysync_SDK/Sources/timeutil.cpp \
+       sysync_SDK/Sources/san.cpp \
        sysync_SDK/Sources/enginemodulebridge.cpp \
        sysync_SDK/Sources/UI_util.cpp \
-       sysync_SDK/Sources/stringutil.cpp \
        sysync_SDK/Sources/sysync_b64.cpp \
        sysync_SDK/Sources/sysync_md5.cpp \
+       sysync_SDK/Sources/syncexception.cpp \
+       sysync_SDK/Sources/sysync_utils.cpp \
        sysync_SDK/Sources/SDK_support.cpp \
        sysync_SDK/Sources/SDK_util.c \
-       sysync_SDK/Sources/enginemodulebase.cpp
+       sysync_SDK/Sources/lineartime.cpp \
+       sysync_SDK/Sources/enginemodulebase.cpp \
+       sysync_SDK/Sources/stringutil.cpp sysync_SDK/Sources/blobs.cpp
 @COND_STATIC_TRUE@am__objects_2 = libsynthesissdk_la-timeutil.lo \
 @COND_STATIC_TRUE@     libsynthesissdk_la-san.lo \
 @COND_STATIC_TRUE@     libsynthesissdk_la-enginemodulebridge.lo \
-@COND_STATIC_TRUE@     libsynthesissdk_la-UI_util.lo \
-@COND_STATIC_TRUE@     libsynthesissdk_la-stringutil.lo
+@COND_STATIC_TRUE@     libsynthesissdk_la-UI_util.lo
 @COND_STATIC_FALSE@am__objects_3 = libsynthesissdk_la-sysync_b64.lo \
 @COND_STATIC_FALSE@    libsynthesissdk_la-timeutil.lo \
 @COND_STATIC_FALSE@    libsynthesissdk_la-sysync_md5.lo \
+@COND_STATIC_FALSE@    libsynthesissdk_la-syncexception.lo \
 @COND_STATIC_FALSE@    libsynthesissdk_la-san.lo \
+@COND_STATIC_FALSE@    libsynthesissdk_la-sysync_utils.lo \
 @COND_STATIC_FALSE@    libsynthesissdk_la-enginemodulebridge.lo \
 @COND_STATIC_FALSE@    libsynthesissdk_la-SDK_support.lo \
 @COND_STATIC_FALSE@    libsynthesissdk_la-SDK_util.lo \
+@COND_STATIC_FALSE@    libsynthesissdk_la-lineartime.lo \
 @COND_STATIC_FALSE@    libsynthesissdk_la-UI_util.lo \
 @COND_STATIC_FALSE@    libsynthesissdk_la-enginemodulebase.lo \
-@COND_STATIC_FALSE@    libsynthesissdk_la-stringutil.lo
+@COND_STATIC_FALSE@    libsynthesissdk_la-stringutil.lo \
+@COND_STATIC_FALSE@    libsynthesissdk_la-blobs.lo
 am_libsynthesissdk_la_OBJECTS = $(am__objects_2) $(am__objects_3)
 libsynthesissdk_la_OBJECTS = $(am_libsynthesissdk_la_OBJECTS)
 libsynthesissdk_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
@@ -493,7 +504,7 @@ ENGINE_AGE = 3
 CLEANFILES = 
 EXTRA_DIST = $(am__append_1)
 lib_LTLIBRARIES = libsmltk.la libsynthesis.la libsynthesissdk.la libsynthesisstubs.la
-nobase_include_HEADERS = synthesis/sysync_b64.h synthesis/enginemodulebridge.h synthesis/SDK_util.h synthesis/prefix_file.h synthesis/sync_dbapi.h synthesis/enginemodulebase.h synthesis/SDK_support.h synthesis/stringutil.h synthesis/sync_declarations.h synthesis/sync_dbapidef.h synthesis/generic_types.h synthesis/engine_defs.h synthesis/sync_include.h synthesis/timeutil.h synthesis/dbitem.h synthesis/san.h synthesis/blobs.h synthesis/sync_uiapi.h synthesis/admindata.h synthesis/dataconversion.h synthesis/sysync_md5.h synthesis/syerror.h synthesis/UI_util.h synthesis/target_options.h
+nobase_include_HEADERS = synthesis/sysync_b64.h synthesis/enginemodulebridge.h synthesis/SDK_util.h synthesis/prefix_file.h synthesis/sync_dbapi.h synthesis/enginemodulebase.h synthesis/SDK_support.h synthesis/stringutil.h synthesis/sync_declarations.h synthesis/sync_dbapidef.h synthesis/lineartime.h synthesis/generic_types.h synthesis/engine_defs.h synthesis/sync_include.h synthesis/timeutil.h synthesis/dbitem.h synthesis/syncexception.h synthesis/san.h synthesis/blobs.h synthesis/sync_uiapi.h synthesis/admindata.h synthesis/dataconversion.h synthesis/sysync_md5.h synthesis/sysync_utils.h synthesis/syerror.h synthesis/UI_util.h synthesis/target_options.h
 
 # Configuration header files are searched in this order:
 # - Targets/ReleasedProducts/autotools: files only used when compiling with autotools
@@ -505,7 +516,7 @@ nobase_include_HEADERS = synthesis/sysync_b64.h synthesis/enginemodulebridge.h s
 #
 # Included as needed:
 # - define.h: hard-coded SyncML Toolkit config (from search path above)
-libsynthesis_la_SOURCES = sysync/binfileimplclient.cpp sysync/syncclientbase.h sysync/syncagent.cpp sysync/syncml_globs.h sysync/stdlogicagent.cpp sysync/syncappbase.cpp sysync/customimplds.cpp sysync/syncsession.h sysync/syncitem.cpp sysync/textitemtype.cpp sysync/textitemtype.h sysync/localengineds.h sysync/syncexception.cpp sysync/clientprovisioning_inc.h sysync/global_progress.h sysync/textprofile.cpp sysync/stringutils.cpp sysync/customimplagent.cpp sysync/debuglogger.cpp sysync/vtimezone.cpp sysync/iso8601.h sysync/vcalendaritemtype.cpp sysync/scriptcontext.h sysync/syncitemtype.h sysync/smltk_precomp.h sysync/sysync_globs.h sysync/sysync_debug.h sysync/syncsessiondispatch.h sysync/sysync_utils.cpp sysync/mimediritemtype.h sysync/dataobjtype.cpp sysync/multifielditem.cpp sysync/sysync_precomp_xpt.h sysync/iso8601.cpp sysync/syncclientbase.cpp sysync/itemfield.h sysync/remotedatastore.h sysync/engineentry.h sysync/itemfield.cpp sysync/stringutils.h sysync/lineartime.h sysync/syncml_tk.h sysync/mimediritemtype.cpp sysync/configelement.h sysync/clientautosync_inc.cpp sysync/binfilebase.cpp sysync/synccommand.cpp sysync/mimedirprofile.h sysync/tz_table.h sysync/binfileimplds.cpp sysync/sysync_crc16.cpp sysync/simpleitem.h sysync/timezones.h sysync/sysync_precomp.h sysync/sysync.h sysync/binfileimplclient.h sysync/syncitem.h sysync/localengineds.cpp sysync/dataobjtype.h sysync/customimplagent.h sysync/synccommand.h sysync/binfilebase.h sysync/textprofile.h sysync/vcarditemtype.h sysync/binfileimplds.h sysync/vcalendaritemtype.h sysync/syncexception.h sysync/multifielditemtype.cpp sysync/lineartime.cpp sysync/clientautosync_inc.h sysync/debuglogger.h sysync/smltk_precomp_xpt.h sysync/syncsession.cpp sysync/multifielditemtype.h sysync/stdlogicds.h sysync/rrules.h sysync/remotedatastore.cpp sysync/engineentry.cpp sysync/simpleitem.cpp sysync/superdatastore.h sysync/uiapi.h sysync/vcarditemtype.cpp sysync/engineinterface.cpp sysync/syncappbase.h sysync/sysync_crc16.h sysync/syncdatastore.cpp sysync/multifielditem.h sysync/scriptcontext.cpp sysync/syncitemtype.cpp sysync/stdlogicds.cpp sysync/vtimezone.h sysync/uiapi.cpp sysync/syncagent.h sysync/dataconversion.cpp sysync/timezones.cpp sysync/engineinterface.h sysync/superdatastore.cpp sysync/sysync_utils.h sysync/customimplds.h sysync/rrules.cpp sysync/configelement.cpp sysync/syserial.h sysync/syncdatastore.h sysync/mimedirprofile.cpp sysync/stdlogicagent.h DB_interfaces/odbc_db/odbcapids.cpp DB_interfaces/odbc_db/odbcapiagent.h DB_interfaces/odbc_db/odbcapiagent.cpp DB_interfaces/odbc_db/odbcdb_precomp.h DB_interfaces/odbc_db/odbcapids.h DB_interfaces/odbc_db/odbcdb.h DB_interfaces/api_db/plugindb.h DB_interfaces/api_db/dbapi.h DB_interfaces/api_db/pluginapiagent.cpp DB_interfaces/api_db/dbapi_include.h DB_interfaces/api_db/sync_dbapiconnect.h DB_interfaces/api_db/pluginapiagent.h DB_interfaces/api_db/sync_dbapiconnect.cpp DB_interfaces/api_db/pluginapids.cpp DB_interfaces/api_db/plugindb_precomp.h DB_interfaces/api_db/dbapi.cpp DB_interfaces/api_db/DLL_interface.h DB_interfaces/api_db/DLL_interface.cpp DB_interfaces/api_db/pluginapids.h sysync_SDK/Sources/sysync_b64.cpp sysync_SDK/Sources/sysync_md5.cpp sysync_SDK/Sources/sysync_b64.h sysync_SDK/Sources/SDK_util.h sysync_SDK/Sources/prefix_file.h sysync_SDK/Sources/sync_dbapi.h sysync_SDK/Sources/enginemodulebase.h sysync_SDK/Sources/SDK_support.h sysync_SDK/Sources/sync_declarations.h sysync_SDK/Sources/sync_dbapidef.h sysync_SDK/Sources/generic_types.h sysync_SDK/Sources/engine_defs.h sysync_SDK/Sources/sync_include.h sysync_SDK/Sources/SDK_support.cpp sysync_SDK/Sources/SDK_util.c sysync_SDK/Sources/dbitem.h sysync_SDK/Sources/dbitem.cpp sysync_SDK/Sources/blobs.h sysync_SDK/Sources/enginemodulebase.cpp sysync_SDK/Sources/sync_uiapi.h sysync_SDK/Sources/admindata.h sysync_SDK/Sources/dataconversion.h sysync_SDK/Sources/admindata.cpp sysync_SDK/Sources/blobs.cpp sysync_SDK/Sources/sysync_md5.h sysync_SDK/Sources/syerror.h Transport_interfaces/engine/engine_client_precomp.h Transport_interfaces/engine/enginesessiondispatch.h Transport_interfaces/engine/engine_server_precomp.h Transport_interfaces/engine/enginesessiondispatch.cpp Transport_interfaces/engine/engine_server.h Transport_interfaces/engine/engineclientbase.cpp Transport_interfaces/engine/engineclientbase.h Transport_interfaces/engine/engine_client.h platform_adapters/sysync_glob_vars.h platform_adapters/configfiles.h platform_adapters/binfile.cpp platform_adapters/sysyncinit.cpp platform_adapters/profiling.h platform_adapters/linux/platform_DLL.cpp platform_adapters/linux/profiling.cpp platform_adapters/linux/platform_exec.h platform_adapters/linux/configfiles.cpp platform_adapters/linux/platform_time.cpp platform_adapters/linux/platform_exec.c platform_adapters/linux/platform_headers.h platform_adapters/linux/platform_timezones.cpp platform_adapters/linux/platform_time.h platform_adapters/binfile.h platform_adapters/platform_thread.h platform_adapters/platform_DLL.h platform_adapters/unix_common/platform_pipe.c platform_adapters/unix_common/platform_file.cpp platform_adapters/unix_common/platform_pipe.h platform_adapters/unix_common/platform_mutex.cpp platform_adapters/platform_file.h platform_adapters/platform_headers.h platform_adapters/platform_mutex.h syncapps/clientEngine_custom/clientengine_custom_Base.h syncapps/clientEngine_custom/clientengine_custom_Base.cpp syncapps/clientEngine_custom/product_options.h syncapps/clientEngine_custom/clientengine_custom_precomp.h syncapps/clientEngine_custom/clientengine_custom.h syncapps/serverEngine_custom/serverengine_custom.h syncapps/serverEngine_custom/serverengine_custom_Base.cpp syncapps/serverEngine_custom/serverengine_custom_Base.h syncapps/serverEngine_custom/combi_product_options.h syncapps/serverEngine_custom/product_options.h syncapps/serverEngine_custom/serverengine_custom_precomp.h sysync_SDK/DB_Interfaces/text_db/sync_dbapi_text.cpp \
+libsynthesis_la_SOURCES = sysync/binfileimplclient.cpp sysync/syncclientbase.h sysync/syncagent.cpp sysync/syncml_globs.h sysync/stdlogicagent.cpp sysync/syncappbase.cpp sysync/customimplds.cpp sysync/syncsession.h sysync/syncitem.cpp sysync/textitemtype.cpp sysync/textitemtype.h sysync/localengineds.h sysync/clientprovisioning_inc.h sysync/global_progress.h sysync/textprofile.cpp sysync/stringutils.cpp sysync/customimplagent.cpp sysync/debuglogger.cpp sysync/vtimezone.cpp sysync/iso8601.h sysync/vcalendaritemtype.cpp sysync/scriptcontext.h sysync/syncitemtype.h sysync/smltk_precomp.h sysync/sysync_globs.h sysync/sysync_debug.h sysync/syncsessiondispatch.h sysync/mimediritemtype.h sysync/dataobjtype.cpp sysync/multifielditem.cpp sysync/sysync_precomp_xpt.h sysync/iso8601.cpp sysync/syncclientbase.cpp sysync/itemfield.h sysync/remotedatastore.h sysync/engineentry.h sysync/itemfield.cpp sysync/stringutils.h sysync/syncml_tk.h sysync/mimediritemtype.cpp sysync/configelement.h sysync/clientautosync_inc.cpp sysync/binfilebase.cpp sysync/synccommand.cpp sysync/mimedirprofile.h sysync/tz_table.h sysync/binfileimplds.cpp sysync/sysync_crc16.cpp sysync/simpleitem.h sysync/timezones.h sysync/sysync_precomp.h sysync/sysync.h sysync/binfileimplclient.h sysync/syncitem.h sysync/localengineds.cpp sysync/dataobjtype.h sysync/customimplagent.h sysync/synccommand.h sysync/binfilebase.h sysync/textprofile.h sysync/vcarditemtype.h sysync/binfileimplds.h sysync/vcalendaritemtype.h sysync/multifielditemtype.cpp sysync/clientautosync_inc.h sysync/debuglogger.h sysync/smltk_precomp_xpt.h sysync/syncsession.cpp sysync/multifielditemtype.h sysync/stdlogicds.h sysync/rrules.h sysync/remotedatastore.cpp sysync/engineentry.cpp sysync/simpleitem.cpp sysync/superdatastore.h sysync/uiapi.h sysync/vcarditemtype.cpp sysync/engineinterface.cpp sysync/syncappbase.h sysync/sysync_crc16.h sysync/syncdatastore.cpp sysync/multifielditem.h sysync/scriptcontext.cpp sysync/syncitemtype.cpp sysync/stdlogicds.cpp sysync/vtimezone.h sysync/uiapi.cpp sysync/syncagent.h sysync/dataconversion.cpp sysync/timezones.cpp sysync/engineinterface.h sysync/superdatastore.cpp sysync/customimplds.h sysync/rrules.cpp sysync/configelement.cpp sysync/syserial.h sysync/syncdatastore.h sysync/mimedirprofile.cpp sysync/stdlogicagent.h DB_interfaces/odbc_db/odbcapids.cpp DB_interfaces/odbc_db/odbcapiagent.h DB_interfaces/odbc_db/odbcapiagent.cpp DB_interfaces/odbc_db/odbcdb_precomp.h DB_interfaces/odbc_db/odbcapids.h DB_interfaces/odbc_db/odbcdb.h DB_interfaces/api_db/plugindb.h DB_interfaces/api_db/dbapi.h DB_interfaces/api_db/pluginapiagent.cpp DB_interfaces/api_db/dbapi_include.h DB_interfaces/api_db/sync_dbapiconnect.h DB_interfaces/api_db/pluginapiagent.h DB_interfaces/api_db/sync_dbapiconnect.cpp DB_interfaces/api_db/pluginapids.cpp DB_interfaces/api_db/plugindb_precomp.h DB_interfaces/api_db/dbapi.cpp DB_interfaces/api_db/DLL_interface.h DB_interfaces/api_db/DLL_interface.cpp DB_interfaces/api_db/pluginapids.h sysync_SDK/Sources/sysync_b64.cpp sysync_SDK/Sources/sysync_md5.cpp sysync_SDK/Sources/sysync_b64.h sysync_SDK/Sources/SDK_util.h sysync_SDK/Sources/syncexception.cpp sysync_SDK/Sources/prefix_file.h sysync_SDK/Sources/sync_dbapi.h sysync_SDK/Sources/enginemodulebase.h sysync_SDK/Sources/sysync_utils.cpp sysync_SDK/Sources/SDK_support.h sysync_SDK/Sources/sync_declarations.h sysync_SDK/Sources/sync_dbapidef.h sysync_SDK/Sources/lineartime.h sysync_SDK/Sources/generic_types.h sysync_SDK/Sources/engine_defs.h sysync_SDK/Sources/sync_include.h sysync_SDK/Sources/SDK_support.cpp sysync_SDK/Sources/SDK_util.c sysync_SDK/Sources/dbitem.h sysync_SDK/Sources/dbitem.cpp sysync_SDK/Sources/syncexception.h sysync_SDK/Sources/lineartime.cpp sysync_SDK/Sources/blobs.h sysync_SDK/Sources/enginemodulebase.cpp sysync_SDK/Sources/sync_uiapi.h sysync_SDK/Sources/admindata.h sysync_SDK/Sources/dataconversion.h sysync_SDK/Sources/admindata.cpp sysync_SDK/Sources/blobs.cpp sysync_SDK/Sources/sysync_md5.h sysync_SDK/Sources/sysync_utils.h sysync_SDK/Sources/syerror.h Transport_interfaces/engine/engine_client_precomp.h Transport_interfaces/engine/enginesessiondispatch.h Transport_interfaces/engine/engine_server_precomp.h Transport_interfaces/engine/enginesessiondispatch.cpp Transport_interfaces/engine/engine_server.h Transport_interfaces/engine/engineclientbase.cpp Transport_interfaces/engine/engineclientbase.h Transport_interfaces/engine/engine_client.h platform_adapters/sysync_glob_vars.h platform_adapters/configfiles.h platform_adapters/binfile.cpp platform_adapters/sysyncinit.cpp platform_adapters/profiling.h platform_adapters/linux/platform_DLL.cpp platform_adapters/linux/profiling.cpp platform_adapters/linux/platform_exec.h platform_adapters/linux/configfiles.cpp platform_adapters/linux/platform_time.cpp platform_adapters/linux/platform_exec.c platform_adapters/linux/platform_headers.h platform_adapters/linux/platform_timezones.cpp platform_adapters/linux/platform_time.h platform_adapters/binfile.h platform_adapters/platform_thread.h platform_adapters/platform_DLL.h platform_adapters/unix_common/platform_pipe.c platform_adapters/unix_common/platform_file.cpp platform_adapters/unix_common/platform_pipe.h platform_adapters/unix_common/platform_mutex.cpp platform_adapters/platform_file.h platform_adapters/platform_headers.h platform_adapters/platform_mutex.h syncapps/clientEngine_custom/clientengine_custom_Base.h syncapps/clientEngine_custom/clientengine_custom_Base.cpp syncapps/clientEngine_custom/product_options.h syncapps/clientEngine_custom/clientengine_custom_precomp.h syncapps/clientEngine_custom/clientengine_custom.h syncapps/serverEngine_custom/serverengine_custom.h syncapps/serverEngine_custom/serverengine_custom_Base.cpp syncapps/serverEngine_custom/serverengine_custom_Base.h syncapps/serverEngine_custom/combi_product_options.h syncapps/serverEngine_custom/product_options.h syncapps/serverEngine_custom/serverengine_custom_precomp.h sysync_SDK/DB_Interfaces/text_db/sync_dbapi_text.cpp \
        $(XMLPARSE_SOURCES)
 
 libsynthesis_la_CPPFLAGS = -I$(srcdir)/sysync_SDK/Sources
@@ -572,17 +583,26 @@ libsynthesissdk_la_SOURCES = synthesis/sysync_b64.h \
        synthesis/prefix_file.h synthesis/sync_dbapi.h \
        synthesis/enginemodulebase.h synthesis/SDK_support.h \
        synthesis/stringutil.h synthesis/sync_declarations.h \
-       synthesis/sync_dbapidef.h synthesis/generic_types.h \
-       synthesis/engine_defs.h synthesis/sync_include.h \
-       synthesis/timeutil.h synthesis/dbitem.h synthesis/san.h \
+       synthesis/sync_dbapidef.h synthesis/lineartime.h \
+       synthesis/generic_types.h synthesis/engine_defs.h \
+       synthesis/sync_include.h synthesis/timeutil.h \
+       synthesis/dbitem.h synthesis/syncexception.h synthesis/san.h \
        synthesis/blobs.h synthesis/sync_uiapi.h synthesis/admindata.h \
        synthesis/dataconversion.h synthesis/sysync_md5.h \
-       synthesis/syerror.h synthesis/UI_util.h $(am__append_2) \
-       $(am__append_3)
+       synthesis/sysync_utils.h synthesis/syerror.h \
+       synthesis/UI_util.h $(am__append_2) $(am__append_3)
 libsynthesissdk_la_CPPFLAGS = \
        -D_GNU_SOURCE=1 \
+       -include $(top_builddir)/config.h \
+       -I$(srcdir)/Targets/ReleasedProducts/SDK \
        -I$(srcdir)/sysync_SDK/Sources \
-       -I$(srcdir)/Targets/ReleasedProducts/SDK
+       -I$(srcdir)/platform_adapters/linux/ \
+       -I$(srcdir)/platform_adapters/unix_common/ \
+       -I$(srcdir)/platform_adapters/ \
+       -I$(srcdir)/sysync/ \
+       -I$(srcdir)/syncml_tk/src/sml/inc/ \
+       -I$(srcdir)/syncml_tk/src/sml/lib/inc/ \
+       -I$(srcdir)/syncml_tk/src/sml/mgr/inc/ 
 
 libsynthesisstubs_la_LDFLAGS = -static
 libsynthesisstubs_la_SOURCES = sysync_SDK/Sources/enginestubs.c
@@ -823,12 +843,16 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsynthesissdk_la-SDK_support.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsynthesissdk_la-SDK_util.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsynthesissdk_la-UI_util.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsynthesissdk_la-blobs.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsynthesissdk_la-enginemodulebase.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsynthesissdk_la-enginemodulebridge.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsynthesissdk_la-lineartime.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsynthesissdk_la-san.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsynthesissdk_la-stringutil.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsynthesissdk_la-syncexception.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsynthesissdk_la-sysync_b64.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsynthesissdk_la-sysync_md5.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsynthesissdk_la-sysync_utils.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsynthesissdk_la-timeutil.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsynthesisstubs_la-enginestubs.Plo@am__quote@
 
@@ -1133,13 +1157,6 @@ libsynthesis_la-textitemtype.lo: sysync/textitemtype.cpp
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o libsynthesis_la-textitemtype.lo `test -f 'sysync/textitemtype.cpp' || echo '$(srcdir)/'`sysync/textitemtype.cpp
 
-libsynthesis_la-syncexception.lo: sysync/syncexception.cpp
-@am__fastdepCXX_TRUE@  $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT libsynthesis_la-syncexception.lo -MD -MP -MF $(DEPDIR)/libsynthesis_la-syncexception.Tpo -c -o libsynthesis_la-syncexception.lo `test -f 'sysync/syncexception.cpp' || echo '$(srcdir)/'`sysync/syncexception.cpp
-@am__fastdepCXX_TRUE@  mv -f $(DEPDIR)/libsynthesis_la-syncexception.Tpo $(DEPDIR)/libsynthesis_la-syncexception.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='sysync/syncexception.cpp' object='libsynthesis_la-syncexception.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o libsynthesis_la-syncexception.lo `test -f 'sysync/syncexception.cpp' || echo '$(srcdir)/'`sysync/syncexception.cpp
-
 libsynthesis_la-textprofile.lo: sysync/textprofile.cpp
 @am__fastdepCXX_TRUE@  $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT libsynthesis_la-textprofile.lo -MD -MP -MF $(DEPDIR)/libsynthesis_la-textprofile.Tpo -c -o libsynthesis_la-textprofile.lo `test -f 'sysync/textprofile.cpp' || echo '$(srcdir)/'`sysync/textprofile.cpp
 @am__fastdepCXX_TRUE@  mv -f $(DEPDIR)/libsynthesis_la-textprofile.Tpo $(DEPDIR)/libsynthesis_la-textprofile.Plo
@@ -1182,13 +1199,6 @@ libsynthesis_la-vcalendaritemtype.lo: sysync/vcalendaritemtype.cpp
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o libsynthesis_la-vcalendaritemtype.lo `test -f 'sysync/vcalendaritemtype.cpp' || echo '$(srcdir)/'`sysync/vcalendaritemtype.cpp
 
-libsynthesis_la-sysync_utils.lo: sysync/sysync_utils.cpp
-@am__fastdepCXX_TRUE@  $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT libsynthesis_la-sysync_utils.lo -MD -MP -MF $(DEPDIR)/libsynthesis_la-sysync_utils.Tpo -c -o libsynthesis_la-sysync_utils.lo `test -f 'sysync/sysync_utils.cpp' || echo '$(srcdir)/'`sysync/sysync_utils.cpp
-@am__fastdepCXX_TRUE@  mv -f $(DEPDIR)/libsynthesis_la-sysync_utils.Tpo $(DEPDIR)/libsynthesis_la-sysync_utils.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='sysync/sysync_utils.cpp' object='libsynthesis_la-sysync_utils.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o libsynthesis_la-sysync_utils.lo `test -f 'sysync/sysync_utils.cpp' || echo '$(srcdir)/'`sysync/sysync_utils.cpp
-
 libsynthesis_la-dataobjtype.lo: sysync/dataobjtype.cpp
 @am__fastdepCXX_TRUE@  $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT libsynthesis_la-dataobjtype.lo -MD -MP -MF $(DEPDIR)/libsynthesis_la-dataobjtype.Tpo -c -o libsynthesis_la-dataobjtype.lo `test -f 'sysync/dataobjtype.cpp' || echo '$(srcdir)/'`sysync/dataobjtype.cpp
 @am__fastdepCXX_TRUE@  mv -f $(DEPDIR)/libsynthesis_la-dataobjtype.Tpo $(DEPDIR)/libsynthesis_la-dataobjtype.Plo
@@ -1280,13 +1290,6 @@ libsynthesis_la-multifielditemtype.lo: sysync/multifielditemtype.cpp
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o libsynthesis_la-multifielditemtype.lo `test -f 'sysync/multifielditemtype.cpp' || echo '$(srcdir)/'`sysync/multifielditemtype.cpp
 
-libsynthesis_la-lineartime.lo: sysync/lineartime.cpp
-@am__fastdepCXX_TRUE@  $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT libsynthesis_la-lineartime.lo -MD -MP -MF $(DEPDIR)/libsynthesis_la-lineartime.Tpo -c -o libsynthesis_la-lineartime.lo `test -f 'sysync/lineartime.cpp' || echo '$(srcdir)/'`sysync/lineartime.cpp
-@am__fastdepCXX_TRUE@  mv -f $(DEPDIR)/libsynthesis_la-lineartime.Tpo $(DEPDIR)/libsynthesis_la-lineartime.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='sysync/lineartime.cpp' object='libsynthesis_la-lineartime.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o libsynthesis_la-lineartime.lo `test -f 'sysync/lineartime.cpp' || echo '$(srcdir)/'`sysync/lineartime.cpp
-
 libsynthesis_la-syncsession.lo: sysync/syncsession.cpp
 @am__fastdepCXX_TRUE@  $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT libsynthesis_la-syncsession.lo -MD -MP -MF $(DEPDIR)/libsynthesis_la-syncsession.Tpo -c -o libsynthesis_la-syncsession.lo `test -f 'sysync/syncsession.cpp' || echo '$(srcdir)/'`sysync/syncsession.cpp
 @am__fastdepCXX_TRUE@  mv -f $(DEPDIR)/libsynthesis_la-syncsession.Tpo $(DEPDIR)/libsynthesis_la-syncsession.Plo
@@ -1469,6 +1472,20 @@ libsynthesis_la-sysync_md5.lo: sysync_SDK/Sources/sysync_md5.cpp
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o libsynthesis_la-sysync_md5.lo `test -f 'sysync_SDK/Sources/sysync_md5.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/sysync_md5.cpp
 
+libsynthesis_la-syncexception.lo: sysync_SDK/Sources/syncexception.cpp
+@am__fastdepCXX_TRUE@  $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT libsynthesis_la-syncexception.lo -MD -MP -MF $(DEPDIR)/libsynthesis_la-syncexception.Tpo -c -o libsynthesis_la-syncexception.lo `test -f 'sysync_SDK/Sources/syncexception.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/syncexception.cpp
+@am__fastdepCXX_TRUE@  mv -f $(DEPDIR)/libsynthesis_la-syncexception.Tpo $(DEPDIR)/libsynthesis_la-syncexception.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='sysync_SDK/Sources/syncexception.cpp' object='libsynthesis_la-syncexception.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o libsynthesis_la-syncexception.lo `test -f 'sysync_SDK/Sources/syncexception.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/syncexception.cpp
+
+libsynthesis_la-sysync_utils.lo: sysync_SDK/Sources/sysync_utils.cpp
+@am__fastdepCXX_TRUE@  $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT libsynthesis_la-sysync_utils.lo -MD -MP -MF $(DEPDIR)/libsynthesis_la-sysync_utils.Tpo -c -o libsynthesis_la-sysync_utils.lo `test -f 'sysync_SDK/Sources/sysync_utils.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/sysync_utils.cpp
+@am__fastdepCXX_TRUE@  mv -f $(DEPDIR)/libsynthesis_la-sysync_utils.Tpo $(DEPDIR)/libsynthesis_la-sysync_utils.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='sysync_SDK/Sources/sysync_utils.cpp' object='libsynthesis_la-sysync_utils.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o libsynthesis_la-sysync_utils.lo `test -f 'sysync_SDK/Sources/sysync_utils.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/sysync_utils.cpp
+
 libsynthesis_la-SDK_support.lo: sysync_SDK/Sources/SDK_support.cpp
 @am__fastdepCXX_TRUE@  $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT libsynthesis_la-SDK_support.lo -MD -MP -MF $(DEPDIR)/libsynthesis_la-SDK_support.Tpo -c -o libsynthesis_la-SDK_support.lo `test -f 'sysync_SDK/Sources/SDK_support.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/SDK_support.cpp
 @am__fastdepCXX_TRUE@  mv -f $(DEPDIR)/libsynthesis_la-SDK_support.Tpo $(DEPDIR)/libsynthesis_la-SDK_support.Plo
@@ -1483,6 +1500,13 @@ libsynthesis_la-dbitem.lo: sysync_SDK/Sources/dbitem.cpp
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o libsynthesis_la-dbitem.lo `test -f 'sysync_SDK/Sources/dbitem.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/dbitem.cpp
 
+libsynthesis_la-lineartime.lo: sysync_SDK/Sources/lineartime.cpp
+@am__fastdepCXX_TRUE@  $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT libsynthesis_la-lineartime.lo -MD -MP -MF $(DEPDIR)/libsynthesis_la-lineartime.Tpo -c -o libsynthesis_la-lineartime.lo `test -f 'sysync_SDK/Sources/lineartime.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/lineartime.cpp
+@am__fastdepCXX_TRUE@  mv -f $(DEPDIR)/libsynthesis_la-lineartime.Tpo $(DEPDIR)/libsynthesis_la-lineartime.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='sysync_SDK/Sources/lineartime.cpp' object='libsynthesis_la-lineartime.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o libsynthesis_la-lineartime.lo `test -f 'sysync_SDK/Sources/lineartime.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/lineartime.cpp
+
 libsynthesis_la-enginemodulebase.lo: sysync_SDK/Sources/enginemodulebase.cpp
 @am__fastdepCXX_TRUE@  $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT libsynthesis_la-enginemodulebase.lo -MD -MP -MF $(DEPDIR)/libsynthesis_la-enginemodulebase.Tpo -c -o libsynthesis_la-enginemodulebase.lo `test -f 'sysync_SDK/Sources/enginemodulebase.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/enginemodulebase.cpp
 @am__fastdepCXX_TRUE@  mv -f $(DEPDIR)/libsynthesis_la-enginemodulebase.Tpo $(DEPDIR)/libsynthesis_la-enginemodulebase.Plo
@@ -1630,13 +1654,6 @@ libsynthesissdk_la-UI_util.lo: sysync_SDK/Sources/UI_util.cpp
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsynthesissdk_la-UI_util.lo `test -f 'sysync_SDK/Sources/UI_util.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/UI_util.cpp
 
-libsynthesissdk_la-stringutil.lo: sysync_SDK/Sources/stringutil.cpp
-@am__fastdepCXX_TRUE@  $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsynthesissdk_la-stringutil.lo -MD -MP -MF $(DEPDIR)/libsynthesissdk_la-stringutil.Tpo -c -o libsynthesissdk_la-stringutil.lo `test -f 'sysync_SDK/Sources/stringutil.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/stringutil.cpp
-@am__fastdepCXX_TRUE@  mv -f $(DEPDIR)/libsynthesissdk_la-stringutil.Tpo $(DEPDIR)/libsynthesissdk_la-stringutil.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='sysync_SDK/Sources/stringutil.cpp' object='libsynthesissdk_la-stringutil.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsynthesissdk_la-stringutil.lo `test -f 'sysync_SDK/Sources/stringutil.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/stringutil.cpp
-
 libsynthesissdk_la-sysync_b64.lo: sysync_SDK/Sources/sysync_b64.cpp
 @am__fastdepCXX_TRUE@  $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsynthesissdk_la-sysync_b64.lo -MD -MP -MF $(DEPDIR)/libsynthesissdk_la-sysync_b64.Tpo -c -o libsynthesissdk_la-sysync_b64.lo `test -f 'sysync_SDK/Sources/sysync_b64.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/sysync_b64.cpp
 @am__fastdepCXX_TRUE@  mv -f $(DEPDIR)/libsynthesissdk_la-sysync_b64.Tpo $(DEPDIR)/libsynthesissdk_la-sysync_b64.Plo
@@ -1651,6 +1668,20 @@ libsynthesissdk_la-sysync_md5.lo: sysync_SDK/Sources/sysync_md5.cpp
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsynthesissdk_la-sysync_md5.lo `test -f 'sysync_SDK/Sources/sysync_md5.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/sysync_md5.cpp
 
+libsynthesissdk_la-syncexception.lo: sysync_SDK/Sources/syncexception.cpp
+@am__fastdepCXX_TRUE@  $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsynthesissdk_la-syncexception.lo -MD -MP -MF $(DEPDIR)/libsynthesissdk_la-syncexception.Tpo -c -o libsynthesissdk_la-syncexception.lo `test -f 'sysync_SDK/Sources/syncexception.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/syncexception.cpp
+@am__fastdepCXX_TRUE@  mv -f $(DEPDIR)/libsynthesissdk_la-syncexception.Tpo $(DEPDIR)/libsynthesissdk_la-syncexception.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='sysync_SDK/Sources/syncexception.cpp' object='libsynthesissdk_la-syncexception.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsynthesissdk_la-syncexception.lo `test -f 'sysync_SDK/Sources/syncexception.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/syncexception.cpp
+
+libsynthesissdk_la-sysync_utils.lo: sysync_SDK/Sources/sysync_utils.cpp
+@am__fastdepCXX_TRUE@  $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsynthesissdk_la-sysync_utils.lo -MD -MP -MF $(DEPDIR)/libsynthesissdk_la-sysync_utils.Tpo -c -o libsynthesissdk_la-sysync_utils.lo `test -f 'sysync_SDK/Sources/sysync_utils.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/sysync_utils.cpp
+@am__fastdepCXX_TRUE@  mv -f $(DEPDIR)/libsynthesissdk_la-sysync_utils.Tpo $(DEPDIR)/libsynthesissdk_la-sysync_utils.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='sysync_SDK/Sources/sysync_utils.cpp' object='libsynthesissdk_la-sysync_utils.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsynthesissdk_la-sysync_utils.lo `test -f 'sysync_SDK/Sources/sysync_utils.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/sysync_utils.cpp
+
 libsynthesissdk_la-SDK_support.lo: sysync_SDK/Sources/SDK_support.cpp
 @am__fastdepCXX_TRUE@  $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsynthesissdk_la-SDK_support.lo -MD -MP -MF $(DEPDIR)/libsynthesissdk_la-SDK_support.Tpo -c -o libsynthesissdk_la-SDK_support.lo `test -f 'sysync_SDK/Sources/SDK_support.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/SDK_support.cpp
 @am__fastdepCXX_TRUE@  mv -f $(DEPDIR)/libsynthesissdk_la-SDK_support.Tpo $(DEPDIR)/libsynthesissdk_la-SDK_support.Plo
@@ -1658,6 +1689,13 @@ libsynthesissdk_la-SDK_support.lo: sysync_SDK/Sources/SDK_support.cpp
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsynthesissdk_la-SDK_support.lo `test -f 'sysync_SDK/Sources/SDK_support.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/SDK_support.cpp
 
+libsynthesissdk_la-lineartime.lo: sysync_SDK/Sources/lineartime.cpp
+@am__fastdepCXX_TRUE@  $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsynthesissdk_la-lineartime.lo -MD -MP -MF $(DEPDIR)/libsynthesissdk_la-lineartime.Tpo -c -o libsynthesissdk_la-lineartime.lo `test -f 'sysync_SDK/Sources/lineartime.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/lineartime.cpp
+@am__fastdepCXX_TRUE@  mv -f $(DEPDIR)/libsynthesissdk_la-lineartime.Tpo $(DEPDIR)/libsynthesissdk_la-lineartime.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='sysync_SDK/Sources/lineartime.cpp' object='libsynthesissdk_la-lineartime.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsynthesissdk_la-lineartime.lo `test -f 'sysync_SDK/Sources/lineartime.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/lineartime.cpp
+
 libsynthesissdk_la-enginemodulebase.lo: sysync_SDK/Sources/enginemodulebase.cpp
 @am__fastdepCXX_TRUE@  $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsynthesissdk_la-enginemodulebase.lo -MD -MP -MF $(DEPDIR)/libsynthesissdk_la-enginemodulebase.Tpo -c -o libsynthesissdk_la-enginemodulebase.lo `test -f 'sysync_SDK/Sources/enginemodulebase.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/enginemodulebase.cpp
 @am__fastdepCXX_TRUE@  mv -f $(DEPDIR)/libsynthesissdk_la-enginemodulebase.Tpo $(DEPDIR)/libsynthesissdk_la-enginemodulebase.Plo
@@ -1665,6 +1703,20 @@ libsynthesissdk_la-enginemodulebase.lo: sysync_SDK/Sources/enginemodulebase.cpp
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsynthesissdk_la-enginemodulebase.lo `test -f 'sysync_SDK/Sources/enginemodulebase.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/enginemodulebase.cpp
 
+libsynthesissdk_la-stringutil.lo: sysync_SDK/Sources/stringutil.cpp
+@am__fastdepCXX_TRUE@  $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsynthesissdk_la-stringutil.lo -MD -MP -MF $(DEPDIR)/libsynthesissdk_la-stringutil.Tpo -c -o libsynthesissdk_la-stringutil.lo `test -f 'sysync_SDK/Sources/stringutil.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/stringutil.cpp
+@am__fastdepCXX_TRUE@  mv -f $(DEPDIR)/libsynthesissdk_la-stringutil.Tpo $(DEPDIR)/libsynthesissdk_la-stringutil.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='sysync_SDK/Sources/stringutil.cpp' object='libsynthesissdk_la-stringutil.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsynthesissdk_la-stringutil.lo `test -f 'sysync_SDK/Sources/stringutil.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/stringutil.cpp
+
+libsynthesissdk_la-blobs.lo: sysync_SDK/Sources/blobs.cpp
+@am__fastdepCXX_TRUE@  $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsynthesissdk_la-blobs.lo -MD -MP -MF $(DEPDIR)/libsynthesissdk_la-blobs.Tpo -c -o libsynthesissdk_la-blobs.lo `test -f 'sysync_SDK/Sources/blobs.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/blobs.cpp
+@am__fastdepCXX_TRUE@  mv -f $(DEPDIR)/libsynthesissdk_la-blobs.Tpo $(DEPDIR)/libsynthesissdk_la-blobs.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='sysync_SDK/Sources/blobs.cpp' object='libsynthesissdk_la-blobs.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsynthesissdk_la-blobs.lo `test -f 'sysync_SDK/Sources/blobs.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/blobs.cpp
+
 mostlyclean-libtool:
        -rm -f *.lo
 
@@ -1891,7 +1943,7 @@ $(srcdir)/Makefile.am: $(srcdir)/Makefile.am.in $(srcdir)/gen-makefile-am.sh
 vpath %.cpp $(srcdir)/sysync_SDK/Sources $(srcdir)/sysync_SDK/SDK
 vpath %.c $(srcdir)/sysync_SDK/Sources $(srcdir)/sysync_SDK/SDK
 vpath %.h $(srcdir)/sysync_SDK/Sources $(srcdir)/sysync_SDK/SDK
-synthesis/sysync_b64.h synthesis/enginemodulebridge.h synthesis/SDK_util.h synthesis/prefix_file.h synthesis/sync_dbapi.h synthesis/enginemodulebase.h synthesis/SDK_support.h synthesis/stringutil.h synthesis/sync_declarations.h synthesis/sync_dbapidef.h synthesis/generic_types.h synthesis/engine_defs.h synthesis/sync_include.h synthesis/timeutil.h synthesis/dbitem.h synthesis/san.h synthesis/blobs.h synthesis/sync_uiapi.h synthesis/admindata.h synthesis/dataconversion.h synthesis/sysync_md5.h synthesis/syerror.h synthesis/UI_util.h: synthesis/%: %
+synthesis/sysync_b64.h synthesis/enginemodulebridge.h synthesis/SDK_util.h synthesis/prefix_file.h synthesis/sync_dbapi.h synthesis/enginemodulebase.h synthesis/SDK_support.h synthesis/stringutil.h synthesis/sync_declarations.h synthesis/sync_dbapidef.h synthesis/lineartime.h synthesis/generic_types.h synthesis/engine_defs.h synthesis/sync_include.h synthesis/timeutil.h synthesis/dbitem.h synthesis/syncexception.h synthesis/san.h synthesis/blobs.h synthesis/sync_uiapi.h synthesis/admindata.h synthesis/dataconversion.h synthesis/sysync_md5.h synthesis/sysync_utils.h synthesis/syerror.h synthesis/UI_util.h: synthesis/%: %
        mkdir -p synthesis
        sed -e 's;# *include  *";#include "synthesis/;' -e 's/defined(HAVE_STDINT_H)/1/' $< >$@
 
diff --git a/src/synthesis/src/SDK_EXCLUDE_FILES b/src/synthesis/src/SDK_EXCLUDE_FILES
new file mode 100644 (file)
index 0000000..ff02b79
--- /dev/null
@@ -0,0 +1,2 @@
+stringutil.cpp
+stringutil.h
index 0151e97..c180216 100644 (file)
@@ -1,7 +1,5 @@
 enginemodulebridge.cpp
 enginemodulebridge.h
-stringutil.cpp
-stringutil.h
 target_options.h
 san.cpp
 san.h
index be37fe0..8784b3e 100644 (file)
@@ -2,7 +2,5 @@ admindata.cpp
 admindata.h
 dbitem.cpp
 dbitem.h
-blobs.cpp
-blobs.h
 enginesessiondispatch.cpp
 syncserver.cpp
diff --git a/src/synthesis/src/Targets/ReleasedProducts/SDK/define.h b/src/synthesis/src/Targets/ReleasedProducts/SDK/define.h
new file mode 100644 (file)
index 0000000..42b2247
--- /dev/null
@@ -0,0 +1,119 @@
+
+// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+// NOTE: this is a local copy for this specific target
+// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+
+
+/*************************************************************************/
+/* module:          Compiler Flag Definition File                        */
+/* file:            define.h                                             */
+/* target system:   win                                                  */
+/* target OS:       win                                                  */
+/*************************************************************************/
+
+/*
+ * Copyright Notice
+ * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication
+ * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc.,
+ * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001).
+ * All Rights Reserved.
+ * Implementation of all or part of any Specification may require
+ * licenses under third party intellectual property rights,
+ * including without limitation, patent rights (such a third party
+ * may or may not be a Supporter). The Sponsors of the Specification
+ * are not responsible and shall not be held responsible in any
+ * manner for identifying or failing to identify any or all such
+ * third party intellectual property rights.
+ *
+ * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED
+ * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM,
+ * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA,
+ * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML
+ * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
+ * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT
+ * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO.,
+ * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY
+ * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF
+ * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF
+ * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL,
+ * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH
+ * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE.
+ *
+ * The above notice and this paragraph must be included on all copies
+ * of this document that are made.
+ *
+ */
+
+/**
+ * File for Windows Specific Compiler Flags
+ */
+
+#ifndef _DEFINE_H
+  #define _DEFINE_H
+#define __ANSI_C__
+
+
+/* thread safety (added by luz@synthesis.ch, 2001-10-29) */
+/* Note: moved define of this to target_options.h of every target */
+#undef __MAKE_THREADSAFE
+
+/* enable Alloc helpers */
+#define __USE_ALLOCFUNCS__
+
+/* do we need WBXML (binary XML) processing ? */
+#define __SML_WBXML__
+/* do we need the capability to decode plain text tokens in WBXML? */
+#define __SML_WBXML_TEXTTOKENS__
+/* do we need XML processing ? */
+#define __SML_XML__
+/* are we using a 'light' toolkit ? */
+//#define __SML_LITE__
+/* do we use Sub DTD extensions ? */
+#define __USE_EXTENSIONS__
+/* do we need Metainformation DTD parsing ? */
+#define __USE_METINF__
+/* do we use Device Info DTD ? */
+#define __USE_DEVINF__
+
+/* which of the following optional commands should be included ? */
+
+#define ADD_SEND
+//#define ATOMIC_SEND
+//#define ATOMIC_RECEIVE
+//#define COPY_SEND
+//#define COPY_RECEIVE
+//#define EXEC_SEND
+//#define EXEC_RECEIVE
+#define GET_SEND
+#define MAP_RECEIVE
+#define MAPITEM_RECEIVE
+#define RESULT_RECEIVE
+//#define SEARCH_SEND
+//#define SEARCH_RECEIVE
+//#define SEQUENCE_SEND
+//#define SEQUENCE_RECEIVE
+
+
+/* TK: to improve interoperability and handling we
+ * switched to using .def files instead of compiler
+ * specific per function definitions. As long as we only
+ * use C this is the easiest and cleanes way
+ */
+
+#define SML_API
+#define SML_API_DEF
+#define XPT_API
+#define XPT_API_DEF
+
+
+/* Multi segment macro for Palm OS */
+#define LIB_FUNC
+#define MGR_FUNC
+#define WSM_FUNC
+#define XLT_FUNC
+
+#endif
index 02dfeb0..4072c0a 100644 (file)
@@ -50,6 +50,7 @@
 /* activate debug output */
 #define SYDEBUG 2
 
+#define NOWSM 1
 
 #endif /* TARGET_OPTIONS_H */
 /* eof */
index 093b33d..83bba90 100644 (file)
@@ -50,6 +50,7 @@ void TEngineServerCommConfig::clear(void)
   // init defaults
   fSessionIDCGIPrefix = "sessionid=";
   fSessionIDCGI = true;
+  fBuffersRetryAnswer = false; // we don't know if the app driving the engine implements this, so default is off
   // clear inherited  
   inherited::clear();
 } // TEngineServerCommConfig::clear
@@ -61,6 +62,8 @@ void TEngineServerCommConfig::clear(void)
 bool TEngineServerCommConfig::localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine)
 {
   // checking the elements
+  if (strucmp(aElementName,"buffersretryanswer")==0)
+    expectBool(fBuffersRetryAnswer);
   if (strucmp(aElementName,"sessionidcgiprefix")==0)
     expectString(fSessionIDCGIPrefix);
   if (strucmp(aElementName,"sessionidcgi")==0)
@@ -130,7 +133,18 @@ Ret_t TEngineSessionDispatch::StartMessage(
 } // TEngineSessionDispatch::StartMessage
 
 
-// - combine URI and session ID to make a RespURI according to transport
+
+
+// Test if message buffering is available
+bool TEngineSessionDispatch::canBufferRetryAnswer(void)
+{
+  // basically, we can buffer, we do it if configured
+  return dynamic_cast<TEngineServerCommConfig *>(getRootConfig()->fCommConfigP)->fBuffersRetryAnswer;
+} // TEngineSessionDispatch::canBufferRetryAnswer
+
+
+
+// Combine URI and session ID to make a RespURI according to transport
 void TEngineSessionDispatch::generateRespURI(
   string &aRespURI,
   cAppCharP aLocalURI,
index e2ed6cf..fae2b65 100644 (file)
@@ -96,8 +96,11 @@ public:
   TEngineServerCommConfig(TConfigElement *aParentElementP);
   virtual ~TEngineServerCommConfig();
   // config vars
+  // - session ID CGI config
   bool fSessionIDCGI;
   string fSessionIDCGIPrefix;
+  // - indicates transport can buffer answer to client until next client response, so it can be resent in case we detect a client resend.
+  bool fBuffersRetryAnswer;
 protected:
   // check config elements
   #ifndef HARDCODED_CONFIG
@@ -151,7 +154,9 @@ public:
   );
   // - Handle exception happening while decoding commands for a session
   virtual Ret_t HandleDecodingException(TSyncSession *aSessionP, const char *aRoutine, exception *aExceptionP);
-  // - combine URI and session ID to make a RespURI according to transport
+  // test if message buffering is available
+  virtual bool canBufferRetryAnswer(void);
+  // combine URI and session ID to make a RespURI according to transport
   virtual void generateRespURI(
     string &aRespURI,
     cAppCharP aLocalURI,
index a46a993..da20f68 100755 (executable)
@@ -11,8 +11,6 @@ ENGINE_SOURCES="sysync DB_interfaces sysync_SDK/Sources Transport_interfaces/eng
 cat > SDK_FILES <<EOF
 enginemodulebridge.cpp
 enginemodulebridge.h
-stringutil.cpp
-stringutil.h
 target_options.h
 san.cpp
 san.h
@@ -22,6 +20,14 @@ UI_util.cpp
 UI_util.h
 EOF
 
+# files needed exclusively for libsynthesissdk.so
+# They should not go into libsynthesissdk.a because the more complete set of
+# code is available in the engine
+cat > SDK_EXCLUDE_FILES <<EOF
+stringutil.cpp
+stringutil.h
+EOF
+
 # The distinction between client and server files is not
 # important and even likely to be wrong/incomplete. Right now,
 # all of these files are compiled into libsynthesis and only
@@ -44,8 +50,6 @@ admindata.cpp
 admindata.h
 dbitem.cpp
 dbitem.h
-blobs.cpp
-blobs.h
 enginesessiondispatch.cpp
 syncserver.cpp
 EOF
@@ -60,7 +64,7 @@ enginestubs.c
 EOF
 
 # files to be included in libsynthesis
-cat EXTRA_FILES SDK_FILES > EXCLUDE_FILES
+cat EXTRA_FILES SDK_FILES SDK_EXCLUDE_FILES> EXCLUDE_FILES
 LIBSYNTHESIS_SOURCES=`find ${ENGINE_SOURCES} \
      syncapps/clientEngine_custom \
      syncapps/serverEngine_custom \
index f603e86..91c4a99 100644 (file)
@@ -71,8 +71,8 @@
 #endif
 
 #ifndef SYSYNC_BUILDNUMBER
-#define SYSYNC_BUILDNUMBER          5
-#define SYSYNC_BUILDNUMBER_TXT     "5"
+#define SYSYNC_BUILDNUMBER          6
+#define SYSYNC_BUILDNUMBER_TXT     "6"
 #endif
 
 
index b589209..5ad9e4c 100755 (executable)
@@ -651,7 +651,9 @@ static Ret_t buildDevInfProperty(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem, in
     XltDecScannerPtr_t            pScanner      = pDecoder->scanner;
     Ret_t rc;
 
-    if (IS_EMPTY(pScanner->curtok)) {
+    /* Do not return immediately for <1.2 style, the outer loop ends only meeting an end tag
+     * which will lead to an infinite loop*/
+    if (datastoreLocal && IS_EMPTY(pScanner->curtok)) {
         return SML_ERR_OK;
     }
 
@@ -812,7 +814,10 @@ Ret_t buildDevInfCtcap(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem, Boolean_t da
             break;
           case TN_DEVINF_PROPERTY:
             // DS 1.2 case: only </Property> ends the property building process, next token must be read first
-            rc = buildDevInfProperty(pDecoder, (VoidPtr_t)&pCtcap->data->prop,datastoreLocal);
+            // If there is a Property tag, let's take it as DS 1.2 Property Decoding even if the CTCAP is globally
+            // This is found from some Nokia phones (eg. N900, which will send a DevInf v1.2 but the CTCAP
+            // was not inside the datastore as DevInf v1.1)
+            rc = buildDevInfProperty(pDecoder, (VoidPtr_t)&pCtcap->data->prop,TRUE);
             break;
           case TN_DEVINF_PROPNAME:
             // <DS 1.2 case: current token TN_DEVINF_PROPNAME is processed by builder, next occurence of TN_DEVINF_PROPNAME ends property as well
@@ -822,6 +827,7 @@ Ret_t buildDevInfCtcap(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem, Boolean_t da
               rc = buildDevInfProperty(pDecoder, (VoidPtr_t)&pCtcap->data->prop,datastoreLocal);
               if (rc==SML_ERR_OK)
                 continue; // re-evaluate current tag (tag that caused buildDevInfProperty() to end, either unknown or closing </CTCap>
+                          // this means do not return SML_ERR_OK unless this is an unknow tag or closing </CTCcap>, otherwise it will trigger an infinite loop
             }
             break;
 
index 7d3ed51..7b73d41 100755 (executable)
@@ -95,6 +95,7 @@ TConfigElement::TConfigElement(const char *aElementName, TConfigElement *aParent
   // init parsing
   ResetParsing();
   #endif
+  fCfgVarExp=0;
 } // TConfigElement::TConfigElement
 
 
index 1c5d171..86606ba 100755 (executable)
@@ -2773,6 +2773,16 @@ bool TCustomImplDS::implProcessItem(
       /// @todo sop_copy is now implemented by read/add sequence
       ///       in localEngineDS, but will be moved here later possibly
       case sop_add :
+       // check for duplicated add
+        // Note: server must check it here, because map lookup is needed. Contrarily, client
+        //       can check it on localengineds level against the pending maps list with isAddFromLastSession().
+        if (IS_SERVER && mappos!=fMapTable.end()) {
+               // we already know this item
+          // - status "already exists"
+          aStatusCommand.setStatusCode(418);
+          ok = false;
+          break;
+        }
         // add item and retrieve new localID for it
         sta = apiAddItem(*myitemP,localID);
         if (IS_SERVER) {
@@ -2874,12 +2884,10 @@ bool TCustomImplDS::implProcessItem(
     if (ok) {
       // successful, save new localID in item
       myitemP->setLocalID(localID.c_str());
-      // make sure transaction is complete after processing the item
       TP_START(fSessionP->fTPInfo,li);
       return true;
     }
     else {
-      // make sure transaction is rolled back for this item
       TP_START(fSessionP->fTPInfo,li);
       return false;
     }
@@ -3275,18 +3283,32 @@ localstatus TCustomImplDS::getItemByID(localid_t aLocalID, TSyncItem *&aItemP)
   string localid;
   LOCALID_TO_STRING(aLocalID,localid);
   TSyncSetList::iterator syncsetpos = findInSyncSet(localid.c_str());
-  if (syncsetpos==fSyncSetList.end())
-    return 404; // not found
-  // return sync item from syncset item (fetches data now if not fetched before)
-  return getItemFromSyncSetItem(*syncsetpos,aItemP);
+  if (syncsetpos==fSyncSetList.end()) {
+       // not found in current sync set, but could be a newly inserted item - try direct load
+    // - create new empty TMultiFieldItem
+    aItemP = (TMultiFieldItem *) newItemForRemote(ity_multifield);
+    if (!aItemP) return 510;
+    // - assign local id, as it is required e.g. by DoDataSubstitutions
+    aItemP->setLocalID(localid.c_str());
+    // - set default operation
+    aItemP->setSyncOp(sop_replace);
+               // - now fetch directly from DB
+       return apiFetchItem(*((TMultiFieldItem *)aItemP),true,NULL);
+  }
+  else {
+    // return sync item from syncset item (fetches data now if not fetched before)
+    return getItemFromSyncSetItem(*syncsetpos,aItemP);
+  }
 } // TCustomImplDS::getItemByID
 
 
 // private helper: get item with data from sync set list. Retrieves item if not already
 // there from loading the sync set
+// Note: can be called with aSyncSetItemP==NULL, which causes directly loading from DB
+//       in all cases. 
 localstatus TCustomImplDS::getItemFromSyncSetItem(TSyncSetItem *aSyncSetItemP, TSyncItem *&aItemP)
 {
-  if (aSyncSetItemP->itemP) {
+  if (aSyncSetItemP && aSyncSetItemP->itemP) {
     // already fetched - pass it to caller and remove link in syncsetitem
     aItemP = aSyncSetItemP->itemP;
     aSyncSetItemP->itemP = NULL; // syncsetitem does not own it any longer
@@ -3298,12 +3320,12 @@ localstatus TCustomImplDS::getItemFromSyncSetItem(TSyncSetItem *aSyncSetItemP, T
       (TMultiFieldItem *) newItemForRemote(ity_multifield);
     if (!aItemP)
       return 510;
-    // - assign local id, as it is required by DoDataSubstitutions
+    // - assign local id, as it is required e.g. by DoDataSubstitutions
     aItemP->setLocalID(aSyncSetItemP->localid.c_str());
     // - set default operation
     aItemP->setSyncOp(sop_replace);
     // Now fetch item (read phase)
-    localstatus sta=apiFetchItem(*((TMultiFieldItem *)aItemP),true,aSyncSetItemP);
+    localstatus sta = apiFetchItem(*((TMultiFieldItem *)aItemP),true,aSyncSetItemP);
     if (sta!=LOCERR_OK)
       return sta; // error
   }
index 1273901..a45c668 100755 (executable)
@@ -503,7 +503,7 @@ void TDataObjType::generateData(TLocalEngineDS *aDatastoreP, TMultiFieldItem &aI
             else if (strucmp( enc.c_str(),"base64" )==0) {
               char*        bb= b64::encode( (uInt8*)ptr,size );
               v=           bb;   // maybe one copy operation can be avoided in future
-              sysync_free( bb ); // does never contain '\0' => can be treated as normal string
+              b64::free( bb ); // does never contain '\0' => can be treated as normal string
             }
             else if (strucmp( enc.c_str(),"quoted-printable")==0) {
               sysync::appendEncoded( (uInt8*)ptr,size, v, enc_quoted_printable,
@@ -853,7 +853,7 @@ bool TDataObjType::parseData(const char *aText, stringSize aSize, TMultiFieldIte
                       uInt32 oLen;
                       uInt8*               bb= b64::decode( value.c_str(), 0, &oLen );
                       fieldP->setAsString( (const char*)bb, oLen ); // assign the value
-                      sysync_free        ( bb );
+                      b64::free        ( bb );
                       break; // already done now (blob assigned correctly
                     }
                     else if (strucmp( enc.c_str(),"quoted-printable")==0) {
index 00f229b..e093f8d 100755 (executable)
@@ -358,16 +358,17 @@ void TStdFileDbgOut::putLine(cAppCharP aLine, bool aForceFlush)
       // now output
       fputs(aLine,fFile);
       fputs("\n",fFile);
-    }
-    // do required flushing
-    if (fFlushMode==dbgflush_openclose) {
-      // we need to close the file after every line of output
-      fclose(fFile);
-      fFile=NULL;
-    }
-    else if (aForceFlush || fFlushMode==dbgflush_flush) {
-      // simply flush
-      fflush(fFile);
+
+      // do required flushing
+      if (fFlushMode==dbgflush_openclose) {
+        // we need to close the file after every line of output
+        fclose(fFile);
+        fFile=NULL;
+      }
+      else if (aForceFlush || fFlushMode==dbgflush_flush) {
+        // simply flush
+        fflush(fFile);
+      }
     }
   }
 } // TStdFileDbgOut::putLine
index 4b61a79..97dfb6a 100644 (file)
@@ -3721,8 +3721,6 @@ SmlDevInfDatastorePtr_t TLocalEngineDS::newDevInfDatastore(bool aAsServer, bool
 {
   SmlDevInfDatastorePtr_t datastoreP;
 
-  // create new
-  datastoreP=SML_NEW(SmlDevInfDatastore_t);
   // set only basic info, details must be added in derived class
   // - sourceref is the name of the datastore,
   //   or for server, if already alerted, the name used in the alert
@@ -3731,7 +3729,13 @@ SmlDevInfDatastorePtr_t TLocalEngineDS::newDevInfDatastore(bool aAsServer, bool
   string dotname;
   #ifdef SYSYNC_SERVER
   if (IS_SERVER && testState(dssta_serveralerted,false) && fSessionP->fDSPathInDevInf) {
-    // server and already alerted - use datastore spec as sent from remote, minus CGI, as relative spec
+    // server and already alerted
+    // - don't include sub-datastores
+    if (fAsSubDatastoreOf) {
+      return NULL;
+    }
+
+    // - use datastore spec as sent from remote, minus CGI, as relative spec
     dotname = URI_RELPREFIX;
     dotname += fSessionP->SessionRelativeURI(fRemoteViewOfLocalURI.c_str());
     if (!fSessionP->fDSCgiInDevInf) {
@@ -3747,6 +3751,9 @@ SmlDevInfDatastorePtr_t TLocalEngineDS::newDevInfDatastore(bool aAsServer, bool
     // client or not yet alerted - just use datastore base name
     StringObjPrintf(dotname,URI_RELPREFIX "%s",fName.c_str());
   }
+
+  // create new
+  datastoreP=SML_NEW(SmlDevInfDatastore_t);
   datastoreP->sourceref=newPCDataString(dotname);
   #ifndef MINIMAL_CODE
   // - Optional display name
@@ -4131,10 +4138,17 @@ endchange:
 
 
 
-// test abort status, datastore is aborted also when session is just suspended
+// test datastore abort status
+// datastore is aborted when
+// - it was explicitly aborted (engAbortDataStoreSync() called, fAbortStatusCode set)
+// - session is suspending and the datastore has not yet completed sync up to sending
+//   maps (client) or admin already saved (server+client).
+//   If client has sent maps, all that MIGHT be missing would be map status, and
+//   if that hasn't arrived, the pendingMaps mechanism will make sure these get
+//   sent in the next session.
 bool TLocalEngineDS::isAborted(void)
 {
-  return fAbortStatusCode!=0 || fSessionP->isSuspending();
+  return fAbortStatusCode!=0 || (fSessionP->isSuspending() && !testState(dssta_clientmapssent));
 } // TLocalEngineDS::isAborted
 
 
index 6a42191..e8d1a5b 100644 (file)
@@ -1923,7 +1923,7 @@ static void decodeValue(
     uInt32 binsz=0;
     uInt8 *binP = b64::decode(p, q-p, &binsz);
     aVal.append((const char *)binP,binsz);
-    sysync_free(binP);
+    b64::free(binP);
     // - continue at next char after b64 value
     p=q;
   }
@@ -3598,19 +3598,20 @@ bool TMimeDirProfileHandler::parseProperty(
   TEncodingTypes encoding;
   TCharSets charset;
   // field storage info vars, defaults are used if property has no TPropNameExtension
-  sInt16 baseoffset=0;
-  sInt16 repoffset=0;
-  sInt16 maxrep=1; // no repeat by default
-  sInt16 repinc=1; // inc by 1
-  sInt16 repid=-1; // invalid by default
-  bool overwriteempty=false; // do not overwrite empty values by default
+  sInt16 baseoffset = 0;
+  sInt16 repoffset = 0;
+  sInt16 maxrep = 1; // no repeat by default
+  sInt16 repinc = 1; // inc by 1
+  sInt16 repid = -1; // invalid by default
+  bool overwriteempty = false; // do not overwrite empty values by default
+  bool repoffsByGroup = false;    
 
   // init
-  encoding=enc_none; // no encoding by default
-  charset=aMimeMode==mimo_standard ? chs_utf8 : fDefaultInCharset; // always UTF8 for real MIME-DIR (same as enclosing SyncML doc), for mimo_old depends on <inputcharset> remote rule option (normally UTF-8)
-  nameextmap=0; // no name extensions detected so far
-  fieldoffsetfound=(aPropP->nameExts==NULL); // no first pass needed at all w/o nameExts, just use offs=0
-  valuelist=aPropP->valuelist; // cache flag
+  encoding = enc_none; // no encoding by default
+  charset = aMimeMode==mimo_standard ? chs_utf8 : fDefaultInCharset; // always UTF8 for real MIME-DIR (same as enclosing SyncML doc), for mimo_old depends on <inputcharset> remote rule option (normally UTF-8)
+  nameextmap = 0; // no name extensions detected so far
+  fieldoffsetfound = (aPropP->nameExts==NULL); // no first pass needed at all w/o nameExts, just use offs=0
+  valuelist = aPropP->valuelist; // cache flag
   // scan parameter list
   do {
     p=aText;
@@ -3805,8 +3806,8 @@ bool TMimeDirProfileHandler::parseProperty(
     //   an entry in the nameexts list
     TPropNameExtension *propnameextP = aPropP->nameExts;
     if (propnameextP) {
-      bool dostore=false;
-      bool repoffsByGroup = false;
+       repoffsByGroup = false;
+      bool dostore = false;
       while (propnameextP) {
         // check if entry matches parsed extendsname param values
         if (
@@ -3841,7 +3842,8 @@ bool TMimeDirProfileHandler::parseProperty(
                 if (someGroups) {
                   // don't use repetitions already used by SOME of the fields in the group
                   // for auto-assigning new groups (or ungrouped occurrences)
-                  if (aRepArray[repid]<n+1) aRepArray[repid] = n+1;
+                  if (aRepArray[repid]<n+1)
+                       aRepArray[repid] = n+1;
                 }
                 // check if group matches (only if there is a group at all)
                 g_fldP->getAsString(s);
@@ -3969,7 +3971,8 @@ bool TMimeDirProfileHandler::parseProperty(
       // update repeat offset and repeat count if this is a value list
       if (valuelist && convDef->combineSep==0 && (notempty || !overwriteempty)) {
         // - update count for every non-empty value (for empty values only if overwriteempty is not set)
-        if (repid>=0) aRepArray[repid]++; // next repetition
+        if (repid>=0)
+               aRepArray[repid]++; // next repetition
         repoffset+=repinc; // also update repeat offset
       }
     }
@@ -3995,11 +3998,13 @@ bool TMimeDirProfileHandler::parseProperty(
       }
     }    
   }
-  if (!valuelist && repid>=0 && (notempty || !overwriteempty)) {
+  if (!valuelist && repid>=0 && (notempty || !overwriteempty) && !repoffsByGroup) {
     // we have used this repetition and actually stored values, so count it now
     // (unless we have stored an empty value only and overwriteempty is true, in
     // this case we don't increment, so next value found for this repetition will
     // overwrite empty value
+    // Also, if repeat offset was found by group name, don't increment (aRepArray
+    // is already updated in this case)
     aRepArray[repid]++;
   }
   // update read pointer past end of what we've scanned (but not necessarily up
index bff1b07..3e72783 100644 (file)
@@ -1297,19 +1297,29 @@ bool TStdLogicDS::logicProcessRemoteItem(
           case sop_add :
             if (sta==418) {
               // 418: item already exists, this is kind of a conflict
-              // (should not happen normally, but can happen if aborted session was not
-              // completely rolled back by server, so treat it like
-              // "conflict resolved by client data winning")
-              PDEBUGPRINTFX(DBG_DATA,("to-be-added item already exists, and incomplete rollbacks in server possible -> trying replace (=conflict resolved by client winning)"));
-              // - switch to replace
-              syncitemP->setSyncOp(sop_replace);
-              irregular=true;
-              // - process again
-              if (implProcessItem(syncitemP,aStatusCommand)) {
-                aStatusCommand.setStatusCode(208); // client has won
+              if (isResuming() || fIgnoreUpdate || IS_CLIENT) {
+               // - in a client, this should not happen (prevented via checking against pending maps before
+                //   this routine is called) - if it still does just report the status back
+               // - in a resume, this can happen and the add should be ignored (se we return the status 418)
+                // - if updates are to be ignored, don't try update instead (and report 418)
+                // --> just return the status as-is
               }
               else {
-                sta = aStatusCommand.getStatusCode();
+                // in normal sync in the server case, this can happen when a previous session
+                // was aborted (and already applied adds not rolled back)
+                // --> reprocess it as a replace
+                PDEBUGPRINTFX(DBG_DATA,("to-be-added item already exists -> trying replace (=conflict resolved by client winning)"));
+                // - switch to replace
+                syncitemP->setSyncOp(sop_replace);
+                irregular=true;
+                // - process again
+                if (implProcessItem(syncitemP,aStatusCommand)) {
+                  aStatusCommand.setStatusCode(208); // client has won
+                }
+                else {
+                  // failed, return status
+                  sta = aStatusCommand.getStatusCode();
+                }
               }
             }
             break;
index 58ee12a..aa9aea7 100755 (executable)
@@ -306,7 +306,13 @@ TAlertCommand *TSuperDataStore::engProcessSyncAlert(
         delete subalertcmdP;
       }
       // check if processing alert had a problem
-      if (substatus.getStatusCode()!=0) {
+      // Notes:
+      // - When we have a subalertcmdP here, it is the server case, which means a non-zero status code
+      //   (such as 508) at this point is ok and should not stop processing alerts.
+      //   Only in case we have no alert we need to check the status code and abort immediately if it's not ok.
+      // - 508 can happen even in client for the rare case the server thinks anchors are ok, but client check
+      //   says they are not, so we need to exclude 508 here.
+      if (!subalertcmdP && substatus.getStatusCode()!=0 && substatus.getStatusCode()!=508) {
         // basic problem with one of the subdatastores
         // - propagate error code
         aStatusCommand.setStatusCode(substatus.getStatusCode());
index bc0f4e0..28fc4ab 100755 (executable)
@@ -2613,7 +2613,7 @@ bool TSyncAgent::handleHeaderStatus(TStatusCommand *aStatusCmdP)
           uInt32 l;
           uInt8 *nonce = b64::decode(smlPCDataToCharP(chalmetaP->nextnonce), 0, &l);
           fRemoteNonce.assign((char *)nonce,l);
-          sysync_free(nonce);
+          b64::free(nonce);
         }
         // - show
         PDEBUGPRINTFX(DBG_PROTO,(
@@ -2974,7 +2974,7 @@ TSyError TSyncAgent::ServerSessionStep(uInt16 &aStepCmd, TEngineProgressInfo *aI
           sta = LOCERR_OK;
           break;
         }
-      } // switch stepCmdIn for ces_processing
+      } // switch stepCmdIn for ses_needdata
       break;
 
     // Waiting until SyncML answer data is sent
@@ -2987,7 +2987,7 @@ TSyError TSyncAgent::ServerSessionStep(uInt16 &aStepCmd, TEngineProgressInfo *aI
           aStepCmd = STEPCMD_NEEDDATA;
           sta = LOCERR_OK;
           break;
-      } // switch stepCmdIn for ces_processing
+      } // switch stepCmdIn for ses_dataready
       break;
 
 
@@ -2997,7 +2997,7 @@ TSyError TSyncAgent::ServerSessionStep(uInt16 &aStepCmd, TEngineProgressInfo *aI
         case STEPCMD_STEP :
           sta = ServerGeneratingStep(aStepCmd,aInfoP);
           break;
-      } // switch stepCmdIn for ces_generating
+      } // switch stepCmdIn for ses_generating
       break;
 
     // Ready for processing steps
@@ -3006,7 +3006,7 @@ TSyError TSyncAgent::ServerSessionStep(uInt16 &aStepCmd, TEngineProgressInfo *aI
         case STEPCMD_STEP :
           sta = ServerProcessingStep(aStepCmd,aInfoP);
           break;
-      } // switch stepCmdIn for ces_processing
+      } // switch stepCmdIn for ses_processing
       break;
 
   case numServerEngineStates:
@@ -3053,7 +3053,19 @@ TSyError TSyncAgent::ServerProcessingStep(uInt16 &aStepCmd, TEngineProgressInfo
     fServerEngineState = ses_generating;
     sta = LOCERR_OK;
   }
-  else {
+  else if (rc==LOCERR_RETRYMSG) {
+               // server has detected that this message is a retry - report this to the app such that app can
+    // first discard the instance buffer (consume everything in it)
+    if (smlLockReadBuffer(myInstance,&data,&datasize)==SML_ERR_OK)
+      smlUnlockReadBuffer(myInstance,datasize);
+    // indicate that transport must resend the previous response
+    PDEBUGPRINTFX(DBG_ERROR,(
+      "Incoming message was identified as a retry - report STEPCMD_RESENDDATA - caller must resent last response"
+    ));
+    aStepCmd = STEPCMD_RESENDDATA;
+    fServerEngineState = ses_dataready;
+       }
+       else {
     // processing failed
     PDEBUGPRINTFX(DBG_ERROR,("===> smlProcessData failed, returned 0x%hX",(sInt16)rc));
     // dump the message that failed to process
@@ -3101,6 +3113,17 @@ TSyError TSyncAgent::ServerGeneratingStep(uInt16 &aStepCmd, TEngineProgressInfo
   }
   // request reset
   fRequestSize = 0;
+
+  // finished generating outgoing message
+  // - make sure read pointer is set (advanced in case incoming
+  //   message had trailing garbage) to beginning of generated
+  //   answer. With incoming message being clean SyncML without
+  //   garbage, this call is not needed, however with garbage
+  //   it is important because otherwise outgoing message
+  //   would have that garbage inserted before actual message
+  //   start.
+  smlReadOutgoingAgain(getSmlWorkspaceID());
+
   // return status
   return LOCERR_OK;
 } // TSyncAgent::ServerGeneratingStep
index 1892b24..73560cc 100755 (executable)
@@ -2270,6 +2270,7 @@ bool TSyncOpCommand::execute(void)
   localstatus sta;
   TSyncOpCommand *incompleteCmdP;
   bool queueforlater,processitem;
+  bool nostatus;
   SmlItemListPtr_t tobequeueditems=NULL;
 
   SYSYNC_TRY {
@@ -2292,6 +2293,7 @@ bool TSyncOpCommand::execute(void)
     while (*itemnodePP) {
       queueforlater=false; // do no queue by default
       processitem=true; // process by default
+      nostatus=false; // set to true if someone else is responsible for updating fLastItemStatus
       thisitemnode = *itemnodePP;
       // no result nor status so far
       statusCmdP=NULL;
@@ -2531,7 +2533,10 @@ bool TSyncOpCommand::execute(void)
               // - first remove global link to it to avoid recursion
               fSessionP->fIncompleteDataCommandP=NULL;
               // - execute now (and pass ownership)
-              //   issues appropriate statuses
+              //   issues appropriate statuses, so we don't need to deal with it;
+              //   in fact, we must not touch fLastItemStatus because we don't
+              //   know the status
+              nostatus=true;
               fSessionP->process(incompleteCmdP);
               // - this item is processed now, continue in loop if there are more items
               processitem=false; // do not process the item normally
@@ -2628,7 +2633,7 @@ bool TSyncOpCommand::execute(void)
         // item processed
         // - remember status (final only) for possible suspend and resume
         sta= statusCmdP ? statusCmdP->getStatusCode() : 0;
-        if (sta!=213) {
+        if (!nostatus && sta!=213) {
           // final status received, save it for possible resend
           fDataStoreP->fLastItemStatus = sta;
           // but forget data stored at DS level
index ba611f2..dfb665e 100755 (executable)
@@ -668,7 +668,7 @@ TSyncItem *TSyncItemType::newSyncItem(
             // something to decode, do it and replace original content
             aItemP->data->content = b64::decode(origData, origSize, (uInt32 *)&(aItemP->data->length));
             // we don't need the original data any more
-            sysync_free((void *)origData);
+            b64::free((void *)origData);
           }
         }
         // convert payload (as a whole) from UTF16 (Unicode) to UTF-8
index c7e5d8b..0be6112 100644 (file)
@@ -947,6 +947,11 @@ TSyncSession::TSyncSession(
   // assume normal, full-featured session. Profile config or session progress might set this flag later 
   fLegacyMode = false;
   fLenientMode = false;
+
+  //initialize the conditonal variables to keep valgrind happy
+  fNeedAuth = true;
+  fRemoteRequestedAuth = auth_none;
+
   #ifdef SYDEBUG
   // initialize session debug logging
   fSessionDebugLogs=getRootConfig()->fDebugConfig.fSessionDebugLogs; /// init from config @todo: get rid of this special session level flag, handle it all via session logger's fDebugEnabled / getDbgMask()
@@ -1628,6 +1633,12 @@ void TSyncSession::MarkSuspendAlertSent(bool aSent)
 // abort session (that is: flag abortion)
 void TSyncSession::AbortSession(TSyError aStatusCode, bool aLocalProblem, TSyError aReason)
 {
+       // Catch the case that some inner routine, e.g. a plugin, detects a user suspend. It can
+  // return LOCERR_USERSUSPEND then and will cause the engine instead of aborting.
+  if (aStatusCode==LOCERR_USERSUSPEND) {
+       SuspendSession(LOCERR_USERSUSPEND);
+    return;
+  }
   // make sure session gets aborted
   // BUT: do NOT reset yet. Reset would incorrectly abort message answering
   if (!fAborted && !fTerminated) {
@@ -3824,7 +3835,7 @@ SmlCredPtr_t TSyncSession::newCredentials(const char *aUser, const char *aPasswo
         // - MD5 it while adding nonce
         md5::Init (&context);
         md5::Update (&context, authdata, authdatalen);
-        sysync_free((void *)authdata); // return buffer allocated by b64::encode
+        b64::free((void *)authdata); // return buffer allocated by b64::encode
         // - important: add colon as nonce separator
         md5::Update (&context, (uInt8 *) ":", 1);
         // - also add nonce that will be used for checking later
@@ -3867,7 +3878,7 @@ SmlCredPtr_t TSyncSession::newCredentials(const char *aUser, const char *aPasswo
     metinfP->format=newPCDataFormat(fRemoteRequestedAuthEnc,false); // no format if default of fmt_chr
   }
   // free buffer
-  if (tobefreed) sysync_free(tobefreed);
+  if (tobefreed) b64::free(tobefreed);
   // return cred or NULL if none
   return credP;
 } // TSyncSession::newCredentials
@@ -4024,7 +4035,7 @@ bool TSyncSession::checkCredentials(const char *aUserName, const SmlCredPtr_t aC
     }
   }
   // free buffer if any
-  if (tobefreed) sysync_free(tobefreed);
+  if (tobefreed) b64::free(tobefreed);
   // make sure we see what config was used in the log
   DebugShowCfgInfo();
   PDEBUGPRINTFX(DBG_HOT,(
@@ -4209,7 +4220,7 @@ bool TSyncSession::getAuthBasicUserPass(const char *aBasicCreds, string &aUserna
       ok=true;
     }
   }
-  sysync_free(userpw);
+  b64::free(userpw);
   return ok;
 } // TSyncSession::getAuthBasicUserPass
 
index 7ada448..b38f29c 100644 (file)
@@ -102,13 +102,14 @@ namespace sysync {
 #define SYSER_PRODCODE_CLIENT_LIB_DEMO         27 // All DEMO Libraries
 
 
-// - Server product flags (no flags -> only XPT version allowed)
+// - Client product flags (no flags -> only XPT version allowed)
 #define SYSER_PRODFLAG_CLIENT_DMU 0x01 // DMU enabled
+#define SYSER_PRODFLAG_CLIENT_APP 0x02 // App enabled (not only library)
 
 
 // Servers
 
-// - Server Libraries
+// - Server (=usually unified server+client) Libraries
 #define SYSER_PRODCODE_SERVER_LIB_WIN32        39 // Win32 ODBC PRO
 #define SYSER_PRODCODE_SERVER_LIB_MACOSX       29 // for Mac OS X
 #define SYSER_PRODCODE_SERVER_LIB_LINUX        30 // for Linux
index 066f86e..2208b97 100755 (executable)
@@ -51,7 +51,9 @@ extern "C" {
 
 // utilities
 #include "sysync_utils.h"
+#ifdef SYSYNC_ENGINE
 #include "stringutils.h"
+#endif
 #include "lineartime.h"
 #include "iso8601.h"
 #include "debuglogger.h"
index 659fc8d..826674d 100755 (executable)
@@ -14,6 +14,8 @@
 #ifndef SYSYNC_GLOBS_H
 #define SYSYNC_GLOBS_H
 
+#include <stdio.h>
+
 #include "generic_types.h"
 
 // global error codes
@@ -28,6 +30,7 @@
 // include global progress defs
 #include "global_progress.h"
 
+
 #ifdef __cplusplus
 // we need some STL basics as we define types based on STL constructs
 #include <string>
index 55ff762..0c38aa0 100755 (executable)
@@ -579,7 +579,7 @@ static void CallbackVPrintf( DB_Callback aCB, cAppCharP format, va_list args, uI
 
     #ifdef __GNUC__
           isMax= strlen(message)==maxmsglen-1;
-      if (isMax) vasprintf( &ptr, format, copy );
+      if (isMax && vasprintf( &ptr, format, copy ) != -1) {};
       va_end(copy);
     #endif
 
index 6d7050c..95a1f73 100644 (file)
@@ -74,6 +74,12 @@ class TBlob {
       TSyError SetDates( string  aBlobName, TDates  aDate );                 // set  "      "      "
     #endif
 
+    string getDBName() const { return fDBName; }
+    string getBlobPath() const { return fBlobPath; }
+    string getContextName() const { return fContextName; }
+    string getDevKey() const { return fDevKey; }
+    string getUsrKey() const { return fUsrKey; }
+
   private:
     void*  fCB;       // callback structure, for debug logs
     string fDBName;   // database name,      for debug logs
similarity index 99%
rename from src/synthesis/src/sysync/lineartime.cpp
rename to src/synthesis/src/sysync_SDK/Sources/lineartime.cpp
index 2a03013..9b93b26 100755 (executable)
@@ -11,7 +11,7 @@
  *
  */
 #include "prefix_file.h"
-
+#include "sync_include.h"
 #include "lineartime.h"
 #include "timezones.h"
 
index e9fce70..5b3f968 100755 (executable)
@@ -75,6 +75,8 @@ digest= H(B64(H(server-identifier:password)):nonce:B64(H(notification)))
 
 
 const uInt16 SyncML12 = 12;   // currently supported SyncML version
+const uInt16 SyncML11 = 11;   // currently supported SyncML version
+const uInt16 SyncML10 = 10;   // currently supported SyncML version
 
 #pragma options align= packed // allow direct mapping of the structure
 
@@ -107,7 +109,6 @@ struct TBody {
 
 
 // ---- defined locally for the moment to avoid dependencies ----
-// - sysync_free replaced by free
 //
 // MD5 and B64 given string
 static void MD5B64_Local(const char *aString, sInt32 aLen, string &aMD5B64)
@@ -126,7 +127,7 @@ static void MD5B64_Local(const char *aString, sInt32 aLen, string &aMD5B64)
   // assign result
   aMD5B64.assign(b64md5,b64md5len);
   // done
-  /*sysync_*/free(b64md5); // return buffer allocated by b64::encode
+  b64::free(b64md5); // return buffer allocated by b64::encode
 } // MD5B64_Local
 
 
@@ -490,7 +491,7 @@ TSyError SanPackage::Check_11( void* san, size_t sanSize )
 
   // struct assignment / 1k buffer
   sIOpts.encoding       = SML_WBXML; // it is always WBXML
-  sIOpts.workspaceSize  = 1024;      // should be always sufficient
+  sIOpts.workspaceSize  = 1024*30;      // should be always sufficient
   sIOpts.maxOutgoingSize=    0;      // disabled for now
 
   err=   smlInitInstance( &scb, &sIOpts, this, &id );  if (err) return err;
@@ -510,23 +511,25 @@ TSyError SanPackage::Check_11( void* san, size_t sanSize )
 #endif // WITHOUT_SAN_1_1
 
 
-TSyError SanPackage::PassSan( void* san, size_t sanSize )
+TSyError SanPackage::PassSan( void* san, size_t sanSize, int mode)
 {
-  TSyError err;
+  TSyError err = LOCERR_OK;
   bool     use_as_12= true;
 
   ReleasePackage();
 //printf( "here we will have the potential 1.1 -> 1.2 conversion\n" );
 
   #ifndef WITHOUT_SAN_1_1
-               err= Check_11  ( san,sanSize );
-    if (!err)  err= GetPackage( san,sanSize );
-  //use_as_12= err==SML_ERR_XLT_INCOMP_WBXML_VERS;
-    use_as_12= err!=0;
-  //printf( "err=%d\n", err );
-  #endif
+  if (mode == 0 || mode == 1) {
+      err= Check_11  ( san,sanSize );
+      if (!err)  err= GetPackage( san,sanSize );
+      //use_as_12= err==SML_ERR_XLT_INCOMP_WBXML_VERS;
+      use_as_12= err!=0;
+      //printf( "err=%d\n", err );
+  }
+#endif
 
-  if (use_as_12) {
+  if (use_as_12 && mode !=1) {
     err= DB_Full;
 
         fSan=   malloc( sanSize );
@@ -597,8 +600,10 @@ TSyError SanPackage::GetNthSync( int    nth,
   fInitiator      = (Initiator)GetBits( tp->bitField, 12, 1 );
   fSessionID      =            GetBits( tp->bitField, 40,16 );
 
-  // that's the joke, it's no longer forbidden !
-//if (fProtocolVersion!=SyncML12) return DB_Forbidden;
+  /*If the version does not match, this should be an invalid SAN message*/
+  if (fProtocolVersion!=SyncML12 &&
+      fProtocolVersion!=SyncML11 &&
+      fProtocolVersion!=SyncML10) return DB_Forbidden;
 
   byte* b= (byte*)(tp+1);
   byte* v;
@@ -689,6 +694,132 @@ void SanPackage::ReleasePackage() {
   if (fSan!=NULL) { free( fSan ); fSan= NULL; }
 } // ReleasePackage
 
+#ifndef WITHOUT_SAN_1_1
+
+const char * const SyncMLVerProtoNames[] = 
+{
+    "undefined",
+    "SyncML/1.0",
+    "SyncML/1.1",
+    "SyncML/1.2"
+};
+
+const char *const SyncMLVerDTDNames[] =
+{
+    "???",
+    "1.0",
+    "1.1",
+    "1.2"
+};
+
+const SmlVersion_t SmlVersionCodes[] =
+{
+    SML_VERS_UNDEF,
+    SML_VERS_1_0,
+    SML_VERS_1_1,
+    SML_VERS_1_1
+};
+
+TSyError SanPackage::GetPackageLegacy( void* &san,
+                                       size_t &sanSize,
+                                       const vector<pair <string, string> >& sources,
+                                       int alertCode,
+                                       bool wbxml)
+{
+  ReleasePackage(); // remove a previous one
+  TSyError err;
+  SmlCallbacks_t       scb= mySmlCallbacks;
+  SmlInstanceOptions_t sIOpts;
+  InstanceID_t         id;
+
+
+  // struct assignment / 1k buffer
+  sIOpts.encoding       = wbxml ? SML_WBXML : SML_XML;
+  sIOpts.workspaceSize  = 1024;      // should be always sufficient
+  sIOpts.maxOutgoingSize=    0;      // disabled for now
+
+  err=   smlInitInstance( &scb, &sIOpts, this, &id );  if (err) return err;
+
+  SmlSyncHdrPtr_t headerP = NULL;
+  SmlAlertPtr_t alertP = NULL;
+
+  do {
+    SYSYNC_TRY{
+      //create SyncHdr
+      headerP = SML_NEW (SmlSyncHdr_t);
+      headerP->elementType = SML_PE_HEADER;
+      if (fProtocolVersion != 10 && fProtocolVersion != 11){
+          //wrong version!
+          err = DB_Error;
+          break;
+      }
+      int version = fProtocolVersion - 10 + 1;
+      headerP->version = newPCDataString (SyncMLVerDTDNames[version]);
+      headerP->proto = newPCDataString (SyncMLVerProtoNames[version]);
+      headerP->sessionID = newPCDataLong (fSessionID);
+      headerP->msgID = newPCDataString ("1");
+      headerP->target = newLocation ("/", "");
+      headerP->source = newLocation (fServerID.c_str(), "");
+      headerP->respURI = NULL;
+      headerP->meta = NULL;
+      headerP->flags = 0;
+      //TODO generate the cred element for authentication
+      headerP->cred = NULL;
+
+      //create SyncMessage
+      err = smlStartMessageExt (id, headerP, SmlVersionCodes[version]); if (err) break;
+      //create Alert Commands
+      //internal Alert element 
+      alertP = SML_NEW (SmlAlert_t);
+      alertP->elementType = SML_PE_ALERT;
+      alertP->cmdID = newPCDataLong(1);
+      alertP->flags = 0;
+      alertP->data = newPCDataLong (alertCode);
+      alertP->cred = NULL;
+      alertP->itemList = NULL;
+      alertP->flags = 0;
+
+      //for each source, add a item
+      for (unsigned int num =0; num < sources.size(); num++) {
+          SmlItemPtr_t alertItemP = newItem();
+          alertItemP->source = newOptLocation (sources[num].second.c_str());
+          alertItemP->meta = newMetaType (sources[num].first.c_str());
+          addItemToList (alertItemP, &alertP->itemList);
+      }
+
+      err = smlAlertCmd (id, alertP); if (err) break;
+      err = smlEndMessage (id, true); if (err) break;
+
+      MemPtr_t buf = NULL;
+      err = smlLockReadBuffer (id, (MemPtr_t *) &buf, (MemSize_t *)&sanSize); if (err) break;
+      fSan          = malloc( sanSize ); if (!fSan) {err = DB_Full; break;}
+      san = fSan;
+      memcpy (san, buf, sanSize);
+      err = smlUnlockReadBuffer (id, sanSize); if (err) break;
+      } SYSYNC_CATCH (...)
+      if  (headerP) {
+          smlFreeProtoElement (headerP);
+          headerP = NULL;
+      }
+      if (alertP) {
+          smlFreeProtoElement (alertP);
+          alertP = NULL;
+      }
+      err = DB_Full;
+      SYSYNC_ENDCATCH
+  } while (false);
+  if  (headerP) {
+      smlFreeProtoElement (headerP);
+  }
+  if (alertP) {
+      smlFreeProtoElement (alertP);
+  }
+  if (err) return err;
+
+  err = smlTerminateInstance( id );
+  return err;
+}
+#endif
 
 } // namespace sysync
 
index 6043365..b0c69d4 100644 (file)
@@ -24,7 +24,7 @@
 #ifdef __cplusplus
   #include <string>      // STL includes
   #include <list>
-
+  #include <vector>
   using namespace std;
 #endif
 
@@ -70,6 +70,11 @@ enum Initiator {
  *     4) Create the SAN package with 'GetPackage'.
  *        A vendor specific record can be added, if required.
  *
+ * How to create a Legacy SAN package (server side SAN 1.0/1.1):
+ *    1) Prepare the SAN package using 'PreparePackage'
+ *    2) Call 'CreateEmptyNotificationBody' (not needed 1st time) and
+ *    3) Create the SAN package with 'GetPackageLegacy'.
+ *
  *--------------------------------------------------------------------
  *  How to check a SAN package (on client side):
  *     1) pass the san message with 'PassSan'
@@ -132,7 +137,7 @@ class SanPackage {
     TSyError AddSync( int syncType, uInt32 contentType, const char* serverURI );
 
 
-    /*! Get the SAN package
+    /*! Get the SAN package for v1.2
      *
      *  (out)
      *  @param  <san>                get the pointer to the SAN message.
@@ -151,6 +156,29 @@ class SanPackage {
                          void*  vendorSpecific= NULL,
                          size_t vendorSpecificSize= 0 );
 
+#ifndef WITHOUT_SAN_1_1
+    /*! Get the SAN package for v1.1/v1.0
+     *
+     *  (out)
+     *  @param  <san>                get the pointer to the SAN message.
+     *  @param  <sanSize>            get the SAN message size (in bytes).
+     *
+     *  (in)
+     *  @param  <sources>            vector of alerted sources
+     *  @param  <alertCode>          the synchronization mode
+     *  @param  <wbxml>              use wbxml or plain xml
+     *
+     *  @return error code           if operation can't be performed
+     *
+     *  NOTE: The notification body will be added automatically
+     *
+     */
+    TSyError GetPackageLegacy( void* &san,
+                               size_t &sanSize,
+                               const vector<pair <string, string> > &sources,
+                               int alertCode,
+                               bool wbxml = true);
+#endif
 
     /*! Create the digest for the SAN package:
      *  digest= H(B64(H(server-identifier:password)):nonce:B64(H(notification)))
@@ -173,8 +201,13 @@ class SanPackage {
 
     /*! Pass SAN message <san>,<sanSize> to object,
      *  a local copy will be kept then internally
+     *  (in)
+     *  @param  <san>          the pointer to the SAN message
+     *  @param  <sanSize>      the max. SAN message size (in bytes)
+     *  @param  <mode>         0|1|2, 0 tries both San 1.1 and 1.2, 1 tries only
+     *                         1.1 and 2 tries only 1.2
      */
-    TSyError PassSan( void* san, size_t sanSize );
+    TSyError PassSan( void* san, size_t sanSize , int mode = 0);
 
 
     /*! Get the effective size of an already created <san> message
index 6f1df58..54ab6ed 100644 (file)
@@ -12,6 +12,7 @@
 
 #include "target_options.h"
 
+#ifndef WITHOUT_SAN_1_1
 
 #if defined __MACH__ && !defined __GNUC__ /* used for va_list support */
   #include <mw_stdarg.h>
@@ -239,10 +240,73 @@ sInt16 HexStrToUIntPtr( cAppCharP aStr, uIntPtr &aIntPtr, sInt16 aMaxDigits )
   #endif
 } // HexStrToUIntPtr
 
+// helper
+static bool isMinus(const char *&aStr, sInt16 &aNumRead)
+{
+  if (!aStr) return false; // not minus
+  if (*aStr=='-') {
+    aStr++;
+    aNumRead++;
+    return true; // is minus
+  }
+  else if (*aStr=='+') {
+    aStr++;
+    aNumRead++;
+  }
+  // is plus
+  return false;
+} // isMinus
+
+// returns number of successfully converted chars
+sInt16 StrToUShort( cAppCharP aStr, uInt16 &aShort, sInt16 aMaxDigits)
+{
+  // our own implementation
+  char c;
+  sInt16 n=0;
+  aShort=0;
+  while (aStr && (c=*aStr++) && (n<aMaxDigits)) {
+    if (!isdigit(c)) break;
+    aShort*=10;
+    aShort+=(c-0x30);
+    n++;
+  }
+  return n;
+} // StrToUShort
+
+// returns number of successfully converted chars
+sInt16 StrToULong(const char *aStr, uInt32 &aLong, sInt16 aMaxDigits)
+{
+  // our own implementation
+  char c;
+  sInt16 n=0;
+  aLong=0;
+  while (aStr && (c=*aStr++) && (n<aMaxDigits)) {
+    if (!isdigit(c)) break;
+    aLong*=10l;
+    aLong+=(c-0x30);
+    n++;
+  }
+  return n;
+} // StrToULong
+
+// returns number of successfully converted chars
+sInt16 StrToLong(const char *aStr, sInt32 &aLong, sInt16 aMaxDigits)
+{
+  // our own implementation
+  uInt32 temp;
+  sInt16 n=0;
+  bool neg=isMinus(aStr,n);
+  n+=StrToULong(aStr,temp,aMaxDigits-n);
+  if (neg) aLong=-(sInt32)temp;
+  else aLong=temp;
+  return n;
+} // StrToLong
+
 
 #ifdef __cplusplus
   } // namespace
 #endif
 
+#endif //WITHOUT_SAN_1_1
 /* eof */
 
index 74dbc00..bb36a94 100644 (file)
@@ -39,6 +39,8 @@ sInt16 StrToCStrAppend( cAppCharP aStr, string &aString, bool aAllow8Bit=false,
 void   StringObjAppendPrintf( string &aStringObj, cAppCharP aFormat, ... );
 
 sInt16    StrToULong    ( cAppCharP aStr, uInt32  &aLong,     sInt16 aMaxDigits= 100 );
+sInt16    StrToLong     ( cAppCharP aStr, sInt32  &aLong,     sInt16 aMaxDigits= 100 );
+sInt16    StrToUShort   ( cAppCharP aStr, uInt16  &aShort,    sInt16 aMaxDigits= 100 );
 sInt16 HexStrToULong    ( cAppCharP aStr, uInt32  &aLong,     sInt16 aMaxDigits= 100 );
 sInt16 HexStrToULongLong( cAppCharP aStr, uInt64  &aLongLong, sInt16 aMaxDigits= 100 );
 sInt16 HexStrToUIntPtr  ( cAppCharP aStr, uIntPtr &aIntPtr,   sInt16 aMaxDigits= 100 );
similarity index 98%
rename from src/synthesis/src/sysync/syncexception.cpp
rename to src/synthesis/src/sysync_SDK/Sources/syncexception.cpp
index 49179d8..3fb2c3f 100755 (executable)
@@ -14,7 +14,7 @@
 
 // includes
 #include "prefix_file.h"
-
+#include "sync_include.h"
 #include "sysync.h"
 #include "syncexception.h"
 
index e1635ad..e9cb535 100755 (executable)
@@ -21,6 +21,16 @@ static const char table [64] = {
   'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/'
 };
 
+
+// free memory allocated with encode or decode above
+void b64::free(void *mem)
+{
+       // we use normal malloc below, so use normal free as well
+       ::free(mem);
+}
+
+
+
 char *b64::encode (const uInt8 *instr, uInt32 len, uInt32 *outlenP, sInt16 maxLineLen, bool crLineEnd) {
 
 
index d10094b..c3d9333 100755 (executable)
@@ -19,6 +19,9 @@ char *encode (
 // decode B64 string to data (len=0 calculates string length automatically)
 uInt8 *decode(const char *instr, uInt32 len=0, uInt32 *outlenP=NULL);
 
+// free memory allocated with encode or decode above
+void free(void *mem);
+
 }
 
 #endif /* SYSYNC_B64_H */
similarity index 99%
rename from src/synthesis/src/sysync/sysync_utils.cpp
rename to src/synthesis/src/sysync_SDK/Sources/sysync_utils.cpp
index 9ba91b6..ce55063 100755 (executable)
@@ -13,7 +13,7 @@
  */
 
 #include "prefix_file.h"
-
+#include "sync_include.h"
 #include "sysync_utils.h"
 
 #include "libmem.h"
@@ -321,6 +321,7 @@ const char * const MIMECharSetNames[numCharSets] = {
 };
 
 
+#ifdef SYSYNC_ENGINE
 // generate RFC2822-style address specificiation
 // - Common Name will be quoted
 // - recipient will be put in angle brackets
@@ -673,7 +674,7 @@ const char *appendDecoded(
       binsz=0;
       binP = b64::decode(aText, aSize, &binsz);
       aBinString.append((const char *)binP,binsz);
-      sysync_free(binP);
+      b64::free(binP);
       aText+=aSize;
       break;
     case enc_7bit:
@@ -798,7 +799,7 @@ void appendEncoded(
         if (b64) {
           aString.append(b64,b64len);
           // release buffer
-          sysync_free(b64);
+          b64::free(b64);
         }
         if (aEncoding!=enc_b) {
           // make sure it ends with a newline for "base64" (but NOT for "b" as used in RFC2047)
@@ -1878,20 +1879,6 @@ treeval_t searchFlatBintree(const TConvFlatTree &aFlatTree, treeval_t aKey, tree
   return aUndefValue;
 } // searchFlatBintree
 
-
-// allocate memory via SyncML toolkit allocation function, but throw
-// exception if it fails. Used by SML
-void *_smlMalloc(MemSize_t size)
-{
-  void *p;
-
-  p=smlLibMalloc(size);
-  if (!p) SYSYNC_THROW(TMemException("smlLibMalloc() failed"));
-  return p;
-} // _smlMalloc
-
-
-
 // MD5 and B64 given string
 void MD5B64(const char *aString, sInt32 aLen, string &aMD5B64)
 {
@@ -1909,7 +1896,7 @@ void MD5B64(const char *aString, sInt32 aLen, string &aMD5B64)
   // assign result
   aMD5B64.assign(b64md5,b64md5len);
   // done
-  sysync_free(b64md5); // return buffer allocated by b64::encode
+  b64::free(b64md5); // return buffer allocated by b64::encode
 } // MD5B64
 
 
@@ -1985,7 +1972,6 @@ void StringLower(string &aString)
 } // StringLower
 
 
-
 // Substitute occurences of pattern with replacement in string
 void StringSubst(
   string &aString, const char *aPattern, const string &aReplacement,
@@ -2081,6 +2067,22 @@ void smlPCDataToStringObj(const SmlPcdataPtr_t aPcdataP, string &aStringObj)
 } // smlPCDataToStringObj
 
 
+// returns item string or empty string (NEVER NULL)
+const char *smlItemDataToCharP(const SmlItemPtr_t aItemP)
+{
+  if (!aItemP) return "";
+  return smlPCDataToCharP(aItemP->data);
+} // smlItemDataToCharP
+
+
+// returns first item string or empty string (NEVER NULL)
+const char *smlFirstItemDataToCharP(const SmlItemListPtr_t aItemListP)
+{
+  if (!aItemListP) return "";
+  return smlItemDataToCharP(aItemListP->item);
+} // smlFirstItemDataToCharP
+#endif //SYSYNC_ENGINE
+
 // returns pointer to PCdata contents or null string. If aSizeP!=NULL, length will be stored in *aSize
 const char *smlPCDataToCharP(const SmlPcdataPtr_t aPcdataP, stringSize *aSizeP)
 {
@@ -2122,23 +2124,6 @@ const char *smlPCDataOptToCharP(const SmlPcdataPtr_t aPcdataP, stringSize *aSize
 } // smlPCDataOptToCharP
 
 
-// returns item string or empty string (NEVER NULL)
-const char *smlItemDataToCharP(const SmlItemPtr_t aItemP)
-{
-  if (!aItemP) return "";
-  return smlPCDataToCharP(aItemP->data);
-} // smlItemDataToCharP
-
-
-// returns first item string or empty string (NEVER NULL)
-const char *smlFirstItemDataToCharP(const SmlItemListPtr_t aItemListP)
-{
-  if (!aItemListP) return "";
-  return smlItemDataToCharP(aItemListP->item);
-} // smlFirstItemDataToCharP
-
-
-
 // returns pointer to source or target LocURI
 const char *smlSrcTargLocURIToCharP(const SmlTargetPtr_t aSrcTargP)
 {
@@ -2165,6 +2150,7 @@ const char *smlSrcTargLocNameToCharP(const SmlTargetPtr_t aSrcTargP)
 } // smlSrcTargLocNameToCharP
 
 
+#ifdef SYSYNC_ENGINE
 // returns error code made ready for SyncML sending (that is, remove offset
 // of 10000 if present, and make generic error 500 for non-SyncML errors,
 // and return LOCERR_OK as 200)
@@ -2299,6 +2285,7 @@ void splitURL(const char *aURI,string *aProtocol,string *aHost,string *aDoc,stri
   }
 } // splitURL
 
+#endif //SYSYNC_ENGINE
 
 
 // returns type from meta
@@ -2348,12 +2335,16 @@ SmlMetInfMetInfPtr_t smlPCDataToMetInfP(const SmlPcdataPtr_t aPCDataP)
 } // smlPCDataToMetInfP
 
 
-
-// returns true on successful conversion of PCData string to sInt32
-bool smlPCDataToLong(const SmlPcdataPtr_t aPCDataP, sInt32 &aLong)
+// allocate memory via SyncML toolkit allocation function, but throw
+// exception if it fails. Used by SML
+void *_smlMalloc(MemSize_t size)
 {
-  return StrToLong(smlPCDataToCharP(aPCDataP),aLong);
-} // smlPCDataToLong
+  void *p;
+
+  p=smlLibMalloc(size);
+  if (!p) SYSYNC_THROW(TMemException("smlLibMalloc() failed"));
+  return p;
+} // _smlMalloc
 
 
 // returns true on successful conversion of PCData string to sInt32
@@ -2362,7 +2353,13 @@ bool smlPCDataToULong(const SmlPcdataPtr_t aPCDataP, uInt32 &aLong)
   return StrToULong(smlPCDataToCharP(aPCDataP),aLong);
 } // smlPCDataToLong
 
+// returns true on successful conversion of PCData string to sInt32
+bool smlPCDataToLong(const SmlPcdataPtr_t aPCDataP, sInt32 &aLong)
+{
+  return StrToLong(smlPCDataToCharP(aPCDataP),aLong);
+} // smlPCDataToLong
 
+#ifdef SYSYNC_ENGINE
 // returns true on successful conversion of PCData string to format
 bool smlPCDataToFormat(const SmlPcdataPtr_t aPCDataP, TFmtTypes &aFmt)
 {
@@ -2378,7 +2375,7 @@ bool smlPCDataToFormat(const SmlPcdataPtr_t aPCDataP, TFmtTypes &aFmt)
   }
   return true;
 } // smlPCDataToFormat
-
+#endif //SYSYNC_ENGINE
 
 // build Meta anchor
 SmlPcdataPtr_t newMetaAnchor(const char *aNextAnchor, const char *aLastAnchor)
@@ -2702,7 +2699,7 @@ SmlPcdataPtr_t newPCDataFormatted(
       b64len=0;
       b64data=b64::encode(aData, aLength, &b64len);
       pcdataP = newPCDataString(b64data,b64len);
-      sysync_free(b64data);
+      b64::free(b64data);
       return pcdataP;
     default:
       // just copy into string or opaque/C_DATA string
@@ -2889,7 +2886,7 @@ SmlChalPtr_t newChallenge(TAuthTypes aAuthType, const string &aNextNonce, bool a
         uInt32 b64len;
         char *b64=b64::encode((const uInt8 *)aNextNonce.c_str(),aNextNonce.size(),&b64len);
         metaP->nextnonce=newPCDataString(b64,b64len);
-        sysync_free(b64); // return buffer allocated by b64_encode
+        b64::free(b64); // return buffer allocated by b64_encode
       }
     }
   }
similarity index 99%
rename from src/synthesis/src/sysync/sysync_utils.h
rename to src/synthesis/src/sysync_SDK/Sources/sysync_utils.h
index 2ba442a..018340b 100755 (executable)
@@ -19,7 +19,9 @@
 // include external utils in separate files
 #include "sysync_b64.h"
 #include "sysync_md5.h"
-#include "stringutils.h"
+#ifndef SYSYNC_ENGINE
+#include "stringutil.h"
+#endif
 #include "lineartime.h"
 #include "iso8601.h"
 
index cca9029..75a446c 100644 (file)
@@ -1,3 +1,2 @@
-peerIsClient = 1
-fingerprint = SyncEvolutionClient, SyncEvolution
+fingerprint = SyncEvolution Client
 description = SyncEvolution server side template
diff --git a/src/templates/clients/default/template.ini b/src/templates/clients/default/template.ini
deleted file mode 100644 (file)
index b135b59..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-peerIsClient = 1
-fingerprint = ServerDefault
-description = server side default template
index 632aa0d..9f05700 100644 (file)
@@ -1,3 +1,3 @@
-peerIsClient = 1
-fingerprint = Nokia_7210c,Nokia
-description = Template for Nokia 7210c phone and as default template for all Nokia phones
+fingerprint = Nokia 7210c,Nokia
+description = Template for Nokia S40 series Phone
+templateName = Nokia S40
diff --git a/src/templates/clients/phone/nokia/S60/N85/config.ini b/src/templates/clients/phone/nokia/S60/N85/config.ini
new file mode 100644 (file)
index 0000000..2325c09
--- /dev/null
@@ -0,0 +1,3 @@
+peerIsClient = 1
+remoteIdentifier = PC Suite
+ConsumerReady = 1
diff --git a/src/templates/clients/phone/nokia/S60/N85/sources/addressbook/config.ini b/src/templates/clients/phone/nokia/S60/N85/sources/addressbook/config.ini
new file mode 100644 (file)
index 0000000..e9850ec
--- /dev/null
@@ -0,0 +1,2 @@
+sync = two-way
+uri = Contacts
diff --git a/src/templates/clients/phone/nokia/S60/N85/sources/calendar+todo/config.ini b/src/templates/clients/phone/nokia/S60/N85/sources/calendar+todo/config.ini
new file mode 100644 (file)
index 0000000..e31f19c
--- /dev/null
@@ -0,0 +1,4 @@
+sync = two-way
+type = virtual:text/calendar
+evolutionsource = calendar,todo
+uri = Calendar
diff --git a/src/templates/clients/phone/nokia/S60/N85/sources/calendar/config.ini b/src/templates/clients/phone/nokia/S60/N85/sources/calendar/config.ini
new file mode 100644 (file)
index 0000000..84e080b
--- /dev/null
@@ -0,0 +1 @@
+sync = none
diff --git a/src/templates/clients/phone/nokia/S60/N85/sources/memo/config.ini b/src/templates/clients/phone/nokia/S60/N85/sources/memo/config.ini
new file mode 100644 (file)
index 0000000..2e2ba78
--- /dev/null
@@ -0,0 +1,2 @@
+sync = two-way
+uri = Notes
diff --git a/src/templates/clients/phone/nokia/S60/N85/sources/todo/config.ini b/src/templates/clients/phone/nokia/S60/N85/sources/todo/config.ini
new file mode 100644 (file)
index 0000000..84e080b
--- /dev/null
@@ -0,0 +1 @@
+sync = none
diff --git a/src/templates/clients/phone/nokia/S60/N85/template.ini b/src/templates/clients/phone/nokia/S60/N85/template.ini
new file mode 100644 (file)
index 0000000..ea0d646
--- /dev/null
@@ -0,0 +1,4 @@
+fingerprint = Nokia N85,Nokia
+description = Template for Nokia S60 series Phone
+templateName = Nokia S60
+
diff --git a/src/templates/clients/phone/nokia/maemo/n900/config.ini b/src/templates/clients/phone/nokia/maemo/n900/config.ini
new file mode 100644 (file)
index 0000000..58ca343
--- /dev/null
@@ -0,0 +1,3 @@
+PeerIsClient = 1
+ConsumerReady = 1
+remoteIdentifier = PC Suite
diff --git a/src/templates/clients/phone/nokia/maemo/n900/sources/addressbook/config.ini b/src/templates/clients/phone/nokia/maemo/n900/sources/addressbook/config.ini
new file mode 100644 (file)
index 0000000..e9850ec
--- /dev/null
@@ -0,0 +1,2 @@
+sync = two-way
+uri = Contacts
diff --git a/src/templates/clients/phone/nokia/maemo/n900/sources/calendar+todo/config.ini b/src/templates/clients/phone/nokia/maemo/n900/sources/calendar+todo/config.ini
new file mode 100644 (file)
index 0000000..e31f19c
--- /dev/null
@@ -0,0 +1,4 @@
+sync = two-way
+type = virtual:text/calendar
+evolutionsource = calendar,todo
+uri = Calendar
diff --git a/src/templates/clients/phone/nokia/maemo/n900/sources/calendar/config.ini b/src/templates/clients/phone/nokia/maemo/n900/sources/calendar/config.ini
new file mode 100644 (file)
index 0000000..84e080b
--- /dev/null
@@ -0,0 +1 @@
+sync = none
diff --git a/src/templates/clients/phone/nokia/maemo/n900/sources/memo/config.ini b/src/templates/clients/phone/nokia/maemo/n900/sources/memo/config.ini
new file mode 100644 (file)
index 0000000..2e2ba78
--- /dev/null
@@ -0,0 +1,2 @@
+sync = two-way
+uri = Notes
diff --git a/src/templates/clients/phone/nokia/maemo/n900/sources/todo/config.ini b/src/templates/clients/phone/nokia/maemo/n900/sources/todo/config.ini
new file mode 100644 (file)
index 0000000..84e080b
--- /dev/null
@@ -0,0 +1 @@
+sync = none
diff --git a/src/templates/clients/phone/nokia/maemo/n900/template.ini b/src/templates/clients/phone/nokia/maemo/n900/template.ini
new file mode 100644 (file)
index 0000000..8365276
--- /dev/null
@@ -0,0 +1,2 @@
+fingerprint = Nokia N900
+description = Template for Nokia N900
index 5502bdd..b2e699c 100644 (file)
@@ -4,3 +4,4 @@ syncURL = http://my.funambol.com/sync
 WebURL = http://my.funambol.com
 enableWBXML = FALSE
 ConsumerReady = TRUE
+RetryInterval = 0
index 6f7a8fa..ef87245 100644 (file)
@@ -1,3 +1,2 @@
-PeerIsClient = 0
 fingerprint = Funambol
 description = http://my.funambol.com
index 03ac4ee..855ce8e 100644 (file)
@@ -1,3 +1,2 @@
-PeerIsClient = 0
 fingerprint = ScheduleWorld, default
 description = http://www.scheduleworld.org
diff --git a/src/testcases/ical20.ics.Ovi.tem b/src/testcases/ical20.ics.Ovi.tem
new file mode 100644 (file)
index 0000000..930fb35
--- /dev/null
@@ -0,0 +1,152 @@
+BEGIN:VCALENDAR\r
+PRODID:-//Ximian//NONSGML Evolution Calendar//EN\r
+VERSION:2.0\r
+BEGIN:VEVENT\r
+UID:20060416T203656Z-4272-727-1-241@gollum\r
+DTSTAMP:20060416T203656Z\r
+DTSTART:20060406T170000Z\r
+DTEND:20060406T173000Z\r
+TRANSP:OPAQUE\r
+SEQUENCE:3\r
+SUMMARY:recurrence weekly\, limited\r
+DESCRIPTION:recurrs four times due its end date\r
+CLASS:PUBLIC\r
+CREATED:20060416T203724Z\r
+LAST-MODIFIED:20060416T203758Z\r
+RRULE:FREQ=WEEKLY;UNTIL=20060427T000000Z;INTERVAL=1;BYDAY=TH\r
+END:VEVENT\r
+END:VCALENDAR\r
+\r
+BEGIN:VCALENDAR\r
+PRODID:-//Ximian//NONSGML Evolution Calendar//EN\r
+VERSION:2.0\r
+BEGIN:VEVENT\r
+UID:20060416T203551Z-4272-727-1-240@gollum\r
+DTSTAMP:20060416T203551Z\r
+DTSTART:20060406T163000Z\r
+DTEND:20060406T170000Z\r
+TRANSP:OPAQUE\r
+SEQUENCE:3\r
+SUMMARY:recurrence daily unlimited\r
+DESCRIPTION:recurrence daily unlimited\r
+CLASS:PUBLIC\r
+CREATED:20060416T203646Z\r
+LAST-MODIFIED:20060416T203806Z\r
+RRULE:FREQ=DAILY;INTERVAL=1\r
+END:VEVENT\r
+END:VCALENDAR\r
+\r
+BEGIN:VCALENDAR\r
+PRODID:-//Ximian//NONSGML Evolution Calendar//EN\r
+VERSION:2.0\r
+BEGIN:VEVENT\r
+UID:20060416T204647Z-4272-727-1-248@gollum\r
+DTSTAMP:20060416T204647Z\r
+DTSTART:20060406T183000Z\r
+DTEND:20060406T190000Z\r
+TRANSP:OPAQUE\r
+SEQUENCE:2\r
+SUMMARY:recurrence\, daily\, with exceptions\r
+DESCRIPTION:recurrs seven times\, excluding (but counting) Friday and \r
+ Saturday\r
+CLASS:PUBLIC\r
+RRULE:FREQ=DAILY;INTERVAL=1;UNTIL=20060412T183000Z\r
+EXDATE;VALUE=DATE:20060408\r
+EXDATE;VALUE=DATE:20060407\r
+CREATED:20060416T204808Z\r
+LAST-MODIFIED:20060416T204808Z\r
+END:VEVENT\r
+END:VCALENDAR\r
+\r
+BEGIN:VCALENDAR\r
+PRODID:-//Ximian//NONSGML Evolution Calendar//EN\r
+VERSION:2.0\r
+BEGIN:VEVENT\r
+UID:20060416T204136Z-4272-727-1-247@gollum\r
+DTSTAMP:20060416T204136Z\r
+DTSTART:20060406T190000Z\r
+DTEND:20060406T193000Z\r
+TRANSP:TRANSPARENT\r
+SEQUENCE:4\r
+SUMMARY:all fields\r
+LOCATION:virtual\r
+CATEGORIES:Business,test,bar\r
+CLASS:PRIVATE\r
+CREATED:20060416T204625Z\r
+LAST-MODIFIED:20060416T204833Z\r
+DESCRIPTION:this is an appointment with plenty of fields set\, and \r
+ special attributes...\n\nempty line above\, line\nbreak\n\nspecial \r
+ characters:\na-umlaut ä\nexclamation mark !\nampersand disabled\nhash \r
+ #\nleft angle bracket disabled\nright angle bracket disabled\nleft square \r
+ bracket [\nright square bracket ]\nleft bracket (\nright bracket \r
+ )\nbackslash \\\nbackslash lf \\n\nbackslash cr \\r\nstar *\ncarret \r
+ ^\npercent %\ntilde ~\ntick `\nbacktick `\ndouble quotation - not tested \r
+ because Evolution encodes it incorrectly\nsingle quotation '\ncolon :\n\r
+ semicolon \;\ncomma \,\n\r
+BEGIN:VALARM\r
+X-EVOLUTION-ALARM-UID:20060416T204833Z-4250-727-1-85@gollum\r
+ACTION:DISPLAY\r
+TRIGGER;VALUE=DURATION;RELATED=START:-PT1H\r
+END:VALARM\r
+END:VEVENT\r
+END:VCALENDAR\r
+\r
+BEGIN:VCALENDAR\r
+PRODID:-//Ximian//NONSGML Evolution Calendar//EN\r
+VERSION:2.0\r
+BEGIN:VEVENT\r
+UID:20060416T204922Z-4272-727-1-250@gollum\r
+DTSTAMP:20060416T204922Z\r
+DTSTART:20060406T193000Z\r
+DTEND:20060406T200000Z\r
+TRANSP:OPAQUE\r
+SEQUENCE:2\r
+CATEGORIES:BUSINESS,MEETING\r
+SUMMARY:meeting invitation\r
+DESCRIPTION:meeting invitation\r
+CLASS:PUBLIC\r
+ORGANIZER;CN=Patrick Ohly:MAILTO:Patrick.Ohly@gmx.de\r
+CREATED:20060416T205003Z\r
+LAST-MODIFIED:20060416T205003Z\r
+END:VEVENT\r
+END:VCALENDAR\r
+\r
+BEGIN:VCALENDAR\r
+PRODID:-//Ximian//NONSGML Evolution Calendar//EN\r
+VERSION:2.0\r
+METHOD:PUBLISH\r
+BEGIN:VEVENT\r
+UID:20080407T193125Z-19554-727-1-50@gollum\r
+DTSTAMP:20080407T193125Z\r
+DTSTART:20080406T090000Z\r
+DTEND:20080406T093000Z\r
+TRANSP:OPAQUE\r
+SEQUENCE:2\r
+SUMMARY:Recurring\r
+DESCRIPTION:recurs each Sonday\, 10 times\r
+CLASS:PUBLIC\r
+RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=SU;UNTIL=20080608T090000Z\r
+CREATED:20080407T193241\r
+LAST-MODIFIED:20080407T193241\r
+END:VEVENT\r
+END:VCALENDAR\r
+\r
+BEGIN:VCALENDAR\r
+PRODID:-//Ximian//NONSGML Evolution Calendar//EN\r
+VERSION:2.0\r
+METHOD:PUBLISH\r
+BEGIN:VEVENT\r
+UID:20080407T193125Z-19554-727-1-50@gollum\r
+DTSTAMP:20080407T193125Z\r
+DTSTART:20080413T090000Z\r
+DTEND:20080413T093000Z\r
+TRANSP:OPAQUE\r
+SEQUENCE:7\r
+SUMMARY:Recurring: Modified\r
+CLASS:PUBLIC\r
+CREATED:20080407T193241\r
+LAST-MODIFIED:20080407T193647\r
+RECURRENCE-ID:20080413T090000Z\r
+DESCRIPTION:second instance modified\r
+END:VEVENT\r
+END:VCALENDAR\r
diff --git a/src/testcases/itodo20.ics.Ovi.tem b/src/testcases/itodo20.ics.Ovi.tem
new file mode 100644 (file)
index 0000000..6ffda99
--- /dev/null
@@ -0,0 +1,24 @@
+BEGIN:VCALENDAR\r
+PRODID:-//Ximian//NONSGML Evolution Calendar//EN\r
+VERSION:2.0\r
+METHOD:PUBLISH\r
+BEGIN:VTODO\r
+UID:20090401T145153Z-22321-1000-1-18@pohly-MOBL\r
+DTSTAMP:20090401T145153Z\r
+SUMMARY:test task with plenty of fields\r
+PRIORITY:7\r
+CREATED:20090401T145153Z\r
+LAST-MODIFIED:20090401T145153Z\r
+DESCRIPTION:This is a test task in time zone New York\, to be started May \r
+ 1st 2009\, due Mai 2st 2009.\n\nIt uses non-standard status values.\r
+DUE:20090502T130000Z\r
+DTSTART:20090501T100000Z\r
+CLASS:PUBLIC\r
+PERCENT-COMPLETE:99\r
+STATUS:COMPLETED\r
+CATEGORIES:Business,Waiting\r
+COMPLETED:20090401T030000Z\r
+URL:http://foo.com\r
+SEQUENCE:1\r
+END:VTODO\r
+END:VCALENDAR\r
index cca9029..75a446c 100644 (file)
@@ -1,3 +1,2 @@
-peerIsClient = 1
-fingerprint = SyncEvolutionClient, SyncEvolution
+fingerprint = SyncEvolution Client
 description = SyncEvolution server side template
diff --git a/src/testcases/templates/clients/default/template.ini b/src/testcases/templates/clients/default/template.ini
deleted file mode 100644 (file)
index b135b59..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-peerIsClient = 1
-fingerprint = ServerDefault
-description = server side default template
index 632aa0d..9f05700 100644 (file)
@@ -1,3 +1,3 @@
-peerIsClient = 1
-fingerprint = Nokia_7210c,Nokia
-description = Template for Nokia 7210c phone and as default template for all Nokia phones
+fingerprint = Nokia 7210c,Nokia
+description = Template for Nokia S40 series Phone
+templateName = Nokia S40
diff --git a/src/testcases/vcard30.vcf.Ovi.tem b/src/testcases/vcard30.vcf.Ovi.tem
new file mode 100644 (file)
index 0000000..5c0708c
--- /dev/null
@@ -0,0 +1,427 @@
+BEGIN:VCARD\r
+VERSION:3.0\r
+NICKNAME:user17\r
+NOTE:triggers parser bug in Funambol 3.0: trailing = is mistaken for soft line break=\r
+FN:parserbug=\r
+N:parserbug=\r
+X-EVOLUTION-FILE-AS:parserbug=\r
+END:VCARD\r
+\r
+BEGIN:VCARD\r
+VERSION:3.0\r
+NICKNAME:user16\r
+NOTE:test case with empty email\r
+FN:incomplete\r
+N:incomplete\r
+EMAIL:\r
+X-EVOLUTION-FILE-AS:incomplete\r
+END:VCARD\r
+\r
+BEGIN:VCARD\r
+VERSION:3.0\r
+NICKNAME:user11\r
+NOTE:This is a long line without any special characters. This is a simpler \r
+ example that should require folding in vcards. Does folding insert a crlf\r
+  before a space or does it insert crlf _plus_ a space? vCard 2.1 inserts \r
+ before a space\, 3.0 inserts line break plus space.\r
+FN:long line\r
+N:line;long;;;\r
+X-EVOLUTION-FILE-AS:line\, long\r
+END:VCARD\r
+\r
+BEGIN:VCARD\r
+VERSION:3.0\r
+NICKNAME:user12\r
+NOTE:ampersand entity &amp\; less-than entity &lt\;\r
+FN:xml entities\r
+N:xml;entities;;;\r
+X-EVOLUTION-FILE-AS:xml\, entities\r
+END:VCARD\r
+\r
+BEGIN:VCARD\r
+VERSION:3.0\r
+NICKNAME:user13\r
+NOTE:a colon is not a special character so here it comes : and not quoting necessary\r
+FN:colon\r
+N:colon;unquoted;;;\r
+X-EVOLUTION-FILE-AS:colon\, unquoted\r
+END:VCARD\r
+\r
+BEGIN:VCARD\r
+VERSION:3.0\r
+NICKNAME:user14\r
+NOTE:here are some quotation marks: single ' double " back ` - none of them is special\r
+FN:quotation marks\r
+N:marks;quotation;;;\r
+X-EVOLUTION-FILE-AS:marks\, quotation\r
+END:VCARD\r
+\r
+BEGIN:VCARD\r
+VERSION:3.0\r
+NICKNAME:user15\r
+NOTE:Spouse's Name: foobar\r
+FN:spouse name\r
+N:name;spouse;;;\r
+X-EVOLUTION-FILE-AS:spouse\, name\r
+END:VCARD\r
+\r
+BEGIN:VCARD\r
+VERSION:3.0\r
+NICKNAME:user9\r
+NOTE;CHARSET="UTF-8":Tests charset specification with quotation marks.\r
+FN:charset\r
+N:set;char;;;\r
+X-EVOLUTION-FILE-AS:set\, char\r
+END:VCARD\r
+\r
+BEGIN:VCARD\r
+VERSION:3.0\r
+URL:\r
+TITLE:\r
+ROLE:\r
+X-EVOLUTION-MANAGER:\r
+X-EVOLUTION-ASSISTANT:\r
+NICKNAME:user2\r
+X-EVOLUTION-SPOUSE:\r
+NOTE:This user tests some of the advanced aspects of vcards:- non-ASCII c\r
+ haracters (with umlauts in the name)- line break (in this note and the\r
+  mailing address)- long lines (in this note)- special characters (in\r
+  this note)- tabs (in this note)Very long line\, very very long th\r
+ is time... still not finished... blah blah blah blah blah 1 2 3 4 5 6 7 \r
+ 8 9 10 11 12 13 14 15 16comma \,colon :semicolon \;backslash \r
+ \\The same\, in the middle of a line:comma \, commacolon : col\r
+ onsemicolon \; semicolonbackslash \\ backslash\r
+FN:Umlaut Ä Ö Ü ß\r
+N:Ü;Ä;Ö;Umlaut;ß\r
+X-EVOLUTION-FILE-AS:Ü\, Ä\r
+CATEGORIES:Business\r
+X-EVOLUTION-BLOG-URL:\r
+CALURI:\r
+FBURL:\r
+X-EVOLUTION-VIDEO-URL:\r
+X-MOZILLA-HTML:FALSE\r
+ADR;TYPE=HOME:test 5;Line 2;Umlaut Ä in Line 1;test 1;test 3;test 2;test 4\r
+LABEL;TYPE=HOME:Umlaut Ä in Line 1\nLine 2\n\ntest 1\, test 3\ntest 2\ntest 5\ntest 4\r
+UID:pas-id-43C0EF0A00000002\r
+END:VCARD\r
+\r
+BEGIN:VCARD\r
+VERSION:3.0\r
+URL:\r
+TITLE:\r
+ROLE:\r
+X-EVOLUTION-MANAGER:\r
+X-EVOLUTION-ASSISTANT:\r
+NICKNAME:user8\r
+X-EVOLUTION-SPOUSE:\r
+NOTE:Here are some special characters: comma \, colon : semicolon \;\r
+FN:special characters\r
+N:characters;special;;;\r
+X-EVOLUTION-FILE-AS:characters\, special\r
+X-EVOLUTION-BLOG-URL:\r
+CALURI:\r
+FBURL:\r
+X-EVOLUTION-VIDEO-URL:\r
+X-MOZILLA-HTML:FALSE\r
+UID:pas-id-43C15E84000001AC\r
+END:VCARD\r
+\r
+BEGIN:VCARD\r
+VERSION:3.0\r
+URL:\r
+TITLE:\r
+ROLE:\r
+X-EVOLUTION-MANAGER:\r
+X-EVOLUTION-ASSISTANT:\r
+NICKNAME:user7\r
+X-EVOLUTION-SPOUSE:\r
+NOTE:This test case uses line breaks. This is line 1.\nLine 2.\n\nLine brea\r
+ ks in vcard 2.1 are encoded as =0D=0A.\nThat means the = has to be encod\r
+ ed itself...\r
+FN:line breaks\r
+N:breaks;line;;;\r
+X-EVOLUTION-FILE-AS:breaks\, line\r
+X-EVOLUTION-BLOG-URL:\r
+CALURI:\r
+FBURL:\r
+X-EVOLUTION-VIDEO-URL:\r
+X-MOZILLA-HTML:FALSE\r
+ADR;TYPE=HOME:;Address Line 2\nAddress Line 3;Address Line 1;;;;\r
+LABEL;TYPE=HOME:Address Line 1\nAddress Line 2\nAddress Line 3\r
+UID:pas-id-43C15DFB000001AB\r
+END:VCARD\r
+\r
+BEGIN:VCARD\r
+VERSION:3.0\r
+URL:http://john.doe.com\r
+TITLE:Senior Tester\r
+ORG:Test Inc.;Testing;test#1\r
+ROLE:professional test case\r
+X-EVOLUTION-MANAGER:John Doe Senior\r
+X-EVOLUTION-ASSISTANT:John Doe Junior\r
+NICKNAME:user1\r
+BDAY:2006-01-08\r
+X-EVOLUTION-ANNIVERSARY:2006-01-09\r
+X-EVOLUTION-SPOUSE:Joan Doe\r
+NOTE:This is a test case which uses almost all Evolution fields.\r
+FN:John Doe\r
+N:Doe;John;;;\r
+X-EVOLUTION-FILE-AS:Doe\, John\r
+CATEGORIES:TEST\r
+X-EVOLUTION-BLOG-URL:web log\r
+CALURI:calender\r
+FBURL:free/busy\r
+X-EVOLUTION-VIDEO-URL:chat\r
+X-MOZILLA-HTML:TRUE\r
+ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O\r
+ ld Testovia\r
+LABEL;TYPE=WORK:Test Drive 2\nTest Town\, Upper Test County\n12346\nTest Bo\r
+ x #2\nOld Testovia\r
+ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234\r
+ 5;Testovia\r
+LABEL;TYPE=HOME:Test Drive 1\nTest Village\, Lower Test County\n12345\nTest\r
+  Box #1\nTestovia\r
+ADR:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;New Testonia\r
+LABEL;TYPE=OTHER:Test Drive 3\nTest Megacity\, Test County\n12347\nTest Box\r
+  #3\nNew Testonia\r
+UID:pas-id-43C0ED3900000001\r
+EMAIL;TYPE=WORK;X-EVOLUTION-UI-SLOT=1:john.doe@work.com\r
+EMAIL;TYPE=HOME;X-EVOLUTION-UI-SLOT=2:john.doe@home.priv\r
+EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=3:john.doe@other.world\r
+EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=4:john.doe@yet.another.world\r
+TEL;TYPE=work;TYPE=Voice;X-EVOLUTION-UI-SLOT=1:business 1\r
+TEL;TYPE=homE;TYPE=VOICE;X-EVOLUTION-UI-SLOT=2:home 2\r
+TEL;TYPE=CELL;X-EVOLUTION-UI-SLOT=3:mobile 3\r
+TEL;TYPE=WORK;TYPE=FAX;X-EVOLUTION-UI-SLOT=4:businessfax 4\r
+TEL;TYPE=HOME;TYPE=FAX;X-EVOLUTION-UI-SLOT=5:homefax 5\r
+TEL;TYPE=PAGER;X-EVOLUTION-UI-SLOT=6:pager 6\r
+TEL;TYPE=CAR;X-EVOLUTION-UI-SLOT=7:car 7\r
+TEL;TYPE=PREF;X-EVOLUTION-UI-SLOT=8:primary 8\r
+X-AIM;TYPE=HOME;X-EVOLUTION-UI-SLOT=1:AIM JOHN\r
+X-YAHOO;TYPE=HOME;X-EVOLUTION-UI-SLOT=2:YAHOO JDOE\r
+X-ICQ;TYPE=HOME;X-EVOLUTION-UI-SLOT=3:ICQ JD\r
+X-GROUPWISE;TYPE=HOME;X-EVOLUTION-UI-SLOT=4:GROUPWISE DOE\r
+END:VCARD\r
+\r
+BEGIN:VCARD\r
+VERSION:3.0\r
+URL:\r
+TITLE:\r
+ROLE:\r
+X-EVOLUTION-MANAGER:\r
+X-EVOLUTION-ASSISTANT:\r
+NICKNAME:user5\r
+X-EVOLUTION-SPOUSE:\r
+NOTE:image in JPG format\r
+FN:Ms. JPG\r
+N:;JPG;;Ms.;\r
+X-EVOLUTION-FILE-AS:JPG\r
+X-EVOLUTION-BLOG-URL:\r
+CALURI:\r
+FBURL:\r
+X-EVOLUTION-VIDEO-URL:\r
+X-MOZILLA-HTML:FALSE\r
+PHOTO;ENCODING=b;TYPE=JPEG:/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAA\r
+ AAgAAAAAAAD//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAFAwQEBAMFBAQEBQUFBgcM\r
+ CAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEF\r
+ BQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e\r
+ Hh4eHh4eHh4e/8AAEQgAFwAkAwEiAAIRAQMRAf/EABkAAQADAQEAAAAAAAAAAAAAAAAGBwgE\r
+ Bf/EADIQAAECBQMCAwQLAAAAAAAAAAECBAADBQYRBxIhEzEUFSIIFjNBGCRHUVZ3lqXD0+P/\r
+ xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMR\r
+ AD8AuX6UehP45/aXv9MTPTLVKxNSvMPcqu+a+XdLxf1SfJ6fU37PioTnOxfbOMc/KIZ7U/2V\r
+ fmTR/wCaKlu6+blu/Ui72zxWtUmmUOrTaWwkWDT09FPR4K587OVrUfVsIwElPPPAbAjxr2um\r
+ hWXbDu5rmfeApLPZ4hx0lzNm9aUJ9KAVHKlJHAPf7ozPLqWt9y6Z0EPGmoLNjTq48a1iaybJ\r
+ YV52yEtCms5KJmAT61JXtJyUdyQTEc1WlMql7N1/oZ6jagVZVFfUyZPpFy5lvWcxU7Z03BUk\r
+ GZLWJqVhPYLkIIPBEBtSEUyNAsjI1q1m/VP+UICwL/sqlXp7v+aOHsnyGttq218MtKd8+Ru2\r
+ JXuScoO45Awe2CIi96aKW1cVyubkYVy6rTqz0J8a5t2qqZl0UjAMwYKScfPAJ+cIQHHP0Dth\r
+ VFaMWt0XwxetnM50Ks2rsxL6ZMnJlJmb5hBBBEiVxjA28dznqo+hdksbQuS3Hs6tVtNzdM1Z\r
+ /VH5nO3Bl/CJmYHKDynjv3zCEB5rLQNo0bIbydWNWxKljbLQLoWkISOAkBKAABCEID//2Q==\r
+UID:pas-id-43C0F0B500000005\r
+END:VCARD\r
+\r
+BEGIN:VCARD\r
+VERSION:3.0\r
+URL:\r
+TITLE:\r
+ROLE:\r
+X-EVOLUTION-MANAGER:\r
+X-EVOLUTION-ASSISTANT:\r
+NICKNAME:user4\r
+X-EVOLUTION-SPOUSE:\r
+NOTE:image in PNG format\r
+FN:Mrs. PNG\r
+N:;PNG;;Mrs.;\r
+X-EVOLUTION-FILE-AS:PNG\r
+X-EVOLUTION-BLOG-URL:\r
+CALURI:\r
+FBURL:\r
+X-EVOLUTION-VIDEO-URL:\r
+X-MOZILLA-HTML:FALSE\r
+PHOTO;ENCODING=b;TYPE=PNG:iVBORw0KGgoAAAANSUhEUgAAACQAAAAXCAYAAABj7u2bAAAAB\r
+ mJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1gEICjgdiWkBO\r
+ QAAAB10RVh0Q29tbWVudABDcmVhdGVkIHdpdGggVGhlIEdJTVDvZCVuAAABaElEQVRIx+3Wu\r
+ 0tcURAG8F98gRKTYGORRqwksJV/QOqFFIFgKgsRYbHV1larDQQCKQxpUscyhUmXJuCSNpYWP\r
+ sAU6wPxHW6aWbgsu+ve3RUs7geHc+fON3O+M4c5HHLkyHG/eISkg5heIGmUr++hVWigyY6TH\r
+ lejbWSt0Bv8QBXX2MF7jKU4IyjjJ45xg31sYKZuw7Xv9Gh6vvXO9QbBtbGNJ8Ert+AlTURkF\r
+ jQX9g5e4ykGUcBm+FaDexx2MUQOYhIL2Lpj09oV9CvsQgPuePj+hP037BL6M6yRSdDZHWVOc\r
+ BHcEv7FvyN8xxqmeynovA1Baf4UVvANhyn/Uq8E/Q57ssNufhvx1QZrDHfS9p9i3sQsnscdN\r
+ owXWEQlOBXMYyI4j3EavqFUzpOYl4OTqUJ9+NzmkbXyb6Ryfumm7Wso4it2cYXL6K6PeBmcV\r
+ 8E5iEvxPDjv8CyVaxQfsIfbqGIlf17k6Bb/Ae0cnahfg6KuAAAAAElFTkSuQmCC\r
+UID:pas-id-43C0F07900000004\r
+END:VCARD\r
+\r
+BEGIN:VCARD\r
+VERSION:3.0\r
+URL:\r
+TITLE:\r
+ROLE:\r
+X-EVOLUTION-MANAGER:\r
+X-EVOLUTION-ASSISTANT:\r
+NICKNAME:user6\r
+X-EVOLUTION-SPOUSE:\r
+NOTE:The first name is "First \; special \;".\r
+FN:Mr. First \; special \; middle Last\r
+N:Last;First \; special \;;middle;Mr.;\r
+X-EVOLUTION-FILE-AS:Last\, First \; special \;\r
+X-EVOLUTION-BLOG-URL:\r
+CALURI:\r
+FBURL:\r
+X-EVOLUTION-VIDEO-URL:\r
+X-MOZILLA-HTML:FALSE\r
+UID:pas-id-43C15D55000001AA\r
+END:VCARD\r
+\r
+BEGIN:VCARD\r
+VERSION:3.0\r
+URL:\r
+TITLE:\r
+ROLE:\r
+X-EVOLUTION-MANAGER:\r
+X-EVOLUTION-ASSISTANT:\r
+NICKNAME:user3\r
+X-EVOLUTION-SPOUSE:\r
+NOTE:image in GIF format\r
+FN:Mr. GIF\r
+N:;GIF;;Mr.;\r
+X-EVOLUTION-FILE-AS:GIF\r
+X-EVOLUTION-BLOG-URL:\r
+CALURI:\r
+FBURL:\r
+X-EVOLUTION-VIDEO-URL:\r
+X-MOZILLA-HTML:FALSE\r
+PHOTO;ENCODING=b;TYPE=GIF:R0lGODlhJAAXAIABAAAAAP///yH+FUNyZWF0ZWQgd2l0aCBUa\r
+ GUgR0lNUAAh+QQBCgABACwAAAAAJAAXAAACVYyPqcvtD6OctNqLFdi8b/sd3giAJRNmqXaKH\r
+ TIaZJKSpx3McLtyeSuTAWm34e+4WBGFuJ/P1QjZek9ksjiRGqFCTW5pZblmzdiO+GJWncqM+\r
+ w2PwwsAOw==\r
+UID:pas-id-43C0F04B00000003\r
+END:VCARD\r
+\r
+BEGIN:VCARD\r
+VERSION:3.0\r
+NICKNAME:user10\r
+X-EVOLUTION-SPOUSE:\r
+NOTE:large vcard with plenty of special chars < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+  & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & <\r
+FN:large vcard\r
+N:;vcard;;large;\r
+X-EVOLUTION-FILE-AS:large\r
+END:VCARD\r
index c2b5a48..b672b26 100644 (file)
@@ -1519,6 +1519,10 @@ void SyncTests::addTests() {
             ADD_TEST_TO_SUITE(retryTests, SyncTests, testInterruptResumeServerAdd);
             ADD_TEST_TO_SUITE(retryTests, SyncTests, testInterruptResumeServerRemove);
             ADD_TEST_TO_SUITE(retryTests, SyncTests, testInterruptResumeServerUpdate);
+            ADD_TEST_TO_SUITE(retryTests, SyncTests, testInterruptResumeClientAddBig);
+            ADD_TEST_TO_SUITE(retryTests, SyncTests, testInterruptResumeClientUpdateBig);
+            ADD_TEST_TO_SUITE(retryTests, SyncTests, testInterruptResumeServerAddBig);
+            ADD_TEST_TO_SUITE(retryTests, SyncTests, testInterruptResumeServerUpdateBig);
             ADD_TEST_TO_SUITE(retryTests, SyncTests, testInterruptResumeFull);
             addTest(FilterTest(retryTests));
         }
@@ -1536,6 +1540,10 @@ void SyncTests::addTests() {
             ADD_TEST_TO_SUITE(suspendTests, SyncTests, testUserSuspendServerAdd);
             ADD_TEST_TO_SUITE(suspendTests, SyncTests, testUserSuspendServerRemove);
             ADD_TEST_TO_SUITE(suspendTests, SyncTests, testUserSuspendServerUpdate);
+            ADD_TEST_TO_SUITE(suspendTests, SyncTests, testUserSuspendClientAddBig);
+            ADD_TEST_TO_SUITE(suspendTests, SyncTests, testUserSuspendClientUpdateBig);
+            ADD_TEST_TO_SUITE(suspendTests, SyncTests, testUserSuspendServerAddBig);
+            ADD_TEST_TO_SUITE(suspendTests, SyncTests, testUserSuspendServerUpdateBig);
             ADD_TEST_TO_SUITE(suspendTests, SyncTests, testUserSuspendFull);
             addTest(FilterTest(suspendTests));
         }
@@ -1598,6 +1606,11 @@ void SyncTests::deleteAll(DeleteAllMode mode) {
     source_it it;
     SyncPrefix prefix("deleteall", *this);
 
+    const char *value = getenv ("CLIENT_TEST_DELETE_REFRESH");
+    if (value) {
+        mode = DELETE_ALL_REFRESH;
+    }
+
     switch(mode) {
      case DELETE_ALL_SYNC:
         // a refresh from server would slightly reduce the amount of data exchanged, but not all servers support it
@@ -1682,7 +1695,7 @@ void SyncTests::testDeleteAllRefresh() {
     doSync("insert", SyncOptions(SYNC_SLOW));
 
     // now ensure we can delete it
-    deleteAll(DELETE_ALL_SYNC);
+    deleteAll(DELETE_ALL_REFRESH);
 
     // nothing stored locally?
     for (it = sources.begin(); it != sources.end(); ++it) {
@@ -2623,6 +2636,16 @@ void SyncTests::doVarSizes(bool withMaxMsgSize,
     compareDatabases();
 }
 
+/**
+ * Send message to server, then pretend that we timed out at exactly
+ * one specific message, specified via m_interruptAtMessage.  The
+ * caller is expected to resend the message, without aborting the
+ * session. That resend and all following message will get through
+ * again.
+ *
+ * Each send() is counted as one message, starting at 1 for the first
+ * message.
+ */
 class TransportResendInjector : public TransportWrapper{
 private:
     int timeout;
@@ -2664,6 +2687,14 @@ public:
     }
 };
 
+/**
+ * Stop sending at m_interruptAtMessage. The caller is forced to abort
+ * the current session and will recover by retrying in another
+ * session.
+ *
+ * Each send() increments the counter by two, so that 1 aborts before
+ * the first message and 2 after it.
+ */
 class TransportFaultInjector : public TransportWrapper{
 public:
     TransportFaultInjector()
@@ -2791,19 +2822,37 @@ public:
  *
  * Set the CLIENT_TEST_INTERRUPT_AT env variable to a message number
  * >= 0 to execute one uninterrupted run and then interrupt at that
- * message.
+ * message. Set to -1 to just do the uninterrupted run.
  */
 void SyncTests::doInterruptResume(int changes, 
                   boost::shared_ptr<TransportWrapper> wrapper)
 {
     int interruptAtMessage = -1;
     const char *t = getenv("CLIENT_TEST_INTERRUPT_AT");
-    int requestedInterruptAt = t ? atoi(t) : -1;
+    int requestedInterruptAt = t ? atoi(t) : -2;
     const char *s = getenv("CLIENT_TEST_INTERRUPT_SLEEP");
     int sleep_t = s ? atoi(s) : 0;
     size_t i;
     std::string refFileBase = getCurrentTest() + ".ref.";
     bool equal = true;
+    bool resend = dynamic_cast <TransportResendInjector *> (wrapper.get()) != NULL;
+    bool suspend = dynamic_cast <UserSuspendInjector *> (wrapper.get()) != NULL;
+    bool interrupt = dynamic_cast <TransportFaultInjector *> (wrapper.get()) != NULL;
+
+    // better be large enough for complete DevInf, 20000 is already a
+    // bit small when running with many stores
+    size_t maxMsgSize = 20000;
+    size_t changedItemSize = (changes & BIG) ?
+        5 * maxMsgSize / 2 : // large enough to be split over three messages
+        0;
+
+    // After running the uninterrupted sync, we remember the number
+    // of sent messages. We never interrupt between sending our
+    // own last message and receiving the servers last reply,
+    // because the server is unable to detect that we didn't get
+    // the reply. It will complete the session whereas the client
+    // suspends, leading to an unexpected slow sync the next time.
+    int maxMsgNum = 0;
 
     while (true) {
         char buffer[80];
@@ -2842,7 +2891,7 @@ void SyncTests::doInterruptResume(int changes,
         for (i = 0; i < sources.size(); i++) {
             if (changes & SERVER_ADD) {
                 sources[i].second->insertManyItems(sources[i].second->createSourceA,
-                                                   4, 1, 0);
+                                                   4, 1, changedItemSize);
             }
             if (changes & SERVER_REMOVE) {
                 // remove second item
@@ -2853,19 +2902,21 @@ void SyncTests::doInterruptResume(int changes,
                 // update third item
                 updateItem(sources[i].second->createSourceA,
                            *(++ ++clientAluids[i].begin()),
-                           sources[i].second->createItem(3, "updated", 0).c_str());
+                           sources[i].second->createItem(3, "updated", changedItemSize).c_str());
                                               
             }
         }
+
+        // send using the same mode as in the interrupted sync with client B
         if (changes & (SERVER_ADD|SERVER_REMOVE|SERVER_UPDATE)) {
-            doSync("changesFromA", SyncOptions(SYNC_TWO_WAY));
+            doSync("changesFromA", SyncOptions(SYNC_TWO_WAY).setMaxMsgSize(maxMsgSize));
         }
 
         // make changes as requested on client B
         for (i = 0; i < sources.size(); i++) {
             if (changes & CLIENT_ADD) {
                 accessClientB->sources[i].second->insertManyItems(accessClientB->sources[i].second->createSourceA,
-                                                                  14, 1, 0);
+                                                                  14, 1, changedItemSize);
             }
             if (changes & CLIENT_REMOVE) {
                 // remove second item
@@ -2876,7 +2927,7 @@ void SyncTests::doInterruptResume(int changes,
                 // update third item
                 updateItem(accessClientB->sources[i].second->createSourceA,
                            *(++ ++clientBluids[i].begin()),
-                           accessClientB->sources[i].second->createItem(13, "updated", 0).c_str());
+                           accessClientB->sources[i].second->createItem(13, "updated", changedItemSize).c_str());
             }
         }
 
@@ -2885,13 +2936,26 @@ void SyncTests::doInterruptResume(int changes,
         // by overloading the delete operator.
         int wasInterrupted;
         {
+            CheckSyncReport check(-1, -1, -1, -1, -1, -1, false);
+            if (resend && interruptAtMessage != 0) {
+                // resend tests must succeed, except for the first
+                // message in the session, which is not resent
+                check.mustSucceed = true;
+            }
+            SyncOptions options(SYNC_TWO_WAY, check);
+            options.setTransportAgent(wrapper);
+            options.setMaxMsgSize(maxMsgSize);
+            if (!resend) {
+                // disable resending completely
+                options.setRetryInterval(0);
+            }
             wrapper->setInterruptAtMessage(interruptAtMessage);
-            accessClientB->doSync("changesFromB",
-                                  SyncOptions(SYNC_TWO_WAY,
-                                              CheckSyncReport(-1, -1, -1, -1,
-                                                  -1, -1, false)).setTransportAgent(wrapper));
+            accessClientB->doSync("changesFromB", options);
             wasInterrupted = interruptAtMessage != -1 &&
                 wrapper->getMessageCount() <= interruptAtMessage;
+            if (!maxMsgNum) {
+                maxMsgNum = wrapper->getMessageCount();
+            }
             wrapper->rewind();
         }
 
@@ -2905,9 +2969,24 @@ void SyncTests::doInterruptResume(int changes,
             if(sleep_t) 
                 sleep (sleep_t);
 
-            // no need for resend tests 
-            if (!dynamic_cast <TransportResendInjector *> (wrapper.get())) {
-                accessClientB->doSync("retryB", SyncOptions(SYNC_TWO_WAY));
+            // no need for resend tests, unless they were interrupted at the first message
+            if (!resend || interruptAtMessage == 0) {
+                SyncReport report;
+                accessClientB->doSync("retryB",
+                                      SyncOptions(SYNC_TWO_WAY,
+                                                  CheckSyncReport().setMode(SYNC_TWO_WAY).setReport(&report)));
+                // Suspending at first and last message doesn't need a
+                // resume, everything else does. When multiple sources
+                // are involved, some may suspend, some may not, so we
+                // cannot check.
+                if (suspend &&
+                    interruptAtMessage != 0 &&
+                    interruptAtMessage + 1 != maxMsgNum &&
+                    report.size() == 1) {
+                    BOOST_FOREACH(const SyncReport::SourceReport_t &sourceReport, report) {
+                        CPPUNIT_ASSERT(sourceReport.second.isResumeSync());
+                    }
+                }
             }
         }
 
@@ -2945,8 +3024,11 @@ void SyncTests::doInterruptResume(int changes,
             }
         }
 
-        // pick next iterration
-        if (requestedInterruptAt != -1) {
+        // pick next iteration
+        if (requestedInterruptAt == -1) {
+            // user requested to stop after first iteration
+            break;
+        } else if (requestedInterruptAt >= 0) {
             // only do one interrupted run of the test
             if (requestedInterruptAt == interruptAtMessage) {
                 break;
@@ -2956,6 +3038,19 @@ void SyncTests::doInterruptResume(int changes,
         } else {
             // interrupt one message later than before
             interruptAtMessage++;
+            if (interrupt &&
+                interruptAtMessage + 1 >= maxMsgNum) {
+                // Don't interrupt before the server's last reply,
+                // because then the server thinks we completed the
+                // session when we think we didn't, which leads to a
+                // slow sync. Testing that is better done with a
+                // specific test.
+                break;
+            }
+            if (interruptAtMessage >= maxMsgNum) {
+                // next run would not interrupt at all, stop now
+                break;
+            }
         }
     }
 
@@ -2992,6 +3087,26 @@ void SyncTests::testInterruptResumeServerUpdate()
     doInterruptResume(SERVER_UPDATE, boost::shared_ptr<TransportWrapper> (new TransportFaultInjector()));
 }
 
+void SyncTests::testInterruptResumeClientAddBig()
+{
+    doInterruptResume(CLIENT_ADD|BIG, boost::shared_ptr<TransportWrapper> (new TransportFaultInjector()));
+}
+
+void SyncTests::testInterruptResumeClientUpdateBig()
+{
+    doInterruptResume(CLIENT_UPDATE|BIG, boost::shared_ptr<TransportWrapper> (new TransportFaultInjector()));
+}
+
+void SyncTests::testInterruptResumeServerAddBig()
+{
+    doInterruptResume(SERVER_ADD|BIG, boost::shared_ptr<TransportWrapper> (new TransportFaultInjector()));
+}
+
+void SyncTests::testInterruptResumeServerUpdateBig()
+{
+    doInterruptResume(SERVER_UPDATE|BIG, boost::shared_ptr<TransportWrapper> (new TransportFaultInjector()));
+}
+
 void SyncTests::testInterruptResumeFull()
 {
     doInterruptResume(CLIENT_ADD|CLIENT_REMOVE|CLIENT_UPDATE|
@@ -3028,6 +3143,26 @@ void SyncTests::testUserSuspendServerUpdate()
     doInterruptResume(SERVER_UPDATE, boost::shared_ptr<TransportWrapper> (new UserSuspendInjector()));
 }
 
+void SyncTests::testUserSuspendClientAddBig()
+{
+    doInterruptResume(CLIENT_ADD|BIG, boost::shared_ptr<TransportWrapper> (new UserSuspendInjector()));
+}
+
+void SyncTests::testUserSuspendClientUpdateBig()
+{
+    doInterruptResume(CLIENT_UPDATE|BIG, boost::shared_ptr<TransportWrapper> (new UserSuspendInjector()));
+}
+
+void SyncTests::testUserSuspendServerAddBig()
+{
+    doInterruptResume(SERVER_ADD|BIG, boost::shared_ptr<TransportWrapper> (new UserSuspendInjector()));
+}
+
+void SyncTests::testUserSuspendServerUpdateBig()
+{
+    doInterruptResume(SERVER_UPDATE|BIG, boost::shared_ptr<TransportWrapper> (new UserSuspendInjector()));
+}
+
 void SyncTests::testUserSuspendFull()
 {
     doInterruptResume(CLIENT_ADD|CLIENT_REMOVE|CLIENT_UPDATE|
@@ -3521,7 +3656,7 @@ void ClientTest::getTestData(const char *type, Config &config)
         config.sourceNameServerTemplate = "calendar";
         config.uri = "cal2"; // ScheduleWorld
         config.type = "text/x-vcalendar";
-        config.insertItem =
+        static string insertItem =
             "BEGIN:VCALENDAR\n"
             "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n"
             "VERSION:2.0\n"
@@ -3541,7 +3676,7 @@ void ClientTest::getTestData(const char *type, Config &config)
             "SEQUENCE:1\n"
             "END:VEVENT\n"
             "END:VCALENDAR\n";
-        config.updateItem =
+        static string updateItem =
             "BEGIN:VCALENDAR\n"
             "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n"
             "VERSION:2.0\n"
@@ -3562,7 +3697,7 @@ void ClientTest::getTestData(const char *type, Config &config)
             "END:VEVENT\n"
             "END:VCALENDAR\n";
         /* change location and description of insertItem in testMerge(), add alarm */
-        config.mergeItem1 =
+        static string mergeItem1 =
             "BEGIN:VCALENDAR\n"
             "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n"
             "VERSION:2.0\n"
@@ -3588,7 +3723,7 @@ void ClientTest::getTestData(const char *type, Config &config)
             "END:VEVENT\n"
             "END:VCALENDAR\n";
         /* change location to something else, add category */
-        config.mergeItem2 =
+        static string mergeItem2 =
             "BEGIN:VCALENDAR\n"
             "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n"
             "VERSION:2.0\n"
@@ -3609,6 +3744,19 @@ void ClientTest::getTestData(const char *type, Config &config)
             "SEQUENCE:1\n"
             "END:VEVENT\n"
             "END:VCALENDAR\n";
+
+        if (getenv("CLIENT_TEST_SIMPLE_UID")) {
+            boost::replace_all(insertItem, "UID:1234567890!@#$%^&*()<>@dummy", "UID:1234567890@dummy");
+            boost::replace_all(updateItem, "UID:1234567890!@#$%^&*()<>@dummy", "UID:1234567890@dummy");
+            boost::replace_all(mergeItem1, "UID:1234567890!@#$%^&*()<>@dummy", "UID:1234567890@dummy");
+            boost::replace_all(mergeItem2, "UID:1234567890!@#$%^&*()<>@dummy", "UID:1234567890@dummy");
+        }
+
+        config.insertItem = insertItem.c_str();
+        config.updateItem = updateItem.c_str();
+        config.mergeItem1 = mergeItem1.c_str();
+        config.mergeItem2 = mergeItem2.c_str();
+
         config.parentItem =
             "BEGIN:VCALENDAR\n"
             "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n"
@@ -3923,14 +4071,18 @@ void ClientTest::getTestData(const char *type, Config &config)
         config.uniqueProperties = "SUMMARY:DESCRIPTION";
         config.sizeProperty = "DESCRIPTION";
         config.testcases = "testcases/imemo20.ics";
-    }else if (!strcmp (type, "super")) {
-        config.subConfigs = "ical20,itodo20";
+    }else if (!strcmp (type, "calendar+todo")) {
         config.uri="";
+        config.sourceNameServerTemplate = "calendar+todo";
     }
 }
 
 void CheckSyncReport::check(SyncMLStatus status, SyncReport &report) const
 {
+    if (m_report) {
+        *m_report = report;
+    }
+
     stringstream str;
 
     str << report;
@@ -3944,6 +4096,10 @@ void CheckSyncReport::check(SyncMLStatus status, SyncReport &report) const
     SE_LOG_INFO(NULL, NULL, "sync report:\n%s\n", str.str().c_str());
 
     if (mustSucceed) {
+        // both STATUS_OK and STATUS_HTTP_OK map to the same
+        // string, so check the formatted status first, then
+        // the numerical one
+        CPPUNIT_ASSERT_EQUAL(string("no error (remote, status 0)"), Status2String(status));
         CPPUNIT_ASSERT_EQUAL(STATUS_OK, status);
     }
 
index 6308063..0329c92 100644 (file)
@@ -70,7 +70,8 @@ class CheckSyncReport {
         serverUpdated(srUpdated),
         serverDeleted(srDeleted),
         mustSucceed(mstSucceed),
-        syncMode(mode)
+        syncMode(mode),
+        m_report(NULL)
         {}
 
     virtual ~CheckSyncReport() {}
@@ -80,6 +81,13 @@ class CheckSyncReport {
     bool mustSucceed;
     SyncMode syncMode;
 
+    // if set, then the report is copied here
+    SyncReport *m_report;
+
+    CheckSyncReport &setMode(SyncMode mode) { syncMode = mode; return *this; }
+    CheckSyncReport &setReport(SyncReport *report) { m_report = report; return *this; }
+
+
     /**
      * checks that the sync completed as expected and throws
      * CPPUnit exceptions if something is wrong
@@ -115,6 +123,9 @@ struct SyncOptions {
     bool m_loSupport;
     /** enabled WBXML (default) */
     bool m_isWBXML;
+    /** overrides resend properties */
+    int m_retryDuration;
+    int m_retryInterval;
 
     bool m_isSuspended; 
     
@@ -146,6 +157,8 @@ struct SyncOptions {
         m_maxObjSize(maxObjSize),
         m_loSupport(loSupport),
         m_isWBXML(isWBXML),
+        m_retryDuration(300),
+        m_retryInterval(60),
         m_isSuspended(false),
         m_isAborted(false),
         m_startCallback(startCallback),
@@ -158,6 +171,8 @@ struct SyncOptions {
     SyncOptions &setMaxObjSize(long maxObjSize) { m_maxObjSize = maxObjSize; return *this; }
     SyncOptions &setLOSupport(bool loSupport) { m_loSupport = loSupport; return *this; }
     SyncOptions &setWBXML(bool isWBXML) { m_isWBXML = isWBXML; return *this; }
+    SyncOptions &setRetryDuration(int retryDuration) { m_retryDuration = retryDuration; return *this; }
+    SyncOptions &setRetryInterval(int retryInterval) { m_retryInterval = retryInterval; return *this; }
     SyncOptions &setStartCallback(const Callback_t &callback) { m_startCallback = callback; return *this; }
     SyncOptions &setTransportAgent(const boost::shared_ptr<TransportAgent> transport)
                                   {m_transport = transport; return *this;}
@@ -680,13 +695,25 @@ protected:
 
     virtual void doInterruptResume(int changes,
                   boost::shared_ptr<TransportWrapper> wrapper); 
+
+    /**
+     * CLIENT_ = change made on client B before interrupting
+     * SERVER_ = change made on client A and applied to server before interrupting
+     *           while sending to B
+     * _ADD = new item added
+     * _REMOVE = existing item deleted
+     * _UPDATE = existing item replaced
+     * BIG = when adding or updating, make the new item so large that it does
+     *       not fit into a single message
+     */
     enum {
         CLIENT_ADD = (1<<0),
         CLIENT_REMOVE = (1<<1),
         CLIENT_UPDATE = (1<<2),
         SERVER_ADD = (1<<3),
         SERVER_REMOVE = (1<<4),
-        SERVER_UPDATE = (1<<5)
+        SERVER_UPDATE = (1<<5),
+        BIG = (1<<6)
     };
     virtual void testInterruptResumeClientAdd();
     virtual void testInterruptResumeClientRemove();
@@ -694,6 +721,10 @@ protected:
     virtual void testInterruptResumeServerAdd();
     virtual void testInterruptResumeServerRemove();
     virtual void testInterruptResumeServerUpdate();
+    virtual void testInterruptResumeClientAddBig();
+    virtual void testInterruptResumeClientUpdateBig();
+    virtual void testInterruptResumeServerAddBig();
+    virtual void testInterruptResumeServerUpdateBig();
     virtual void testInterruptResumeFull();
 
     virtual void testUserSuspendClientAdd();
@@ -702,6 +733,10 @@ protected:
     virtual void testUserSuspendServerAdd();
     virtual void testUserSuspendServerRemove();
     virtual void testUserSuspendServerUpdate();
+    virtual void testUserSuspendClientAddBig();
+    virtual void testUserSuspendClientUpdateBig();
+    virtual void testUserSuspendServerAddBig();
+    virtual void testUserSuspendServerUpdateBig();
     virtual void testUserSuspendFull();
 
     virtual void testResendClientAdd();
index dc61138..327dc7c 100644 (file)
@@ -18,5 +18,7 @@ EXTRA_DIST = \
         testcases/imemo20.ics \
        testcases/lcs/file1.txt \
        testcases/lcs/file2.txt \
+        syncevo-http-server.py \
+        syncevo-phone-config.py \
        $(wildcard testcases/*.patch) \
         synccompare.pl
index 61ef438..9c76d87 100644 (file)
@@ -143,6 +143,8 @@ LDFLAGS = @LDFLAGS@
 LIBEXECDIR = @LIBEXECDIR@
 LIBICAL_AVAILABLE_CFLAGS = @LIBICAL_AVAILABLE_CFLAGS@
 LIBICAL_AVAILABLE_LIBS = @LIBICAL_AVAILABLE_LIBS@
+LIBNOTIFY_CFLAGS = @LIBNOTIFY_CFLAGS@
+LIBNOTIFY_LIBS = @LIBNOTIFY_LIBS@
 LIBOBJS = @LIBOBJS@
 LIBOPENOBEX_CFLAGS = @LIBOPENOBEX_CFLAGS@
 LIBOPENOBEX_LIBS = @LIBOPENOBEX_LIBS@
@@ -161,6 +163,8 @@ MODIFY_SYNCCOMPARE = @MODIFY_SYNCCOMPARE@
 MSGFMT = @MSGFMT@
 MSGFMT_OPTS = @MSGFMT_OPTS@
 MSGMERGE = @MSGMERGE@
+MX_GTK_0_99_1_CFLAGS = @MX_GTK_0_99_1_CFLAGS@
+MX_GTK_0_99_1_LIBS = @MX_GTK_0_99_1_LIBS@
 NMEDIT = @NMEDIT@
 NSS_CFLAGS = @NSS_CFLAGS@
 NSS_LIBS = @NSS_LIBS@
@@ -198,6 +202,7 @@ SYNTHESIS_LIB = @SYNTHESIS_LIB@
 SYNTHESIS_LIBS = @SYNTHESIS_LIBS@
 SYNTHESIS_SRC = @SYNTHESIS_SRC@
 SYNTHESIS_SUBDIR = @SYNTHESIS_SUBDIR@
+SYNTHESIS_SUBDIR_INCLUDES = @SYNTHESIS_SUBDIR_INCLUDES@
 TRANSPORT_CFLAGS = @TRANSPORT_CFLAGS@
 TRANSPORT_LIBS = @TRANSPORT_LIBS@
 UNIQUE_CFLAGS = @UNIQUE_CFLAGS@
@@ -281,6 +286,8 @@ EXTRA_DIST = \
         testcases/imemo20.ics \
        testcases/lcs/file1.txt \
        testcases/lcs/file2.txt \
+        syncevo-http-server.py \
+        syncevo-phone-config.py \
        $(wildcard testcases/*.patch) \
         synccompare.pl
 
diff --git a/test/README.Ovi b/test/README.Ovi
new file mode 100644 (file)
index 0000000..25dc104
--- /dev/null
@@ -0,0 +1,111 @@
+This document is used to show interoperability test information with Nokia Ovi server.
+http://bugzilla.moblin.org/show_bug.cgi?id=3182
+
+* How to get the password
+  Register your account at Ovi.com.
+  Add your phone by Ovi.com->Login->Add Device.
+  At the end of your adding device page, the synchronization configuration will
+  be sent to your phone by mms but it also provides a 'Manual Setting' link which
+  provides the synchronization password used to sync this device in case you
+  could not receive the mms.
+  Please use your Ovi user name and this per-device password for SyncEvolution.
+
+* The Ovi Server's device information 
+    Man=Intellisync
+    Mod=-
+    SwV=6.5.0.OVI.1033
+    HwV=-
+    OEM=-
+    DevID=Ovi.com
+    DevTyp=server
+    VerDTD=1.2
+    UTC=
+    SupportLargeObjs=true
+    SupportNumberOfChanges=true
+
+* Test Environment Variables Settings
+  CLIENT_TEST_SERVER=Ovi \
+  CLIENT_TEST_DELETE_REFRESH=1 \
+  CLIENT_TEST_NUM_ITEMS=50 \
+  CLIENT_TEST_MAX_ITEM_SIZE=512\
+  CLIENT_TEST_EVOLUTION_PREFIX=file:///tmp/test/                             \
+  CLIENT_TEST_SKIP=Client::Sync::vcard30::testRefreshFromServerSync,         \
+  Client::Sync::vcard30::testOneWayFromClient,                               \
+  Client::Sync::vcard30::testOneWayFromServer,                               \
+  Client::Sync::vcard30::testSlowSyncSemantic,                               \
+  Client::Sync::vcard30::testComplexRefreshFromServerSemantic,               \
+  Client::Sync::vcard30::testDelete,                                        \
+  Client::Sync::vcard30::testManyDeletes,                                    \
+  Client::Sync::vcard30::testDeleteAllSync,                                  \
+  Client::Sync::vcard30::testRetry,Client::Sync::vcard30::Suspend            \
+  Client::Sync::calendar+task::testRefreshFromServerSync,                         \
+  Client::Sync::calendar+task::testOneWayFromClient,                               \
+  Client::Sync::calendar+task::testOneWayFromServer,                               \
+  Client::Sync::calendar+task::testSlowSyncSemantic,                               \
+  Client::Sync::calendar+task::testComplexRefreshFromServerSemantic,               \
+  Client::Sync::calendar+task::testDelete,                                        \
+  Client::Sync::calendar+task::testManyDeletes,                                    \
+  Client::Sync::calendar+task::testDeleteAllSync,                                  \
+  Client::Sync::calendar+task::testRetry,Client::Sync::vcard30::Suspend, \
+  Client::Sync::calendar+task::testDeleteAllRefresh, \
+  Client::Sync::calendar+task::testItemsXML, \
+  Client::Sync::calendar+task::testMaxMsg, \
+  Client::Sync::calendar+task::testLargeObject
+
+* Data formats we need to test:
+Client::Sync::vcard30
+
+* Know Limitations in Ovi server:
+The server is unstable, during testing, it returns '400' error from time to
+time.
+The authentication process need 3 retries to success.
+Delete in normal sync (including two-way, one-way-from-client) does not 
+effectively delete the data in the server, we can only use
+(refresh-from-client). because of this limitation, many cases failed.
+
+VCard30
+  -- The server does not accept entries without an empty REV field.
+  -- Below properties are lost:
+     X-AIM X-EVOLUTION-UI-SLOT FBURL CALURI
+  -- 'FN' value mismatch
+  -- 'X-EVOLUTION-FILE-AS' mismatch, the server adds '\'
+  -- 'ADR' only support maximum two fields
+  -- Several fields is accepted by the server but do not send back to client (PHOTO, URL, EMAIL).
+  -- Character 'Tab' in Note will confuse the server and causing value mismatch
+
+* Known test failures:
+Client::Sync::vcard30
+  -- Client::Sync::vcard30::testRefreshFromServerSync,
+     Client::Sync::vcard30::testComplexRefreshFromServerSemantic,
+     Client::Sync::vcard30::testOneWayFromClient,
+     Client::Sync::vcard30::testOneWayFromServer,
+     Client::Sync::vcard30::testSlowSyncSemantic,
+     Client::Sync::vcard30::testManyDeletes,     
+     Client::Sync::vcard30::testDelete,     
+     Client::Sync::vcard30::testDeleteAllSync,          
+     Client::Sync::vcard30::testRetry,Client::Sync::vcard30::Suspend
+
+Client::Sync::calendar+todo (vcalendar1.0)
+EVENTS:
+ --All day event not supported
+ --Yearly recur and Monthly recur event not supported
+ --'attendee' not supported 
+ --The maxsize of an event items seems less than 512 (tested with
+   MAX_ITEM_SIZE=512)
+TODO:
+ --Lost properties: SEQUENCE, PERCENT-COMPLETE
+ --MISMATCH properties: DTSTART, COMPLETED; TODO only supports date not datetime
+
+testDeleteAllRefresh, testItemsXML, testMaxMsg, testLargeObject these cases were 
+tested OK sometime with serveral retires but the server is quite unstable and usually
+failed with an unexpected response.
+
+Also tried with icalendar 2.0 format which also works badly (all day event
+recognized but with one additional day added, events with VTimeZone rejected by
+server, some events have the closing date wrongly calculatd (seems treating
+DTEND as inclusive).
+
+Client::Sync::text
+Reject contents, No devinfo. Items sent from client is rejected by server.
+Adding a note from the web interface and try testFreshFromServerSync, the
+server sends 1 item with empty content thus also rejected by our client.
diff --git a/test/README.syncevolution-server b/test/README.syncevolution-server
new file mode 100644 (file)
index 0000000..81ae139
--- /dev/null
@@ -0,0 +1,57 @@
+Here are some quick (and probably incomplete) notes about setting up
+SyncEvolution as HTTP server for client-test runs using just the local
+account and machine.
+
+# 1. run client-test like this:
+CLIENT_TEST_SERVER=syncevolution --help
+
+# 2. set the URL (using IPv4 here, in case that "localhost" expands to IPv6, which
+#    can be problematic):
+for i in 1 2; do
+   syncevolution --configure --sync-property syncURL=http://127.0.0.1:9000/syncevolution syncevolution_$i
+done
+
+# 3. configure the server, using a separate context with the four standard URIs
+#    implemented via files in /tmp, no credential checking, maximum message size
+#    which forces the clients to split items (makes testInterruptResume*Big more
+#    interesting), low timeout to keep tests going quickly, with device IDs as
+#    set by client-test-app.cpp in step 1:
+for i in 1 2; do
+   syncevolution --configure --template SyncEvolutionClient \
+                 --sync-property username= \
+                 --sync-property password= \
+                 --sync-property maxMsgSize=20000 \
+                 --sync-property RetryDuration=20 \
+                 syncevolution_client_$i@server
+done
+syncevolution --configure \
+              --source-property type=file:text/vcard:3.0 \
+              --source-property evolutionsource=file:///tmp/server_addressbook \
+              @server addressbook
+syncevolution --configure \
+              --source-property type=file:text/calendar:2.0 \
+              --source-property evolutionsource=file:///tmp/server_calendar \
+              @server calendar
+syncevolution --configure \
+              --source-property type=file:text/plain:1.0 \
+              --source-property evolutionsource=file:///tmp/server_memo \
+              @server memo
+syncevolution --configure \
+              --source-property type=file:text/calendar:2.0 \
+              --source-property evolutionsource=file:///tmp/server_todo \
+              @server todo
+syncevolution --configure --sync-property remoteDeviceId=sc-api-nat syncevolution_client_1@server
+syncevolution --configure --sync-property remoteDeviceId=sc-pim-ppc syncevolution_client_2@server
+
+# 4. run the syncevo-dbus-server (necessary when not installed):
+syncevo-dbus-server -d 1000000 &
+
+# 5. run http server:
+syncevo-http-server http://localhost:9000/syncevolution &
+
+# 6. run testing, here using again file backends:
+CLIENT_TEST_SERVER=syncevolution \
+CLIENT_TEST_RETRY=t CLIENT_TEST_RESEND=t CLIENT_TEST_SUSPEND=t \
+CLIENT_TEST_SOURCES=file_vcard30,file_ical20 \
+CLIENT_TEST_EVOLUTION_PREFIX=file:///tmp/test_ \
+client-test
index d2eec8c..fd4d39c 100644 (file)
@@ -125,7 +125,7 @@ public:
 
     void startTest (CppUnit::Test *test) {
         m_currentTest = test->getName();
-        cerr << m_currentTest;
+        std::cerr << m_currentTest;
         string logfile = m_currentTest + ".log";
         simplifyFilename(logfile);
         m_logger.reset(new LoggerStdout(logfile));
@@ -190,9 +190,9 @@ public:
             }
         }
 
-        cerr << " " << result << "\n";
+        std::cerr << " " << result << "\n";
         if (!failure.empty()) {
-            cerr << failure << "\n";
+            std::cerr << failure << "\n";
         }
     }
 
index a90f2ff..52553cf 100644 (file)
@@ -61,6 +61,7 @@ my $zyb = $server =~ /zyb/;
 my $mobical = $server =~ /mobical/;
 my $memotoo = $server =~ /memotoo/;
 my $nokia_7210c = $server =~ /nokia_7210c/;
+my $ovi = $server =~ /Ovi/;
 
 # TODO: this hack ensures that any synchronization is limited to
 # properties supported by Synthesis. Remove this again.
@@ -394,6 +395,39 @@ sub Normalize {
         s/^(UID|CLASS|SEQUENCE|TRANSP)(;[^:;\n]*)*:.*\r?\n?//gm;
     }
 
+    if ($ovi) {
+        if (/^BEGIN:VCARD/m) {
+            #lost properties
+            s/^(X-AIM|CALURI|URL|FBURL|PHOTO|EMAIL)(;[^:;\n]*)*:.*\r?\n?//gm;
+            #FN value mismatch (reordring and adding , by the server)
+            s/^FN:.*\r?\n?/FN:[...]\n/gm;
+            #X-EVOLUTION-FILE-AS adding '\' by the server
+            while (s/^X-EVOLUTION-FILE-AS:(.*)\\(.*)/X-EVOLUTION-FILE-AS:$1$2/gm) {}
+
+            # does not preserve X-EVOLUTION-UI-SLOT=
+            s/^(\w+)([^:\n]*);X-EVOLUTION-UI-SLOT=\d+/$1$2/mg;
+
+            # does not preserve third ADR
+            s/^ADR:Test Box #3.*\n\r?//mg;
+        }
+
+        if (/^BEGIN:VEVENT/m) {
+            #Testing with vcalendar, do not support UID
+            s/^(UID|SEQUENCE|TRANSP)(;[^:;\n]*)*:.*\r?\n?//gm;
+            #Add PRORITY by default
+            s/^(PRIORITY)(;[^:;\n]*)*:.*\r?\n?//gm;
+            # VALARM not supported
+            s/^BEGIN:VALARM.*?END:VALARM\r?\n?//msg;
+        }
+
+        if (/^BEGIN:VTODO/m) {
+            #Testing with vcalendar, do not support UID
+            s/^(UID|SEQUENCE|PERCENT-COMPLETE)(;[^:;\n]*)*:.*\r?\n?//gm;
+            #Mismatch DTSTART, COMPLETED
+            s/^(DTSTART|COMPLETED)(;[^:;\n]*)*:.*\r?\n?/$1:[...]\n/gm;
+        }
+    }
+
     if ($funambol || $egroupware || $nokia_7210c) {
       # NOTE may be truncated due to length resistrictions
       s/^(NOTE(;[^:;\n]*)*:.{0,160}).*(\r?\n?)/$1$3/gm;
@@ -568,8 +602,10 @@ if($#ARGV > 1) {
           open(IN, "<:utf8", "$fullname") || die "$fullname: $!";
           push @content1, <IN>;
       }
-      @normal1 = Normalize(join("", @content1), $singlewidth);
-      @normal2 = Normalize(join("", @content2), $singlewidth);
+      my $content1 = join("", @content1);
+      my $content2 = join("", @content2); 
+      @normal1 = Normalize($content1, $singlewidth);
+      @normal2 = Normalize($content2, $singlewidth);
   } else {
       if (-d $file1) {
           open(IN1, "-|:utf8", "find $file1 -type f -print0 | xargs -0 cat") || die "$file1: $!";
diff --git a/test/syncevo-http-server.py b/test/syncevo-http-server.py
new file mode 100755 (executable)
index 0000000..ae92251
--- /dev/null
@@ -0,0 +1,232 @@
+#! /usr/bin/python
+
+'''Usage: syncevo-http-server.py <URL>
+Runs a SyncML HTTP server under the given base URL.'''
+
+# use the same glib main loop in D-Bus and twisted
+from dbus.mainloop.glib import DBusGMainLoop
+from twisted.internet import glib2reactor # for non-GUI apps
+DBusGMainLoop(set_as_default=True)
+glib2reactor.install()
+
+import dbus
+import gobject
+import sys
+import urlparse
+import optparse
+
+import twisted.web
+from twisted.web import server, resource, http
+from twisted.internet import reactor
+
+bus = dbus.SessionBus()
+loop = gobject.MainLoop()
+
+# cached information about previous POST and reply,
+# in case that we need to resend
+class OldRequest:
+    sessionid = None
+    data = None
+    reply = None
+    type = None
+
+def session_changed(object, ready):
+    print "SessionChanged:", object, ready
+
+bus.add_signal_receiver(session_changed,
+                        'SessionChanged',
+                        'org.syncevolution.Server',
+                        'org.syncevolution',
+                        None,
+                        byte_arrays=True)
+
+class SyncMLSession:
+    sessions = []
+
+    def __init__(self):
+        self.sessionid = None
+        self.request = None
+        self.conpath = None
+        self.connection = None
+
+    def destruct(self, code, message=""):
+        '''Tell both HTTP client and D-Bus server that we are shutting down,
+        then remove the session'''
+        if self.request:
+            self.request.setResponseCode(code, message)
+            self.request.finish()
+            self.request = None
+        if self.connection:
+            self.connection.Close(False, message)
+            self.connection = None
+        if self in SyncMLSession.sessions:
+            SyncMLSession.sessions.remove(self)
+
+    def abort(self):
+        '''D-Bus server requests to close connection, so cancel everything'''
+        print "connection", self.conpath, "went down"
+        self.destruct(http.INTERNAL_SERVER_ERROR, "lost connection to SyncEvolution")
+
+    def reply(self, data, type, meta, final, session):
+        '''sent reply to HTTP client and/or close down normally'''
+        print "reply session", session, "final", final, "data len", len(data), meta
+        # When the D-Bus server sends an empty array, Python binding
+        # puts the four chars in 'None' into the data array?!
+        if data and len(data) > 0 and data != 'None':
+            request = self.request
+            self.request = None
+            OldRequest.reply = data
+            OldRequest.type = type
+            if request:
+                request.setHeader('Content-Type', type)
+                request.setResponseCode(http.OK)
+                request.write(data)
+                request.finish()
+                self.sessionid = session
+            else:
+                self.connection.Close(False, "could not deliver reply")
+                self.connection = None
+        if final:
+            print "closing connection for connection", self.conpath, "session", session
+            if self.connection:
+                self.connection.Close(True, "")
+                self.connection = None
+            self.destruct(http.GONE, "D-Bus server done")
+
+    def done(self, error):
+        '''lost connection to HTTP client, either normally or in error'''
+        if error and self.connection:
+            self.connection.Close(False, error)
+            self.connection = None
+
+    def start(self, request, config, url):
+        '''start a new session based on the incoming message'''
+        print "requesting new session"
+        self.object = dbus.Interface(bus.get_object('org.syncevolution',
+                                                    '/org/syncevolution/Server'),
+                                     'org.syncevolution.Server')
+        deferred = request.notifyFinish()
+        deferred.addCallback(self.done)
+        self.conpath = self.object.Connect({'description': 'syncevo-server-http.py',
+                                            'transport': 'HTTP',
+                                            'config': config,
+                                            'URL': url},
+                                           True,
+                                           '')
+        self.connection = dbus.Interface(bus.get_object('org.syncevolution',
+                                                        self.conpath),
+                                         'org.syncevolution.Connection')
+
+        bus.add_signal_receiver(self.abort,
+                                'Abort',
+                                'org.syncevolution.Connection',
+                                'org.syncevolution',
+                                self.conpath,
+                                utf8_strings=True,
+                                byte_arrays=True)
+        bus.add_signal_receiver(self.reply,
+                                'Reply',
+                                'org.syncevolution.Connection',
+                                'org.syncevolution',
+                                self.conpath,
+                                utf8_strings=True,
+                                byte_arrays=True)
+
+        # feed new data into SyncEvolution and wait for reply
+        request.content.seek(0, 0)
+        self.connection.Process(request.content.read(),
+                                request.getHeader('content-type'))
+        self.request = request
+        SyncMLSession.sessions.append(self)
+
+    def process(self, request, data):
+        '''process next message by client in running session'''
+        if self.request:
+            # message resend?! Ignore old request.
+            print "message resend?!"
+            self.request.finish()
+            self.request = None
+        deferred = request.notifyFinish()
+        deferred.addCallback(self.done)
+        self.connection.Process(data,
+                                request.getHeader('content-type'))
+        self.request = request
+
+class SyncMLPost(resource.Resource):
+    isLeaf = True
+
+    def __init__(self, url):
+        self.url = url
+
+    def render_GET(self, request):
+        return "<html>SyncEvolution SyncML Server</html>"
+
+    def render_POST(self, request):
+        config = request.postpath
+        if config:
+            config = config[0]
+        else:
+            config = ""
+        type = request.getHeader('content-type')
+        len = request.getHeader('content-length')
+        sessionid = request.args.get('sessionid')
+        if sessionid:
+            sessionid = sessionid[0]
+        print "POST from", request.getClientIP(), "config", config, "type", type, "session", sessionid, "args", request.args, "length", len
+        if not sessionid:
+            session = SyncMLSession()
+            session.start(request, config,
+                          urlparse.urljoin(self.url.geturl(), request.path))
+            return server.NOT_DONE_YET
+        else:
+            data = request.content.read()
+            # Detect resent message. We support that for
+            # independently from the session, because it
+            # might already be gone (server sends last reply
+            # in session, closes session, client doesn't
+            # get reply, reposts).
+            if sessionid == OldRequest.sessionid and \
+                    OldRequest.data == data and \
+                    OldRequest.reply:
+                print "resend reply session", sessionid
+                request.setHeader('Content-Type', OldRequest.type)
+                request.setResponseCode(http.OK)
+                request.write(OldRequest.reply)
+                request.finish()
+                return server.NOT_DONE_YET
+            else:
+                # prepare resending, will be completed in
+                # SyncSession.reply()
+                OldRequest.sessionid = sessionid
+                OldRequest.data = data
+                OldRequest.reply = None
+            for session in SyncMLSession.sessions:
+                if session.sessionid == sessionid:
+                    session.process(request, data)
+                    return server.NOT_DONE_YET
+            print "unknown session", sessionid, "=>", http.NOT_FOUND
+            raise twisted.web.Error(http.NOT_FOUND)
+
+
+usage =  """usage: %prog http://localhost:<port>/<path>
+
+Runs a HTTP server which listens on all network interfaces on
+the given port and answers requests for the given path.
+Configurations for clients must be created manually, see
+http://syncevolution.org/development/http-server-howto"""
+
+def main():
+    parser = optparse.OptionParser(usage=usage)
+    (options, args) = parser.parse_args()
+    if len(args) != 1:
+        print "need exactly on URL as command line parameter"
+        exit(1)
+    url = urlparse.urlparse(args[0])
+    root = resource.Resource()
+    root.putChild(url.path[1:], SyncMLPost(url))
+    site = server.Site(root)
+    reactor.listenTCP(url.port, site)
+    reactor.run()
+
+if __name__ == '__main__':
+    main()
diff --git a/test/syncevo-phone-config.py b/test/syncevo-phone-config.py
new file mode 100755 (executable)
index 0000000..9cb9ac0
--- /dev/null
@@ -0,0 +1,707 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2010 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
+
+'''
+Automatically trying different configurations for a phone to sync with
+SyncEvolution.
+'''
+import sys, optparse, os, time, popen2, tempfile
+
+########################### cmdline options ##########################################
+parser = optparse.OptionParser()
+parser.add_option("-b", "--bt-address", action = "store", type = "string",
+        dest = "btaddr", help = "The Bluetooth mac address for the testing phone", default = "")
+parser.add_option ("-p", "--proto-version", action = "store", type = "string",
+        dest="version", help = "The SyncML protocal version for testing, can be one of 1.0|1.1|1.2, by default it will try all versions one by one"
+        ,default = "")
+parser.add_option ("-s", "--source", action = "store", type = "string", dest=
+        "source", help = "The local database for testing, can be one of contact|calendar|task|memo|calendar+task, by default it will try all except calendar+task, use --combined-calendar-task to activate",
+        default = "")
+parser.add_option ("-u", "--uri", action = "store", type = "string", dest =
+        "uri", help = "The URI for testing the selected source, invalid when no specific source is selected via --source", default = "")
+parser.add_option ("-t", "--type", action = "store", type = "string", dest =
+        "type", help = "The content type for testing the selected source, invalid when no specific source is selected via --source"
+        ,default = "")
+parser.add_option ("-i", "--identifier", action = "store", type="string",
+        dest = "identifier", help = "The identifier used when contacting the phone, can be arbitray string. By default it will try 'PC Suite','Nokia PC Suite' and empty string",
+        default = "")
+parser.add_option ("", "--without-ctcap", action = "store_true", default =False,
+        dest = "ctcap", help = "Testing without sending CTCap information")
+parser.add_option ("-v", "--verbose", action = "store_true", default = False,
+        dest = "verbose", help = "Enabling detailed output")
+parser.add_option ("", "--combined-calendar-task", action = "store_true",
+        default = False, dest = "combined", help = "Testing the combined calendar, task data source")
+parser.add_option ("-a", "--advanced", action = "store_true", default = False,
+        dest = "advanced", help = "More extensive test with sending/receving data, WARNING: will destroy your data on the tested phone")
+parser.add_option("-c", "--create-config", action ="store", type = "string", 
+        dest = "create", help = "If set, a configuration file with the name will be created based on the testing result",
+        default ="")
+parser.add_option("-l", "--create-template", action ="store", type = "string", 
+        dest = "template", help = "If set, a template for the found configuration with the name will be created, it is a folder located in current working directory",default ="")
+(options, args) = parser.parse_args()
+
+####################semantic check for  cmdline options #######################################
+if (not options.btaddr):
+    parser.error ("Please input the bluetooth address for the testing phone by -b")
+if (options.version and options.version not in ['1.1', '1.2', '1.3']):
+    parser.error("option -p can only be one of 1.0|1.1|1.2")
+if (options.source and options.source not in ['contact', 'calendar', 'task',
+    'memo', 'calendar+task']):
+    parser.error("option -s can only be one of contact|calendar|task|memo|calendar+task")
+if (options.uri and not options.source and not options.combined):
+    parser.error ("options -u must work with -s")
+if (options.type and not options.source):
+    parser.error ("options -t must work with -s")
+
+#######################some global parameters ######################
+syncevo = 'syncevolution'
+configName = 'bfb3e7cb3d259e5f5aabbfb2ffac23f8cf5ad91b'
+configContext = 'test-phone'
+templateName = '"Nokia 7210c"'
+
+#################### Configuration Parameter #######################
+class ConfigurationParameter:
+    def __init__ (self, version, source, uri, type, ctcap, identifier):
+        self.version = version 
+        self.source = source
+        self.uri = uri 
+        self.type = type 
+        self.ctcap = ctcap 
+        self.identifier = identifier
+
+    def printMe(self):
+        print "Test parameter: "
+        print "With CTCap:     %s" %(self.ctcap,)
+        print "Identifier:     %s" %(self.identifier,)
+        print "SyncML version: %s" %(self.version,)
+        print "Sync Source:    %s" %(self.source,)
+        print "URI:            %s" %(self.uri,)
+        print "Content Type:   %s" %(self.type,)
+
+    def equalWith(self, config):
+        return (config and \
+                self.ctcap == config.ctcap and \
+                self.identifier == config.identifier and \
+                self.version == config.version and \
+                self.uri == config.uri and \
+                self.type == config.type)
+
+###################### utility functions ####################
+def isCombinedSource (source):
+    return source == 'calendar+task'
+
+def getSubSources (source):
+    return ['calendar','task']
+
+def clearLocalSyncData(sources):
+    for source in sources:
+        sourceCmd = "rm -rf %s/%s; mkdir %s/%s" % (testFolder, source, testFolder, source)
+        try:
+            runCommand(sourceCmd)
+        except:
+            pass
+
+def insertLocalSyncData(sources, type):
+    for source in sources:
+        testcase = getTestCase (source, type)
+        cmd = "echo \"%s\" > %s/%s/0 ;echo 'insertLocalSyncData'" % (testcase, testFolder, source)
+        runCommand(cmd)
+
+def getTestCase(source, type):
+    if (source == 'contact' and (type == 'text/vcard:3.0' or type == 'text/vcard')):
+        return  "BEGIN:VCARD\n"\
+        +"VERSION:3.0\n"\
+        +"TITLE:tester\n"\
+        +"FN:John Doe\n"\
+        +"N:Doe;John;;;\n"\
+        +"TEL;TYPE=WORK;TYPE=VOICE:business 1\n"\
+        +"X-EVOLUTION-FILE-AS:Doe\\, John\n"\
+        +"X-MOZILLA-HTML:FALSE\n"\
+        +"NOTE:test-phone\n"\
+        +"END:VCARD\n"
+    if (source == 'contact' and (type == 'text/x-vcard:2.1' or type == 'text/x-vcard')):
+        return "BEGIN:VCARD\n"\
+        +"VERSION:2.1\n"\
+        +"TITLE:tester\n"\
+        +"FN:John Doe\n"\
+        +"N:Doe;John;;;\n"\
+        +"TEL;TYPE=WORK;TYPE=VOICE:business 1\n"\
+        +"X-MOZILLA-HTML:FALSE\n"\
+        +"NOTE:REVISION\n"\
+        +"END:VCARD\n"
+    if (source == 'calendar' and (type == 'text/calendar:2.0' or type == 'text/calendar')):
+        return "BEGIN:VCALENDAR\n"\
+        +"PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n"\
+        +"VERSION:2.0\n"\
+        +"METHOD:PUBLISH\n"\
+        +"BEGIN:VEVENT\n"\
+        +"SUMMARY:phone meeting\n"\
+        +"DTEND:20060406T163000Z\n"\
+        +"DTSTART:20060406T160000Z\n"\
+        +"DTSTAMP:20060406T211449Z\n"\
+        +"LAST-MODIFIED:20060409T213201\n"\
+        +"CREATED:20060409T213201\n"\
+        +"LOCATION:my office\n"\
+        +"DESCRIPTION:let's talkREVISION\n"\
+        +"END:VEVENT\n"\
+        +"END:VCALENDAR\n"
+    if (source == 'calendar' and (type =='text/x-vcalendar:1.0' or type == 'text/x-vcalendar')):
+        return "BEGIN:VCALENDAR\n"\
+        +"VERSION:1.0\n"\
+        +"BEGIN:VEVENT\n"\
+        +"SUMMARY:phone meeting\n"\
+        +"DTEND:20060406T163000Z\n"\
+        +"DTSTART:20060406T160000Z\n"\
+        +"DTSTAMP:20060406T211449Z\n"\
+        +"LOCATION:my office\n"\
+        +"DESCRIPTION:let's talkREVISION\n"\
+        +"END:VEVENT\n"\
+        +"END:VCALENDAR\n"
+    if (source == 'task' and (type == 'text/calendar:2.0' or type == 'text/calendar')):
+        return "BEGIN:VCALENDAR\n"\
+        +"PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n"\
+        +"VERSION:2.0\n"\
+        +"METHOD:PUBLISH\n"\
+        +"BEGIN:VTODO\n"\
+        +"DTSTAMP:20060417T173712Z\n"\
+        +"SUMMARY:do me\n"\
+        +"DESCRIPTION:to be doneREVISION\n"\
+        +"CREATED:20060417T173712\n"\
+        +"LAST-MODIFIED:20060417T173712\n"\
+        +"END:VTODO\n"\
+        +"END:VCALENDAR\n"
+    if (source == 'task' and (type == 'text/x-vcalendar:1.0' or type == 'text/x-vcalendar')):
+        return "BEGIN:VCALENDAR\n"\
+        +"PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n"\
+        +"VERSION:1.0\n"\
+        +"METHOD:PUBLISH\n"\
+        +"BEGIN:VTODO\n"\
+        +"DTSTAMP:20060417T173712Z\n"\
+        +"SUMMARY:do me\n"\
+        +"DESCRIPTION:to be doneREVISION\n"\
+        +"CREATED:20060417T173712\n"\
+        +"LAST-MODIFIED:20060417T173712\n"\
+        +"END:VTODO\n"\
+        +"END:VCALENDAR\n"
+    if (source == 'memo'):
+        return "SUMMARY\n"\
+        +"BODY TEXT\n"
+    return ""
+
+# Get the keyword to be matched with for each test case
+def getTestCaseKeywords(source, type):
+    if (source == 'contact' and (type == 'text/vcard:3.0' or type == 'text/vcard')):
+        return ["VCARD", "TITLE:tester", "Doe", "John"] 
+    if (source == 'contact' and (type == 'text/x-vcard:2.1' or type == 'text/x-vcard')):
+        return ["VCARD", "TITLE:tester", "Doe", "John"]
+    if (source == 'calendar' and (type == 'text/calendar:2.0' or type == 'text/calendar')):
+        return ["VCALENDAR", "VEVENT", "phone meeting", "my office"]
+    if (source == 'calendar' and (type =='text/x-vcalendar:1.0' or type == 'text/x-vcalendar')):
+        return ["VCALENDAR", "VEVENT", "phone meeting", "my office"]
+    if (source == 'task' and (type == 'text/calendar:2.0' or type == 'text/calendar')):
+        return ["VCALENDAR", "VTODO", "do me"]
+    if (source == 'task' and (type == 'text/x-vcalendar:1.0' or type == 'text/x-vcalendar')):
+        return ["VCALENDAR", "VTODO", "do me"]
+    if (source == 'memo'):
+        return ["SUMMARY"]
+    return ""
+
+# Compare the received data with the sent data, we only match selected keywords in received
+# data for a basic sanity test
+def compareSyncData(sources, type):
+    for source in sources:
+        testcase = getTestCase (source, type)
+        received = ''
+        recFile = "%s/%s/0" %(testFolder, source)
+        try:
+            rf = open (recFile)
+            received = rf.read()
+        except:
+            return False
+        keys = getTestCaseKeywords(source, type)
+        if (options.verbose):
+            print "comparing received file:"
+            print received
+            print "with built in keywords in test case:"
+            print keys
+        for key in keys:
+            if (received.find(key) <0):
+                return False
+        return True
+
+# wrapper of running a shell command
+def runCommand(cmd, exception = True):
+    """Log and run the given command, throwing an exception if it fails."""
+    if (options.verbose):
+        print "%s: %s" % (os.getcwd(), cmd)
+    else:
+        cmd += ' >/dev/null 2>&1'
+    sys.stdout.flush()
+    result = os.system(cmd)
+    if result != 0 and exception:
+        raise Exception("%s: failed (return code %d)" % (cmd, result>>8))
+
+def runSync(sync):
+    cmd = "rm -rf %s/syncevolution" %(testResult)
+    runCommand (cmd)
+    status = True
+    interrupt = False
+
+    try:
+        runCommand (sync)
+    except:
+        status = False
+        pass
+    cmd = "find %s/syncevolution/ -name 'status.ini'" %(testResult)
+    fout,fin = popen2.popen2(cmd)
+    for line in fout:
+        resultFile = line.rpartition('\n')[0]
+    result = open(resultFile)
+    for line in result:
+        if (line.find ('status') != -1 and line.find('20015') != -1):
+            status = False
+            interrupt = True
+            break;
+    return (status, interrupt)
+
+
+##############################TestConfiguration##################################
+class TestingConfiguration():
+    def __init__(self, versions, sources, uris, types, ctcaps, identifiers, btaddr):
+        self.allSources = ['contact', 'calendar', 'task', 'memo', 'calendar+task']
+        if (versions):
+            self.versions = versions
+        else:
+            self.versions = ["1.2", "1.1", "1.0"]
+        if (sources):
+            self.sources = sources
+        else:
+            self.sources = ["contact", "calendar", "task", "memo"]
+            if (options.combined):
+                self.sources.insert (0, "calendar+task")
+        if (uris):
+            self.uris = uris
+        else:
+            self.uris = {}
+            self.uris['contact'] = ['Contact', 'contact', 'Contacts', 'contacts', 'Addressbook', 'addressbook']
+            self.uris['calendar'] = ['Calendar', 'calendar', 'Agenda','agenda']
+            self.uris['task'] = self.uris['calendar'] + ['Task', 'task', 'Tasks', 'tasks', 'Todo','todo']
+            self.uris['memo'] = ['Memo', 'memo', 'Notes', 'notes', 'Note', 'note']
+            self.uris['calendar+task'] = self.uris['calendar'] + self.uris['task']
+        if (types):
+            self.types = types
+        else:
+            self.types = {}
+            self.types['contact'] = ['text/vcard:3.0', 'text/x-vcard:2.1']
+            self.types['calendar'] = self.types['task'] = ['text/calendar:2.0', 'text/x-vcalendar:1.0']
+            self.types['memo'] = ['text/plain:1.0',
+                    'text/calendar:2.0', 'text/x-vcalendar:1.0']
+            self.types['calendar+task'] = self.types['calendar']
+
+        if (ctcaps):
+            self.ctcaps = ctcaps
+        else:
+            self.ctcaps =  [True, False]
+        if (identifiers):
+            self.identifiers = identifiers
+        else:
+            self.identifiers = ['PC Suite','','Nokia PC Suite']
+        self.btaddr = btaddr
+
+
+    #map between user perceivable source name and the underlying source name in SyncEvolution
+    def getLocalSourceName (self, source):
+        if (source == 'contact'):
+            return 'addressbook'
+        if (source == 'calendar'):
+            return 'calendar'
+        if (source == 'task'):
+            return 'todo'
+        if (source == 'memo'):
+            return 'memo'
+        if (source =='calendar+task'):
+            return 'calendar+todo'
+
+    #before each configuration is really tested, prepare is called.
+    #returns True if we decide current configuration need not be tested
+    def prepare (self, allconfigs, curconfig):
+        # Decide whether this config should be skipped (because we already found
+        # a working configuration
+        # Test is skipped either because 
+        # 1) we already found a working configuration for the data source;
+        # 2) based on the working configuration for source A, we can reasonably
+        # guess a working configuration for source B must have the same
+        # 'identifier', 'ctcap' and 'SyncMLVersion' setting.
+        # 3) we already found a working configuration for combined calendar and
+        # task, thus seperate testing for calendar and task is not needed.
+        skip = False
+        for source, config in self.wConfigs.items():
+            if (config):
+                if ( (config.source == self.source) or (config.identifier != self.identifier ) or (config.ctcap != self.ctcap) or (config.version != self.version)):
+                    skip = True
+                if ((self.source == 'calendar' or self.source == 'task') and isCombinedSource(config.source)):
+                    skip = True
+        if (skip):
+            if (options.verbose):
+                print "Test %d/%d skipped because already found a working configuration" % (curconfig, allconfigs)
+            else:
+                print "Test %d/%d skipped" %(curconfig, allconfigs)
+        else:
+            print "Start %d/%d test" % (curconfig, allconfigs)
+            if (options.verbose):
+                config = ConfigurationParameter(self.version, self.source, self.uri, self.type, self.ctcap, self.identifier)
+                config.printMe()
+        return skip
+
+
+    #run the real sync test with current configuration parameter
+    #if advanced option is set and the basic test succeed, it will contintue with 
+    #the advanced test
+    def testWithCurrentConfiguration(self):
+        """ Prepare the configuration and run a sync session, Returns true if
+        the test was successful, otherwise false"""
+        fullConfigName = configName +'@' + configContext
+        try:
+            runCommand (syncevo+' --remove '+fullConfigName)
+        except:
+            pass
+        runCommand (syncevo+' -c -l ' + templateName + ' ' + fullConfigName)
+        runSources ={'contact':'addressbook', 'calendar':'calendar', 'task':'todo', 'memo':'memo', 'calendar+task':'calendar+todo'}
+        # set the local database
+        if (isCombinedSource(self.source)):
+            for s in getSubSources(self.source):
+                    filesource = testFolder+'/'+s
+                    configCmd = "%s --configure --source-property evolutionsource='file:///%s' %s %s" %(syncevo,filesource, fullConfigName, runSources[s]) 
+                    runCommand(configCmd)
+            subSources = getSubSources(self.source)
+            filesource = runSources[subSources[0]] +',' + runSources[subSources[1]]
+            configCmd = "%s --configure --source-property evolutionsource=%s %s %s" %(syncevo,filesource, fullConfigName, runSources[self.source]) 
+            runCommand(configCmd)
+
+        else:
+            filesource = testFolder+'/'+self.source
+            configCmd = "%s --configure --source-property evolutionsource='file:///%s' %s %s" %(syncevo,filesource, fullConfigName, runSources[self.source]) 
+            runCommand (configCmd)
+
+        configCmd = "%s --configure --sync-property logLevel=5 --sync-property SyncURL=obex-bt://%s --sync-property SyncMLVersion=%s %s" % (syncevo, self.btaddr,self.version, fullConfigName)
+        runCommand (configCmd)
+
+        if (self.identifier):
+            configCmd = "%s --configure --sync-property remoteIdentifier='%s' %s" %(syncevo, self.identifier, fullConfigName)
+            runCommand (configCmd)
+
+        if (isCombinedSource(self.source)):
+            configCmd = "%s --configure --source-property type=%s --source-property uri=%s %s %s" %(syncevo, "virtual:"+self.type.partition(':')[0], self.uri, fullConfigName, runSources[self.source])
+            runCommand (configCmd)
+            for s in getSubSources(self.source):
+                configCmd = "%s --configure --source-property type=%s %s %s" %(syncevo, "file:"+self.type, fullConfigName, runSources[s])
+                runCommand (configCmd)
+        else:
+            configCmd = "%s --configure --source-property type=%s --source-property uri=%s %s %s" %(syncevo, "file:"+self.type, self.uri, fullConfigName, runSources[self.source])
+            runCommand (configCmd)
+
+        """ start the sync session """
+        cmdPrefix="XDG_CACHE_HOME=%s " %(testResult)
+        if (not self.ctcap):
+            cmdPrefix += "SYNCEVOLUTION_NOCTCAP=t "
+        syncCmd = "%s %s %s" % (syncevo, fullConfigName, runSources[self.source])
+        (status,interrupt) = runSync (cmdPrefix+syncCmd)
+        if (options.advanced and status and not interrupt):
+            (status,interrupt)= self.advancedTestWithCurrentConfiguration(runSources)
+        return (status, interrupt)
+
+    '''Basic test for sending/receiving data
+    It will work as:
+    Clear local data and data on the phone via 'slow-sync' and 'two-way' sync
+    Send local test case to the phone via 'two-way'
+    Clear local data and get the data from the phone via 'slow-sync'
+    compare the sent data with the received data to decide whether the test was successful
+
+    Note that this depends on the phone support 'slow-sync' and 'two-way' sync and 
+    implements the semantics correctly as specified in the spec. Otherwise the results will
+    be undefined.
+    '''
+    def advancedTestWithCurrentConfiguration (self, runSources):
+        """ 
+        Sending/receving real data for basic sanity test
+        """
+        fullConfigName = configName +'@' + configContext
+        sources = []
+        if (isCombinedSource (self.source)):
+            sources = getSubSources (self.source)
+        else:
+            sources.append(self.source)
+
+        #step 1: clean the data both locally and remotely using a 'slow-sync' and 'two-way'
+        clearLocalSyncData(sources)
+        cmdPrefix="XDG_CACHE_HOME=%s " % (testResult)
+        if (not self.ctcap):
+            cmdPrefix += "SYNCEVOLUTION_NOCTCAP=t "
+        syncCmd = "%s %s --sync slow %s %s" % (cmdPrefix, syncevo, fullConfigName, runSources[self.source])
+        status,interrupt = runSync(syncCmd)
+        if (not status or interrupt):
+            return (status, interrupt)
+        clearLocalSyncData(sources)
+        syncCmd = "%s %s --sync two-way %s %s" % (cmdPrefix, syncevo, fullConfigName, runSources[self.source])
+        status,interrupt = runSync(syncCmd)
+        if (not status or interrupt):
+            return (status, interrupt)
+
+        #step 2: insert testcase to local data and sync with 'two-way'
+        insertLocalSyncData(sources, self.type)
+        syncCmd = "%s %s --sync two-way %s %s" % (cmdPrefix, syncevo, fullConfigName, runSources[self.source])
+        status,interrupt = runSync(syncCmd)
+        if (not status or interrupt):
+            return (status, interrupt)
+
+        #step 3: delete local data and sync with 'slow-sync'
+        clearLocalSyncData(sources)
+        syncCmd = "%s %s --sync slow %s %s" % (cmdPrefix, syncevo, fullConfigName, runSources[self.source])
+        status,interrupt = runSync(syncCmd)
+        if (not status or interrupt):
+            return (status, interrupt)
+
+        #step 4: compare the received data with test case
+        status = compareSyncData(sources, self.type)
+        return (status, interrupt)
+
+    '''
+    The test driver iterating all possible test combinations and try them one by one
+    '''
+    def run(self):
+        #first round of iterating, calculating all possible configuration numbers
+        allconfigs = 0
+        for self.ctcap in self.ctcaps:
+            for self.identifier in self.identifiers:
+                for self.version in self.versions:
+                    for self.source in self.sources:
+                        for self.uri in self.uris[self.source]:
+                            for self.type in self.types[self.source]:
+                                allconfigs +=1
+        print "Starting test for %d configurations..." %(allconfigs,)
+
+        curconfig = 0
+        self.wConfigs = {}
+        for source in self.sources:
+            self.wConfigs[source] = None
+
+        #second round of iterating, test for each configuration
+        interrupt = False
+        for self.source in self.sources:
+           if(interrupt):
+               break
+           for self.ctcap in self.ctcaps:
+               if(interrupt):
+                   break
+               for self.version in self.versions:
+                   if(interrupt):
+                       break
+                   for self.identifier in self.identifiers:
+                       if(interrupt):
+                           break
+                       for self.uri in self.uris[self.source]:
+                           if(interrupt):
+                               break
+                           for self.type in self.types[self.source]:
+                               curconfig +=1
+                               skip = self.prepare (allconfigs, curconfig)
+                               if (not skip):
+                                   (status, interrupt) = self.testWithCurrentConfiguration ()
+                                   if (status and not interrupt):
+                                       self.wConfigs[self.source] = ConfigurationParameter (self.version, self.source, self.uri, self.type, self.ctcap, self.identifier)
+                                       print "Found a working configuration for %s" % (self.source,)
+                                       if (options.verbose):
+                                           self.wConfigs[self.source].printMe()
+                               if (interrupt):
+                                   break;
+        if(interrupt):
+            print "Test Interrupted"
+            self.cleanup()
+            return 1
+
+        print "Test Ended"
+        self.cleanup()
+
+        #Test finished, print summary and generating configurations
+        print "****************SUMMARY****************"
+        found = False
+        for source,config in self.wConfigs.items():
+            if (config):
+                found = True
+                print "------------------------------------------"
+                print "Configuration parameter for %s:" % (source,)
+                config.printMe()
+
+        #We did not tested with calendar+task but we have found configuration 
+        #for calendar or task
+        if (options.combined == False):
+            s = getSubSources(self.source)
+            try:
+                if (self.wConfigs[s[0]] or self.wConfigs[s[1]]):
+                    print ""
+                    print "Note some phones have combined calendar and task"
+                    print "you might run the tool with --combined-calendar-task"
+                    print "to detect this behavior"
+                #restrict to only two subsources
+                if (self.wConfigs[s[0]] and self.wConfigs[s[0]].equalWith (self.wConfigs[s[1]])):
+                    print "This phone likely works with a combined calendar and task"
+                    print "because they have identical configurations"
+            except:
+                pass
+
+        if (not found):
+            print "No working configuration found"
+        else:
+            if (options.create):
+                #first remove the previous configuration if there is a configuration with the same name
+                create = options.create
+                cmd = "%s --remove '%s'" %(syncevo, create)
+                try:
+                    runCommand (cmd)
+                except:
+                    pass
+                #create the configuration based on the template
+                cmd = "%s -c -l %s %s" %(syncevo, templateName, create)
+                runCommand (cmd)
+                #disable all sources by default
+                for source in self.allSources:
+                    cmd = "%s -c --source-property sync='disabled' %s %s" %(syncevo, create, self.getLocalSourceName(source))
+                    runCommand(cmd)
+
+                syncCreated = False
+                for source,config in self.wConfigs.items():
+                    if (config):
+                        if (not syncCreated):
+                            #set the sync parameter
+                            cmd = "%s --configure --sync-property syncURL='obex-bt://%s' --sync-property remoteIdentifier='%s' --sync-property SyncMLVersion='%s' '%s'" %(syncevo, self.btaddr, config.identifier, config.version, create)
+                            syncCreated = True
+                            runCommand (cmd)
+                        #set each source parameter
+                        ltype = config.type.split(':')[0]
+                        if(isCombinedSource (config.source)):
+                            ltype = 'virtual:'+ltype
+                        cmd = "%s --configure --source-property sync='two-way' --source-property URI='%s' --source-property type='%s' '%s' '%s'" %(syncevo, config.uri, ltype, create, self.getLocalSourceName(config.source))
+                        runCommand(cmd)
+
+            if (options.template):
+                template = options.template
+                configini = "peerIsClient = 1\n"
+                sourceConfiginis={}
+                syncCreated = False
+                for source,config in self.wConfigs.items():
+                    if(config):
+                        if (not syncCreated):
+                            if (config.identifier):
+                                configini += "remoteIdentifier = '%s'\n" %(config.identifier)
+                            if (config.version != '1.2'):
+                                configini += "SyncMLVersion = '%s'\n" %(config.version)
+                            syncCreated = True
+                        sourceini = "sync = two-way\n"
+                        if (isCombinedSource (source)):
+                            sourceini += "evolutionsource = calendar,todo\n"
+                            sourceini += "uri = %s\n" %(config.uri)
+                            sourceini += "type = virtual:%s\n" %(config.type.split(':')[0])
+                            sourceConfiginis[self.getLocalSourceName(source)]=sourceini
+                            #disable the sub datasoruce
+                            for s in getSubSources(source):
+                                sourceini = "sync = none\n"
+                                sourceConfiginis[self.getLocalSourceName(s)]=sourceini
+                        else:
+                            sourceini += "uri = %s\n" %(config.uri)
+                            sourceConfiginis[self.getLocalSourceName(source)]=sourceini
+                            defualtTypes = ["text/x-vcard:2.1", "text/calendar:2.0", "text/plain:1.0"]
+                            if (config.type not in defualtTypes):
+                                sourceini += "type = %s\n" %(config.type)
+
+                fingerprint=''
+                description=''
+                templateini = "fingerprint = %s\ndescription = %s\n" %(fingerprint,description)
+                #write to directory
+                cmd = "rm -rf %s; mkdir %s; mkdir %s/sources" %(template,template,template)
+                runCommand(cmd)
+                cmd = "echo '%s' >%s/config.ini; echo ''" %(configini, template)
+                runCommand(cmd)
+                cmd = "echo '%s' >%s/template.ini; echo ''" %(templateini, template)
+                runCommand(cmd)
+                for s,ini in sourceConfiginis.items():
+                    cmd = "mkdir %s/sources/%s; echo''" %(template, s)
+                    runCommand(cmd)
+                    cmd = "echo '%s' >%s/sources/%s/config.ini; echo ''" %(ini,template,s)
+                    runCommand(cmd)
+
+            if (options.advanced):
+                print ""
+                print "We have conducted basic test by sending and receiving"
+                print "data for the phone"
+            else:
+                print ""
+                print "We just conducted minimum test by syncing with the phone"
+                print "without checking received data. You can use --advanced"
+                print "to conduct basic sending/receiving test against your phone"
+
+            if (options.create):
+                print "Created configuration %s" %(options.create)
+                print "You may start syncing with syncevolution %s" %(options.create)
+
+            if (options.template):
+                print "Created configuration template %s" %(options.template)
+                print "It is located as folder %s in current directory" %(options.template)
+
+    def cleanup (self):
+        #remove configurations 
+        fullConfigName = configName +'@' + configContext
+        cleanCmd = '%s --remove "%s"' %(syncevo, fullConfigName,)
+        try:
+            runCommand (cleanCmd)
+        except:
+            pass
+
+def main():
+    versions = []
+    sources = []
+    ctcaps = []
+    identifiers = []
+    uris = {}
+    types = {}
+    if (options.version):
+        versions.append (options.version)
+    if (options.source):
+        sources.append (options.source)
+    if (options.uri):
+        uris[sources[0]] = []
+        uris[sources[0]].append(options.uri)
+    if (options.type):
+        types[sources[0]] = []
+        types[sources[0]].append(options.type)
+    if (options.ctcap):
+        ctcaps.append (options.ctcap)
+    if (options.identifier):
+        identifiers.append (options.identifier)
+
+    config = TestingConfiguration (versions, sources, uris, types, ctcaps,
+            identifiers, options.btaddr)
+
+    tempfile = tempfile.mkdtemp(prefix="syncevo-phone-config")
+    testFolder = testfile+'/data'
+    testResult = testfile+'/cache'
+    print "Running test with test data inside %s and test results inside %s" %(testFolder, testResult)
+    config.run()
+
+if __name__ == "__main__":
+  main()