Merge branch 'FREMANTLE-1-2-2' into HARMATTAN-1-2-2
This commit is contained in:
commit
95b2c267fe
31 changed files with 5761 additions and 4497 deletions
20
Makefile.am
20
Makefile.am
|
@ -232,20 +232,30 @@ installcheck-local:
|
|||
done
|
||||
endif
|
||||
|
||||
# Be strict about running 'syncevolution' only when not doing
|
||||
# cross-compilation: in that case, if running 'syncevolution' fails,
|
||||
# abort the build process. Otherwise proceed with the fallback below,
|
||||
# which is to keep the "see --sync/source-property ?" placeholders in
|
||||
# the README.
|
||||
if COND_CROSS_COMPILING
|
||||
RUN_SYNCEVOLUTION_CHECK=if ($$?) { return ""; } else { return $$buffer; }
|
||||
else
|
||||
RUN_SYNCEVOLUTION_CHECK=die if $$?; return $$buffer;
|
||||
endif
|
||||
|
||||
# patch README.rst properties on-the-fly
|
||||
README.patched.rst: README.rst src/syncevolution
|
||||
perl -e '$$syncfound=0; $$sourcefound=0; $$res=0;' \
|
||||
-e 'sub run { $$cmd = shift; $$buffer = `$$cmd`; die if $$?; return $$buffer; }' \
|
||||
-e 'sub run { $$cmd = shift; $$buffer = `env LD_LIBRARY_PATH=src/syncevo/.libs:src/gdbus/.libs:src/gdbusxx/.libs:src/build-synthesis/src/.libs:$$ENV{LD_LIBRARY_PATH} $$cmd`; $(RUN_SYNCEVOLUTION_CHECK) }' \
|
||||
-e 'while (<>) {' \
|
||||
-e 's/^:Version: .*/:Version: $(VERSION)/;' \
|
||||
-e 's/:Date: .*/":Date: " . `date +%Y-%m-%d`/e;' \
|
||||
-e 'if (s;<<insert sync-property>>\n;run("src/syncevolution --daemon=no --sync-property ?");e) { $$syncfound=1; }' \
|
||||
-e 'if (s;<<insert source-property>>\n;run("src/syncevolution --daemon=no --source-property ?");e) { $$sourcefound=1; }' \
|
||||
-e 'if (s;(<< see "syncevolution --sync-property ." >>\n);run("src/syncevolution --daemon=no --sync-property ?") || $$1;e) { $$syncfound=1; }' \
|
||||
-e 'if (s;(<< see "syncevolution --source-property ." >>\n);run("src/syncevolution --daemon=no --source-property ?") || $$1;e) { $$sourcefound=1; }' \
|
||||
-e 'print;' \
|
||||
-e '}' \
|
||||
-e 'die "<<insert sync-property>> not in README.rst?!" unless $$syncfound;' \
|
||||
-e 'die "<<insert source-property>> not in README.rst?!" unless $$sourcefound;' \
|
||||
-e 'die "<<sync-property>> tag not in README.rst?!" unless $$syncfound;' \
|
||||
-e 'die "<<source-property>> tag not in README.rst?!" unless $$sourcefound;' \
|
||||
-e 'exit $$res;' \
|
||||
$< >$@
|
||||
CLEANFILES += README.patched.rst
|
||||
|
|
48
NEWS
48
NEWS
|
@ -1,3 +1,51 @@
|
|||
SyncEvolution 1.2.1 -> 1.2.2, 13.01.2012
|
||||
========================================
|
||||
|
||||
Maintenance release with various bug fixes.
|
||||
|
||||
* syncevo-dbus-server + ConnMan: fixed "online" detection (BMC #21541, BMC #24587)
|
||||
|
||||
SyncEvolution did not recognize any cellular connectivity as
|
||||
suitable for syncing. The strict check for certain "connected
|
||||
technology" is unnecessary, anything which makes the computer
|
||||
"online" should be good enough. So now it just uses the ConnMan
|
||||
"State" property.
|
||||
|
||||
Additional benefit: will continue to work with ConnMan 1.0, which
|
||||
won't have the "ConnectedTechnologies" property anymore.
|
||||
|
||||
The Bluetooth available check was also (incorrectly) using the
|
||||
ConnMan API. Now asssume that OBEX/Bluetooth is always available.
|
||||
|
||||
* automatic backups: added INFO messages and fixed dumpData/printChanges (BMC #24619)
|
||||
|
||||
Point out that backups are created (user might be unaware otherwise
|
||||
and wonder about the delay), explain why (so that users know how to
|
||||
turn it off).
|
||||
|
||||
Turning these backups off with dumpData=0 printChanges=0 had to be
|
||||
fixed, backups were always written previously.
|
||||
|
||||
* EDS compatibility: bumped version check for EDS 3.2
|
||||
|
||||
SyncEvolution is known to work with EDS 3.2. Therefore use the
|
||||
libebook/ecal/edataserver libs from 3.2 if available, without
|
||||
warnings in the --version output. Also happens with inconsistent
|
||||
distro setups where the old libs are available and would have been
|
||||
prefered by SyncEvolution 1.2.1 even though the old libs no longer
|
||||
work with EDS 3.2.
|
||||
|
||||
* GTK-UI: do not accept service config without a username (BMC#23106)
|
||||
|
||||
Instead of creating such a config, an error dialog is shown.
|
||||
|
||||
* GTK-UI: updated translations
|
||||
|
||||
* fixed various compile issues, primarily on Fedora Core 17
|
||||
(unistd.h/ssize_t, invoking syncevolution during compilation,
|
||||
missing src/dbus/qt/configure-sub.in)
|
||||
|
||||
|
||||
SyncEvolution 1.2 -> 1.2.1, 25.11.2011
|
||||
======================================
|
||||
|
||||
|
|
|
@ -662,11 +662,11 @@ defined, which is marked with the word `required`.
|
|||
|
||||
Sync properties
|
||||
---------------
|
||||
<<insert sync-property>>
|
||||
<< see "syncevolution --sync-property ?" >>
|
||||
|
||||
Source properties
|
||||
-----------------
|
||||
<<insert source-property>>
|
||||
<< see "syncevolution --source-property ?" >>
|
||||
|
||||
|
||||
EXAMPLES
|
||||
|
|
|
@ -158,6 +158,9 @@ SYNCEVOLUTION_LIBS=`pwd`/src/syncevo/libsyncevolution.la
|
|||
AC_SUBST(SYNCEVOLUTION_CFLAGS)
|
||||
AC_SUBST(SYNCEVOLUTION_LIBS)
|
||||
|
||||
# invoking syncevolution binary is allowed to fail when cross-compiling
|
||||
AM_CONDITIONAL([COND_CROSS_COMPILING], [test "$cross_compiling" = "yes"])
|
||||
|
||||
AC_CONFIG_FILES(Makefile src/dbus/interfaces/Makefile src/gdbus/Makefile src/dbus/Makefile src/dbus/glib/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/glib/syncevo-dbus.pc)
|
||||
AC_OUTPUT
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@ dnl Invoke autogen.sh to produce a configure script.
|
|||
#
|
||||
# Starting with the 1.1 release cycle, the rpm-style
|
||||
# .99 pseudo-version number is used to mark a pre-release.
|
||||
AC_INIT([syncevolution], [1.2.1])
|
||||
AC_INIT([syncevolution], [1.2.2])
|
||||
# STABLE_VERSION=1.0.1+
|
||||
AC_SUBST(STABLE_VERSION)
|
||||
|
||||
|
|
8
debian/changelog
vendored
8
debian/changelog
vendored
|
@ -1,3 +1,11 @@
|
|||
syncevolution (1:1.2.2-1) unstable; urgency=low
|
||||
|
||||
* SyncEvolution 1.2.2 for Maemo.
|
||||
* Merged from Harmattan branch (irrelevant on Fremantle):
|
||||
- Only sync contacts which have a SyncTarget of "addressbook".
|
||||
|
||||
-- Ove Kaaven <ovek@arcticnet.no> Mon, 23 Jan 2012 23:19:33 +0100
|
||||
|
||||
syncevolution (1:1.2.1-1) unstable; urgency=low
|
||||
|
||||
* SyncEvolution 1.2.1 for Harmattan.
|
||||
|
|
528
po/en_GB.po
528
po/en_GB.po
File diff suppressed because it is too large
Load diff
985
po/en_US.po
Normal file
985
po/en_US.po
Normal file
|
@ -0,0 +1,985 @@
|
|||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
#
|
||||
# Translators:
|
||||
# Margie Foster <margie@linux.intel.com>, 2011.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: syncevolution\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.meego.com/\n"
|
||||
"POT-Creation-Date: 2011-12-05 10:21-0800\n"
|
||||
"PO-Revision-Date: 2011-12-05 22:05+0000\n"
|
||||
"Last-Translator: margie <margie@linux.intel.com>\n"
|
||||
"Language-Team: English (United States) (http://www.transifex.net/projects/p/meego/team/en_US/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: en_US\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1)\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:266
|
||||
msgid "Contacts"
|
||||
msgstr "Contacts"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:268
|
||||
msgid "Appointments"
|
||||
msgstr "Appointments"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:270 ../src/gtk-ui/ui.glade.h:40
|
||||
msgid "Tasks"
|
||||
msgstr "Tasks"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:272
|
||||
msgid "Notes"
|
||||
msgstr "Notes"
|
||||
|
||||
#. 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:277
|
||||
msgid "Appointments & Tasks"
|
||||
msgstr "Appointments & Tasks"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:349
|
||||
msgid "Starting sync"
|
||||
msgstr "Starting sync"
|
||||
|
||||
#. TRANSLATORS: slow sync confirmation dialog message. Placeholder
|
||||
#. * is service/device name
|
||||
#: ../src/gtk-ui/sync-ui.c:387
|
||||
#, c-format
|
||||
msgid "Do you want to slow sync with %s?"
|
||||
msgstr "Do you want to slow sync with %s?"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:391
|
||||
msgid "Yes, do slow sync"
|
||||
msgstr "Yes, do slow sync"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:391
|
||||
msgid "No, cancel sync"
|
||||
msgstr "No, cancel sync"
|
||||
|
||||
#. TRANSLATORS: confirmation dialog for "refresh from peer". Placeholder
|
||||
#. * is service/device name
|
||||
#: ../src/gtk-ui/sync-ui.c:424
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Do you want to delete all local data and replace it with data from %s? This "
|
||||
"is not usually advised."
|
||||
msgstr ""
|
||||
"Do you want to delete all local data and replace it with data from %s? This "
|
||||
"is not usually advised."
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:429 ../src/gtk-ui/sync-ui.c:462
|
||||
msgid "Yes, delete and replace"
|
||||
msgstr "Yes, delete and replace"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:429 ../src/gtk-ui/sync-ui.c:462
|
||||
#: ../src/gtk-ui/sync-ui.c:1610
|
||||
msgid "No"
|
||||
msgstr "No"
|
||||
|
||||
#. TRANSLATORS: confirmation dialog for "refresh from local side". Placeholder
|
||||
#. * is service/device name
|
||||
#: ../src/gtk-ui/sync-ui.c:457
|
||||
#, 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 ""
|
||||
"Do you want to delete all data in %s and replace it with your local data? "
|
||||
"This is not usually advised."
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:491
|
||||
msgid "Trying to cancel sync"
|
||||
msgstr "Trying to cancel sync"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:533
|
||||
msgid "No service or device selected"
|
||||
msgstr "No service or device selected"
|
||||
|
||||
#. TRANSLATORS: This is the title on main view. Placeholder is
|
||||
#. * the service name. Example: "Google - synced just now"
|
||||
#: ../src/gtk-ui/sync-ui.c:541
|
||||
#, c-format
|
||||
msgid "%s - synced just now"
|
||||
msgstr "%s - synced just now"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:545
|
||||
#, c-format
|
||||
msgid "%s - synced a minute ago"
|
||||
msgstr "%s - synced a minute ago"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:549
|
||||
#, c-format
|
||||
msgid "%s - synced %ld minutes ago"
|
||||
msgstr "%s - synced %ld minutes ago"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:554
|
||||
#, c-format
|
||||
msgid "%s - synced an hour ago"
|
||||
msgstr "%s - synced an hour ago"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:558
|
||||
#, c-format
|
||||
msgid "%s - synced %ld hours ago"
|
||||
msgstr "%s - synced %ld hours ago"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:563
|
||||
#, c-format
|
||||
msgid "%s - synced a day ago"
|
||||
msgstr "%s - synced a day ago"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:567
|
||||
#, c-format
|
||||
msgid "%s - synced %ld days ago"
|
||||
msgstr "%s - synced %ld days ago"
|
||||
|
||||
#. 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:616 ../src/gtk-ui/sync-ui.c:701
|
||||
msgid "Sync now"
|
||||
msgstr "Sync now"
|
||||
|
||||
#. 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:622 ../src/gtk-ui/ui.glade.h:37
|
||||
msgid "Slow sync"
|
||||
msgstr "Slow sync"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:623
|
||||
msgid "Other options..."
|
||||
msgstr "Other 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:628
|
||||
msgid "Select sync service"
|
||||
msgstr "Select sync 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:633
|
||||
msgid "Edit service settings"
|
||||
msgstr "Edit service settings"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:709
|
||||
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 ""
|
||||
"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."
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:729
|
||||
msgid "Sync again"
|
||||
msgstr "Sync again"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:748
|
||||
msgid "Restoring"
|
||||
msgstr "Restoring"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:750
|
||||
msgid "Syncing"
|
||||
msgstr "Syncing"
|
||||
|
||||
#. 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:762 ../src/gtk-ui/sync-ui.c:3407
|
||||
msgid "Cancel sync"
|
||||
msgstr "Cancel sync"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:927
|
||||
msgid "Back to sync"
|
||||
msgstr "Back to sync"
|
||||
|
||||
#. 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:1229
|
||||
msgid "Automatic sync"
|
||||
msgstr "Automatic sync"
|
||||
|
||||
#. 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:1524
|
||||
#, c-format
|
||||
msgid "Affected data: %s %s"
|
||||
msgstr "Affected data: %s %s"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:1529
|
||||
#, c-format
|
||||
msgid "Affected data: none"
|
||||
msgstr "Affected data: none"
|
||||
|
||||
#. TRANSLATORS: confirmation for restoring a backup. placeholder is the
|
||||
#. * backup time string defined below
|
||||
#: ../src/gtk-ui/sync-ui.c:1607
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Do you want to restore the backup from %s? All changes you have made since "
|
||||
"then will be lost."
|
||||
msgstr ""
|
||||
"Do you want to restore the backup from %s? All changes you have made since "
|
||||
"then will be lost."
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:1610
|
||||
msgid "Yes, restore"
|
||||
msgstr "Yes, restore"
|
||||
|
||||
#. 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:1642
|
||||
#, 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:1661
|
||||
#, c-format
|
||||
msgid "Backed up before syncing with %s"
|
||||
msgstr "Backed up before syncing with %s"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:1678
|
||||
msgid "Restore"
|
||||
msgstr "Restore"
|
||||
|
||||
#. TRANSLATORS: this is an explanation in Emergency view.
|
||||
#. * Placeholder is a service/device name
|
||||
#: ../src/gtk-ui/sync-ui.c:1785
|
||||
#, 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 ""
|
||||
"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."
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:1795
|
||||
#, c-format
|
||||
msgid ""
|
||||
"If something has gone horribly wrong, you can try a slow sync, start from "
|
||||
"scratch or restore from backup."
|
||||
msgstr ""
|
||||
"If something has gone horribly wrong, you can try a slow sync, start from "
|
||||
"scratch or restore from 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:1804
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Delete all your local\n"
|
||||
"data and replace with\n"
|
||||
"data from %s"
|
||||
msgstr ""
|
||||
"Delete all your local\n"
|
||||
"data and replace with\n"
|
||||
"data from %s"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:1810
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Delete all data on\n"
|
||||
"%s and replace\n"
|
||||
"with your local data"
|
||||
msgstr ""
|
||||
"Delete all data on\n"
|
||||
"%s and replace\n"
|
||||
"with your local data"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:2275
|
||||
msgid "Failed to get list of supported services from SyncEvolution"
|
||||
msgstr "Failed to get list of supported services from SyncEvolution"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:2329
|
||||
msgid ""
|
||||
"There was a problem communicating with the sync process. Please try again "
|
||||
"later."
|
||||
msgstr ""
|
||||
"There was a problem communicating with the sync process. Please try again "
|
||||
"later."
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:2388
|
||||
msgid "Restore failed"
|
||||
msgstr "Restore failed"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:2391 ../src/gtk-ui/sync-ui.c:3276
|
||||
msgid "Sync failed"
|
||||
msgstr "Sync failed"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:2397
|
||||
msgid "Restore complete"
|
||||
msgstr "Restore complete"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:2400
|
||||
msgid "Sync complete"
|
||||
msgstr "Sync complete"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:2492
|
||||
#, c-format
|
||||
msgid "Preparing '%s'"
|
||||
msgstr "Preparing '%s'"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:2495
|
||||
#, c-format
|
||||
msgid "Receiving '%s'"
|
||||
msgstr "Receiving '%s'"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:2498
|
||||
#, c-format
|
||||
msgid "Sending '%s'"
|
||||
msgstr "Sending '%s'"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:2619
|
||||
#, c-format
|
||||
msgid "There was one remote rejection."
|
||||
msgid_plural "There were %ld remote rejections."
|
||||
msgstr[0] "There was one remote rejection."
|
||||
msgstr[1] "There were %ld remote rejections."
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:2624
|
||||
#, c-format
|
||||
msgid "There was one local rejection."
|
||||
msgid_plural "There were %ld local rejections."
|
||||
msgstr[0] "There was one local rejection."
|
||||
msgstr[1] "There were %ld local rejections."
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:2629
|
||||
#, c-format
|
||||
msgid "There were %ld local rejections and %ld remote rejections."
|
||||
msgstr "There were %ld local rejections and %ld remote rejections."
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:2634
|
||||
#, c-format
|
||||
msgid "Last time: No changes."
|
||||
msgstr "Last time: No changes."
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:2636
|
||||
#, c-format
|
||||
msgid "Last time: Sent one change."
|
||||
msgid_plural "Last time: Sent %ld changes."
|
||||
msgstr[0] "Last time: Sent one change."
|
||||
msgstr[1] "Last time: Sent %ld changes."
|
||||
|
||||
#. 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:2644
|
||||
#, c-format
|
||||
msgid "Last time: Applied one change."
|
||||
msgid_plural "Last time: Applied %ld changes."
|
||||
msgstr[0] "Last time: Applied one change."
|
||||
msgstr[1] "Last time: Applied %ld changes."
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:2649
|
||||
#, c-format
|
||||
msgid "Last time: Applied %ld changes and sent %ld changes."
|
||||
msgstr "Last time: Applied %ld changes and sent %ld changes."
|
||||
|
||||
#. TRANSLATORS: the placeholder is a error message (hopefully)
|
||||
#. * explaining the problem
|
||||
#: ../src/gtk-ui/sync-ui.c:2856
|
||||
#, c-format
|
||||
msgid ""
|
||||
"There was a problem with last sync:\n"
|
||||
"%s"
|
||||
msgstr ""
|
||||
"There was a problem with last sync:\n"
|
||||
"%s"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:2866
|
||||
#, c-format
|
||||
msgid ""
|
||||
"You've just restored a backup. The changes have not been synced with %s yet"
|
||||
msgstr ""
|
||||
"You've just restored a backup. The changes have not been synced with %s yet"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:3154
|
||||
msgid "Waiting for current operation to finish..."
|
||||
msgstr "Waiting for current operation to finish..."
|
||||
|
||||
#. TRANSLATORS: next strings are error messages.
|
||||
#: ../src/gtk-ui/sync-ui.c:3188
|
||||
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 ""
|
||||
"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."
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:3192
|
||||
msgid "The sync process died unexpectedly."
|
||||
msgstr "The sync process died unexpectedly."
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:3197
|
||||
msgid ""
|
||||
"Password request was not answered. You can save the password in the settings"
|
||||
" to prevent the request."
|
||||
msgstr ""
|
||||
"Password request was not answered. You can save the password in the settings"
|
||||
" to prevent the request."
|
||||
|
||||
#. TODO use the service device name here, this is a remote problem
|
||||
#: ../src/gtk-ui/sync-ui.c:3201
|
||||
msgid "There was a problem processing sync request. Trying again may help."
|
||||
msgstr "There was a problem processing sync request. Trying again may help."
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:3207
|
||||
msgid ""
|
||||
"Failed to login. Could there be a problem with your username or password?"
|
||||
msgstr ""
|
||||
"Failed to log in. Could there be a problem with your username or password?"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:3210
|
||||
msgid "Forbidden"
|
||||
msgstr "Forbidden"
|
||||
|
||||
#. TRANSLATORS: data source means e.g. calendar or addressbook
|
||||
#: ../src/gtk-ui/sync-ui.c:3216
|
||||
msgid ""
|
||||
"A data source could not be found. Could there be a problem with the "
|
||||
"settings?"
|
||||
msgstr ""
|
||||
"A data source could not be found. Could there be a problem with the "
|
||||
"settings?"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:3220
|
||||
msgid "Remote database error"
|
||||
msgstr "Remote database error"
|
||||
|
||||
#. This can happen when EDS is borked, restart it may help...
|
||||
#: ../src/gtk-ui/sync-ui.c:3223
|
||||
msgid ""
|
||||
"There is a problem with the local database. Syncing again or rebooting may "
|
||||
"help."
|
||||
msgstr ""
|
||||
"There is a problem with the local database. Syncing again or rebooting may "
|
||||
"help."
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:3226
|
||||
msgid "No space on disk"
|
||||
msgstr "No space on disk"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:3228
|
||||
msgid "Failed to process SyncML"
|
||||
msgstr "Failed to process SyncML"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:3230
|
||||
msgid "Server authorization failed"
|
||||
msgstr "Server authorization failed"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:3232
|
||||
msgid "Failed to parse configuration file"
|
||||
msgstr "Failed to parse configuration file"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:3234
|
||||
msgid "Failed to read configuration file"
|
||||
msgstr "Failed to read configuration file"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:3236
|
||||
msgid "No configuration found"
|
||||
msgstr "No configuration found"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:3238
|
||||
msgid "No configuration file found"
|
||||
msgstr "No configuration file found"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:3240
|
||||
msgid "Server sent bad content"
|
||||
msgstr "Server sent bad content"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:3242
|
||||
msgid "Connection certificate has expired"
|
||||
msgstr "Connection certificate has expired"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:3244
|
||||
msgid "Connection certificate is invalid"
|
||||
msgstr "Connection certificate is invalid"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:3252
|
||||
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 were unable to connect to the server. The problem could be temporary or "
|
||||
"there could be something wrong with the settings."
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:3259
|
||||
msgid "The server URL is bad"
|
||||
msgstr "The server URL is bad"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:3264
|
||||
msgid "The server was not found"
|
||||
msgstr "The server was not found"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:3266
|
||||
#, c-format
|
||||
msgid "Error %d"
|
||||
msgstr "Error %d"
|
||||
|
||||
#. TRANSLATORS: password request dialog contents: title, cancel button
|
||||
#. * and ok button
|
||||
#: ../src/gtk-ui/sync-ui.c:3404
|
||||
msgid "Password is required for sync"
|
||||
msgstr "Password is required for sync"
|
||||
|
||||
#: ../src/gtk-ui/sync-ui.c:3408
|
||||
msgid "Sync with password"
|
||||
msgstr "Sync with password"
|
||||
|
||||
#. TRANSLATORS: password request dialog message, placeholder is service name
|
||||
#: ../src/gtk-ui/sync-ui.c:3418
|
||||
#, c-format
|
||||
msgid "Please enter password for syncing with %s:"
|
||||
msgstr "Please enter password for syncing with %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>Actions</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>or</b>"
|
||||
|
||||
#: ../src/gtk-ui/ui.glade.h:5
|
||||
msgid "<big>Direct sync</big>"
|
||||
msgstr "<big>Direct sync</big>"
|
||||
|
||||
#: ../src/gtk-ui/ui.glade.h:6
|
||||
msgid "<big>Network sync</big>"
|
||||
msgstr "<big>Network sync</big>"
|
||||
|
||||
#. a title in emergency view
|
||||
#: ../src/gtk-ui/ui.glade.h:8
|
||||
msgid "<big>Restore from backup</big>"
|
||||
msgstr "<big>Restore from backup</big>"
|
||||
|
||||
#. a title in emergency view
|
||||
#: ../src/gtk-ui/ui.glade.h:10
|
||||
msgid "<big>Slow sync</big>"
|
||||
msgstr "<big>Slow sync</big>"
|
||||
|
||||
#. a title in emergency view
|
||||
#: ../src/gtk-ui/ui.glade.h:12
|
||||
msgid "<big>Start from scratch</big>"
|
||||
msgstr "<big>Start from scratch</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 ""
|
||||
"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."
|
||||
|
||||
#: ../src/gtk-ui/ui.glade.h:15
|
||||
msgid "Add new device"
|
||||
msgstr "Add new device"
|
||||
|
||||
#: ../src/gtk-ui/ui.glade.h:16
|
||||
msgid "Add new service"
|
||||
msgstr "Add new service"
|
||||
|
||||
#. 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 ""
|
||||
"Backups are made before every sync. Choose a backup to restore. Any changes "
|
||||
"you have made since then will be lost."
|
||||
|
||||
#: ../src/gtk-ui/ui.glade.h:19
|
||||
msgid "Calendar"
|
||||
msgstr "Calendar"
|
||||
|
||||
#. 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 ""
|
||||
"Change or edit\n"
|
||||
"sync service"
|
||||
|
||||
#. close button for settings window
|
||||
#: ../src/gtk-ui/ui.glade.h:24
|
||||
msgid "Close"
|
||||
msgstr "Close"
|
||||
|
||||
#: ../src/gtk-ui/ui.glade.h:25
|
||||
msgid ""
|
||||
"Delete all data on Zyb \n"
|
||||
"and replace with your\n"
|
||||
"local information"
|
||||
msgstr ""
|
||||
"Delete all data on Zyb \n"
|
||||
"and replace with your\n"
|
||||
"local information"
|
||||
|
||||
#: ../src/gtk-ui/ui.glade.h:28
|
||||
msgid ""
|
||||
"Delete all your local\n"
|
||||
"information and replace\n"
|
||||
"with data from Zyb"
|
||||
msgstr ""
|
||||
"Delete all your local\n"
|
||||
"information and replace\n"
|
||||
"with data from 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 ""
|
||||
"Fix a sync\n"
|
||||
"emergency"
|
||||
|
||||
#: ../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 ""
|
||||
"If you don't see your service above but know that your sync provider uses SyncML\n"
|
||||
"you can setup a service manually."
|
||||
|
||||
#: ../src/gtk-ui/ui.glade.h:36
|
||||
msgid "Settings"
|
||||
msgstr "Settings"
|
||||
|
||||
#: ../src/gtk-ui/ui.glade.h:39
|
||||
msgid "Sync Emergency"
|
||||
msgstr "Sync Emergency"
|
||||
|
||||
#: ../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 ""
|
||||
"To sync you'll need a network connection and an account with a sync service.\n"
|
||||
"We support the following services: "
|
||||
|
||||
#: ../src/gtk-ui/ui.glade.h:43
|
||||
msgid "Use Bluetooth to Sync your data from one device to another."
|
||||
msgstr "Use Bluetooth to sync your data from one device to another."
|
||||
|
||||
#: ../src/gtk-ui/ui.glade.h:44
|
||||
msgid "You will need to add Bluetooth devices before they can be synced."
|
||||
msgstr "You will need to add Bluetooth devices before they can be synced."
|
||||
|
||||
#: ../src/gtk-ui/sync.desktop.in.h:2
|
||||
msgid "Up to date"
|
||||
msgstr "Up to date"
|
||||
|
||||
#: ../src/gtk-ui/sync-gtk.desktop.in.h:1
|
||||
msgid "SyncEvolution (GTK)"
|
||||
msgstr "SyncEvolution (GTK)"
|
||||
|
||||
#: ../src/gtk-ui/sync-gtk.desktop.in.h:2
|
||||
msgid "Synchronize PIM data"
|
||||
msgstr "Synchronize PIM data"
|
||||
|
||||
#: ../src/gtk-ui/sync-config-widget.c:88
|
||||
msgid ""
|
||||
"ScheduleWorld enables you to keep your contacts, events, tasks, and notes in"
|
||||
" sync."
|
||||
msgstr ""
|
||||
"ScheduleWorld enables you to keep your contacts, events, tasks, and notes in"
|
||||
" sync."
|
||||
|
||||
#: ../src/gtk-ui/sync-config-widget.c:91
|
||||
msgid ""
|
||||
"Google Sync can back up and synchronize your contacts with your Gmail "
|
||||
"contacts."
|
||||
msgstr ""
|
||||
"Google Sync can back up and synchronize your contacts with your Gmail "
|
||||
"contacts."
|
||||
|
||||
#. 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:97
|
||||
msgid ""
|
||||
"Back up your contacts and calendar. Sync with a single click, anytime, "
|
||||
"anywhere (DEMO)."
|
||||
msgstr ""
|
||||
"Back up your contacts and calendar. Sync with a single click, anytime, "
|
||||
"anywhere (DEMO)."
|
||||
|
||||
#: ../src/gtk-ui/sync-config-widget.c:100
|
||||
msgid ""
|
||||
"Mobical Backup and Restore service allows you to securely back up your "
|
||||
"personal mobile data for free."
|
||||
msgstr ""
|
||||
"Mobical Backup and Restore service allows you to securely back up your "
|
||||
"personal mobile data for free."
|
||||
|
||||
#: ../src/gtk-ui/sync-config-widget.c:103
|
||||
msgid ""
|
||||
"ZYB is a simple way for people to store and share mobile information online."
|
||||
msgstr ""
|
||||
"ZYB is a simple way for people to store and share mobile information online."
|
||||
|
||||
#: ../src/gtk-ui/sync-config-widget.c:106
|
||||
msgid ""
|
||||
"Memotoo lets you access your personal data from any computer connected to "
|
||||
"the Internet."
|
||||
msgstr ""
|
||||
"Memotoo lets you access your personal data from any computer connected to "
|
||||
"the Internet."
|
||||
|
||||
#: ../src/gtk-ui/sync-config-widget.c:195
|
||||
msgid "Sorry, failed to save the configuration"
|
||||
msgstr "Sorry, failed to save the configuration"
|
||||
|
||||
#: ../src/gtk-ui/sync-config-widget.c:445
|
||||
msgid "Service must have a name and server URL"
|
||||
msgstr "Service must have a name and server URL"
|
||||
|
||||
#. TRANSLATORS: error dialog when creating a new sync configuration
|
||||
#: ../src/gtk-ui/sync-config-widget.c:451
|
||||
msgid "A username is required for this service"
|
||||
msgstr "A username is required for this service"
|
||||
|
||||
#: ../src/gtk-ui/sync-config-widget.c:493
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Do you want to reset the settings for %s? This will not remove any synced "
|
||||
"information on either end."
|
||||
msgstr ""
|
||||
"Do you want to reset the settings for %s? This will not remove any synced "
|
||||
"information on either end."
|
||||
|
||||
#. TRANSLATORS: buttons in reset-service warning dialog
|
||||
#: ../src/gtk-ui/sync-config-widget.c:497
|
||||
msgid "Yes, reset"
|
||||
msgstr "Yes, reset"
|
||||
|
||||
#: ../src/gtk-ui/sync-config-widget.c:498
|
||||
#: ../src/gtk-ui/sync-config-widget.c:509
|
||||
msgid "No, keep settings"
|
||||
msgstr "No, keep settings"
|
||||
|
||||
#: ../src/gtk-ui/sync-config-widget.c:503
|
||||
#, 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 ""
|
||||
"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."
|
||||
|
||||
#. TRANSLATORS: buttons in delete-service warning dialog
|
||||
#: ../src/gtk-ui/sync-config-widget.c:508
|
||||
msgid "Yes, delete"
|
||||
msgstr "Yes, delete"
|
||||
|
||||
#: ../src/gtk-ui/sync-config-widget.c:539
|
||||
msgid "Reset settings"
|
||||
msgstr "Reset settings"
|
||||
|
||||
#: ../src/gtk-ui/sync-config-widget.c:542
|
||||
msgid "Delete settings"
|
||||
msgstr "Delete settings"
|
||||
|
||||
#: ../src/gtk-ui/sync-config-widget.c:552
|
||||
msgid "Save and use"
|
||||
msgstr "Save and use"
|
||||
|
||||
#: ../src/gtk-ui/sync-config-widget.c:555
|
||||
msgid ""
|
||||
"Save and replace\n"
|
||||
"current service"
|
||||
msgstr ""
|
||||
"Save and replace\n"
|
||||
"current service"
|
||||
|
||||
#: ../src/gtk-ui/sync-config-widget.c:563
|
||||
msgid "Stop using device"
|
||||
msgstr "Stop using device"
|
||||
|
||||
#: ../src/gtk-ui/sync-config-widget.c:566
|
||||
msgid "Stop using service"
|
||||
msgstr "Stop using 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:749
|
||||
#, 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:936
|
||||
#, c-format
|
||||
msgid "Send changes to %s"
|
||||
msgstr "Send changes to %s"
|
||||
|
||||
#: ../src/gtk-ui/sync-config-widget.c:941
|
||||
#, c-format
|
||||
msgid "Receive changes from %s"
|
||||
msgstr "Receive changes from %s"
|
||||
|
||||
#: ../src/gtk-ui/sync-config-widget.c:957
|
||||
msgid "<b>Sync</b>"
|
||||
msgstr "<b>Sync</b>"
|
||||
|
||||
#. TRANSLATORS: label of a entry in service configuration
|
||||
#: ../src/gtk-ui/sync-config-widget.c:973
|
||||
msgid "Server address"
|
||||
msgstr "Server address"
|
||||
|
||||
#. 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:1049
|
||||
#, 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 ""
|
||||
"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"
|
||||
|
||||
#: ../src/gtk-ui/sync-config-widget.c:1055
|
||||
#: ../src/gtk-ui/sync-config-widget.c:1915
|
||||
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 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"
|
||||
|
||||
#: ../src/gtk-ui/sync-config-widget.c:1207
|
||||
#, c-format
|
||||
msgid "%s - Bluetooth device"
|
||||
msgstr "%s - Bluetooth device"
|
||||
|
||||
#. 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:1213
|
||||
#, c-format
|
||||
msgid "%s - manually setup"
|
||||
msgstr "%s - manually set up"
|
||||
|
||||
#. TRANSLATORS: link button in service configuration form
|
||||
#: ../src/gtk-ui/sync-config-widget.c:1886
|
||||
msgid "Launch website"
|
||||
msgstr "Launch website"
|
||||
|
||||
#. TRANSLATORS: button in service configuration form
|
||||
#: ../src/gtk-ui/sync-config-widget.c:1895
|
||||
msgid "Set up now"
|
||||
msgstr "Set up now"
|
||||
|
||||
#: ../src/gtk-ui/sync-config-widget.c:1953
|
||||
msgid "Use these settings"
|
||||
msgstr "Use these settings"
|
||||
|
||||
#. TRANSLATORS: labels of entries in service configuration form
|
||||
#: ../src/gtk-ui/sync-config-widget.c:1991
|
||||
msgid "Username"
|
||||
msgstr "Username"
|
||||
|
||||
#: ../src/gtk-ui/sync-config-widget.c:2006
|
||||
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:2029
|
||||
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 ""
|
||||
"Current configuration is more complex than what can be shown here. Changes "
|
||||
"to sync mode or synced data types will overwrite that configuration."
|
||||
|
||||
#. TRANSLATORS: this is the epander label for server settings
|
||||
#. in service configuration form
|
||||
#: ../src/gtk-ui/sync-config-widget.c:2048
|
||||
msgid "Hide server settings"
|
||||
msgstr "Hide server settings"
|
||||
|
||||
#. TRANSLATORS: this is the epander label for server settings
|
||||
#. in service configuration form
|
||||
#: ../src/gtk-ui/sync-config-widget.c:2068
|
||||
msgid "Show server settings"
|
||||
msgstr "Show server settings"
|
||||
|
||||
#: ../src/gnome-bluetooth/syncevolution.c:110
|
||||
msgid "Sync in the Sync application"
|
||||
msgstr "Sync in the Sync application"
|
||||
|
||||
#: ../src/syncevo-dbus-server.cpp:6653
|
||||
#, c-format
|
||||
msgid "%s is syncing"
|
||||
msgstr "%s is syncing"
|
||||
|
||||
#: ../src/syncevo-dbus-server.cpp:6654
|
||||
#, c-format
|
||||
msgid "We have just started to sync your computer with the %s sync service."
|
||||
msgstr "We have just started to sync your computer with the %s sync service."
|
||||
|
||||
#. if sync is successfully started and done
|
||||
#: ../src/syncevo-dbus-server.cpp:6670
|
||||
#, c-format
|
||||
msgid "%s sync complete"
|
||||
msgstr "%s sync complete"
|
||||
|
||||
#: ../src/syncevo-dbus-server.cpp:6671
|
||||
#, c-format
|
||||
msgid "We have just finished syncing your computer with the %s sync service."
|
||||
msgstr "We have just finished syncing your computer with the %s sync service."
|
||||
|
||||
#. if sync is successfully started and has errors, or not started successful
|
||||
#. with a fatal problem
|
||||
#: ../src/syncevo-dbus-server.cpp:6676
|
||||
msgid "Sync problem."
|
||||
msgstr "Sync problem."
|
||||
|
||||
#: ../src/syncevo-dbus-server.cpp:6677
|
||||
msgid "Sorry, there's a problem with your sync that you need to attend to."
|
||||
msgstr "Sorry, there's a problem with your sync that you need to attend to."
|
||||
|
||||
#: ../src/syncevo-dbus-server.cpp:6758
|
||||
msgid "View"
|
||||
msgstr "View"
|
||||
|
||||
#. 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).
|
||||
#: ../src/syncevo-dbus-server.cpp:6762
|
||||
msgid "Dismiss"
|
||||
msgstr "Dismiss"
|
||||
|
||||
|
663
po/pt_BR.po
663
po/pt_BR.po
File diff suppressed because it is too large
Load diff
551
po/zh_CN.po
551
po/zh_CN.po
File diff suppressed because it is too large
Load diff
511
po/zh_TW.po
511
po/zh_TW.po
File diff suppressed because it is too large
Load diff
|
@ -150,7 +150,7 @@ dist-hook:
|
|||
mkdir -p $(distdir)/synthesis && \
|
||||
if test -d "$(SYNTHESIS_SRC)/.git"; \
|
||||
then \
|
||||
( ( cd "$(SYNTHESIS_SRC)" && git archive HEAD ) | ( cd "$(distdir)/synthesis" && tar xf - && $$SHELL autogen.sh && rm -rf autom4te.cache ) ) && \
|
||||
( ( cd "$(SYNTHESIS_SRC)" && git archive HEAD ) | ( cd "$(distdir)/synthesis" && tar xf - && $$SHELL autogen.sh && rm -rf autom4te.cache && find . -name .gitignore -delete ) ) && \
|
||||
( echo Creating ChangeLog && \
|
||||
( ( cd "$(SYNTHESIS_SRC)" && \
|
||||
echo '# Generated by configure. Do no edit.' && \
|
||||
|
@ -166,7 +166,7 @@ dist-hook:
|
|||
elif test $(SYNTHESIS_SRC) != "no-synthesis-source"; then \
|
||||
cp -a $(SYNTHESIS_SRC)/* $(distdir)/synthesis && \
|
||||
for i in _build autom4te.cache; do [ ! -d "$(SYNTHESIS_SRC)/$$i" ] || chmod -R u+rwx "$(SYNTHESIS_SRC)/$$i"; done && \
|
||||
find "$(distdir)" -name .libs -o -name "*~" -o -name ".*" -o -name "*.o" -o -name "*.lo" -o -name CVS -o -name .svn -o -name .git -o -name autom4te.cache -print0 | xargs -0 rm -rf; \
|
||||
find "$(distdir)" -name .libs -o -name "*~" -o -name ".*" -o -name "*.o" -o -name "*.lo" -o -name CVS -o -name .svn -o -name .git -o -name .gitignore -o -name autom4te.cache -print0 | xargs -0 rm -rf; \
|
||||
fi
|
||||
|
||||
clean-local: testclean
|
||||
|
|
|
@ -31,6 +31,6 @@ AC_ARG_ENABLE(neon-compatibility,
|
|||
)
|
||||
if test "$enable_neon_compat" = "yes"; then
|
||||
AC_DEFINE(NEON_COMPATIBILITY, 1, [dynamically open libneon])
|
||||
NEON_LIBS="`echo $NEON_LIBS | sed -e 's/\(-lneon\|[^ ]*libneon.la\)/-ldl/'`"
|
||||
NEON_LIBS="`echo $NEON_LIBS | sed -e 's/\(-lneon\(-gnutls\)*\|[^ ]*libneon\(-gnutls\)*.la\)/-ldl/'`"
|
||||
fi
|
||||
AM_CONDITIONAL([NEON_COMPATIBILITY], [test "$enable_neon_compat" = "yes"])
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
EXTRA_DIST = configure-sub.in
|
||||
|
||||
if ENABLE_QT_DBUS
|
||||
|
||||
include $(top_srcdir)/m4-repo/autotroll.mk
|
||||
|
@ -22,8 +24,6 @@ nodist_libsyncevolution_qt_dbus_la_SOURCES = \
|
|||
|
||||
AM_CPPFLAGS = $(SYNCEVOLUTION_CFLAGS) -I$(top_srcdir)/test $(BACKEND_CPPFLAGS)
|
||||
|
||||
EXTRA_DIST = configure-sub.in
|
||||
|
||||
built_headers = \
|
||||
syncevo-server-full.h \
|
||||
syncevo-session-full.h \
|
||||
|
|
|
@ -446,6 +446,12 @@ use_clicked_cb (GtkButton *btn, SyncConfigWidget *self)
|
|||
_("Service must have a name and server URL"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (!username || strlen (username) == 0) {
|
||||
/* TRANSLATORS: error dialog when creating a new sync configuration */
|
||||
show_error_dialog (GTK_WIDGET (self), _("A username is required for this service"));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
syncevo_config_foreach_source (self->config,
|
||||
|
|
|
@ -1023,13 +1023,15 @@ class PresenceStatus {
|
|||
|
||||
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; }
|
||||
|
||||
private:
|
||||
void updatePresenceStatus (bool httpPresence, bool btPresence);
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -1047,9 +1049,9 @@ public:
|
|||
virtual DBusConnection *getConnection() const {return m_connmanConn.get();}
|
||||
|
||||
void propertyChanged(const string &name,
|
||||
const boost::variant<vector<string>, string> &prop);
|
||||
const boost::variant<std::string> &prop);
|
||||
|
||||
void getPropCb(const std::map <std::string, boost::variant <std::vector <std::string> > >& props, const string &error);
|
||||
void getPropCb(const std::map <std::string, boost::variant<std::string> >& props, const string &error);
|
||||
|
||||
/** TRUE if watching ConnMan status */
|
||||
bool isAvailable() { return m_connmanConn; }
|
||||
|
@ -1058,7 +1060,7 @@ private:
|
|||
DBusServer &m_server;
|
||||
DBusConnectionPtr m_connmanConn;
|
||||
|
||||
SignalWatch2 <string,boost::variant<vector<string>, string> > m_propertyChanged;
|
||||
SignalWatch2 <string, boost::variant<std::string> > m_propertyChanged;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -1539,7 +1541,7 @@ public:
|
|||
void autoTermCallback() { m_autoTerm.reset(); }
|
||||
|
||||
/** poll_nm callback for connman, used for presence detection*/
|
||||
void connmanCallback(const std::map <std::string, boost::variant <std::vector <std::string> > >& props, const string &error);
|
||||
void connmanCallback(const std::map <std::string, boost::variant<std::string> >& props, const string &error);
|
||||
|
||||
PresenceStatus& getPresenceStatus() {return m_presence;}
|
||||
|
||||
|
@ -5328,7 +5330,7 @@ ConnmanClient::ConnmanClient(DBusServer &server):
|
|||
const char *connmanTest = getenv ("DBUS_TEST_CONNMAN");
|
||||
m_connmanConn = b_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;
|
||||
typedef std::map <std::string, boost::variant<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));
|
||||
|
@ -5338,12 +5340,12 @@ ConnmanClient::ConnmanClient(DBusServer &server):
|
|||
}
|
||||
|
||||
void ConnmanClient::getPropCb (const std::map <std::string,
|
||||
boost::variant <std::vector <std::string> > >& props, const string &error){
|
||||
boost::variant<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);
|
||||
m_server.getPresenceStatus().updatePresenceStatus (true, PresenceStatus::HTTP_TRANSPORT);
|
||||
SE_LOG_DEBUG (NULL, NULL, "No connman service available %s", error.c_str());
|
||||
return;
|
||||
}
|
||||
|
@ -5351,65 +5353,28 @@ void ConnmanClient::getPropCb (const std::map <std::string,
|
|||
return;
|
||||
}
|
||||
|
||||
typedef std::pair <std::string, boost::variant <std::vector <std::string> > > element;
|
||||
bool httpPresence = false, btPresence = false;
|
||||
typedef std::pair <std::string, boost::variant<std::string> > element;
|
||||
bool httpPresence = 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;
|
||||
// just check online state, we don't care how about the underlying technology
|
||||
if (entry.first == "State") {
|
||||
std::string state = boost::get<std::string>(entry.second);
|
||||
httpPresence = state == "online";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//now delivering the signals
|
||||
m_server.getPresenceStatus().updatePresenceStatus (httpPresence, btPresence);
|
||||
m_server.getPresenceStatus().updatePresenceStatus (httpPresence, PresenceStatus::HTTP_TRANSPORT);
|
||||
}
|
||||
|
||||
void ConnmanClient::propertyChanged(const string &name,
|
||||
const boost::variant<vector<string>, string> &prop)
|
||||
const boost::variant<std::string> &prop)
|
||||
{
|
||||
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 {
|
||||
if (name == "State") {
|
||||
std::string state = boost::get<std::string>(prop);
|
||||
m_server.getPresenceStatus().updatePresenceStatus(state == "online",
|
||||
PresenceStatus::HTTP_TRANSPORT);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -5709,10 +5674,15 @@ DBusServer::DBusServer(GMainLoop *loop, const DBusConnectionPtr &conn, int durat
|
|||
LoggerBase::pushLogger(this);
|
||||
setLevel(LoggerBase::DEBUG);
|
||||
|
||||
// Assume that Bluetooth is available. Neither ConnMan nor Network
|
||||
// manager can tell us about that. The "Bluetooth" ConnMan technology
|
||||
// is about IP connection via Bluetooth - not what we need.
|
||||
getPresenceStatus().updatePresenceStatus(true, PresenceStatus::BT_TRANSPORT);
|
||||
|
||||
if (!m_connman.isAvailable() &&
|
||||
!m_networkManager.isAvailable()) {
|
||||
// assume that we are online if no network manager was found at all
|
||||
getPresenceStatus().updatePresenceStatus(true, true);
|
||||
getPresenceStatus().updatePresenceStatus(true, PresenceStatus::HTTP_TRANSPORT);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1289,10 +1289,16 @@ public:
|
|||
// @param excludeSource when non-empty, limit preparation to that source
|
||||
void syncPrepare(const string &excludeSource = "") {
|
||||
if (m_logdir.getLogfile().size() &&
|
||||
(m_client.getDumpData() || m_doLogging)) {
|
||||
m_doLogging &&
|
||||
(m_client.getDumpData() || m_client.getPrintChanges())) {
|
||||
// dump initial databases
|
||||
SE_LOG_INFO(NULL, NULL, "creating complete data backup before sync (%s)",
|
||||
(m_client.getDumpData() && m_client.getPrintChanges()) ? "enabled with dumpData and needed for printChanges" :
|
||||
m_client.getDumpData() ? "because it was enabled with dumpData" :
|
||||
m_client.getPrintChanges() ? "needed for printChanges" :
|
||||
"???");
|
||||
dumpDatabases("before", &SyncSourceReport::m_backupBefore, excludeSource);
|
||||
if (m_doLogging) {
|
||||
if (m_client.getPrintChanges()) {
|
||||
// compare against the old "after" database dump
|
||||
dumpLocalChanges("", "after", "before", excludeSource,
|
||||
StringPrintf("%s data changes to be applied during synchronization:\n",
|
||||
|
@ -1313,9 +1319,15 @@ public:
|
|||
// dump database after sync if explicitly enabled or
|
||||
// needed for comparison;
|
||||
// in the latter case only if dumping it at the beginning completed
|
||||
if (m_client.getDumpData() ||
|
||||
(m_doLogging && m_reportTodo && !m_prepared.empty())) {
|
||||
if (m_doLogging &&
|
||||
(m_client.getDumpData() ||
|
||||
(m_client.getPrintChanges() && m_reportTodo && !m_prepared.empty()))) {
|
||||
try {
|
||||
SE_LOG_INFO(NULL, NULL, "creating complete data backup after sync (%s)",
|
||||
(m_client.getDumpData() && m_client.getPrintChanges()) ? "enabled with dumpData and needed for printChanges" :
|
||||
m_client.getDumpData() ? "because it was enabled with dumpData" :
|
||||
m_client.getPrintChanges() ? "needed for printChanges" :
|
||||
"???");
|
||||
dumpDatabases("after", &SyncSourceReport::m_backupAfter);
|
||||
} catch (...) {
|
||||
Exception::handle();
|
||||
|
@ -1366,11 +1378,15 @@ public:
|
|||
}
|
||||
|
||||
// compare databases?
|
||||
dumpLocalChanges(m_logdir.getLogdir(),
|
||||
"before", "after", "",
|
||||
StringPrintf("\nData modified %s during synchronization:\n",
|
||||
m_client.isLocalSync() ? m_client.getContextName().c_str() : "locally"),
|
||||
"CLIENT_TEST_LEFT_NAME='before sync' CLIENT_TEST_RIGHT_NAME='after sync' CLIENT_TEST_REMOVED='removed during sync' CLIENT_TEST_ADDED='added during sync'");
|
||||
if (m_client.getPrintChanges()) {
|
||||
dumpLocalChanges(m_logdir.getLogdir(),
|
||||
"before", "after", "",
|
||||
StringPrintf("\nData modified %s during synchronization:\n",
|
||||
m_client.isLocalSync() ? m_client.getContextName().c_str() : "locally"),
|
||||
"CLIENT_TEST_LEFT_NAME='before sync' CLIENT_TEST_RIGHT_NAME='after sync' CLIENT_TEST_REMOVED='removed during sync' CLIENT_TEST_ADDED='added during sync'");
|
||||
}
|
||||
|
||||
// now remove some old logdirs
|
||||
m_logdir.expire();
|
||||
}
|
||||
}
|
||||
|
@ -3820,14 +3836,14 @@ void SyncContext::status()
|
|||
bool found = access(prevLogdir.c_str(), R_OK|X_OK) == 0;
|
||||
|
||||
if (found) {
|
||||
try {
|
||||
sourceList.setPath(prevLogdir);
|
||||
if (getPrintChanges() || getDumpData()) {
|
||||
if (!m_quiet && getPrintChanges()) {
|
||||
try {
|
||||
sourceList.setPath(prevLogdir);
|
||||
sourceList.dumpDatabases("current", NULL);
|
||||
sourceList.dumpLocalChanges("", "after", "current", "");
|
||||
} catch(...) {
|
||||
Exception::handle();
|
||||
}
|
||||
} catch(...) {
|
||||
Exception::handle();
|
||||
}
|
||||
} else {
|
||||
ostream &out = getOutput();
|
||||
|
@ -3952,10 +3968,8 @@ void SyncContext::restore(const string &dirname, RestoreDatabase database)
|
|||
source->open();
|
||||
}
|
||||
|
||||
if (!m_quiet || getDumpData()) {
|
||||
if (!m_quiet && getPrintChanges()) {
|
||||
sourceList.dumpDatabases("current", NULL);
|
||||
}
|
||||
if (!m_quiet) {
|
||||
sourceList.dumpLocalChanges(dirname, "current", datadump, "",
|
||||
"Data changes to be applied locally during restore:\n",
|
||||
"CLIENT_TEST_LEFT_NAME='current data' "
|
||||
|
|
|
@ -198,7 +198,7 @@ extern "C" void EDSAbiWrapperInit()
|
|||
|
||||
# ifdef ENABLE_EBOOK
|
||||
ebookhandle =
|
||||
findSymbols("libebook-1.2.so", 5, 10,
|
||||
findSymbols("libebook-1.2.so", 5, 12,
|
||||
FIND_SYMBOLS_NEED_ALL|FIND_SYMBOLS_LENIENT_MAX_VERSION, NULL,
|
||||
&EDSAbiWrapperSingleton.e_book_add_contact, "e_book_add_contact",
|
||||
&EDSAbiWrapperSingleton.e_book_authenticate_user, "e_book_authenticate_user",
|
||||
|
@ -232,7 +232,7 @@ extern "C" void EDSAbiWrapperInit()
|
|||
|
||||
# ifdef ENABLE_ECAL
|
||||
static const int libecalMinVersion = 3,
|
||||
libecalMaxVersion = 8;
|
||||
libecalMaxVersion = 10;
|
||||
ecalhandle =
|
||||
findSymbols("libecal-1.2.so", libecalMinVersion, libecalMaxVersion,
|
||||
FIND_SYMBOLS_NEED_ALL|FIND_SYMBOLS_LENIENT_MAX_VERSION, NULL,
|
||||
|
|
|
@ -25,6 +25,9 @@
|
|||
#include <list>
|
||||
#include <ostream>
|
||||
|
||||
// for size_t and ssize_t
|
||||
#include <unistd.h>
|
||||
|
||||
#include <syncevo/declarations.h>
|
||||
SE_BEGIN_CXX
|
||||
namespace LCS {
|
||||
|
|
|
@ -951,162 +951,158 @@ class TestDBusServerTerm(unittest.TestCase, DBusUtil):
|
|||
|
||||
|
||||
class Connman (dbus.service.Object):
|
||||
count = 0
|
||||
state = "online"
|
||||
getPropertiesCalled = False
|
||||
waitingForGetProperties = False
|
||||
|
||||
@dbus.service.method(dbus_interface='net.connman.Manager', in_signature='', out_signature='a{sv}')
|
||||
def GetProperties(self):
|
||||
self.count = self.count+1
|
||||
if (self.count == 1):
|
||||
# notify TestDBusServerPresence.setUp()?
|
||||
if self.waitingForGetProperties:
|
||||
loop.quit()
|
||||
return {"ConnectedTechnologies":["ethernet", "some other stuff"],
|
||||
"AvailableTechnologies": ["bluetooth"]}
|
||||
elif (self.count == 2):
|
||||
""" unplug the ethernet cable """
|
||||
loop.quit()
|
||||
return {"ConnectedTechnologies":["some other stuff"],
|
||||
"AvailableTechnologies": ["bluetooth"]}
|
||||
elif (self.count == 3):
|
||||
""" replug the ethernet cable """
|
||||
loop.quit()
|
||||
return {"ConnectedTechnologies":["ethernet", "some other stuff"],
|
||||
"AvailableTechnologies": ["bluetooth"]}
|
||||
elif (self.count == 4):
|
||||
""" nothing presence """
|
||||
loop.quit()
|
||||
return {"ConnectedTechnologies":[""],
|
||||
"AvailableTechnologies": [""]}
|
||||
elif (self.count == 5):
|
||||
""" come back the same time """
|
||||
loop.quit()
|
||||
return {"ConnectedTechnologies":["ethernet", "some other stuff"],
|
||||
"AvailableTechnologies": ["bluetooth"]}
|
||||
else:
|
||||
return {}
|
||||
self.getPropertiesCalled = True
|
||||
return { "State" : self.state }
|
||||
|
||||
@dbus.service.signal(dbus_interface='net.connman.Manager', signature='sv')
|
||||
def PropertyChanged(self, key, value):
|
||||
pass
|
||||
|
||||
def emitSignal(self):
|
||||
self.count = self.count+1
|
||||
if (self.count == 2):
|
||||
""" unplug the ethernet cable """
|
||||
self.PropertyChanged("ConnectedTechnologies",["some other stuff"])
|
||||
return
|
||||
elif (self.count == 3):
|
||||
""" replug the ethernet cable """
|
||||
self.PropertyChanged("ConnectedTechnologies", ["ethernet", "some other stuff"])
|
||||
return
|
||||
elif (self.count == 4):
|
||||
""" nothing presence """
|
||||
self.PropertyChanged("ConnectedTechnologies", [""])
|
||||
self.PropertyChanged("AvailableTechnologies", [""])
|
||||
return
|
||||
elif (self.count == 5):
|
||||
""" come back the same time """
|
||||
self.PropertyChanged("ConnectedTechnologies", ["ethernet", "some other stuff"])
|
||||
self.PropertyChanged("AvailableTechnologies", ["bluetooth"])
|
||||
return
|
||||
def setState(self, state):
|
||||
if self.state != state:
|
||||
self.state = state
|
||||
self.PropertyChanged("State", state)
|
||||
# race condition: it happened that method calls
|
||||
# reached syncevo-dbus-server before the state change,
|
||||
# thus breaking the test
|
||||
time.sleep(1)
|
||||
|
||||
def reset(self):
|
||||
self.count = 0
|
||||
self.state = "online"
|
||||
self.getPropertiesCalled = False
|
||||
self.waitingForGetProperties = False
|
||||
|
||||
class TestDBusServerPresence(unittest.TestCase, DBusUtil):
|
||||
"""Tests Presence signal and checkPresence API"""
|
||||
|
||||
# Our fake ConnMan implementation must be present on the
|
||||
# bus also outside of tests, because syncevo-dbus-server
|
||||
# will try to call it before setUp(). The implementation's
|
||||
# initialization and tearDown() below ensures that the state
|
||||
# is "online" outside of tests.
|
||||
name = dbus.service.BusName ("net.connman", bus);
|
||||
conn = Connman (bus, "/")
|
||||
|
||||
def setUp(self):
|
||||
self.conn = Connman (bus, "/")
|
||||
self.setUpServer()
|
||||
self.cbFailure = None
|
||||
# we don't know if the GetProperties() call was already
|
||||
# processed; if not, wait for it here
|
||||
if not self.conn.getPropertiesCalled:
|
||||
self.conn.waitingForGetProperties = True
|
||||
loop.run()
|
||||
|
||||
def tearDown(self):
|
||||
self.conn.remove_from_connection()
|
||||
self.conn.reset()
|
||||
self.conf = None
|
||||
|
||||
def presenceCB(self,
|
||||
server, status, transport,
|
||||
expected):
|
||||
try:
|
||||
state = expected.pop(server, None)
|
||||
if not state:
|
||||
self.fail("unexpected presence signal for config " + server)
|
||||
self.failUnlessEqual(status, state[0])
|
||||
if not status:
|
||||
self.failUnlessEqual(transport, state[1])
|
||||
except Exception, ex:
|
||||
# tell test method about the problem
|
||||
loop.quit()
|
||||
self.cbFailure = ex
|
||||
# log exception
|
||||
raise ex
|
||||
|
||||
if not expected:
|
||||
# got all expected signals
|
||||
loop.quit()
|
||||
|
||||
def expect(self, expected):
|
||||
'''expected: hash from server config name to state+transport'''
|
||||
match = bus.add_signal_receiver(lambda x,y,z:
|
||||
self.presenceCB(x,y,z, expected), \
|
||||
'Presence',
|
||||
'org.syncevolution.Server',
|
||||
self.server.bus_name,
|
||||
None,
|
||||
byte_arrays=True,
|
||||
utf8_strings=True)
|
||||
return match
|
||||
|
||||
@property("ENV", "DBUS_TEST_CONNMAN=session")
|
||||
@timeout(100)
|
||||
def testPresenceSignal(self):
|
||||
"""TestDBusServerPresence.testPresenceSignal - check Server.Presence signal"""
|
||||
self.conn.reset()
|
||||
self.setUpSession("foo")
|
||||
self.session.SetConfig(False, False, {"" : {"syncURL":
|
||||
"http://http-only-1"}})
|
||||
self.session.Detach()
|
||||
def cb_http_presence(server, status, transport):
|
||||
self.failUnlessEqual (status, "")
|
||||
self.failUnlessEqual (server, "foo")
|
||||
self.failUnlessEqual (transport, "http://http-only-1")
|
||||
loop.quit()
|
||||
|
||||
match = bus.add_signal_receiver(cb_http_presence,
|
||||
'Presence',
|
||||
'org.syncevolution.Server',
|
||||
self.server.bus_name,
|
||||
None,
|
||||
byte_arrays=True,
|
||||
utf8_strings=True)
|
||||
# creating a config does not trigger a Presence signal
|
||||
self.setUpSession("foo")
|
||||
self.session.SetConfig(False, False, {"" : {"syncURL": "http://http-only-1"}})
|
||||
self.session.Detach()
|
||||
|
||||
# go offline
|
||||
match = self.expect({"foo" : ("no transport", "")})
|
||||
self.conn.setState("idle")
|
||||
loop.run()
|
||||
time.sleep(1)
|
||||
self.failIf(self.cbFailure)
|
||||
match.remove()
|
||||
|
||||
# Changing the properties temporarily does change
|
||||
# the presence of the config although strictly speaking,
|
||||
# the presence of the config on disk hasn't changed.
|
||||
# Not sure whether we really want that behavior.
|
||||
match = self.expect({"foo" : ("", "obex-bt://temp-bluetooth-peer-changed-from-http")})
|
||||
self.setUpSession("foo")
|
||||
self.session.SetConfig(True, False, {"" : {"syncURL":
|
||||
"obex-bt://temp-bluetooth-peer-changed-from-http"}})
|
||||
def cb_bt_presence(server, status, transport):
|
||||
self.failUnlessEqual (status, "")
|
||||
self.failUnlessEqual (server, "foo")
|
||||
self.failUnlessEqual (transport,
|
||||
"obex-bt://temp-bluetooth-peer-changed-from-http")
|
||||
loop.quit()
|
||||
match.remove()
|
||||
match = bus.add_signal_receiver(cb_bt_presence,
|
||||
'Presence',
|
||||
'org.syncevolution.Server',
|
||||
self.server.bus_name,
|
||||
None,
|
||||
byte_arrays=True,
|
||||
utf8_strings=True)
|
||||
self.conn.emitSignal()
|
||||
# A ConnMan state change is needed to trigger the presence signal.
|
||||
# Definitely not the behavior that we want :-/
|
||||
self.conn.setState("failure")
|
||||
loop.run()
|
||||
time.sleep(1)
|
||||
self.failIf(self.cbFailure)
|
||||
match.remove()
|
||||
# remove temporary config change, back to using HTTP
|
||||
# BUG BMC #24648 in syncevo-dbus-server: after discarding the temporary
|
||||
# config change it keeps using the obex-bt syncURL.
|
||||
# Work around that bug in thus test here temporarily
|
||||
# by explicitly restoring the previous URL.
|
||||
self.session.SetConfig(True, False, {"" : {"syncURL": "http://http-only-1"}})
|
||||
self.session.Detach()
|
||||
|
||||
# create second session
|
||||
self.setUpSession("bar")
|
||||
self.session.SetConfig(False, False, {"" : {"syncURL":
|
||||
"http://http-client-2"}})
|
||||
self.session.Detach()
|
||||
self.foo = "random string"
|
||||
self.bar = "random string"
|
||||
match.remove()
|
||||
self.conn.emitSignal()
|
||||
self.conn.emitSignal()
|
||||
def cb_bt_http_presence(server, status, transport):
|
||||
if (server == "foo"):
|
||||
self.foo = status
|
||||
elif (server == "bar"):
|
||||
self.bar = status
|
||||
else:
|
||||
self.fail("wrong server config")
|
||||
loop.quit()
|
||||
|
||||
match = bus.add_signal_receiver(cb_bt_http_presence,
|
||||
'Presence',
|
||||
'org.syncevolution.Server',
|
||||
self.server.bus_name,
|
||||
None,
|
||||
byte_arrays=True,
|
||||
utf8_strings=True)
|
||||
#count=5, 2 signals recevied
|
||||
self.conn.emitSignal()
|
||||
# go back to online mode
|
||||
match = self.expect({"foo" : ("", "http://http-only-1"),
|
||||
"bar" : ("", "http://http-client-2")})
|
||||
self.conn.setState("online")
|
||||
loop.run()
|
||||
self.failIf(self.cbFailure)
|
||||
match.remove()
|
||||
|
||||
# and offline
|
||||
match = self.expect({"foo" : ("no transport", ""),
|
||||
"bar" : ("no transport", "")})
|
||||
self.conn.setState("idle")
|
||||
loop.run()
|
||||
time.sleep(1)
|
||||
self.failUnlessEqual (self.foo, "")
|
||||
self.failUnlessEqual (self.bar, "")
|
||||
self.failIf(self.cbFailure)
|
||||
match.remove()
|
||||
|
||||
@property("ENV", "DBUS_TEST_CONNMAN=session")
|
||||
@timeout(100)
|
||||
def testServerCheckPresence(self):
|
||||
"""TestDBusServerPresence.testServerCheckPresence - check Server.CheckPresence()"""
|
||||
self.conn.reset()
|
||||
self.setUpSession("foo")
|
||||
self.session.SetConfig(False, False, {"" : {"syncURL":
|
||||
"http://http-client"}})
|
||||
|
@ -1120,9 +1116,7 @@ class TestDBusServerPresence(unittest.TestCase, DBusUtil):
|
|||
"obex-bt://bt-client-mixed http://http-client-mixed"}})
|
||||
self.session.Detach()
|
||||
|
||||
#let dbus server get the first presence
|
||||
loop.run()
|
||||
time.sleep(1)
|
||||
# online initially
|
||||
(status, transports) = self.server.CheckPresence ("foo")
|
||||
self.failUnlessEqual (status, "")
|
||||
self.failUnlessEqual (transports, ["http://http-client"])
|
||||
|
@ -1134,9 +1128,17 @@ class TestDBusServerPresence(unittest.TestCase, DBusUtil):
|
|||
self.failUnlessEqual (transports, ["obex-bt://bt-client-mixed",
|
||||
"http://http-client-mixed"])
|
||||
|
||||
#count = 2
|
||||
self.conn.emitSignal()
|
||||
time.sleep(1)
|
||||
# go offline; Bluetooth remains on
|
||||
self.conn.setState("idle")
|
||||
# wait until server has seen the state change
|
||||
match = bus.add_signal_receiver(lambda x,y,z: loop.quit(),
|
||||
'Presence',
|
||||
'org.syncevolution.Server',
|
||||
self.server.bus_name,
|
||||
None,
|
||||
byte_arrays=True,
|
||||
utf8_strings=True)
|
||||
match.remove()
|
||||
(status, transports) = self.server.CheckPresence ("foo")
|
||||
self.failUnlessEqual (status, "no transport")
|
||||
(status, transports) = self.server.CheckPresence ("bar")
|
||||
|
@ -1150,22 +1152,67 @@ class TestDBusServerPresence(unittest.TestCase, DBusUtil):
|
|||
@timeout(100)
|
||||
def testSessionCheckPresence(self):
|
||||
"""TestDBusServerPresence.testSessionCheckPresence - check Session.CheckPresence()"""
|
||||
self.conn.reset()
|
||||
self.setUpSession("foobar")
|
||||
self.session.SetConfig(False, False, {"" : {"syncURL":
|
||||
"obex-bt://bt-client-mixed http://http-client-mixed"}})
|
||||
loop.run()
|
||||
time.sleep(1)
|
||||
status = self.session.checkPresence()
|
||||
self.failUnlessEqual (status, "")
|
||||
self.conn.emitSignal()
|
||||
self.conn.emitSignal()
|
||||
self.conn.emitSignal()
|
||||
#count = 4
|
||||
time.sleep(1)
|
||||
|
||||
# go offline; Bluetooth remains on
|
||||
self.conn.setState("idle")
|
||||
# wait until server has seen the state change
|
||||
match = bus.add_signal_receiver(lambda x,y,z: loop.quit(),
|
||||
'Presence',
|
||||
'org.syncevolution.Server',
|
||||
self.server.bus_name,
|
||||
None,
|
||||
byte_arrays=True,
|
||||
utf8_strings=True)
|
||||
match.remove()
|
||||
|
||||
# config uses Bluetooth, so syncing still possible
|
||||
status = self.session.checkPresence()
|
||||
self.failUnlessEqual (status, "")
|
||||
|
||||
# now the same without Bluetooth, while offline
|
||||
self.session.Detach()
|
||||
self.setUpSession("foo")
|
||||
self.session.SetConfig(False, False, {"" : {"syncURL": "http://http-only"}})
|
||||
status = self.session.checkPresence()
|
||||
self.failUnlessEqual (status, "no transport")
|
||||
|
||||
# go online
|
||||
self.conn.setState("online")
|
||||
# wait until server has seen the state change
|
||||
match = bus.add_signal_receiver(lambda x,y,z: loop.quit(),
|
||||
'Presence',
|
||||
'org.syncevolution.Server',
|
||||
self.server.bus_name,
|
||||
None,
|
||||
byte_arrays=True,
|
||||
utf8_strings=True)
|
||||
match.remove()
|
||||
status = self.session.checkPresence()
|
||||
self.failUnlessEqual (status, "")
|
||||
|
||||
# temporary config change shall always affect the
|
||||
# Session.CheckPresence() result: go offline,
|
||||
# then switch to Bluetooth (still present)
|
||||
self.conn.setState("idle")
|
||||
match = bus.add_signal_receiver(lambda x,y,z: loop.quit(),
|
||||
'Presence',
|
||||
'org.syncevolution.Server',
|
||||
self.server.bus_name,
|
||||
None,
|
||||
byte_arrays=True,
|
||||
utf8_strings=True)
|
||||
match.remove()
|
||||
status = self.session.checkPresence()
|
||||
self.failUnlessEqual (status, "no transport")
|
||||
self.session.SetConfig(True, False, {"" : {"syncURL": "obex-bt://bt-client-mixed"}})
|
||||
status = self.session.checkPresence()
|
||||
self.failUnlessEqual (status, "")
|
||||
|
||||
def run(self, result):
|
||||
self.runTest(result, True)
|
||||
|
||||
|
|
Loading…
Reference in a new issue