diff --git a/.gitignore b/.gitignore
index 19fe61e82..c180c90cb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,7 +2,6 @@
*build*/
*flymake*
CMakeLists.txt.user*
-*.patch
*~
*.autosave
doc/_build/*
diff --git a/CMakeLists.txt b/CMakeLists.txt
index fcde73357..a0417c743 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -9,6 +9,13 @@ if ( EXISTS ${OEM_THEME_DIR}/OEM.cmake )
else ()
include ( ${CMAKE_SOURCE_DIR}/OWNCLOUD.cmake )
endif()
+# need this logic to not mess with re/uninstallations via macosx.pkgproj
+if(${APPLICATION_REV_DOMAIN} STREQUAL "com.owncloud.desktopclient")
+ set(APPLICATION_REV_DOMAIN_INSTALLER "com.ownCloud.client")
+else()
+ set(APPLICATION_REV_DOMAIN_INSTALLER ${APPLICATION_REV_DOMAIN})
+endif()
+
if (NOT DEFINED APPLICATION_SHORTNAME)
set ( APPLICATION_SHORTNAME ${APPLICATION_NAME} )
@@ -166,9 +173,11 @@ set(TRANSLATIONS ${TRANS_FILES})
add_subdirectory(csync)
add_subdirectory(src)
+if(NOT BUILD_LIBRARIES_ONLY)
add_subdirectory(shell_integration)
add_subdirectory(doc)
add_subdirectory(admin)
+endif(NOT BUILD_LIBRARIES_ONLY)
if(UNIT_TESTING)
include(CTest)
diff --git a/README.md b/README.md
index c22cc81f9..21570f972 100644
--- a/README.md
+++ b/README.md
@@ -21,8 +21,7 @@ https://github.com/owncloud/client.
## Building the source code
-Please refer to doc/building.rst, or
-[Building the Client](http://doc.owncloud.org/desktop/1.5/building.html)
+[Building the Client](http://doc.owncloud.org/desktop/1.7/building.html)
in the ownCloud Desktop Client manual.
## Maintainers and Contributors
diff --git a/admin/osx/macosx.pkgproj b/admin/osx/macosx.pkgproj
index 460b9d87a..516f0c39f 100644
--- a/admin/osx/macosx.pkgproj
+++ b/admin/osx/macosx.pkgproj
@@ -485,9 +485,9 @@
CONCLUSION_ACTION
0
IDENTIFIER
- com.ownCloud.client
+ @APPLICATION_REV_DOMAIN_INSTALLER@
NAME
- ownCloud Client
+ @APPLICATION_NAME@
OVERWRITE_PERMISSIONS
VERSION
@@ -1213,7 +1213,7 @@
LANGUAGE
English
VALUE
- ownCloud Client
+ @APPLICATION_NAME@ Client
@@ -1413,7 +1413,7 @@
NAME
- ownCloud Installer
+ @APPLICATION_NAME@ Installer
REFERENCE_FOLDER_PATH
@CMAKE_INSTALL_DIR@
diff --git a/admin/win/nsi/l10n/Portuguese.nsh b/admin/win/nsi/l10n/Portuguese.nsh
index c39c93d52..4c7dd69b9 100644
--- a/admin/win/nsi/l10n/Portuguese.nsh
+++ b/admin/win/nsi/l10n/Portuguese.nsh
@@ -1,14 +1,14 @@
# Auto-generated - do not modify
-StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Mostrar notas de lançamento"
-StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Encontrados processos ${APPLICATION_EXECUTABLE} que precisam de ser parados.$\nDeseja que o instalador os pare ?"
+StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Ver notas de lançamento"
+StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Processos(s) ${APPLICATION_EXECUTABLE} em execução. Estes processos precisam de ser interrompidos.$\\nDeseja que o instalador os termine automaticamente?"
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "A terminar processos ${APPLICATION_EXECUTABLE}."
-StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Processo para terminar não foi encontrado!"
-StrCpy $PageReinstall_NEW_Field_1 "Está instalada uma versão anterior de ${APPLICATION_NAME} no seu sistema. Recomenda-se que desinstale primeiro a versão atual antes de instalar. Selecione a operação que pretende fazer, e clique Seguinte para continuar."
+StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Processo a terminar não encontrado!"
+StrCpy $PageReinstall_NEW_Field_1 "Uma versão antiga de ${APPLICATION_NAME} está instalada no sistema. É recomendado que você desinstale a versão atual antes de instalar. Selecione a operação que deseja executar e clique em $\"Avançar$\" para continuar."
StrCpy $PageReinstall_NEW_Field_2 "Desinstalar antes de instalar"
-StrCpy $PageReinstall_NEW_Field_3 "Não desinstalar"
+StrCpy $PageReinstall_NEW_Field_3 "Não desinstale"
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Já instalado"
StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Escolha como pretende instalar ${APPLICATION_NAME}."
-StrCpy $PageReinstall_OLD_Field_1 "Já esta instalada uma nova versão dfe ${APPLICATION_NAME}! Não se recomenda instalar uma versão anterior. Se quer mesmo instalar esta versão mais antiga, é melhor desinstalar primeiro a versão atual. Selecione a operação que pretende fazer e clique Seguinte para continuar."
+StrCpy $PageReinstall_OLD_Field_1 "Uma versão mais recente do ${APPLICATION_NAME} já está instalada! Não é recomendada a instalação de uma versão mais antiga. Se realmente deseja instalar esta versão, aconselha-se a desinstalação da versão atual primeiro. Selecione a operação que deseja executar e clique em Avançar para continuar."
StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} já está instalado.\nSelecione a operação que deseja fazer, e clique Seguinte para continuar."
StrCpy $PageReinstall_SAME_Field_2 "Adicionar/Reinstalar Componentes"
StrCpy $PageReinstall_SAME_Field_3 "Desinstalar ${APPLICATION_NAME}"
@@ -40,7 +40,7 @@ StrCpy $INIT_NO_QUICK_LAUNCH "Atalho de Início Rápido (N/A)"
StrCpy $INIT_NO_DESKTOP "Atalho do Ambiente de Trabalho (sobrepõe o existente)"
StrCpy $UAC_ERROR_ELEVATE "Incapaz de elevar, erro:"
StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Este instalador precisa de permissões de administrador, tente novamente"
-StrCpy $INIT_INSTALLER_RUNNING "O instalador já está a correr."
-StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Este desinstalador precisa de acesso de administrador; tente novamente"
-StrCpy $INIT_UNINSTALLER_RUNNING "O desinstalador já está a correr."
+StrCpy $INIT_INSTALLER_RUNNING "O instalador já está em execução."
+StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Este desinstalador requer permissões de administrador, tente novamente"
+StrCpy $INIT_UNINSTALLER_RUNNING "O desinstalador já está em execução."
StrCpy $SectionGroup_Shortcuts "Atalhos"
diff --git a/cmake/modules/AddAppIconMacro.cmake b/cmake/modules/AddAppIconMacro.cmake
index 9a223e0ea..3106b1bfa 100644
--- a/cmake/modules/AddAppIconMacro.cmake
+++ b/cmake/modules/AddAppIconMacro.cmake
@@ -1,4 +1,4 @@
-SET(WINDRES_EXECUTABLE ${CMAKE_RC_COMPILER})
+SET(WINDRES_EXECUTABLE_BASE ${CMAKE_RC_COMPILER})
# This macro is taken from kdelibs/cmake/modules/KDE4Macros.cmake.
#
@@ -21,7 +21,7 @@ macro (KDE4_ADD_APP_ICON appsources pattern)
else(NOT WINCE)
find_program(PNG2ICO_EXECUTABLE NAMES png2ico PATHS ${HOST_BINDIR} NO_DEFAULT_PATH )
endif(NOT WINCE)
- find_program(WINDRES_EXECUTABLE NAMES windres)
+ find_program(WINDRES_EXECUTABLE NAMES ${WINDRES_EXECUTABLE_BASE})
if(MSVC)
set(WINDRES_EXECUTABLE TRUE)
endif(MSVC)
diff --git a/csync/src/csync_update.c b/csync/src/csync_update.c
index 2934d71ab..b7eff2bac 100644
--- a/csync/src/csync_update.c
+++ b/csync/src/csync_update.c
@@ -29,6 +29,7 @@
#include
#include
#include
+#include
#include "c_lib.h"
#include "c_jhash.h"
@@ -266,7 +267,10 @@ static int _csync_detect_update(CSYNC *ctx, const char *file,
goto out;
}
if((ctx->current == REMOTE_REPLICA && !c_streq(fs->etag, tmp->etag ))
- || (ctx->current == LOCAL_REPLICA && (fs->mtime != tmp->modtime
+ || (ctx->current == LOCAL_REPLICA && ((fs->mtime != tmp->modtime
+ /* Ignore when there is exactly one hour difference because of summer time switches */
+ && (int64_t)difftime(fs->mtime, tmp->modtime) != 3600
+ && (int64_t)difftime(fs->mtime, tmp->modtime) != -3600)
// zero size in statedb can happen during migration
|| (tmp->size != 0 && fs->size != tmp->size)
#if 0
diff --git a/csync/src/httpbf/src/httpbf.c b/csync/src/httpbf/src/httpbf.c
index 40080240e..3c5f2107d 100644
--- a/csync/src/httpbf/src/httpbf.c
+++ b/csync/src/httpbf/src/httpbf.c
@@ -503,6 +503,8 @@ Hbf_State hbf_transfer( ne_session *session, hbf_transfer_t *transfer, const cha
if( transfer->block_cnt > 1 ) {
ne_add_request_header(req, "OC-Chunked", "1");
+ snprintf(buf, sizeof(buf), "%"PRId64, transfer->threshold);
+ ne_add_request_header(req, "OC-Chunk-Size", buf);
}
ne_add_request_header( req, "Content-Type", "application/octet-stream");
diff --git a/csync/tests/ownCloud/t8.pl b/csync/tests/ownCloud/t8.pl
index 4851f75d6..1a0557d7f 100755
--- a/csync/tests/ownCloud/t8.pl
+++ b/csync/tests/ownCloud/t8.pl
@@ -127,10 +127,9 @@ glob_put( "$tmpdir2/*", "parallel" );
csync();
-# We assume the smaller file finished first, blocking
-# the second file from being saved.
-assert( !-e localDir() . 'parallel/FILE.dat' );
-assert( -e localDir() . 'parallel/file.dat' );
+# only one file must exist
+assert( (!-e localDir() . 'parallel/FILE.dat' ) or (!-e localDir() . 'parallel/file.dat') );
+assert( (-e localDir() . 'parallel/FILE.dat' ) or (-e localDir() . 'parallel/file.dat') );
cleanup();
system("rm -r " . $tmpdir);
diff --git a/doc/images/icon-error.png b/doc/images/icon-error.png
new file mode 100644
index 000000000..6eb5e3e40
Binary files /dev/null and b/doc/images/icon-error.png differ
diff --git a/doc/images/icon-information.png b/doc/images/icon-information.png
new file mode 100644
index 000000000..f1ce1eb62
Binary files /dev/null and b/doc/images/icon-information.png differ
diff --git a/doc/images/icon-offline.png b/doc/images/icon-offline.png
new file mode 100644
index 000000000..40a4c7882
Binary files /dev/null and b/doc/images/icon-offline.png differ
diff --git a/doc/images/icon-paused.png b/doc/images/icon-paused.png
new file mode 100644
index 000000000..eada780f9
Binary files /dev/null and b/doc/images/icon-paused.png differ
diff --git a/doc/images/icon-syncing.png b/doc/images/icon-syncing.png
new file mode 100644
index 000000000..4b0f2515d
Binary files /dev/null and b/doc/images/icon-syncing.png differ
diff --git a/doc/images/icon.png b/doc/images/icon.png
index 28dee23cc..29888b6cf 100644
Binary files a/doc/images/icon.png and b/doc/images/icon.png differ
diff --git a/doc/navigating.rst b/doc/navigating.rst
index 9e6bfeca9..6fa12b225 100644
--- a/doc/navigating.rst
+++ b/doc/navigating.rst
@@ -9,7 +9,35 @@ system tray (Windows, KDE), status bar (MAC OS X), or notification area
.. image:: images/icon.png
-**ownCloud Desktop Client icon**
+This is a status indicator which uses overlay icons to indicate the
+current status of your synchronization. The green circle with the white checkmark
+tells you that your synchronization is current and you are connected to your
+ownCloud server.
+
+.. image:: images/icon-syncing.png
+
+The blue icon with the white semi-circles means synchronization is in progress.
+
+.. image:: images/icon-paused.png
+
+The yellow overlay icon with the parallel lines tells you your synchronization
+has been paused. (Most likely by you, by opening the client and clicking
+Account > Pause.)
+
+.. image:: images/icon-offline.png
+
+The gray icon with three white dots means your sync client has lost its
+connection with your ownCloud server.
+
+.. image:: images/icon-information.png
+
+When you see a white circle with the letter "i" that is the informational icon,
+so you should click it to see what it has to tell you.
+
+.. image:: images/icon-error.png
+
+The red circle with the white "x" indicates a configuration error, such as an
+incorrect login or server URL.
Using the Desktop Client Menu
-----------------------------
@@ -24,10 +52,17 @@ following menu:
The Desktop Client menu provides the following options:
* ``Open ownCloud in browser``: Launches the ownCloud WEB interface.
-* ``Open folder 'ownCloud'``: Opens the ownCloud local folder. If you have defined multiple synchronization targets, the window displays each local folder.
-* **Disk space indicator**: Indicates the amount of space currently used on the server.
-* Operation indicator: Displays the status of the current synchronization process or indicates ``Up to date`` if the server and client are in sync.
-* **Recent Changes**: Displays the last six files modified by the synchronization operations and provides access to the current synchronization status listing all changes since the last restart of the ownCloud client.
+* ``Open folder 'ownCloud'``: Opens the ownCloud local folder. If you have
+ defined multiple synchronization targets, the window displays each local
+ folder.
+* **Disk space indicator**: Indicates the amount of space currently used on the
+ server.
+* Operation indicator: Displays the status of the current synchronization
+ process or indicates ``Up to date`` if the server and client are in sync.
+* **Recent Changes**: Displays the last six files modified by the
+ synchronization operations and provides access to the current
+ synchronization status listing all changes since the last restart of the
+ ownCloud client.
* ``Settings...``: Provides access to the settings menu.
* ``Help``: Opens a browser to display ownCloud Desktop Client Guide.
* ``Sign out``: Disables the client from continued synchronizations.
@@ -39,7 +74,9 @@ Using the Account Settings Window
.. index:: account settings, user, password, Server URL
-The ``Account`` window provides a summary for general settings associated with the ownCloud account. This window enalbes you to manage any synchronized folders in the account and enables you to modify them.
+The ``Account`` window provides a summary for general settings associated with
+the ownCloud account. This window enalbes you to manage any synchronized
+folders in the account and enables you to modify them.
To access and modify the account settings:
@@ -48,25 +85,37 @@ To access and modify the account settings:
The fields and options in this window include:
-* ``Connected to as `` field: Indicates the ownCloud server to which the client is synchronizing and the user account on that server.
+* ``Connected to as `` field: Indicates the ownCloud
+ server to which the client is synchronizing and the user account on that
+ server.
-* ``Add Folder...`` button: Provides the ability to add another folder to the synchronization process (see ``Adding a Folder``).
+* ``Add Folder...`` button: Provides the ability to add another folder to the
+ synchronization process (see ``Adding a Folder``).
-* ``Pause/Resume`` button: Pauses the current sync (or prevents the client from starting a new sync) or resumes the sync process.
+* ``Pause/Resume`` button: Pauses the current sync (or prevents the client from
+ starting a new sync) or resumes the sync process.
-* ``Remove`` button: Removes the selected folder from the sync process. This button is used when you want to synchronize only a few folders and not the root folder. If only the root folder is available, you must first remove the root from the synchronization and then add individual folders that you want to synchronize as desired.
+* ``Remove`` button: Removes the selected folder from the sync process. This
+ button is used when you want to synchronize only a few folders and not the
+ root folder. If only the root folder is available, you must first remove the
+ root from the synchronization and then add individual folders that you want
+ to synchronize as desired.
-* ``Storage Usage`` field: Indicates the storage utilization on the ownCloud server.
+* ``Storage Usage`` field: Indicates the storage utilization on the ownCloud
+ server.
* ``Edit Ignored Files`` button: Launches the Ignored Files Editor.
-* ``Modify Account`` button: Enables you to change the ownCloud server to which you are synchronizing. This option launches the ``Setting up an Account`` windows (See ??).
+* ``Modify Account`` button: Enables you to change the ownCloud server to which
+ you are synchronizing. This option launches the ``Setting up an Account``
+ dialog (see :doc:`accountsetup`).
Adding a Folder
^^^^^^^^^^^^^^^
-The ``Add a Folder ...`` button enables you to add a new folder to the syncrhonization process.
+The ``Add a Folder ...`` button enables you to add a new folder to the
+syncrhonization process.
To add a new folder:
@@ -74,37 +123,35 @@ To add a new folder:
The ``Add Folder...`` window opens
- .. image:: images/folderwizard_local.png
- :scale: 50 %
+.. image:: images/folderwizard_local.png
- **``Add Folder...`` window (local folder)**
+2. Specify a *unique* path and alias name to the folder or use the ``Choose...``
+ button to locate the new folder on your system to which you want to
+ synchronize.
-2. Specify a *unique* path and alias name to the folder or use the ``Choose...`` button to locate the new folder on your system to which you want to synchronize.
-
- ..note:: Nested synchronizations are not supported. In other words, you
+.. note:: Nested synchronizations are not supported. In other words, you
cannot add a folder that is already contained within another synchronized
folder. In addition, you cannot add a higher level (parent) folder that
contains a folder to which you are already synchronizing. By default, the
ownCloud Set Up Wizard syncrhonizes your entire ownCloud account to the root
- folder of the ownCloud server. Due to this default setup, you must first remove
- the top-level folder prior to specifying new synchronizations.
+ folder of the ownCloud server. Due to this default setup, you must first
+ remove the top-level folder prior to specifying new synchronizations.
3. Click 'Next' to continue.
A window opens prompting you to select a remote destination folder on the
ownCloud server to which you want to synchronize.
- .. image:: images/folderwizard_remote.png
- :scale: 50 %
+.. image:: images/folderwizard_remote.png
- **``Add Folder...`` window (remote destination)**
+4. Select a folder on the ownCloud server to which you want to synchronize your
+newly added folder.
-4. Select a folder on the ownCloud server to which you want to synchronize your newly added folder.
-
- ..note:: A server folder can only be synchronized with a particular client once.
- If you attempt to sync the root directory, you cannot sync with other folders
- on the server. Similarly, if you sync with folder ``/a``, you cannot create
- another sync with ``/a/b``, since ``b`` is already being synched.
+..note:: A server folder can only be synchronized with a particular client
+ once. If you attempt to sync the root directory, you cannot sync with
+ other folders on the server. Similarly, if you sync with folder ``/a``, you
+ cannot create another sync with ``/a/b``, since ``b`` is already being
+ synched.
Editing Ignored Files
^^^^^^^^^^^^^^^^^^^^^
@@ -117,7 +164,8 @@ In addition to using standard characters, the Ignored Files Editor enables you
to use wild cards (for example, using an asterisk ‘*’ to indicate multiple
characters or a question mark ‘?’ to incidate a single character).
-For additional information about this editor, see `Using the Ignored Files Editor`_
+For additional information about this editor, see `Using the Ignored Files
+Editor`_
Using the Activity Settings Window
----------------------------------
@@ -131,9 +179,6 @@ manner due to containing special characters that cannot be stored on certain
file systems.
.. image:: images/settings_activity.png
- :scale: 50 %
-
- **Activity settings window**
You can open the Activity window in one of the following ways:
@@ -152,9 +197,6 @@ ownCloud Desktop Client and provides information about the software version,
its creator, and the existance of any updates.
.. image:: images/settings_general.png
- :scale: 50 %
-
- **General settings window**
The settings and information contained in this window are as follows:
@@ -170,12 +212,13 @@ The settings and information contained in this window are as follows:
* ``Use Monochrome Icons`` checkbox: Provides the option to check (enable) or
uncheck (disable) the use of monochrome (visually less obtrusive) icons.
- .. note:: This option can be useful on MAC OSX platforms.
+.. note:: This option can be useful on MAC OSX platforms.
* ``About`` field: Provides information about the software authors along with
pertinent build conditions.
- .. note:: Information in this field can be valuable when submitting a support request.
+.. note:: Information in this field can be valuable when submitting a support
+ request.
* ``Updates`` field: Provides information about any available updates for the
ownCloud Desktop Client.
@@ -190,9 +233,6 @@ well as limit the download and upload bandwidth utilization of file
synchronizations.
.. image:: images/settings_network.png
- :scale: 50 %
-
- **Network settings window**
Specifying Proxy Settings
^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -202,20 +242,27 @@ that functions as an intermediary contact for requests from clients that are
seeking resources from other servers. For the ownCloud Desktop Client, you can
define the following proxy settings:
-* ``No Proxy`` option: Specifies that the ownCloud Client circumvent the default proxy configured on the system.
+* ``No Proxy`` option: Specifies that the ownCloud Client circumvent the default
+ proxy configured on the system.
* ``Use system proxy`` option: Default setting. Follows the systems proxy
settings. On Linux systems, this setting uses the value of the variable
``http_proxy``.
* ``Specify proxy manually as`` option: Enables you to specify
the following custom proxy settings:
- - ``HTTP(S)``: Used when you are required to use an HTTP(S) proxy server (for example, Squid or Microsoft Forefront TMG).
- - ``SOCKSv5``: Typically used in special company LAN setups, or in combination with the OpenSSH
+ - ``HTTP(S)``: Used when you are required to use an HTTP(S) proxy server (for
+ example, Squid or Microsoft Forefront TMG).
+ - ``SOCKSv5``: Typically used in special company LAN setups, or in combination
+ with the OpenSSH
dynamic application level forwarding feature (see ``ssh -D``).
- - ``Host``: Host name or IP address of the proxy server along with the port number. HTTP proxies
- typically listen over Ports 8080 (default) or 3128. SOCKS servers typically listen over port 1080.
-* ``Proxy Server requires authentication`` checkbox: Provides the option to check (enable/require) or
- uncheck (disable/not require) proxy server authentication. When not checked, the proxy server must
- be configured to allow anonymous usage. When checked, a proxy server username and password is required.
+ - ``Host``: Host name or IP address of the proxy server along with the port
+ number. HTTP proxies typically listen over Ports 8080 (default) or 3128.
+ SOCKS servers typically listen over port 1080.
+* ``Proxy Server requires authentication`` checkbox: Provides the option to
+ check (enable/require) or
+ uncheck (disable/not require) proxy server authentication. When not checked,
+ the proxy server must
+ be configured to allow anonymous usage. When checked, a proxy server username
+ and password is required.
Bandwidth Limiting
^^^^^^^^^^^^^^^^^^
@@ -265,13 +312,10 @@ can use the *Ignored Files Editor* that is embedded in the ownCloud Desktop
Client.
.. image:: images/ignored_files_editor.png
- :scale: 50%
- Ignored Files Editor window
-
-The :guilabel:`Ignored Files Editor` enables you to define customized patterns that the
-ownCloud Client uses to identify files and directories that you want to exclude
-from the synchronization process. For your convenience, the editor is
+The ``Ignored Files Editor`` enables you to define customized patterns
+that the ownCloud Client uses to identify files and directories that you want
+to exclude from the synchronization process. For your convenience, the editor is
pre-populated with a default list of typically ignore patterns. These patterns
are contained in a system file (typically ``sync-exclude.lst``) located in the
ownCloud Client application directory. You cannot modify these pre-populated
diff --git a/issue_template.md b/issue_template.md
index b11453867..c36b35bd1 100644
--- a/issue_template.md
+++ b/issue_template.md
@@ -39,6 +39,8 @@ logs.
```Template for output < 10 lines```
1. Output of `owncloud --logwindow` or `owncloud --logfile log.txt`
+(On Windows using `cmd.exe`, you might need to first `cd` into the ownCloud directory)
+(See also http://doc.owncloud.org/desktop/1.5/troubleshooting.html#client-logfile )
2. Web server error log:
diff --git a/mirall.qrc b/mirall.qrc
index afd9dce94..e4787ad2d 100644
--- a/mirall.qrc
+++ b/mirall.qrc
@@ -13,7 +13,8 @@
resources/settings.png
resources/activity.png
resources/network.png
- resources/lock-http.png
- resources/lock-https.png
+ resources/lock-http.png
+ resources/lock-https.png
+ resources/accounts.png
diff --git a/resources/accounts.png b/resources/accounts.png
new file mode 100644
index 000000000..ea983a2a4
Binary files /dev/null and b/resources/accounts.png differ
diff --git a/shell_integration/dolphin/0001-KOverlayIconPlugin.patch b/shell_integration/dolphin/0001-KOverlayIconPlugin.patch
new file mode 100644
index 000000000..25f9ceeea
--- /dev/null
+++ b/shell_integration/dolphin/0001-KOverlayIconPlugin.patch
@@ -0,0 +1,256 @@
+From 3a26dc77f8e988ea99b23c4d5a2c831ecc31c920 Mon Sep 17 00:00:00 2001
+From: Olivier Goffart
+Date: Thu, 17 Jul 2014 13:26:56 +0200
+Subject: [PATCH] WIP: add KOverlayIconPlugin
+
+---
+ .../src/kitemviews/kfileitemmodelrolesupdater.cpp | 35 ++++++++++++-
+ .../src/kitemviews/kfileitemmodelrolesupdater.h | 9 ++++
+ lib/konq/CMakeLists.txt | 4 +-
+ lib/konq/koverlayiconplugin.cpp | 30 ++++++++++++
+ lib/konq/koverlayiconplugin.desktop | 4 ++
+ lib/konq/koverlayiconplugin.h | 57 ++++++++++++++++++++++
+ 6 files changed, 137 insertions(+), 2 deletions(-)
+ create mode 100644 lib/konq/koverlayiconplugin.cpp
+ create mode 100644 lib/konq/koverlayiconplugin.desktop
+ create mode 100644 lib/konq/koverlayiconplugin.h
+
+diff --git a/dolphin/src/kitemviews/kfileitemmodelrolesupdater.cpp b/dolphin/src/kitemviews/kfileitemmodelrolesupdater.cpp
+index 0865d40..840a65d 100644
+--- a/dolphin/src/kitemviews/kfileitemmodelrolesupdater.cpp
++++ b/dolphin/src/kitemviews/kfileitemmodelrolesupdater.cpp
+@@ -28,9 +28,11 @@
+ #include
+ #include
+ #include
++#include
+
+ #include "private/kpixmapmodifier.h"
+ #include "private/kdirectorycontentscounter.h"
++#include
+
+ #include
+ #include
+@@ -129,6 +131,17 @@ KFileItemModelRolesUpdater::KFileItemModelRolesUpdater(KFileItemModel* model, QO
+ m_directoryContentsCounter = new KDirectoryContentsCounter(m_model, this);
+ connect(m_directoryContentsCounter, SIGNAL(result(QString,int)),
+ this, SLOT(slotDirectoryContentsCountReceived(QString,int)));
++
++
++ const KService::List pluginServices = KServiceTypeTrader::self()->query("KOverlayIconPlugin");
++
++ for (KService::List::ConstIterator it = pluginServices.constBegin(); it != pluginServices.constEnd(); ++it) {
++ KOverlayIconPlugin* plugin = (*it)->createInstance(this);
++ if (plugin) {
++ m_overlayIconsPlugin.append(plugin);
++ connect(plugin, SIGNAL(overlaysChanged(KUrl,QStringList)), this, SLOT(slotOverlaysChanged(KUrl,QStringList)));
++ }
++ }
+ }
+
+ KFileItemModelRolesUpdater::~KFileItemModelRolesUpdater()
+@@ -1075,7 +1088,11 @@ QHash KFileItemModelRolesUpdater::rolesData(const KFileIte
+ data.insert("type", item.mimeComment());
+ }
+
+- data.insert("iconOverlays", item.overlays());
++ QStringList overlays = item.overlays();
++ foreach(KOverlayIconPlugin *it, m_overlayIconsPlugin) {
++ overlays.append(it->getOverlays(item));
++ }
++ data.insert("iconOverlays", overlays);
+
+ #ifdef HAVE_BALOO
+ if (m_balooFileMonitor) {
+@@ -1086,6 +1103,22 @@ QHash KFileItemModelRolesUpdater::rolesData(const KFileIte
+ return data;
+ }
+
++void KFileItemModelRolesUpdater::slotOverlaysChanged(const KUrl& url, const QStringList &)
++{
++ KFileItem item = m_model->fileItem(url);
++ if (item.isNull())
++ return;
++ int index = m_model->index(item);
++ QHash data = m_model->data(index);
++ QStringList overlays = item.overlays();
++ foreach(KOverlayIconPlugin *it, m_overlayIconsPlugin) {
++ overlays.append(it->getOverlays(item));
++ }
++ data.insert("iconOverlays", overlays);
++ m_model->setData(index, data);
++}
++
++
+ void KFileItemModelRolesUpdater::updateAllPreviews()
+ {
+ if (m_state == Paused) {
+diff --git a/dolphin/src/kitemviews/kfileitemmodelrolesupdater.h b/dolphin/src/kitemviews/kfileitemmodelrolesupdater.h
+index a9e979a..6d3add0 100644
+--- a/dolphin/src/kitemviews/kfileitemmodelrolesupdater.h
++++ b/dolphin/src/kitemviews/kfileitemmodelrolesupdater.h
+@@ -32,6 +32,7 @@
+ #include
+ #include
+
++class KOverlayIconPlugin;
+ class KDirectoryContentsCounter;
+ class KFileItemModel;
+ class KJob;
+@@ -180,6 +181,12 @@ private slots:
+ void slotPreviewJobFinished();
+
+ /**
++ * Is invoked when one of the KOverlayIconPlugin emit the signal that an overlay has changed
++ */
++ void slotOverlaysChanged(const KUrl&, const QStringList&);
++
++
++ /**
+ * Resolves the sort role of the next item in m_pendingSortRole, applies it
+ * to the model, and invokes itself if there are any pending items left. If
+ * that is not the case, \a startUpdating() is called.
+@@ -331,6 +338,8 @@ private:
+
+ KDirectoryContentsCounter* m_directoryContentsCounter;
+
++ QList m_overlayIconsPlugin;
++
+ #ifdef HAVE_BALOO
+ Baloo::FileMonitor* m_balooFileMonitor;
+ #endif
+diff --git a/lib/konq/CMakeLists.txt b/lib/konq/CMakeLists.txt
+index 8ecbfa9..7381caf 100644
+--- a/lib/konq/CMakeLists.txt
++++ b/lib/konq/CMakeLists.txt
+@@ -22,6 +22,7 @@ set(konq_LIB_SRCS
+ konq_historyprovider.cpp
+ kversioncontrolplugin.cpp # used by dolphin and its version control plugins (deprecated)
+ kversioncontrolplugin2.cpp # used by dolphin and its version control plugins
++ koverlayiconplugin.cpp
+
+ konq_nameandurlinputdialog.cpp # deprecated (functionality has moved to kdelibs)
+ knewmenu.cpp # deprecated (functionality has moved to kdelibs)
+@@ -67,8 +68,9 @@ install( FILES
+ konq_fileitemcapabilities.h
+ kversioncontrolplugin.h
+ kversioncontrolplugin2.h
++ koverlayiconplugin.h
+ konq_historyprovider.h
+ konq_historyentry.h
+ DESTINATION ${INCLUDE_INSTALL_DIR} COMPONENT Devel
+ )
+-install( FILES konqpopupmenuplugin.desktop konqdndpopupmenuplugin.desktop DESTINATION ${SERVICETYPES_INSTALL_DIR} )
++install( FILES konqpopupmenuplugin.desktop konqdndpopupmenuplugin.desktop koverlayiconplugin.desktop DESTINATION ${SERVICETYPES_INSTALL_DIR} )
+diff --git a/lib/konq/koverlayiconplugin.cpp b/lib/konq/koverlayiconplugin.cpp
+new file mode 100644
+index 0000000..6125040
+--- /dev/null
++++ b/lib/konq/koverlayiconplugin.cpp
+@@ -0,0 +1,30 @@
++/*****************************************************************************
++ * Copyright (C) 2014 by Olivier Goffart *
++ * *
++ * This library is free software; you can redistribute it and/or *
++ * modify it under the terms of the GNU Library General Public *
++ * License version 2 as published by the Free Software Foundation. *
++ * *
++ * 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 *
++ * Library General Public License for more details. *
++ * *
++ * You should have received a copy of the GNU Library General Public License *
++ * along with this library; see the file COPYING.LIB. If not, write to *
++ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
++ * Boston, MA 02110-1301, USA. *
++ *****************************************************************************/
++
++#include "koverlayiconplugin.h"
++#include
++
++KOverlayIconPlugin::KOverlayIconPlugin(QObject* parent) : QObject(parent)
++{
++}
++
++KOverlayIconPlugin::~KOverlayIconPlugin()
++{
++}
++
++#include "koverlayiconplugin.moc"
+diff --git a/lib/konq/koverlayiconplugin.desktop b/lib/konq/koverlayiconplugin.desktop
+new file mode 100644
+index 0000000..65a1170
+--- /dev/null
++++ b/lib/konq/koverlayiconplugin.desktop
+@@ -0,0 +1,4 @@
++[Desktop Entry]
++Type=ServiceType
++X-KDE-ServiceType=KOverlayIconPlugin
++Comment=Plugin to add overlay icons in Dolphin
+diff --git a/lib/konq/koverlayiconplugin.h b/lib/konq/koverlayiconplugin.h
+new file mode 100644
+index 0000000..bcdf31b
+--- /dev/null
++++ b/lib/konq/koverlayiconplugin.h
+@@ -0,0 +1,57 @@
++/*****************************************************************************
++ * Copyright (C) 2014 by Olivier Goffart *
++ * *
++ * This library is free software; you can redistribute it and/or *
++ * modify it under the terms of the GNU Library General Public *
++ * License version 2 as published by the Free Software Foundation. *
++ * *
++ * 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 *
++ * Library General Public License for more details. *
++ * *
++ * You should have received a copy of the GNU Library General Public License *
++ * along with this library; see the file COPYING.LIB. If not, write to *
++ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
++ * Boston, MA 02110-1301, USA. *
++ *****************************************************************************/
++
++
++#ifndef OverlayIconPlugin_H
++#define OverlayIconPlugin_H
++
++#include
++#include
++
++class KUrl;
++class KFileItem;
++
++/**
++ * @brief Base class for overlay icon plugins.
++ *
++ * Enables the file manager to show custom overlay icons on files.
++ *
++ * To write a custom plugin you need to create a .desktop file for your plugin with
++ * KDE-ServiceTypes=KOverlayIconPlugin
++ */
++class LIBKONQ_EXPORT KOverlayIconPlugin : public QObject {
++ Q_OBJECT
++ void *d;
++public:
++ explicit KOverlayIconPlugin(QObject *parent = 0);
++ ~KOverlayIconPlugin();
++
++ /**
++ * Returns a list of overlay pixmap to add to a file
++ * This can be a path to an icon, or the icon name
++ */
++ virtual QStringList getOverlays(const KFileItem &item) = 0;
++signals:
++
++ /**
++ * Emit this signal when the list of overlay icon changed for a given URL
++ */
++ void overlaysChanged(const KUrl &url, const QStringList &overlays);
++};
++
++#endif
+--
+2.1.3
+
diff --git a/shell_integration/dolphin/CMakeLists.txt b/shell_integration/dolphin/CMakeLists.txt
new file mode 100644
index 000000000..0d70854ab
--- /dev/null
+++ b/shell_integration/dolphin/CMakeLists.txt
@@ -0,0 +1,17 @@
+cmake_minimum_required(VERSION 2.6)
+project(dolphin-owncloud)
+find_package(KDE4 REQUIRED)
+include(KDE4Defaults)
+include(MacroLibrary)
+find_package(LibKonq REQUIRED)
+
+add_definitions (${QT_DEFINITIONS} ${KDE4_DEFINITIONS})
+add_definitions(-DQT_USE_FAST_CONCATENATION -DQT_USE_FAST_OPERATOR_PLUS)
+include_directories (${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR} ${KDE4_INCLUDES} )
+include_directories( ${KDE4_INCLUDE_DIR} ${QT_INCLUDES} ${LIBKONQ_INCLUDE_DIR} )
+
+kde4_add_plugin(ownclouddolphinplugin ownclouddolphinplugin.cpp)
+
+target_link_libraries(ownclouddolphinplugin ${KDE4_KIO_LIBS} ${LIBKONQ_LIBRARY})
+install(FILES ownclouddolphinplugin.desktop DESTINATION ${SERVICES_INSTALL_DIR})
+install(TARGETS ownclouddolphinplugin DESTINATION ${PLUGIN_INSTALL_DIR})
diff --git a/shell_integration/dolphin/README b/shell_integration/dolphin/README
new file mode 100644
index 000000000..715adcbbf
--- /dev/null
+++ b/shell_integration/dolphin/README
@@ -0,0 +1,18 @@
+
+
+- The patch 0001-KOverlayIconPlugin.patch should be applied to kde-baseapps git repository
+(It should applies to both KDE/4.14 or Applications/14.12 branches)
+
+- Recompile and install dolphin
+
+- Build and install the plugin
+
+- After installing, run
+ kdeinit4 --noincremental
+
+- To test taht the plugin is well installed
+ ktraderclient --servicetype KOverlayIconPlugin
+ It should show the Owncloud plugin
+
+- restart dolphin (make sure to kill all instances)
+
diff --git a/shell_integration/dolphin/ownclouddolphinplugin.cpp b/shell_integration/dolphin/ownclouddolphinplugin.cpp
new file mode 100644
index 000000000..def66573d
--- /dev/null
+++ b/shell_integration/dolphin/ownclouddolphinplugin.cpp
@@ -0,0 +1,131 @@
+/******************************************************************************
+ * Copyright (C) 2014 by Olivier Goffart
+#include
+#include
+#include
+#include
+#include
+
+
+class OwncloudDolphinPlugin : public KOverlayIconPlugin
+{
+ Q_OBJECT
+ QLocalSocket m_socket;
+ typedef QHash StatusMap;
+ StatusMap m_status;
+ QByteArray m_line;
+
+public:
+ explicit OwncloudDolphinPlugin(QObject* parent, const QList&) : KOverlayIconPlugin(parent) {
+ connect(&m_socket, SIGNAL(readyRead()), this, SLOT(readyRead()));
+ tryConnect();
+ }
+
+ virtual QStringList getOverlays(const KFileItem& item) {
+ KUrl url = item.url();
+ if (!url.isLocalFile())
+ return QStringList();
+ const QByteArray localFile = url.toLocalFile().toUtf8();
+ kDebug() << localFile;
+
+ tryConnect();
+ if (m_socket.state() == QLocalSocket::ConnectingState) {
+ if (!m_socket.waitForConnected(100)) {
+ kWarning() << "not connected" << m_socket.errorString();
+ }
+ }
+ if (m_socket.state() == QLocalSocket::ConnectedState) {
+ m_socket.write("RETRIEVE_FILE_STATUS:");
+ m_socket.write(localFile);
+ m_socket.write("\n");
+ }
+
+ StatusMap::iterator it = m_status.find(localFile);
+ if (it != m_status.constEnd()) {
+ return overlaysForString(*it);
+ }
+ return QStringList();
+ }
+
+
+
+private:
+ void tryConnect() {
+ if (m_socket.state() != QLocalSocket::UnconnectedState)
+ return;
+ QString runtimeDir = QFile::decodeName(qgetenv("XDG_RUNTIME_DIR"));
+ QString socketPath = runtimeDir + "/" + "ownCloud" + "/socket";
+ m_socket.connectToServer(socketPath);
+ }
+
+ QStringList overlaysForString(const QByteArray status) {
+ QStringList r;
+ if (status.startsWith("NOP"))
+ return r;
+
+ if (status.startsWith("OK"))
+ r << "dialog-ok";
+ if (status.startsWith("SYNC") || status.startsWith("NEW"))
+ r << "view-refresh";
+
+ if (status.contains("+SWM"))
+ r << "document-share";
+
+ kDebug() << status << r;
+ return r;
+ }
+
+private slots:
+ void readyRead() {
+ while (m_socket.bytesAvailable()) {
+ m_line += m_socket.readLine();
+ if (!m_line.endsWith("\n"))
+ continue;
+ QByteArray line;
+ qSwap(line, m_line);
+ line.chop(1);
+ kDebug() << "got line " << line;
+ if (line.isEmpty())
+ continue;
+ QList tokens = line.split(':');
+ if (tokens.count() != 3)
+ continue;
+ if (tokens[0] != "STATUS" && tokens[0] != "BROADCAST")
+ continue;
+ if (tokens[2].isEmpty())
+ continue;
+
+ const QByteArray name = tokens[2];
+ QByteArray &status = m_status[name]; // reference to the item in the hash
+ if (status == tokens[1])
+ continue;
+ status = tokens[1];
+
+ emit this->overlaysChanged(KUrl::fromLocalFile(QString::fromUtf8(name)), overlaysForString(status));
+ }
+ }
+};
+
+K_PLUGIN_FACTORY(OwncloudDolphinPluginFactory, registerPlugin();)
+K_EXPORT_PLUGIN(OwncloudDolphinPluginFactory("ownclouddolhpinplugin"))
+
+
+#include "ownclouddolphinplugin.moc"
diff --git a/shell_integration/dolphin/ownclouddolphinplugin.desktop b/shell_integration/dolphin/ownclouddolphinplugin.desktop
new file mode 100644
index 000000000..07fc63f33
--- /dev/null
+++ b/shell_integration/dolphin/ownclouddolphinplugin.desktop
@@ -0,0 +1,6 @@
+[Desktop Entry]
+Type=Service
+Name=Owncloud
+X-KDE-ServiceTypes=KOverlayIconPlugin
+MimeType=text/plain;
+X-KDE-Library=ownclouddolphinplugin
diff --git a/shell_integration/nautilus/syncstate.py b/shell_integration/nautilus/syncstate.py
index 3d0cc0488..ca8b2b1f4 100755
--- a/shell_integration/nautilus/syncstate.py
+++ b/shell_integration/nautilus/syncstate.py
@@ -18,6 +18,19 @@ import socket
from gi.repository import GObject, Nautilus
+
+def get_runtime_dir():
+ """Returns the value of $XDG_RUNTIME_DIR, a directory path.
+
+ If the value is not set, returns the same default as in Qt5
+ """
+ try:
+ return os.environ['XDG_RUNTIME_DIR']
+ except KeyError:
+ fallback = '/tmp/runtime-' + os.environ['USER']
+ return fallback
+
+
class syncStateExtension(GObject.GObject, Nautilus.ColumnProvider, Nautilus.InfoProvider):
nautilusVFSFile_table = {}
@@ -38,21 +51,21 @@ class syncStateExtension(GObject.GObject, Nautilus.ColumnProvider, Nautilus.Info
try:
self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
postfix = "/"+self.appname+"/socket"
- sock_file = os.environ["XDG_RUNTIME_DIR"]+postfix
+ sock_file = get_runtime_dir()+postfix
print ("XXXX " + sock_file + " <=> " + postfix)
if sock_file != postfix:
- try:
- print("Socket File: "+sock_file)
- self.sock.connect(sock_file)
- self.connected = True
- print("Setting connected to %r" % self.connected )
- self.watch_id = GObject.io_add_watch(self.sock, GObject.IO_IN, self.handle_notify)
- do_reconnect = False
- except Exception, e:
- print("Could not connect to unix socket." + str(e))
- else:
- print("Sock-File not valid: "+sock_file)
- except Exception, e:
+ try:
+ print("Socket File: "+sock_file)
+ self.sock.connect(sock_file)
+ self.connected = True
+ print("Setting connected to %r" % self.connected )
+ self.watch_id = GObject.io_add_watch(self.sock, GObject.IO_IN, self.handle_notify)
+ do_reconnect = False
+ except Exception as e:
+ print("Could not connect to unix socket." + str(e))
+ else:
+ print("Sock-File not valid: "+sock_file)
+ except Exception as e:
print("Connect could not be established, try again later " + str(e))
self.sock.close()
# print("Returning %r" % do_reconnect)
@@ -75,7 +88,7 @@ class syncStateExtension(GObject.GObject, Nautilus.ColumnProvider, Nautilus.Info
return None
def askForOverlay(self, file):
- # print("Asking for overlay for "+file)
+ # print("Asking for overlay for "+file)
if os.path.isdir(file):
folderStatus = self.sendCommand("RETRIEVE_FOLDER_STATUS:"+file+"\n");
@@ -85,15 +98,15 @@ class syncStateExtension(GObject.GObject, Nautilus.ColumnProvider, Nautilus.Info
def invalidate_items_underneath(self, path):
update_items = []
if not self.nautilusVFSFile_table:
- self.askForOverlay(path)
- else:
- for p in self.nautilusVFSFile_table:
- if p == path or p.startswith(path):
- item = self.nautilusVFSFile_table[p]['item']
- update_items.append(item)
+ self.askForOverlay(path)
+ else:
+ for p in self.nautilusVFSFile_table:
+ if p == path or p.startswith(path):
+ item = self.nautilusVFSFile_table[p]['item']
+ update_items.append(item)
- for item in update_items:
- item.invalidate_extension_info()
+ for item in update_items:
+ item.invalidate_extension_info()
# Handles a single line of server respoonse and sets the emblem
def handle_server_response(self, l):
@@ -118,16 +131,16 @@ class syncStateExtension(GObject.GObject, Nautilus.ColumnProvider, Nautilus.Info
# file = parts[1]
# print "Action for " + file + ": "+parts[0]
if action == 'STATUS':
- newState = parts[1]
+ newState = parts[1]
emblem = Emblems[newState]
if emblem:
itemStore = self.find_item_for_file(parts[2])
if itemStore:
- if( not itemStore['state'] or newState != itemStore['state'] ):
- item = itemStore['item']
- item.add_emblem(emblem)
- # print "Setting emblem on " + parts[2]+ "<>"+emblem+"<>"
- self.nautilusVFSFile_table[parts[2]] = {'item': item, 'state':newState}
+ if( not itemStore['state'] or newState != itemStore['state'] ):
+ item = itemStore['item']
+ item.add_emblem(emblem)
+ # print "Setting emblem on " + parts[2]+ "<>"+emblem+"<>"
+ self.nautilusVFSFile_table[parts[2]] = {'item': item, 'state':newState}
elif action == 'UPDATE_VIEW':
# Search all items underneath this path and invalidate them
diff --git a/shell_integration/windows/OCShellExtensions/OCUtilTest/OCUtilTest.cpp b/shell_integration/windows/OCShellExtensions/OCUtilTest/OCUtilTest.cpp
deleted file mode 100644
index 179f8334a..000000000
--- a/shell_integration/windows/OCShellExtensions/OCUtilTest/OCUtilTest.cpp
+++ /dev/null
@@ -1,37 +0,0 @@
-// ConsoleApplication1.cpp : Defines the entry point for the console application.
-//
-
-#include "stdafx.h"
-
-#include
-#include
-#include
-
-#include "RemotePathChecker.h"
-#include "StringUtil.h"
-
-using namespace std;
-
-int _tmain(int argc, _TCHAR* argv[])
-{
- RemotePathChecker checker(33001);
-
- vector paths;
-
- wstring test1(L"C:\\Users\\owncloud\\ownCloud\\wizard2.png");
- wstring test2(L"C:\\Users\\owncloud\\ownCloud\\wizard3.png");
- wstring test3(L"C:\\Users\\owncloud\\ownCloud\\HAMMANET.png");
- paths.push_back(test1);
- paths.push_back(test2);
- paths.push_back(test3);
-
-// wstring test3 = StringUtil::toUtf16(StringUtil::toUtf8(test1.c_str()));
-
- vector::iterator it;
- for (it = paths.begin(); it != paths.end(); ++it) {
- bool monitored = checker.IsMonitoredPath(it->c_str(), false);
- wcout << *it << " " << monitored << " with value " << checker.GetPathType() << endl;
- }
- return 0;
-}
-
diff --git a/shell_integration/windows/OCShellExtensions/OCUtilTest/OCUtilTest.filters b/shell_integration/windows/OCShellExtensions/OCUtilTest/OCUtilTest.filters
deleted file mode 100644
index 2507d8e20..000000000
--- a/shell_integration/windows/OCShellExtensions/OCUtilTest/OCUtilTest.filters
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-
-
- {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
- cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx
-
-
- {93995380-89BD-4b04-88EB-625FBE52EBFB}
- h;hh;hpp;hxx;hm;inl;inc;xsd
-
-
- {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
- rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
-
-
-
-
- Header Files
-
-
- Header Files
-
-
-
-
- Source Files
-
-
- Source Files
-
-
-
\ No newline at end of file
diff --git a/shell_integration/windows/OCShellExtensions/OCUtilTest/OCUtilTest.vcxproj b/shell_integration/windows/OCShellExtensions/OCUtilTest/OCUtilTest.vcxproj
deleted file mode 100644
index e4c35a3b2..000000000
--- a/shell_integration/windows/OCShellExtensions/OCUtilTest/OCUtilTest.vcxproj
+++ /dev/null
@@ -1,97 +0,0 @@
-
-
-
-
- Debug
- Win32
-
-
- Release
- Win32
-
-
-
- {A81E3DAE-8FE7-4BD0-82F9-939B2D59D033}
- Win32Proj
- OCUtilTest
- OCUtilTest
-
-
-
- Application
- true
- v120
- Unicode
-
-
- Application
- false
- v120
- true
- Unicode
-
-
-
-
-
-
-
-
-
-
-
-
- true
- $(SolutionDir)$(Configuration)\$(Platform)\
-
-
- false
-
-
-
- Use
- Level3
- Disabled
- WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)
- true
- ..\OCUtil
-
-
- Console
- true
- ..\$(Configuration)\$(Platform);
- OCUtil_x86.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
-
-
-
-
- Level3
- Use
- MaxSpeed
- true
- true
- WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)
- true
-
-
- Console
- true
- true
- true
-
-
-
-
-
-
-
-
-
- Create
- Create
-
-
-
-
-
-
\ No newline at end of file
diff --git a/shell_integration/windows/OCShellExtensions/OCUtilTest/ReadMe.txt b/shell_integration/windows/OCShellExtensions/OCUtilTest/ReadMe.txt
deleted file mode 100644
index 4cb8a2f4b..000000000
--- a/shell_integration/windows/OCShellExtensions/OCUtilTest/ReadMe.txt
+++ /dev/null
@@ -1,40 +0,0 @@
-========================================================================
- CONSOLE APPLICATION : ConsoleApplication1 Project Overview
-========================================================================
-
-AppWizard has created this ConsoleApplication1 application for you.
-
-This file contains a summary of what you will find in each of the files that
-make up your ConsoleApplication1 application.
-
-
-ConsoleApplication1.vcxproj
- This is the main project file for VC++ projects generated using an Application Wizard.
- It contains information about the version of Visual C++ that generated the file, and
- information about the platforms, configurations, and project features selected with the
- Application Wizard.
-
-ConsoleApplication1.vcxproj.filters
- This is the filters file for VC++ projects generated using an Application Wizard.
- It contains information about the association between the files in your project
- and the filters. This association is used in the IDE to show grouping of files with
- similar extensions under a specific node (for e.g. ".cpp" files are associated with the
- "Source Files" filter).
-
-ConsoleApplication1.cpp
- This is the main application source file.
-
-/////////////////////////////////////////////////////////////////////////////
-Other standard files:
-
-StdAfx.h, StdAfx.cpp
- These files are used to build a precompiled header (PCH) file
- named ConsoleApplication1.pch and a precompiled types file named StdAfx.obj.
-
-/////////////////////////////////////////////////////////////////////////////
-Other notes:
-
-AppWizard uses "TODO:" comments to indicate parts of the source code you
-should add to or customize.
-
-/////////////////////////////////////////////////////////////////////////////
diff --git a/shell_integration/windows/OCShellExtensions/OCUtilTest/stdafx.cpp b/shell_integration/windows/OCShellExtensions/OCUtilTest/stdafx.cpp
deleted file mode 100644
index f1d63e0b4..000000000
--- a/shell_integration/windows/OCShellExtensions/OCUtilTest/stdafx.cpp
+++ /dev/null
@@ -1,8 +0,0 @@
-// stdafx.cpp : source file that includes just the standard includes
-// ConsoleApplication1.pch will be the pre-compiled header
-// stdafx.obj will contain the pre-compiled type information
-
-#include "stdafx.h"
-
-// TODO: reference any additional headers you need in STDAFX.H
-// and not in this file
diff --git a/shell_integration/windows/OCShellExtensions/OCUtilTest/stdafx.h b/shell_integration/windows/OCShellExtensions/OCUtilTest/stdafx.h
deleted file mode 100644
index b005a839d..000000000
--- a/shell_integration/windows/OCShellExtensions/OCUtilTest/stdafx.h
+++ /dev/null
@@ -1,15 +0,0 @@
-// stdafx.h : include file for standard system include files,
-// or project specific include files that are used frequently, but
-// are changed infrequently
-//
-
-#pragma once
-
-#include "targetver.h"
-
-#include
-#include
-
-
-
-// TODO: reference additional headers your program requires here
diff --git a/shell_integration/windows/OCShellExtensions/OCUtilTest/targetver.h b/shell_integration/windows/OCShellExtensions/OCUtilTest/targetver.h
deleted file mode 100644
index 87c0086de..000000000
--- a/shell_integration/windows/OCShellExtensions/OCUtilTest/targetver.h
+++ /dev/null
@@ -1,8 +0,0 @@
-#pragma once
-
-// Including SDKDDKVer.h defines the highest available Windows platform.
-
-// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and
-// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h.
-
-#include
diff --git a/src/gui/folder.cpp b/src/gui/folder.cpp
index ca0c696f0..b86334dd9 100644
--- a/src/gui/folder.cpp
+++ b/src/gui/folder.cpp
@@ -540,6 +540,37 @@ int Folder::slotWipeBlacklist()
return _journal.wipeBlacklist();
}
+void Folder::slotWatchedPathChanged(const QString& path)
+{
+ // When no sync is running or it's in the prepare phase, we can
+ // always schedule a new sync.
+ if (! _engine || _syncResult.status() == SyncResult::SyncPrepare) {
+ emit scheduleToSync(alias());
+ return;
+ }
+
+ // The folder watcher fires a lot of bogus notifications during
+ // a sync operation, both for actual user files and the database
+ // and log. Therefore we check notifications against operations
+ // the sync is doing to filter out our own changes.
+ bool ownChange = false;
+#ifdef Q_OS_MAC
+ // On OSX the folder watcher does not report changes done by our
+ // own process. Therefore nothing needs to be done here!
+#else
+ // Use the path to figure out whether it was our own change
+ const auto maxNotificationDelay = 15*1000;
+ qint64 time = _engine->timeSinceFileTouched(path);
+ if (time != -1 && time < maxNotificationDelay) {
+ ownChange = true;
+ }
+#endif
+
+ if (! ownChange) {
+ emit scheduleToSync(alias());
+ }
+}
+
void Folder::setConfigFile( const QString& file )
{
_configFile = file;
diff --git a/src/gui/folder.h b/src/gui/folder.h
index 51f7b005c..6d255031c 100644
--- a/src/gui/folder.h
+++ b/src/gui/folder.h
@@ -154,6 +154,13 @@ public slots:
int slotWipeBlacklist();
int blackListEntryCount();
+ /**
+ * Triggered by the folder watcher when a file/dir in this folder
+ * changes. Needs to check whether this change should trigger a new
+ * sync run to be scheduled.
+ */
+ void slotWatchedPathChanged(const QString& path);
+
private slots:
void slotSyncStarted();
void slotSyncError(const QString& );
diff --git a/src/gui/folderman.cpp b/src/gui/folderman.cpp
index f2dce11c8..def2dfc0b 100644
--- a/src/gui/folderman.cpp
+++ b/src/gui/folderman.cpp
@@ -55,10 +55,6 @@ FolderMan::FolderMan(QObject *parent) :
connect(_folderChangeSignalMapper, SIGNAL(mapped(const QString &)),
this, SIGNAL(folderSyncStateChange(const QString &)));
- _folderWatcherSignalMapper = new QSignalMapper(this);
- connect(_folderWatcherSignalMapper, SIGNAL(mapped(const QString&)),
- this, SLOT(slotScheduleSync(const QString&)));
-
ne_sock_init();
Q_ASSERT(!_instance);
_instance = this;
@@ -100,8 +96,6 @@ void FolderMan::unloadFolder( const QString& alias )
_folderChangeSignalMapper->removeMappings(f);
if( _folderWatchers.contains(alias)) {
- FolderWatcher *fw = _folderWatchers[alias];
- _folderWatcherSignalMapper->removeMappings(fw);
_folderWatchers.remove(alias);
}
_folderMap.remove( alias );
@@ -135,20 +129,19 @@ void FolderMan::registerFolderMonitor( Folder *folder )
if( !folder ) return;
if( !_folderWatchers.contains(folder->alias() ) ) {
- FolderWatcher *fw = new FolderWatcher(folder->path(), this);
+ FolderWatcher *fw = new FolderWatcher(folder->path(), folder);
ConfigFile cfg;
fw->addIgnoreListFile( cfg.excludeFile(ConfigFile::SystemScope) );
fw->addIgnoreListFile( cfg.excludeFile(ConfigFile::UserScope) );
- // Connect the folderChanged signal, which comes with the changed path,
+ // Connect the pathChanged signal, which comes with the changed path,
// to the signal mapper which maps to the folder alias. The changed path
// is lost this way, but we do not need it for the current implementation.
- connect(fw, SIGNAL(folderChanged(QString)), _folderWatcherSignalMapper, SLOT(map()));
- _folderWatcherSignalMapper->setMapping(fw, folder->alias());
+ connect(fw, SIGNAL(pathChanged(QString)), folder, SLOT(slotWatchedPathChanged(QString)));
_folderWatchers.insert(folder->alias(), fw);
// This is at the moment only for the behaviour of the SocketApi.
- connect(fw, SIGNAL(folderChanged(QString)), folder, SLOT(watcherSlot(QString)));
+ connect(fw, SIGNAL(pathChanged(QString)), folder, SLOT(watcherSlot(QString)));
}
// register the folder with the socket API
@@ -444,17 +437,6 @@ void FolderMan::slotScheduleSync( const QString& alias )
return;
}
- // The folder watcher fires a lot of bogus notifications during
- // a sync operation, both for actual user files and the database
- // and log. Never enqueue a folder for sync while it is syncing.
- // We lose some genuine sync requests that way, but that can't be
- // helped.
- // ^^ FIXME: Note that this is not the case on OS X
- if( _currentSyncFolder == alias ) {
- qDebug() << "folder " << alias << " is currently syncing. NOT scheduling.";
- return;
- }
-
if( _socketApi ) {
// We want the SocketAPI to already now update so that it can show the EVAL icon
// for files/folders. Only do this when not syncing, else we might get a lot
diff --git a/src/gui/folderman.h b/src/gui/folderman.h
index 74646b3de..21fabfee0 100644
--- a/src/gui/folderman.h
+++ b/src/gui/folderman.h
@@ -150,7 +150,6 @@ private:
Folder::Map _folderMap;
QString _folderConfigPath;
QSignalMapper *_folderChangeSignalMapper;
- QSignalMapper *_folderWatcherSignalMapper;
QString _currentSyncFolder;
bool _syncEnabled;
QMap _folderWatchers;
diff --git a/src/gui/folderwatcher.cpp b/src/gui/folderwatcher.cpp
index 486d0589e..d01566363 100644
--- a/src/gui/folderwatcher.cpp
+++ b/src/gui/folderwatcher.cpp
@@ -130,7 +130,7 @@ void FolderWatcher::changeDetected( const QStringList& paths )
_lastPaths = pathsSet;
_timer.restart();
- QSet changedFolders;
+ QSet changedPaths;
// ------- handle ignores:
for (int i = 0; i < paths.size(); ++i) {
@@ -139,20 +139,15 @@ void FolderWatcher::changeDetected( const QStringList& paths )
continue;
}
- QFileInfo fi(path);
- if (fi.isDir()) {
- changedFolders.insert(path);
- } else {
- changedFolders.insert(fi.dir().path());
- }
+ changedPaths.insert(path);
}
- if (changedFolders.isEmpty()) {
+ if (changedPaths.isEmpty()) {
return;
}
- qDebug() << "detected changes in folders:" << changedFolders;
- foreach (const QString &path, changedFolders) {
- emit folderChanged(path);
+ qDebug() << "detected changes in paths:" << changedPaths;
+ foreach (const QString &path, changedPaths) {
+ emit pathChanged(path);
}
}
diff --git a/src/gui/folderwatcher.h b/src/gui/folderwatcher.h
index e4945ea70..27b131886 100644
--- a/src/gui/folderwatcher.h
+++ b/src/gui/folderwatcher.h
@@ -34,7 +34,7 @@ class FolderWatcherPrivate;
/*
* Folder Watcher monitors a directory and its sub directories
* for changes in the local file system. Changes are signalled
- * through the folderChanged() signal.
+ * through the pathChanged() signal.
*
* Note that if new folders are created, this folderwatcher class
* does not automatically adds them to the list of monitored
@@ -74,8 +74,9 @@ public:
bool pathIsIgnored( const QString& path );
signals:
- /** Emitted when one of the paths is changed */
- void folderChanged(const QString &path);
+ /** Emitted when one of the watched directories or one
+ * of the contained files is changed. */
+ void pathChanged(const QString &path);
/** Emitted if an error occurs */
void error(const QString& error);
diff --git a/src/gui/folderwatcher_linux.cpp b/src/gui/folderwatcher_linux.cpp
index 0bb0e18cf..e8f280b34 100644
--- a/src/gui/folderwatcher_linux.cpp
+++ b/src/gui/folderwatcher_linux.cpp
@@ -159,23 +159,22 @@ void FolderWatcherPrivate::slotReceivedNotification(int fd)
while(i + sizeof(struct inotify_event) < static_cast(len)) {
// cast an inotify_event
event = (struct inotify_event*)&buffer[i];
- // with the help of watch descriptor, retrieve, corresponding INotify
if (event == NULL) {
qDebug() << "NULL event";
i += sizeof(struct inotify_event);
continue;
}
- // fire event
- // Note: The name of the changed file and stuff could be taken from
- // the event data structure. That does not happen yet.
+ // Fire event for the path that was changed.
if (event->len > 0 && event->wd > -1) {
+ QByteArray fileName(event->name);
// qDebug() << Q_FUNC_INFO << event->name;
- if (QByteArray(event->name).startsWith(".csync") ||
- QByteArray(event->name).startsWith(".owncloudsync.log")) {
+ if (fileName.startsWith(".csync_journal.db") ||
+ fileName.startsWith(".owncloudsync.log")) {
// qDebug() << "ignore journal";
} else {
- const QString p = _watches[event->wd];
+ const QString p = _watches[event->wd] + '/' + fileName;
+ //qDebug() << "found a change in " << p;
_parent->changeDetected(p);
}
}
diff --git a/src/gui/folderwatcher_win.cpp b/src/gui/folderwatcher_win.cpp
index 1e0bf2884..29b7f5d25 100644
--- a/src/gui/folderwatcher_win.cpp
+++ b/src/gui/folderwatcher_win.cpp
@@ -13,6 +13,7 @@
#include
#include
+#include
#include "folderwatcher.h"
#include "folderwatcher_win.h"
@@ -23,52 +24,123 @@
namespace OCC {
-void WatcherThread::run()
+void WatcherThread::watchChanges(size_t fileNotifyBufferSize,
+ bool* increaseBufferSize)
{
- _handle = FindFirstChangeNotification((wchar_t*)_path.utf16(),
- true, // recursive watch
- FILE_NOTIFY_CHANGE_FILE_NAME |
- FILE_NOTIFY_CHANGE_DIR_NAME |
- FILE_NOTIFY_CHANGE_LAST_WRITE);
+ *increaseBufferSize = false;
+
+ _handle = CreateFileW(
+ (wchar_t*)_path.utf16(),
+ FILE_LIST_DIRECTORY,
+ FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE,
+ NULL,
+ OPEN_EXISTING,
+ FILE_FLAG_BACKUP_SEMANTICS,
+ NULL
+ );
if (_handle == INVALID_HANDLE_VALUE)
{
- qDebug() << Q_FUNC_INFO << "FindFirstChangeNotification function failed, stopping watcher!";
- FindCloseChangeNotification(_handle);
+ DWORD errorCode = GetLastError();
+ qDebug() << Q_FUNC_INFO << "Failed to create handle for" << _path << ", error:" << errorCode;
_handle = 0;
return;
}
- if (_handle == NULL)
- {
- qDebug() << Q_FUNC_INFO << "FindFirstChangeNotification returned null, stopping watcher!";
- FindCloseChangeNotification(_handle);
- _handle = 0;
- return;
- }
+ // QVarLengthArray ensures the stack-buffer is aligned like double and qint64.
+ QVarLengthArray fileNotifyBuffer;
+ fileNotifyBuffer.resize(fileNotifyBufferSize);
- while(true) {
- switch(WaitForSingleObject(_handle, /*wait*/ INFINITE)) {
- case WAIT_OBJECT_0:
- if (FindNextChangeNotification(_handle) == false) {
- qDebug() << Q_FUNC_INFO << "FindFirstChangeNotification returned FALSE, stopping watcher!";
- FindCloseChangeNotification(_handle);
- _handle = 0;
- return;
+ const size_t fileNameBufferSize = 4096;
+ TCHAR fileNameBuffer[fileNameBufferSize];
+
+ forever {
+ FILE_NOTIFY_INFORMATION *pFileNotifyBuffer =
+ (FILE_NOTIFY_INFORMATION*)fileNotifyBuffer.data();
+ DWORD dwBytesReturned = 0;
+ SecureZeroMemory(pFileNotifyBuffer, fileNotifyBufferSize);
+ if(ReadDirectoryChangesW( _handle, (LPVOID)pFileNotifyBuffer,
+ fileNotifyBufferSize, true,
+ FILE_NOTIFY_CHANGE_FILE_NAME |
+ FILE_NOTIFY_CHANGE_DIR_NAME |
+ FILE_NOTIFY_CHANGE_LAST_WRITE,
+ &dwBytesReturned, NULL, NULL))
+ {
+ FILE_NOTIFY_INFORMATION *curEntry = pFileNotifyBuffer;
+ forever {
+ size_t len = curEntry->FileNameLength / 2;
+ QString file = _path + "\\" + QString::fromWCharArray(curEntry->FileName, len);
+
+ // Unless the file was removed or renamed, get its full long name
+ // TODO: We could still try expanding the path in the tricky cases...
+ QString longfile = file;
+ if (curEntry->Action != FILE_ACTION_REMOVED
+ && curEntry->Action != FILE_ACTION_RENAMED_OLD_NAME) {
+ size_t longNameSize = GetLongPathNameW(reinterpret_cast(file.utf16()), fileNameBuffer, fileNameBufferSize);
+ if (longNameSize > 0) {
+ longfile = QString::fromUtf16(reinterpret_cast(fileNameBuffer), longNameSize);
+ } else {
+ qDebug() << Q_FUNC_INFO << "Error converting file name to full length, keeping original name.";
+ }
+ }
+ longfile = QDir::cleanPath(longfile);
+
+ qDebug() << Q_FUNC_INFO << "Found change in" << longfile << "action:" << curEntry->Action;
+ emit changed(longfile);
+
+ if (curEntry->NextEntryOffset == 0) {
+ break;
+ }
+ curEntry = (FILE_NOTIFY_INFORMATION*)(
+ (char*)curEntry + curEntry->NextEntryOffset);
}
- // qDebug() << Q_FUNC_INFO << "Change detected in" << _path << "from" << QThread::currentThread ();
- emit changed(_path);
- break;
- default:
- qDebug() << Q_FUNC_INFO << "Error while watching";
+ } else {
+ DWORD errorCode = GetLastError();
+ switch(errorCode) {
+ case ERROR_NOTIFY_ENUM_DIR:
+ qDebug() << Q_FUNC_INFO << "The buffer for changes overflowed! Triggering a generic change and resizing";
+ emit changed(_path);
+ *increaseBufferSize = true;
+ break;
+ default:
+ qDebug() << Q_FUNC_INFO << "General error" << errorCode << "while watching. Exiting.";
+ break;
+ }
+ CloseHandle(_handle);
+ _handle = NULL;
+ return;
+ }
+ }
+}
+
+void WatcherThread::run()
+{
+ // If this buffer fills up before we've extracted its data we will lose
+ // change information. Therefore start big.
+ size_t bufferSize = 4096*10;
+ size_t maxBuffer = 64*1024;
+
+ forever {
+ bool increaseBufferSize = false;
+ watchChanges(bufferSize, &increaseBufferSize);
+
+ if (increaseBufferSize) {
+ bufferSize = qMin(bufferSize*2, maxBuffer);
+ } else {
+ // Other errors shouldn't actually happen,
+ // so sleep a bit to avoid running into the same error case in a
+ // tight loop.
+ sleep(2);
}
}
}
WatcherThread::~WatcherThread()
{
- if (_handle)
- FindCloseChangeNotification(_handle);
+ if (_handle) {
+ CloseHandle(_handle);
+ _handle = NULL;
+ }
}
FolderWatcherPrivate::FolderWatcherPrivate(FolderWatcher *p, const QString& path)
diff --git a/src/gui/folderwatcher_win.h b/src/gui/folderwatcher_win.h
index 7dff7541b..08c766076 100644
--- a/src/gui/folderwatcher_win.h
+++ b/src/gui/folderwatcher_win.h
@@ -33,6 +33,8 @@ public:
protected:
void run();
+ void watchChanges(size_t fileNotifyBufferSize,
+ bool* increaseBufferSize);
signals:
void changed(const QString &path);
diff --git a/src/gui/owncloudgui.cpp b/src/gui/owncloudgui.cpp
index 25a9f057c..cd6527caa 100644
--- a/src/gui/owncloudgui.cpp
+++ b/src/gui/owncloudgui.cpp
@@ -278,11 +278,6 @@ void ownCloudGui::slotComputeOverallSyncStatus()
QIcon icon = Theme::instance()->syncStateIcon(SyncResult::Problem);
_tray->setIcon( icon );
_tray->setToolTip(tr("There are no sync folders configured."));
-#if !defined Q_OS_MAC
- if( _settingsDialog ) {
- _settingsDialog->slotUpdateAccountIcon(icon);
- }
-#endif
}
}
}
diff --git a/src/gui/settingsdialog.cpp b/src/gui/settingsdialog.cpp
index d83bbd48d..99f3614d3 100644
--- a/src/gui/settingsdialog.cpp
+++ b/src/gui/settingsdialog.cpp
@@ -26,26 +26,37 @@
#include
#include
+#include
#include
#include
#include
+#include
+#include
+
+namespace {
+ const char TOOLBAR_CSS[] =
+ "QToolBar { background: white; margin: 0; padding: 0; border: none; border-bottom: 1px solid grey; spacing: 0; } "
+ "QToolBar QToolButton { background: white; border: none; border-bottom: 1px solid grey; margin: 0; padding: 0; } "
+ "QToolBar QToolButton:checked { background: %1; color: %2; }";
+}
namespace OCC {
-QIcon createDummy() {
- QIcon icon;
- QPixmap p(32,32);
- p.fill(Qt::transparent);
- icon.addPixmap(p);
- return icon;
-}
-
SettingsDialog::SettingsDialog(ownCloudGui *gui, QWidget *parent) :
- QDialog(parent),
- _ui(new Ui::SettingsDialog)
+ QDialog(parent)
+ , _ui(new Ui::SettingsDialog)
+ , _accountSettings(new AccountSettings)
+
{
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
_ui->setupUi(this);
+ QToolBar *toolBar = new QToolBar;
+ toolBar->setIconSize(QSize(32,32));
+ QString highlightColor(palette().highlight().color().name());
+ QString altBase(palette().alternateBase().color().name());
+ toolBar->setStyleSheet(QString::fromAscii(TOOLBAR_CSS).arg(highlightColor).arg(altBase));
+ toolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
+ layout()->setMenuBar(toolBar);
// People perceive this as a Window, so also make Ctrl+W work
QAction *closeWindowAction = new QAction(this);
@@ -55,32 +66,44 @@ SettingsDialog::SettingsDialog(ownCloudGui *gui, QWidget *parent) :
setObjectName("Settings"); // required as group for saveGeometry call
- setWindowTitle(tr("%1").arg(Theme::instance()->appNameGUI()));
+ setWindowTitle(Theme::instance()->appNameGUI());
- _accountSettings = new AccountSettings(this);
- addAccount(tr("Account"), _accountSettings);
+ QIcon accountIcon(QLatin1String(":/mirall/resources/accounts.png"));
+ QAction *accountAction = toolBar->addAction(accountIcon, tr("Account"));
+ accountAction->setCheckable(true);
+ _ui->stack->addWidget(_accountSettings);
QIcon protocolIcon(QLatin1String(":/mirall/resources/activity.png"));
- QListWidgetItem *protocol= new QListWidgetItem(protocolIcon, tr("Activity"), _ui->labelWidget);
- protocol->setSizeHint(QSize(0, 32));
- _ui->labelWidget->addItem(protocol);
- _protocolWidget = new ProtocolWidget;
- _protocolIdx = _ui->stack->addWidget(_protocolWidget);
+ _protocolAction = toolBar->addAction(protocolIcon, tr("Activity"));
+ _protocolAction->setCheckable(true);
+ ProtocolWidget *protocolWidget = new ProtocolWidget;
+ _ui->stack->addWidget(protocolWidget);
QIcon generalIcon(QLatin1String(":/mirall/resources/settings.png"));
- QListWidgetItem *general = new QListWidgetItem(generalIcon, tr("General"), _ui->labelWidget);
- general->setSizeHint(QSize(0, 32));
- _ui->labelWidget->addItem(general);
+ QAction *generalAction = toolBar->addAction(generalIcon, tr("General"));
+ generalAction->setCheckable(true);
GeneralSettings *generalSettings = new GeneralSettings;
_ui->stack->addWidget(generalSettings);
QIcon networkIcon(QLatin1String(":/mirall/resources/network.png"));
- QListWidgetItem *network = new QListWidgetItem(networkIcon, tr("Network"), _ui->labelWidget);
- network->setSizeHint(QSize(0, 32));
- _ui->labelWidget->addItem(network);
+ QAction *networkAction = toolBar->addAction(networkIcon, tr("Network"));
+ networkAction->setCheckable(true);
NetworkSettings *networkSettings = new NetworkSettings;
_ui->stack->addWidget(networkSettings);
+ _actions.insert(accountAction, _accountSettings);
+ _actions.insert(_protocolAction, protocolWidget);
+ _actions.insert(generalAction, generalSettings);
+ _actions.insert(networkAction, networkSettings);
+
+ QActionGroup *group = new QActionGroup(this);
+ group->addAction(accountAction);
+ group->addAction(_protocolAction);
+ group->addAction(generalAction);
+ group->addAction(networkAction);
+ group->setExclusive(true);
+ connect(group, SIGNAL(triggered(QAction*)), SLOT(slotSwitchPage(QAction*)));
+
connect( _accountSettings, SIGNAL(folderChanged()), gui, SLOT(slotFoldersChanged()));
connect( _accountSettings, SIGNAL(accountIconChanged(QIcon)), SLOT(slotUpdateAccountIcon(QIcon)));
connect( _accountSettings, SIGNAL(openFolderAlias(const QString&)),
@@ -89,10 +112,9 @@ SettingsDialog::SettingsDialog(ownCloudGui *gui, QWidget *parent) :
connect( ProgressDispatcher::instance(), SIGNAL(progressInfo(QString, Progress::Info)),
_accountSettings, SLOT(slotSetProgress(QString, Progress::Info)) );
- _ui->labelWidget->setCurrentRow(_ui->labelWidget->row(_accountItem));
- connect(_ui->labelWidget, SIGNAL(currentRowChanged(int)),
- _ui->stack, SLOT(setCurrentIndex(int)));
+ // default to Account
+ accountAction->setChecked(true);
QPushButton *closeButton = _ui->buttonBox->button(QDialogButtonBox::Close);
connect(closeButton, SIGNAL(clicked()), SLOT(accept()));
@@ -102,23 +124,6 @@ SettingsDialog::SettingsDialog(ownCloudGui *gui, QWidget *parent) :
connect(showLogWindow, SIGNAL(triggered()), gui, SLOT(slotToggleLogBrowser()));
addAction(showLogWindow);
- int iconSize = 32;
- QListWidget *listWidget = _ui->labelWidget;
- int spacing = 20;
- // reverse at least ~8 characters
- int effectiveWidth = fontMetrics().averageCharWidth() * 8 + iconSize + spacing;
- // less than ~16 characters, elide otherwise
- int maxWidth = fontMetrics().averageCharWidth() * 16 + iconSize + spacing;
- for (int i = 0; i < listWidget->count(); i++) {
- QListWidgetItem *item = listWidget->item(i);
- QFontMetrics fm(item->font());
- int curWidth = fm.width(item->text()) + iconSize + spacing;
- effectiveWidth = qMax(curWidth, effectiveWidth);
- if (curWidth > maxWidth) item->setToolTip(item->text());
- }
- effectiveWidth = qMin(effectiveWidth, maxWidth);
- listWidget->setFixedWidth(effectiveWidth);
-
ConfigFile cfg;
cfg.restoreGeometry(this);
}
@@ -128,20 +133,9 @@ SettingsDialog::~SettingsDialog()
delete _ui;
}
-void SettingsDialog::addAccount(const QString &title, QWidget *widget)
-{
- _accountItem = new QListWidgetItem(title);
- _accountItem->setSizeHint(QSize(0, 32));
- _ui->labelWidget->addItem(_accountItem);
- _ui->stack->addWidget(widget);
- _accountSettings->slotSyncStateChange();
-}
-
void SettingsDialog::setGeneralErrors(const QStringList &errors)
{
- if( _accountSettings ) {
- _accountSettings->setGeneralErrors(errors);
- }
+ _accountSettings->setGeneralErrors(errors);
}
// close event is not being called here
@@ -157,14 +151,16 @@ void SettingsDialog::accept() {
QDialog::accept();
}
-void SettingsDialog::slotUpdateAccountIcon(const QIcon &icon)
+void SettingsDialog::slotSwitchPage(QAction *action)
{
- _accountItem->setIcon(icon);
+ _ui->stack->setCurrentWidget(_actions.value(action));
}
void SettingsDialog::showActivityPage()
{
- _ui->labelWidget->setCurrentRow(_protocolIdx);
+ if (_protocolAction) {
+ slotSwitchPage(_protocolAction);
+ }
}
diff --git a/src/gui/settingsdialog.cpp.Rbt431 b/src/gui/settingsdialog.cpp.Rbt431
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/gui/settingsdialog.h b/src/gui/settingsdialog.h
index a9d898cbf..002e4a204 100644
--- a/src/gui/settingsdialog.h
+++ b/src/gui/settingsdialog.h
@@ -19,8 +19,8 @@
#include "progressdispatcher.h"
+class QAction;
class QStandardItemModel;
-class QListWidgetItem;
namespace OCC {
@@ -28,7 +28,6 @@ namespace Ui {
class SettingsDialog;
}
class AccountSettings;
-class ProtocolWidget;
class Application;
class FolderMan;
class ownCloudGui;
@@ -46,7 +45,7 @@ public:
public slots:
void showActivityPage();
- void slotUpdateAccountIcon(const QIcon& icon);
+ void slotSwitchPage(QAction *action);
protected:
void reject() Q_DECL_OVERRIDE;
@@ -55,12 +54,10 @@ protected:
private slots:
private:
- Ui::SettingsDialog *_ui;
- AccountSettings *_accountSettings;
- QListWidgetItem *_accountItem;
- ProtocolWidget *_protocolWidget;
-
- int _protocolIdx;
+ Ui::SettingsDialog * const _ui;
+ QHash _actions;
+ AccountSettings * const _accountSettings;
+ QAction * _protocolAction;
};
}
diff --git a/src/gui/settingsdialog.ui b/src/gui/settingsdialog.ui
index 4acc77fb2..cdabf661f 100644
--- a/src/gui/settingsdialog.ui
+++ b/src/gui/settingsdialog.ui
@@ -14,26 +14,22 @@
Settings
-
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
0
0
- -
-
-
-
- 0
- 0
-
-
-
-
- -
-
-
- -
+
-
@@ -55,6 +51,9 @@
+ -
+
+
diff --git a/src/gui/settingsdialogmac.cpp b/src/gui/settingsdialogmac.cpp
index cbc6e7584..bb455bbae 100644
--- a/src/gui/settingsdialogmac.cpp
+++ b/src/gui/settingsdialogmac.cpp
@@ -63,8 +63,8 @@ SettingsDialogMac::SettingsDialogMac(ownCloudGui *gui, QWidget *parent)
setWindowTitle(tr("%1").arg(Theme::instance()->appNameGUI()));
_accountSettings = new AccountSettings;
- QIcon icon = Theme::instance()->syncStateIcon(SyncResult::Undefined, true);
- _accountIdx = addPreferencesPanel(icon, tr("Account"), _accountSettings);
+ QIcon accountIcon = (QLatin1String(":/mirall/resources/accounts.png"));
+ addPreferencesPanel(accountIcon, tr("Account"), _accountSettings);
QIcon protocolIcon(QLatin1String(":/mirall/resources/activity.png"));
_protocolWidget = new ProtocolWidget;
@@ -97,9 +97,6 @@ SettingsDialogMac::SettingsDialogMac(ownCloudGui *gui, QWidget *parent)
void SettingsDialogMac::slotSyncStateChange(const QString& alias)
{
FolderMan *folderMan = FolderMan::instance();
- SyncResult state = folderMan->accountStatus(folderMan->map().values());
- QIcon accountIcon = Theme::instance()->syncStateIcon(state.status());
- setPreferencesPanelIcon(_accountIdx, accountIcon);
Folder *folder = folderMan->folder(alias);
if( folder ) {
@@ -109,9 +106,7 @@ void SettingsDialogMac::slotSyncStateChange(const QString& alias)
void SettingsDialogMac::setGeneralErrors(const QStringList &errors)
{
- if( _accountSettings ) {
- _accountSettings->setGeneralErrors(errors);
- }
+ _accountSettings->setGeneralErrors(errors);
}
void SettingsDialogMac::closeEvent(QCloseEvent *event)
diff --git a/src/gui/settingsdialogmac.h b/src/gui/settingsdialogmac.h
index 90681628b..c4876e153 100644
--- a/src/gui/settingsdialogmac.h
+++ b/src/gui/settingsdialogmac.h
@@ -49,7 +49,6 @@ private:
QListWidgetItem *_accountItem;
ProtocolWidget *_protocolWidget;
- int _accountIdx;
int _protocolIdx;
};
diff --git a/src/gui/socketapi.cpp b/src/gui/socketapi.cpp
index 1cbf6a624..aba0a29e8 100644
--- a/src/gui/socketapi.cpp
+++ b/src/gui/socketapi.cpp
@@ -94,6 +94,11 @@ SocketApi::SocketApi(QObject* parent)
runtimeDir = QStandardPaths::writableLocation(QStandardPaths::RuntimeLocation);
#else
runtimeDir = QFile::decodeName(qgetenv("XDG_RUNTIME_DIR"));
+ if (runtimeDir.isEmpty()) {
+ runtimeDir = QDir::tempPath() + QLatin1String("/runtime-")
+ + QString::fromLocal8Bit(qgetenv("USER"));
+ QDir().mkdir(runtimeDir);
+ }
#endif
socketPath = runtimeDir + "/" + Theme::instance()->appName() + "/socket";
} else {
diff --git a/src/gui/wizard/owncloudsetuppage.cpp b/src/gui/wizard/owncloudsetuppage.cpp
index c6f5d84bf..5eddacf7d 100644
--- a/src/gui/wizard/owncloudsetuppage.cpp
+++ b/src/gui/wizard/owncloudsetuppage.cpp
@@ -224,7 +224,7 @@ void OwncloudSetupPage::setErrorString( const QString& err )
_ui.errorLabel->setVisible(false);
} else {
if (_ui.leUrl->text().startsWith("https://")) {
- QString msg = tr("Could not connect securely. Do you want to connect unencrypted instead (not recommended)?").arg(err);
+ QString msg = tr("Could not connect securely:\n\n%1\n\nDo you want to connect unencrypted instead (not recommended)?").arg(err);
QString title = tr("Connection failed");
if (QMessageBox::question(this, title, msg, QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes) {
QUrl url(_ui.leUrl->text());
diff --git a/src/libsync/CMakeLists.txt b/src/libsync/CMakeLists.txt
index b9840c017..47d83b926 100644
--- a/src/libsync/CMakeLists.txt
+++ b/src/libsync/CMakeLists.txt
@@ -33,7 +33,6 @@ endif()
set(libsync_SRCS
account.cpp
- authenticationdialog.cpp
bandwidthmanager.cpp
clientproxy.cpp
connectionvalidator.cpp
@@ -53,6 +52,7 @@ set(libsync_SRCS
propagateupload.cpp
propagateremotedelete.cpp
propagateremotemove.cpp
+ propagateremotemkdir.cpp
quotainfo.cpp
syncengine.cpp
syncfilestatus.cpp
@@ -82,6 +82,7 @@ else()
creds/shibboleth/shibbolethwebview.cpp
creds/shibboleth/shibbolethrefresher.cpp
creds/shibboleth/shibbolethuserjob.cpp
+ authenticationdialog.cpp
)
endif()
diff --git a/src/libsync/accessmanager.cpp b/src/libsync/accessmanager.cpp
index c8a21faba..2b9fc77f1 100644
--- a/src/libsync/accessmanager.cpp
+++ b/src/libsync/accessmanager.cpp
@@ -19,7 +19,10 @@
#include
#include
+#ifndef TOKEN_AUTH_ONLY
#include "authenticationdialog.h"
+#endif
+
#include "cookiejar.h"
#include "accessmanager.h"
#include "utility.h"
@@ -87,6 +90,7 @@ void AccessManager::slotProxyAuthenticationRequired(const QNetworkProxy &proxy,
}
void AccessManager::slotAuthenticationRequired(QNetworkReply *reply, QAuthenticator *authenticator)
{
+#ifndef TOKEN_AUTH_ONLY
// do not handle 401 created by the networkjobs. We may want
// to eventually exempt some, but for now we need
// it only for other things, e.g. the browser. Would we handle
@@ -106,6 +110,10 @@ void AccessManager::slotAuthenticationRequired(QNetworkReply *reply, QAuthentica
authenticator->setUser(dialog.user());
authenticator->setPassword(dialog.password());
}
+#else
+ Q_UNUSED(reply) Q_UNUSED(authenticator)
+ Q_ASSERT(!"MirallAccessManager::slotAuthenticationRequired called");
+#endif
}
} // namespace OCC
diff --git a/src/libsync/configfile.cpp b/src/libsync/configfile.cpp
index 23df4db76..3b4f96a66 100644
--- a/src/libsync/configfile.cpp
+++ b/src/libsync/configfile.cpp
@@ -365,7 +365,8 @@ quint64 ConfigFile::forceSyncInterval(const QString& connection) const
QSettings settings(configFile(), QSettings::IniFormat);
settings.beginGroup( con );
- quint64 interval = settings.value( QLatin1String(forceSyncIntervalC), 10 * pollInterval ).toULongLong();
+ quint64 defaultInterval = 2 * 60 * 60 * 1000ull; // 2h
+ quint64 interval = settings.value( QLatin1String(forceSyncIntervalC), defaultInterval ).toULongLong();
if( interval < pollInterval) {
qDebug() << "Force sync interval is less than the remote poll inteval, reverting to" << pollInterval;
interval = pollInterval;
diff --git a/src/libsync/cookiejar.cpp b/src/libsync/cookiejar.cpp
index 865ea0844..cf0ff5c56 100644
--- a/src/libsync/cookiejar.cpp
+++ b/src/libsync/cookiejar.cpp
@@ -91,27 +91,11 @@ QList CookieJar::cookiesForUrl(const QUrl &url) const
return cookies;
}
-bool CookieJar::deleteCookie(const QNetworkCookie &delCookie)
-{
- QList cookies = allCookies();
- bool removeSucceeded = false;
- foreach(const QNetworkCookie &cookie, cookies) {
- // ### cookies are not identical in attriutes, why?
- if (cookie.name() == delCookie.name()) {
- cookies.removeOne(cookie);
- removeSucceeded = true;
- }
- }
- setAllCookies(cookies);
- return removeSucceeded;
-}
-
void CookieJar::clearSessionCookies()
{
setAllCookies(removeExpired(allCookies()));
}
-
void CookieJar::save()
{
QFile file;
diff --git a/src/libsync/cookiejar.h b/src/libsync/cookiejar.h
index a336d5c80..a7c8c671c 100644
--- a/src/libsync/cookiejar.h
+++ b/src/libsync/cookiejar.h
@@ -29,13 +29,11 @@ public:
bool setCookiesFromUrl(const QList &cookieList, const QUrl &url) Q_DECL_OVERRIDE;
QList cookiesForUrl(const QUrl &url) const Q_DECL_OVERRIDE;
- bool deleteCookie(const QNetworkCookie & cookie)
-#if QT_VERSION > QT_VERSION_CHECK(5, 0, 0)
- Q_DECL_OVERRIDE //that function is not virtual in Qt4
-#endif
- ;
void clearSessionCookies();
+ using QNetworkCookieJar::setAllCookies;
+ using QNetworkCookieJar::allCookies;
+
signals:
void newCookiesForUrl(const QList& cookieList, const QUrl& url);
private:
diff --git a/src/libsync/creds/shibbolethcredentials.cpp b/src/libsync/creds/shibbolethcredentials.cpp
index 7194ec106..4ee518803 100644
--- a/src/libsync/creds/shibbolethcredentials.cpp
+++ b/src/libsync/creds/shibbolethcredentials.cpp
@@ -241,7 +241,19 @@ void ShibbolethCredentials::persist(Account* account)
void ShibbolethCredentials::invalidateToken(Account *account)
{
CookieJar *jar = static_cast(account->networkAccessManager()->cookieJar());
- jar->deleteCookie(_shibCookie);
+
+ // Remove the _shibCookie
+ auto cookies = jar->allCookies();
+ for (auto it = cookies.begin(); it != cookies.end(); ) {
+ if (it->name() == _shibCookie.name()) {
+ it = cookies.erase(it);
+ } else {
+ ++it;
+ }
+ }
+ jar->setAllCookies(cookies);
+
+ // Clear all other temporary cookies
jar->clearSessionCookies();
removeShibCookie(account);
_shibCookie = QNetworkCookie();
diff --git a/src/libsync/networkjobs.cpp b/src/libsync/networkjobs.cpp
index fa87b4475..a619034cd 100644
--- a/src/libsync/networkjobs.cpp
+++ b/src/libsync/networkjobs.cpp
@@ -497,7 +497,12 @@ void PropfindJob::start()
req.setRawHeader("Depth", "0");
QByteArray propStr;
foreach (const QByteArray &prop, properties) {
- propStr += " \n";
+ if (prop.contains(':')) {
+ int colIdx = prop.lastIndexOf(":");
+ propStr += " <" + prop.mid(colIdx+1) + " xmlns=\"" + prop.left(colIdx) + "\" />\n";
+ } else {
+ propStr += " \n";
+ }
}
QByteArray xml = "\n"
"\n"
@@ -540,25 +545,23 @@ bool PropfindJob::finished()
while (!reader.atEnd()) {
QXmlStreamReader::TokenType type = reader.readNext();
- if (type == QXmlStreamReader::StartElement &&
- reader.namespaceUri() == QLatin1String("DAV:")) {
- if (curElement.isEmpty()) {
- curElement.push(reader.name().toString());
- items.insert(reader.name().toString(), reader.text().toString());
+ if (type == QXmlStreamReader::StartElement) {
+ if (!curElement.isEmpty() && curElement.top() == QLatin1String("prop")) {
+ items.insert(reader.name().toString(), reader.readElementText());
}
+ curElement.push(reader.name().toString());
}
- if (type == QXmlStreamReader::EndElement &&
- reader.namespaceUri() == QLatin1String("DAV:")) {
+ if (type == QXmlStreamReader::EndElement) {
if(curElement.top() == reader.name()) {
curElement.pop();
}
}
-
}
emit result(items);
} else {
qDebug() << "Quota request *not* successful, http result code is" << http_result_code
<< (http_result_code == 302 ? reply()->header(QNetworkRequest::LocationHeader).toString() : QLatin1String(""));
+ emit finishedWithError();
}
return true;
}
diff --git a/src/libsync/networkjobs.h b/src/libsync/networkjobs.h
index fdd750014..8ba01dd9e 100644
--- a/src/libsync/networkjobs.h
+++ b/src/libsync/networkjobs.h
@@ -158,6 +158,7 @@ public:
signals:
void result(const QVariantMap &values);
+ void finishedWithError();
private slots:
virtual bool finished() Q_DECL_OVERRIDE;
diff --git a/src/libsync/owncloudpropagator.cpp b/src/libsync/owncloudpropagator.cpp
index 474c9d3dd..7d86dcec0 100644
--- a/src/libsync/owncloudpropagator.cpp
+++ b/src/libsync/owncloudpropagator.cpp
@@ -20,6 +20,7 @@
#include "propagateupload.h"
#include "propagateremotedelete.h"
#include "propagateremotemove.h"
+#include "propagateremotemkdir.h"
#include "propagatorjobs.h"
#include "propagator_legacy.h"
#include "configfile.h"
@@ -70,6 +71,7 @@ static bool blacklist(SyncJournalDb* journal, const SyncFileItem& item)
void PropagateItemJob::done(SyncFileItem::Status status, const QString &errorString)
{
+ _state = Finished;
if (_item._isRestoration) {
if( status == SyncFileItem::Success || status == SyncFileItem::Conflict) {
status = SyncFileItem::Restoration;
@@ -308,10 +310,11 @@ void OwncloudPropagator::start(const SyncFileItemVector& items)
connect(_rootJob.data(), SIGNAL(completed(SyncFileItem)), this, SIGNAL(completed(SyncFileItem)));
connect(_rootJob.data(), SIGNAL(progress(SyncFileItem,quint64)), this, SIGNAL(progress(SyncFileItem,quint64)));
connect(_rootJob.data(), SIGNAL(finished(SyncFileItem::Status)), this, SLOT(emitFinished()));
+ connect(_rootJob.data(), SIGNAL(ready()), this, SLOT(scheduleNextJob()), Qt::QueuedConnection);
qDebug() << (useLegacyJobs() ? "Using legacy libneon/HTTP sequential code path" : "Using QNAM/HTTP parallel code path");
- QMetaObject::invokeMethod(_rootJob.data(), "start", Qt::QueuedConnection);
+ QTimer::singleShot(0, this, SLOT(scheduleNextJob()));
}
bool OwncloudPropagator::isInSharedDirectory(const QString& file)
@@ -343,21 +346,31 @@ bool OwncloudPropagator::useLegacyJobs()
return true;
}
- env = qgetenv("OWNCLOUD_NEW_BANDWIDTH_LIMITING");
- if (env=="true" || env =="1") {
- qDebug() << "New Bandwidth Limiting Code ACTIVATED";
- // Only certain Qt versions support this at the moment.
- // They need those Change-Ids: Idb1c2d5a382a704d8cc08fe03c55c883bfc95aa7 Iefbcb1a21d8aedef1eb11761232dd16a049018dc
- // FIXME We need to check the Qt version and then also return false here as soon
- // as mirall ships with those Qt versions on Windows and OS X
- return false;
- }
-
if (_downloadLimit.fetchAndAddAcquire(0) != 0 || _uploadLimit.fetchAndAddAcquire(0) != 0) {
- qDebug() << "Switching To Legacy Propagator Because Of Bandwidth Limit ACTIVATED";
- // QNAM does not support bandwith limiting
- // in most Qt versions.
+ // QNAM bandwith limiting only work with version of Qt greater or equal to 5.3.3
+ // (It needs Qt commits 097b641 and b99fa32)
+#if QT_VERSION >= QT_VERSION_CHECK(5,3,3)
+ return false;
+#elif QT_VERSION >= QT_VERSION_CHECK(5,0,0)
+ env = qgetenv("OWNCLOUD_NEW_BANDWIDTH_LIMITING");
+ if (env=="true" || env =="1") {
+ qDebug() << "New Bandwidth Limiting Code ACTIVATED";
+ return false;
+ }
+
+ // Do a runtime check.
+ // (Poor man's version comparison)
+ const char *v = qVersion(); // "x.y.z";
+ if (QLatin1String(v) >= QLatin1String("5.3.3")) {
+ return false;
+ } else {
+ qDebug() << "Use legacy jobs because qt version is only" << v << "while 5.3.3 is needed";
+ return true;
+ }
+#else
+ qDebug() << "Use legacy jobs because of Qt4";
return true;
+#endif
}
return false;
@@ -435,52 +448,133 @@ QString OwncloudPropagator::getFilePath(const QString& tmp_file_name) const
return _localDir + tmp_file_name;
}
+void OwncloudPropagator::scheduleNextJob()
+{
+ if (this->_activeJobs < maximumActiveJob()) {
+ if (_rootJob->scheduleNextJob()) {
+ QTimer::singleShot(100, this, SLOT(scheduleNextJob()));
+ }
+ }
+}
+
+void OwncloudPropagator::addTouchedFile(const QString& fn)
+{
+ QString file = QDir::cleanPath(fn);
+
+ QElapsedTimer timer;
+ timer.start();
+
+ QMutexLocker lock(&_touchedFilesMutex);
+ _touchedFiles.insert(file, timer);
+}
+
+qint64 OwncloudPropagator::timeSinceFileTouched(const QString& fn) const
+{
+ QMutexLocker lock(&_touchedFilesMutex);
+ if (! _touchedFiles.contains(fn)) {
+ return -1;
+ }
+
+ return _touchedFiles[fn].elapsed();
+}
+
// ================================================================================
-void PropagateDirectory::start()
+PropagatorJob::JobParallelism PropagateDirectory::parallelism()
{
- _current = -1;
- _hasError = SyncFileItem::NoStatus;
- if (!_firstJob) {
- slotSubJobReady();
- } else {
- startJob(_firstJob.data());
+ // If any of the non-finished sub jobs is not parallel, we have to wait
+
+ // FIXME! we should probably cache this result
+
+ if (_firstJob && _firstJob->_state != Finished) {
+ if (_firstJob->parallelism() != FullParallelism)
+ return WaitForFinished;
}
+
+ // FIXME: use the cached value of finished job
+ for (int i = 0; i < _subJobs.count(); ++i) {
+ if (_subJobs.at(i)->_state != Finished && _subJobs.at(i)->parallelism() != FullParallelism) {
+ return WaitForFinished;
+ }
+ }
+ return FullParallelism;
+}
+
+
+bool PropagateDirectory::scheduleNextJob()
+{
+ if (_state == Finished) {
+ return false;
+ }
+
+ if (_state == NotYetStarted) {
+ _state = Running;
+
+ if (!_firstJob && _subJobs.isEmpty()) {
+ slotSubJobFinished(SyncFileItem::Success);
+ return true;
+ }
+ }
+
+ if (_firstJob && _firstJob->_state == NotYetStarted) {
+ return possiblyRunNextJob(_firstJob.data());
+ }
+
+ if (_firstJob && _firstJob->_state == Running) {
+ return false;
+ }
+
+ bool stopAtDirectory = false;
+ // FIXME: use the cached value of finished job
+ for (int i = 0; i < _subJobs.count(); ++i) {
+ if (_subJobs.at(i)->_state == Finished) {
+ continue;
+ }
+
+ if (stopAtDirectory && qobject_cast(_subJobs.at(i))) {
+ return false;
+ }
+
+ if (possiblyRunNextJob(_subJobs.at(i))) {
+ return true;
+ }
+
+ Q_ASSERT(_subJobs.at(i)->_state == Running);
+
+ auto paral = _subJobs.at(i)->parallelism();
+ if (paral == WaitForFinished) {
+ return false;
+ }
+ if (paral == WaitForFinishedInParentDirectory) {
+ stopAtDirectory = true;
+ }
+ }
+ return false;
}
void PropagateDirectory::slotSubJobFinished(SyncFileItem::Status status)
{
if (status == SyncFileItem::FatalError ||
- (_current == -1 && status != SyncFileItem::Success && status != SyncFileItem::Restoration)) {
+ (sender() == _firstJob.data() && status != SyncFileItem::Success && status != SyncFileItem::Restoration)) {
abort();
+ _state = Finished;
emit finished(status);
return;
} else if (status == SyncFileItem::NormalError || status == SyncFileItem::SoftError) {
_hasError = status;
}
_runningNow--;
- slotSubJobReady();
-}
-void PropagateDirectory::slotSubJobReady()
-{
- if (_runningNow && _current == -1)
- return; // Ignore the case when the _fistJob is ready and not yet finished
- if (_runningNow && _current >= 0 && _current < _subJobs.count()) {
- // there is a job running and the current one is not ready yet, we can't start new job
- if (!_subJobs[_current]->_readySent || _propagator->_activeJobs >= _propagator->maximumActiveJob())
- return;
+ int total = _subJobs.count();
+ if (!_firstJob) {
+ total--;
}
_current++;
- if (_current < _subJobs.size() && !_propagator->_abortRequested.fetchAndAddRelaxed(0)) {
- PropagatorJob *next = _subJobs.at(_current);
- startJob(next);
- return;
- }
+
// We finished to processing all the jobs
- emitReady();
- if (!_runningNow) {
+ // check if we finished
+ if (_current >= total) {
if (!_item.isEmpty() && _hasError == SyncFileItem::NoStatus) {
if( !_item._renameTarget.isEmpty() ) {
_item._file = _item._renameTarget;
@@ -497,7 +591,10 @@ void PropagateDirectory::slotSubJobReady()
_propagator->_journal->setFileRecord(record);
}
}
+ _state = Finished;
emit finished(_hasError == SyncFileItem::NoStatus ? SyncFileItem::Success : _hasError);
+ } else {
+ emit ready();
}
}
diff --git a/src/libsync/owncloudpropagator.h b/src/libsync/owncloudpropagator.h
index a5aaae5bd..bd38363cf 100644
--- a/src/libsync/owncloudpropagator.h
+++ b/src/libsync/owncloudpropagator.h
@@ -24,6 +24,7 @@
#include
#include
#include
+#include
#include "syncfileitem.h"
#include "syncjournaldb.h"
@@ -41,23 +42,53 @@ class Account;
class SyncJournalDb;
class OwncloudPropagator;
+/**
+ * @class PropagatorJob
+ * @brief the base class of propagator jobs
+ *
+ * This can either be a job, or a container for jobs.
+ * If it is a composite jobs, it then inherits from PropagateDirectory
+ *
+ *
+ */
+
class PropagatorJob : public QObject {
Q_OBJECT
protected:
OwncloudPropagator *_propagator;
- void emitReady() {
- bool wasReady = _readySent;
- _readySent = true;
- if (!wasReady)
- emit ready();
- };
+
public:
- bool _readySent;
- explicit PropagatorJob(OwncloudPropagator* propagator) : _propagator(propagator), _readySent(false) {}
+ explicit PropagatorJob(OwncloudPropagator* propagator) : _propagator(propagator), _state(NotYetStarted) {}
+
+ enum JobState {
+ NotYetStarted,
+ Running,
+ Finished
+ };
+ JobState _state;
+
+ enum JobParallelism {
+
+ /** Jobs can be run in parallel to this job */
+ FullParallelism,
+ /** This job do not support parallelism, and no other job shall
+ be started until this one has finished */
+ WaitForFinished,
+
+ /** This job support paralelism with other jobs in the same directory, but it should
+ not be paralelized with jobs in other directories (typically a move operation) */
+ WaitForFinishedInParentDirectory
+ };
+
+ virtual JobParallelism parallelism() { return FullParallelism; }
public slots:
- virtual void start() = 0;
virtual void abort() {}
+
+ /** Starts this job, or a new subjob
+ * returns true if a job was started.
+ */
+ virtual bool scheduleNextJob() = 0;
signals:
/**
* Emitted when the job is fully finished
@@ -70,9 +101,8 @@ signals:
void completed(const SyncFileItem &);
/**
- * Emitted when all the sub-jobs have been scheduled and
- * we are ready and more jobs might be started
- * This signal is not always emitted.
+ * Emitted when all the sub-jobs have been finished and
+ * more jobs might be started (so scheduleNextJob can/must be called again)
*/
void ready();
@@ -111,7 +141,8 @@ public:
_subJobs.append(subJob);
}
- virtual void start() Q_DECL_OVERRIDE;
+ virtual bool scheduleNextJob() Q_DECL_OVERRIDE;
+ virtual JobParallelism parallelism() Q_DECL_OVERRIDE;
virtual void abort() Q_DECL_OVERRIDE {
if (_firstJob)
_firstJob->abort();
@@ -120,23 +151,23 @@ public:
}
private slots:
- void startJob(PropagatorJob *next) {
- connect(next, SIGNAL(finished(SyncFileItem::Status)), this, SLOT(slotSubJobFinished(SyncFileItem::Status)), Qt::QueuedConnection);
- connect(next, SIGNAL(completed(SyncFileItem)), this, SIGNAL(completed(SyncFileItem)));
- connect(next, SIGNAL(progress(SyncFileItem,quint64)), this, SIGNAL(progress(SyncFileItem,quint64)));
- connect(next, SIGNAL(ready()), this, SLOT(slotSubJobReady()));
- _runningNow++;
- QMetaObject::invokeMethod(next, "start", Qt::QueuedConnection);
+ bool possiblyRunNextJob(PropagatorJob *next) {
+ if (next->_state == NotYetStarted) {
+ connect(next, SIGNAL(finished(SyncFileItem::Status)), this, SLOT(slotSubJobFinished(SyncFileItem::Status)), Qt::QueuedConnection);
+ connect(next, SIGNAL(completed(SyncFileItem)), this, SIGNAL(completed(SyncFileItem)));
+ connect(next, SIGNAL(progress(SyncFileItem,quint64)), this, SIGNAL(progress(SyncFileItem,quint64)));
+ connect(next, SIGNAL(ready()), this, SIGNAL(ready()));
+ _runningNow++;
+ }
+ return next->scheduleNextJob();
}
void slotSubJobFinished(SyncFileItem::Status status);
- void slotSubJobReady();
};
/*
* Abstract class to propagate a single item
- * (Only used for neon job)
*/
class PropagateItemJob : public PropagatorJob {
Q_OBJECT
@@ -169,6 +200,17 @@ public:
PropagateItemJob(OwncloudPropagator* propagator, const SyncFileItem &item)
: PropagatorJob(propagator), _item(item) {}
+ bool scheduleNextJob() Q_DECL_OVERRIDE {
+ if (_state != NotYetStarted) {
+ return false;
+ }
+ _state = Running;
+ QMetaObject::invokeMethod(this, "start"); // We could be in a different thread (neon jobs)
+ return true;
+ }
+public slots:
+ virtual void start() = 0;
+
};
// Dummy job that just mark it as completed and ignored.
@@ -183,44 +225,6 @@ public:
}
};
-class BandwidthManager; // fwd
-class UploadDevice : public QIODevice {
- Q_OBJECT
-public:
- QPointer _file;
- qint64 _read;
- qint64 _size;
- qint64 _start;
- BandwidthManager* _bandwidthManager;
-
- qint64 _bandwidthQuota;
- qint64 _readWithProgress;
-
- UploadDevice(QIODevice *file, qint64 start, qint64 size, BandwidthManager *bwm);
- ~UploadDevice();
- virtual qint64 writeData(const char* , qint64 );
- virtual qint64 readData(char* data, qint64 maxlen);
- virtual bool atEnd() const;
- virtual qint64 size() const;
- qint64 bytesAvailable() const;
- virtual bool isSequential() const;
- virtual bool seek ( qint64 pos );
-
- void setBandwidthLimited(bool);
- bool isBandwidthLimited() { return _bandwidthLimited; }
- void setChoked(bool);
- bool isChoked() { return _choked; }
- void giveBandwidthQuota(qint64 bwq);
-private:
- bool _bandwidthLimited; // if _bandwidthQuota will be used
- bool _choked; // if upload is paused (readData() will return 0)
-protected slots:
- void slotJobUploadProgress(qint64 sent, qint64 t);
-};
-//Q_DECLARE_METATYPE(UploadDevice);
-//Q_DECLARE_METATYPE(QPointer);
-
-
class OwncloudPropagator : public QObject {
Q_OBJECT
@@ -241,7 +245,6 @@ public:
SyncJournalDb * const _journal;
bool _finishedEmited; // used to ensure that finished is only emit once
- BandwidthManager _bandwidthManager;
public:
OwncloudPropagator(ne_session_s *session, const QString &localDir, const QString &remoteDir, const QString &remoteFolder,
@@ -262,6 +265,7 @@ public:
QAtomicInt _downloadLimit;
QAtomicInt _uploadLimit;
+ BandwidthManager _bandwidthManager;
QAtomicInt _abortRequested; // boolean set by the main thread to abort.
@@ -289,6 +293,19 @@ public:
// timeout in seconds
static int httpTimeout();
+ /** Records that a file was touched by a job.
+ *
+ * Thread-safe.
+ */
+ void addTouchedFile(const QString& fn);
+
+ /** Get the ms since a file was touched, or -1 if it wasn't.
+ *
+ * Thread-safe.
+ */
+ qint64 timeSinceFileTouched(const QString& fn) const;
+
+
private slots:
/** Emit the finished signal and make sure it is only emit once */
@@ -298,6 +315,8 @@ private slots:
_finishedEmited = true;
}
+ void scheduleNextJob();
+
signals:
void completed(const SyncFileItem &);
void progress(const SyncFileItem&, quint64 bytes);
@@ -308,6 +327,11 @@ signals:
*/
void adjustTotalTransmissionSize( qint64 adjust );
+private:
+
+ /** Stores the time since a job touched a file. */
+ QHash _touchedFiles;
+ mutable QMutex _touchedFilesMutex;
};
// Job that wait for all the poll jobs to be completed
diff --git a/src/libsync/owncloudtheme.cpp b/src/libsync/owncloudtheme.cpp
index 382001a65..d2711cb17 100644
--- a/src/libsync/owncloudtheme.cpp
+++ b/src/libsync/owncloudtheme.cpp
@@ -74,7 +74,6 @@ QIcon ownCloudTheme::applicationIcon( ) const
return themeIcon( QLatin1String("owncloud-icon") );
}
-#endif
QVariant ownCloudTheme::customMedia(Theme::CustomMediaType type)
{
@@ -89,6 +88,8 @@ QVariant ownCloudTheme::customMedia(Theme::CustomMediaType type)
}
}
+#endif
+
QString ownCloudTheme::helpUrl() const
{
return QString::fromLatin1("http://doc.owncloud.org/desktop/%1.%2/").arg(MIRALL_VERSION_MAJOR).arg(MIRALL_VERSION_MINOR);
diff --git a/src/libsync/owncloudtheme.h b/src/libsync/owncloudtheme.h
index 733754b9b..abe9261d1 100644
--- a/src/libsync/owncloudtheme.h
+++ b/src/libsync/owncloudtheme.h
@@ -27,20 +27,22 @@ public:
QString configFileName() const Q_DECL_OVERRIDE;
QString about() const Q_DECL_OVERRIDE;
- QPixmap splashScreen() const;
- QIcon folderIcon( const QString& ) const;
+#ifndef TOKEN_AUTH_ONLY
QIcon trayFolderIcon( const QString& ) const Q_DECL_OVERRIDE;
QIcon applicationIcon() const Q_DECL_OVERRIDE;
+#endif
QString appName() const Q_DECL_OVERRIDE;
QString appNameGUI() const Q_DECL_OVERRIDE;
- QVariant customMedia(CustomMediaType type) Q_DECL_OVERRIDE;
QString helpUrl() const Q_DECL_OVERRIDE;
+#ifndef TOKEN_AUTH_ONLY
+ QVariant customMedia(CustomMediaType type) Q_DECL_OVERRIDE;
QColor wizardHeaderBackgroundColor() const Q_DECL_OVERRIDE;
QColor wizardHeaderTitleColor() const Q_DECL_OVERRIDE;
QPixmap wizardHeaderLogo() const Q_DECL_OVERRIDE;
+#endif
private:
diff --git a/src/libsync/propagatedownload.cpp b/src/libsync/propagatedownload.cpp
index ea3c67102..fdd8ef758 100644
--- a/src/libsync/propagatedownload.cpp
+++ b/src/libsync/propagatedownload.cpp
@@ -361,7 +361,6 @@ void PropagateDownloadFileQNAM::start()
connect(_job, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(slotDownloadProgress(qint64,qint64)));
_propagator->_activeJobs ++;
_job->start();
- emitReady();
}
void PropagateDownloadFileQNAM::slotGetFinished()
@@ -418,6 +417,21 @@ void PropagateDownloadFileQNAM::slotGetFinished()
_tmpFile.close();
_tmpFile.flush();
+
+ /* Check that the size of the GET reply matches the file size. There have been cases
+ * reported that if a server breaks behind a proxy, the GET is still a 200 but is
+ * truncated, as described here: https://github.com/owncloud/mirall/issues/2528
+ */
+ const QByteArray sizeHeader("Content-Length");
+ quint64 bodySize = job->reply()->rawHeader(sizeHeader).toULongLong();
+
+ if(bodySize > 0 && bodySize != _tmpFile.size() - job->resumeStart() ) {
+ qDebug() << bodySize << _tmpFile.size() << job->resumeStart();
+ _propagator->_anotherSyncNeeded = true;
+ done(SyncFileItem::SoftError, tr("The file could not be downloaded completely."));
+ return;
+ }
+
downloadFinished();
}
@@ -477,6 +491,7 @@ void PropagateDownloadFileQNAM::downloadFinished()
FileSystem::setFileHidden(_tmpFile.fileName(), false);
QString error;
+ _propagator->addTouchedFile(fn);
if (!FileSystem::renameReplace(_tmpFile.fileName(), fn, &error)) {
// If we moved away the original file due to a conflict but can't
// put the downloaded file in its place, we are in a bad spot:
diff --git a/src/libsync/propagatedownload.h b/src/libsync/propagatedownload.h
index a74ba68f7..e98be4b40 100644
--- a/src/libsync/propagatedownload.h
+++ b/src/libsync/propagatedownload.h
@@ -54,9 +54,9 @@ public:
virtual void start() Q_DECL_OVERRIDE;
virtual bool finished() Q_DECL_OVERRIDE {
- qDebug() << Q_FUNC_INFO << reply()->bytesAvailable() << _hasEmittedFinishedSignal;
+// qDebug() << Q_FUNC_INFO << reply()->bytesAvailable() << _hasEmittedFinishedSignal;
if (reply()->bytesAvailable()) {
- qDebug() << Q_FUNC_INFO << "Not all read yet because of bandwidth limits";
+// qDebug() << Q_FUNC_INFO << "Not all read yet because of bandwidth limits";
return false;
} else {
if (_bandwidthManager) {
diff --git a/src/libsync/propagateremotedelete.cpp b/src/libsync/propagateremotedelete.cpp
index 654328bc1..503daf307 100644
--- a/src/libsync/propagateremotedelete.cpp
+++ b/src/libsync/propagateremotedelete.cpp
@@ -60,7 +60,6 @@ void PropagateRemoteDelete::start()
connect(_job, SIGNAL(finishedSignal()), this, SLOT(slotDeleteJobFinished()));
_propagator->_activeJobs ++;
_job->start();
- emitReady();
}
void PropagateRemoteDelete::abort()
diff --git a/src/libsync/propagateremotemkdir.cpp b/src/libsync/propagateremotemkdir.cpp
new file mode 100644
index 000000000..ce51a054f
--- /dev/null
+++ b/src/libsync/propagateremotemkdir.cpp
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) by Olivier Goffart
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ */
+
+#include "propagateremotemkdir.h"
+#include "owncloudpropagator_p.h"
+#include "account.h"
+#include "syncjournalfilerecord.h"
+#include
+
+namespace Mirall {
+
+void PropagateRemoteMkdir::start()
+{
+ if (_propagator->_abortRequested.fetchAndAddRelaxed(0))
+ return;
+
+ qDebug() << Q_FUNC_INFO << _item._file;
+
+ _job = new MkColJob(AccountManager::instance()->account(),
+ _propagator->_remoteFolder + _item._file,
+ this);
+ connect(_job, SIGNAL(finished(QNetworkReply::NetworkError)), this, SLOT(slotMkcolJobFinished()));
+ _propagator->_activeJobs++;
+ _job->start();
+}
+
+void PropagateRemoteMkdir::abort()
+{
+ if (_job && _job->reply())
+ _job->reply()->abort();
+}
+
+void PropagateRemoteMkdir::slotMkcolJobFinished()
+{
+ _propagator->_activeJobs--;
+
+ Q_ASSERT(_job);
+
+ qDebug() << Q_FUNC_INFO << _job->reply()->request().url() << "FINISHED WITH STATUS"
+ << _job->reply()->error()
+ << (_job->reply()->error() == QNetworkReply::NoError ? QLatin1String("") : _job->reply()->errorString());
+
+ QNetworkReply::NetworkError err = _job->reply()->error();
+ _item._httpErrorCode = _job->reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
+
+ if (_item._httpErrorCode == 405) {
+ // This happens when the directory already exist. Nothing to do.
+ } else if (err != QNetworkReply::NoError) {
+ SyncFileItem::Status status = classifyError(err, _item._httpErrorCode);
+ done(status, _job->reply()->errorString());
+ return;
+ } else if (_item._httpErrorCode != 201) {
+ // Normaly we expect "201 Created"
+ // If it is not the case, it might be because of a proxy or gateway intercepting the request, so we must
+ // throw an error.
+ done(SyncFileItem::NormalError, tr("Wrong HTTP code returned by server. Expected 201, but recieved \"%1 %2\".")
+ .arg(_item._httpErrorCode).arg(_job->reply()->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString()));
+ return;
+ }
+
+ _item._requestDuration = _job->duration();
+ _item._responseTimeStamp = _job->responseTimestamp();
+ _item._fileId = _job->reply()->rawHeader("OC-FileId");
+
+ if (_item._fileId.isEmpty()) {
+ // Owncloud 7.0.0 and before did not have a header with the file id.
+ // (https://github.com/owncloud/core/issues/9000)
+ // So we must get the file id using a PROPFIND
+ // This is required so that we can detect moves even if the folder is renamed on the server
+ // while files are still uploading
+ _propagator->_activeJobs++;
+ auto propfindJob = new PropfindJob(_job->account(), _job->path(), this);
+ propfindJob->setProperties(QList() << "getetag" << "http://owncloud.org/ns:id");
+ QObject::connect(propfindJob, SIGNAL(result(QVariantMap)), this, SLOT(propfindResult(QVariantMap)));
+ QObject::connect(propfindJob, SIGNAL(finishedWithError()), this, SLOT(propfindError()));
+ propfindJob->start();
+ _job = propfindJob;
+ return;
+ }
+
+ done(SyncFileItem::Success);
+}
+
+void PropagateRemoteMkdir::propfindResult(const QVariantMap &result)
+{
+ _propagator->_activeJobs--;
+ if (result.contains("getetag")) {
+ _item._etag = result["getetag"].toByteArray();
+ }
+ if (result.contains("id")) {
+ _item._fileId = result["id"].toByteArray();
+ }
+ done(SyncFileItem::Success);
+}
+
+void PropagateRemoteMkdir::propfindError()
+{
+ // ignore the PROPFIND error
+ _propagator->_activeJobs--;
+ done(SyncFileItem::Success);
+}
+
+
+}
+
diff --git a/src/libsync/propagateremotemkdir.h b/src/libsync/propagateremotemkdir.h
new file mode 100644
index 000000000..fae8db28b
--- /dev/null
+++ b/src/libsync/propagateremotemkdir.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) by Olivier Goffart
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ */
+#pragma once
+
+#include "owncloudpropagator.h"
+#include "networkjobs.h"
+
+namespace Mirall {
+
+class PropagateRemoteMkdir : public PropagateItemJob {
+ Q_OBJECT
+ QPointer _job;
+ friend class PropagateDirectory; // So it can access the _item;
+public:
+ PropagateRemoteMkdir (OwncloudPropagator* propagator,const SyncFileItem& item)
+ : PropagateItemJob(propagator, item) {}
+ void start() Q_DECL_OVERRIDE;
+ void abort() Q_DECL_OVERRIDE;
+private slots:
+ void slotMkcolJobFinished();
+ void propfindResult(const QVariantMap &);
+ void propfindError();
+};
+
+}
\ No newline at end of file
diff --git a/src/libsync/propagateremotemove.cpp b/src/libsync/propagateremotemove.cpp
index 06084cb02..d7888029e 100644
--- a/src/libsync/propagateremotemove.cpp
+++ b/src/libsync/propagateremotemove.cpp
@@ -58,13 +58,18 @@ void PropagateRemoteMove::start()
qDebug() << Q_FUNC_INFO << _item._file << _item._renameTarget;
+ QString targetFile(_propagator->getFilePath(_item._renameTarget));
+
if (_item._file == _item._renameTarget) {
// The parents has been renamed already so there is nothing more to do.
finalize();
return;
} else if (AbstractNetworkJob::preOc7WasDetected && _item._file == QLatin1String("Shared") ) {
// Check if it is the toplevel Shared folder and do not propagate it.
- if( QFile::rename( _propagator->_localDir + _item._renameTarget, _propagator->_localDir + QLatin1String("Shared")) ) {
+ QString originalFile(_propagator->getFilePath(QLatin1String("Shared")));
+ _propagator->addTouchedFile(originalFile);
+ _propagator->addTouchedFile(targetFile);
+ if( QFile::rename( targetFile, originalFile) ) {
done(SyncFileItem::NormalError, tr("This folder must not be renamed. It is renamed back to its original name."));
} else {
done(SyncFileItem::NormalError, tr("This folder must not be renamed. Please name it back to Shared."));
@@ -78,7 +83,6 @@ void PropagateRemoteMove::start()
connect(_job, SIGNAL(finishedSignal()), this, SLOT(slotMoveJobFinished()));
_propagator->_activeJobs++;
_job->start();
- emitReady();
}
}
@@ -132,7 +136,7 @@ void PropagateRemoteMove::slotMoveJobFinished()
void PropagateRemoteMove::finalize()
{
_propagator->_journal->deleteFileRecord(_item._originalFile);
- SyncJournalFileRecord record(_item, _propagator->_localDir + _item._renameTarget);
+ SyncJournalFileRecord record(_item, _propagator->getFilePath(_item._renameTarget));
record._path = _item._renameTarget;
_propagator->_journal->setFileRecord(record);
diff --git a/src/libsync/propagateremotemove.h b/src/libsync/propagateremotemove.h
index 97cf5c0f0..540fff9f6 100644
--- a/src/libsync/propagateremotemove.h
+++ b/src/libsync/propagateremotemove.h
@@ -43,6 +43,7 @@ public:
: PropagateItemJob(propagator, item) {}
void start() Q_DECL_OVERRIDE;
void abort() Q_DECL_OVERRIDE;
+ JobParallelism parallelism() Q_DECL_OVERRIDE { return Mirall::PropagatorJob::WaitForFinishedInParentDirectory; }
private slots:
void slotMoveJobFinished();
void finalize();
diff --git a/src/libsync/propagateupload.cpp b/src/libsync/propagateupload.cpp
index d5ac518da..654de66c9 100644
--- a/src/libsync/propagateupload.cpp
+++ b/src/libsync/propagateupload.cpp
@@ -14,6 +14,7 @@
#include "propagateupload.h"
#include "owncloudpropagator_p.h"
+#include "propagator_legacy.h"
#include "networkjobs.h"
#include "account.h"
#include "syncjournaldb.h"
@@ -152,7 +153,8 @@ void PropagateUploadFileQNAM::start()
_file = new QFile(_propagator->getFilePath(_item._file), this);
if (!_file->open(QIODevice::ReadOnly)) {
- done(SyncFileItem::NormalError, _file->errorString());
+ // Soft error because this is likely caused by the user modifying his files while syncing
+ done(SyncFileItem::SoftError, _file->errorString());
delete _file;
return;
}
@@ -199,7 +201,6 @@ UploadDevice::UploadDevice(QIODevice *file, qint64 start, qint64 size, Bandwidt
_readWithProgress(0),
_bandwidthLimited(false), _choked(false)
{
- qDebug() << Q_FUNC_INFO << start << size << chunkSize();
_bandwidthManager->registerUploadDevice(this);
_file = QPointer(file);
}
@@ -216,7 +217,7 @@ qint64 UploadDevice::writeData(const char* , qint64 ) {
qint64 UploadDevice::readData(char* data, qint64 maxlen) {
if (_file.isNull()) {
- qDebug() << Q_FUNC_INFO << "Upload file object deleted during upload";
+ qDebug() << "Upload file object deleted during upload";
close();
return -1;
}
@@ -224,7 +225,6 @@ qint64 UploadDevice::readData(char* data, qint64 maxlen) {
//qDebug() << Q_FUNC_INFO << maxlen << _read << _size << _bandwidthQuota;
if (_size - _read <= 0) {
// at end
- qDebug() << Q_FUNC_INFO << _read << _size << _bandwidthQuota << "at end";
_bandwidthManager->unregisterUploadDevice(this);
return -1;
}
@@ -233,28 +233,21 @@ qint64 UploadDevice::readData(char* data, qint64 maxlen) {
return 0;
}
if (isChoked()) {
- qDebug() << Q_FUNC_INFO << this << "Upload Choked";
return 0;
}
if (isBandwidthLimited()) {
- qDebug() << Q_FUNC_INFO << "BW LIMITED" << maxlen << _bandwidthQuota
- << qMin(maxlen, _bandwidthQuota);
maxlen = qMin(maxlen, _bandwidthQuota);
if (maxlen <= 0) { // no quota
- qDebug() << Q_FUNC_INFO << "no quota";
+ qDebug() << "no quota";
return 0;
}
_bandwidthQuota -= maxlen;
}
- qDebug() << Q_FUNC_INFO << "reading limited=" << isBandwidthLimited()
- << "maxlen=" << maxlen << "quota=" << _bandwidthQuota;
qint64 ret = _file.data()->read(data, maxlen);
- //qDebug() << Q_FUNC_INFO << "returning " << ret;
if (ret < 0)
return -1;
_read += ret;
- //qDebug() << Q_FUNC_INFO << "returning2 " << ret << _read;
return ret;
}
@@ -270,7 +263,7 @@ void UploadDevice::slotJobUploadProgress(qint64 sent, qint64 t)
bool UploadDevice::atEnd() const {
if (_file.isNull()) {
- qDebug() << Q_FUNC_INFO << "Upload file object deleted during upload";
+ qDebug() << "Upload file object deleted during upload";
return true;
}
// qDebug() << this << Q_FUNC_INFO << _read << chunkSize()
@@ -298,20 +291,17 @@ bool UploadDevice::isSequential() const{
bool UploadDevice::seek ( qint64 pos ) {
if (_file.isNull()) {
- qDebug() << Q_FUNC_INFO << "Upload file object deleted during upload";
+ qDebug() << "Upload file object deleted during upload";
close();
return false;
}
- qDebug() << this << Q_FUNC_INFO << pos << _read;
_read = pos;
return _file.data()->seek(pos + _start);
}
void UploadDevice::giveBandwidthQuota(qint64 bwq) {
-// qDebug() << Q_FUNC_INFO << bwq;
if (!atEnd()) {
_bandwidthQuota = bwq;
-// qDebug() << Q_FUNC_INFO << bwq << "emitting readyRead()" << _read << _readWithProgress;
QMetaObject::invokeMethod(this, "readyRead", Qt::QueuedConnection); // tell QNAM that we have quota
}
}
@@ -343,6 +333,7 @@ void PropagateUploadFileQNAM::startNextChunk()
QMap headers;
headers["OC-Total-Length"] = QByteArray::number(fileSize);
headers["OC-Async"] = "1";
+ headers["OC-Chunk-Size"]= QByteArray::number(quint64(chunkSize()));
headers["Content-Type"] = "application/octet-stream";
headers["X-OC-Mtime"] = QByteArray::number(qint64(_item._modtime));
if (!_item._etag.isEmpty() && _item._etag != "empty_etag" &&
@@ -403,7 +394,7 @@ void PropagateUploadFileQNAM::startNextChunk()
startNextChunk();
}
if (!parallelChunkUpload || _chunkCount - _currentChunk <= 0) {
- emitReady();
+ emit ready();
}
} else {
qDebug() << "ERR: Could not open upload file: " << device->errorString();
@@ -456,6 +447,13 @@ void PropagateUploadFileQNAM::slotPutFinished()
_propagator->_anotherSyncNeeded = true;
}
+ foreach (auto job, _jobs) {
+ if (job->reply()) {
+ job->reply()->abort();
+ }
+ }
+
+ _finished = true;
done(classifyError(err, _item._httpErrorCode), errorString);
return;
}
@@ -466,6 +464,7 @@ void PropagateUploadFileQNAM::slotPutFinished()
_finished = true;
QString path = QString::fromUtf8(job->reply()->rawHeader("OC-Finish-Poll"));
if (path.isEmpty()) {
+ _finished = true;
done(SyncFileItem::NormalError, tr("Poll URL missing"));
return;
}
@@ -587,7 +586,7 @@ void PropagateUploadFileQNAM::finalize(const SyncFileItem ©)
_propagator->_journal->setUploadInfo(_item._file, SyncJournalDb::UploadInfo());
_propagator->_journal->commit("upload file start");
- qDebug() << Q_FUNC_INFO << "msec=" <<_duration.elapsed();
+ _finished = true;
done(SyncFileItem::Success);
}
@@ -620,6 +619,7 @@ void PropagateUploadFileQNAM::startPollJob(const QString& path)
info._modtime = _item._modtime;
_propagator->_journal->setPollInfo(info);
_propagator->_journal->commit("add poll info");
+ _propagator->_activeJobs++;
job->start();
}
@@ -628,7 +628,10 @@ void PropagateUploadFileQNAM::slotPollFinished()
PollJob *job = qobject_cast(sender());
Q_ASSERT(job);
+ _propagator->_activeJobs--;
+
if (job->_item._status != SyncFileItem::Success) {
+ _finished = true;
done(job->_item._status, job->_item._errorString);
return;
}
diff --git a/src/libsync/propagateupload.h b/src/libsync/propagateupload.h
index c6a250cbc..7b1c01966 100644
--- a/src/libsync/propagateupload.h
+++ b/src/libsync/propagateupload.h
@@ -21,30 +21,40 @@
#include
namespace OCC {
+class BandwidthManager;
-class ChunkBlock {
-
+class UploadDevice : public QIODevice {
+ Q_OBJECT
public:
- explicit ChunkBlock() : _state(NotTransfered) { }
- enum State {
- CHUNK_SUCCESS,
- NotTransfered, /* never tried to transfer */
- Transfered, /* transfer currently running */
- TransferFailed, /* transfer tried but failed */
- TransferSuccess, /* block transfer succeeded. */
- Fail
- };
+ QPointer _file;
+ qint64 _read;
+ qint64 _size;
+ qint64 _start;
+ BandwidthManager* _bandwidthManager;
- int _sequenceNo;
- int64_t _start;
- int64_t _size;
+ qint64 _bandwidthQuota;
+ qint64 _readWithProgress;
- State _state;
- int _httpResultCode;
- QString _httpErrorMsg;
- QString _etag;
- QBuffer *_buffer;
+ UploadDevice(QIODevice *file, qint64 start, qint64 size, BandwidthManager *bwm);
+ ~UploadDevice();
+ virtual qint64 writeData(const char* , qint64 );
+ virtual qint64 readData(char* data, qint64 maxlen);
+ virtual bool atEnd() const;
+ virtual qint64 size() const;
+ qint64 bytesAvailable() const;
+ virtual bool isSequential() const;
+ virtual bool seek ( qint64 pos );
+ void setBandwidthLimited(bool);
+ bool isBandwidthLimited() { return _bandwidthLimited; }
+ void setChoked(bool);
+ bool isChoked() { return _choked; }
+ void giveBandwidthQuota(qint64 bwq);
+private:
+ bool _bandwidthLimited; // if _bandwidthQuota will be used
+ bool _choked; // if upload is paused (readData() will return 0)
+protected slots:
+ void slotJobUploadProgress(qint64 sent, qint64 t);
};
class PUTFileJob : public AbstractNetworkJob {
diff --git a/src/libsync/propagator_legacy.cpp b/src/libsync/propagator_legacy.cpp
index 8d9dda1d0..0e8561d45 100644
--- a/src/libsync/propagator_legacy.cpp
+++ b/src/libsync/propagator_legacy.cpp
@@ -56,6 +56,78 @@ static QByteArray get_etag_from_reply(ne_request *req)
return ret;
}
+bool PropagateNeonJob::updateErrorFromSession(int neon_code, ne_request* req, int ignoreHttpCode)
+{
+ if( neon_code != NE_OK ) {
+ qDebug("Neon error code was %d", neon_code);
+ }
+
+ QString errorString;
+ int httpStatusCode = 0;
+
+ switch(neon_code) {
+ case NE_OK: /* Success, but still the possiblity of problems */
+ if( req ) {
+ const ne_status *status = ne_get_status(req);
+
+ if (status) {
+ if ( status->klass == 2 || status->code == ignoreHttpCode) {
+ // Everything is ok, no error.
+ return false;
+ }
+ errorString = QString::fromUtf8( status->reason_phrase );
+ httpStatusCode = status->code;
+ _item._httpErrorCode = httpStatusCode;
+ }
+ } else {
+ errorString = QString::fromUtf8(ne_get_error(_propagator->_session));
+ httpStatusCode = errorString.mid(0, errorString.indexOf(QChar(' '))).toInt();
+ _item._httpErrorCode = httpStatusCode;
+ if ((httpStatusCode >= 200 && httpStatusCode < 300)
+ || (httpStatusCode != 0 && httpStatusCode == ignoreHttpCode)) {
+ // No error
+ return false;
+ }
+ }
+ // FIXME: classify the error
+ done (SyncFileItem::NormalError, errorString);
+ return true;
+ case NE_ERROR: /* Generic error; use ne_get_error(session) for message */
+ errorString = QString::fromUtf8(ne_get_error(_propagator->_session));
+ // Check if we don't need to ignore that error.
+ httpStatusCode = errorString.mid(0, errorString.indexOf(QChar(' '))).toInt();
+ _item._httpErrorCode = httpStatusCode;
+ qDebug() << Q_FUNC_INFO << "NE_ERROR" << errorString << httpStatusCode << ignoreHttpCode;
+ if (ignoreHttpCode && httpStatusCode == ignoreHttpCode)
+ return false;
+
+ done(SyncFileItem::NormalError, errorString);
+ return true;
+ case NE_LOOKUP: /* Server or proxy hostname lookup failed */
+ case NE_AUTH: /* User authentication failed on server */
+ case NE_PROXYAUTH: /* User authentication failed on proxy */
+ case NE_CONNECT: /* Could not connect to server */
+ case NE_TIMEOUT: /* Connection timed out */
+ done(SyncFileItem::FatalError, QString::fromUtf8(ne_get_error(_propagator->_session)));
+ return true;
+ case NE_FAILED: /* The precondition failed */
+ case NE_RETRY: /* Retry request (ne_end_request ONLY) */
+ case NE_REDIRECT: /* See ne_redirect.h */
+ default:
+ done(SyncFileItem::SoftError, QString::fromUtf8(ne_get_error(_propagator->_session)));
+ return true;
+ }
+ return false;
+}
+
+void UpdateMTimeAndETagJob::start()
+{
+ QScopedPointer uri(
+ ne_path_escape((_propagator->_remoteDir + _item._file).toUtf8()));
+ if (!updateMTimeAndETag(uri.data(), _item._modtime))
+ return;
+ done(SyncFileItem::Success);
+}
void PropagateUploadFileLegacy::start()
{
@@ -640,6 +712,7 @@ void PropagateDownloadFileLegacy::start()
FileSystem::setFileHidden(tmpFile.fileName(), false);
QString error;
+ _propagator->addTouchedFile(fn);
if (!FileSystem::renameReplace(tmpFile.fileName(), fn, &error)) {
done(SyncFileItem::NormalError, error);
return;
diff --git a/src/libsync/propagator_legacy.h b/src/libsync/propagator_legacy.h
index 083230ef3..f162ad239 100644
--- a/src/libsync/propagator_legacy.h
+++ b/src/libsync/propagator_legacy.h
@@ -16,9 +16,73 @@
#pragma once
#include "propagatorjobs.h"
+#include
+#include
+struct hbf_transfer_s;
+struct ne_session_s;
+typedef struct ne_prop_result_set_s ne_prop_result_set;
+
namespace OCC {
+
+
+/* Helper for QScopedPointer<>, to be used as the deleter.
+ * QScopePointer will call the right overload of cleanup for the pointer it holds
+ */
+struct ScopedPointerHelpers {
+ static inline void cleanup(hbf_transfer_t *pointer) { if (pointer) hbf_free_transfer(pointer); }
+ static inline void cleanup(ne_request *pointer) { if (pointer) ne_request_destroy(pointer); }
+ static inline void cleanup(ne_decompress *pointer) { if (pointer) ne_decompress_destroy(pointer); }
+ // static inline void cleanup(ne_propfind_handler *pointer) { if (pointer) ne_propfind_destroy(pointer); }
+};
+
+
+/*
+ * Abstract class for neon job. Lives in the neon thread
+ */
+class PropagateNeonJob : public PropagateItemJob {
+ Q_OBJECT
+protected:
+
+ /* Issue a PROPPATCH and PROPFIND to update the mtime, and fetch the etag
+ * Return true in case of success, and false if the PROPFIND failed and the
+ * error has been reported
+ */
+ bool updateMTimeAndETag(const char *uri, time_t);
+
+ /* fetch the error code and string from the session
+ in case of error, calls done with the error and returns true.
+
+ If the HTTP error code is ignoreHTTPError, the error is ignored
+ */
+ bool updateErrorFromSession(int neon_code = 0, ne_request *req = 0, int ignoreHTTPError = 0);
+
+ /*
+ * to be called by the progress callback and will wait the amount of time needed.
+ */
+ void limitBandwidth(qint64 progress, qint64 limit);
+
+ QElapsedTimer _lastTime;
+ qint64 _lastProgress;
+ int _httpStatusCode;
+
+public:
+ PropagateNeonJob(OwncloudPropagator* propagator, const SyncFileItem &item)
+ : PropagateItemJob(propagator, item), _lastProgress(0), _httpStatusCode(0) {
+ moveToThread(propagator->_neonThread);
+ }
+
+ JobParallelism parallelism() Q_DECL_OVERRIDE { return WaitForFinished; }
+};
+
+class UpdateMTimeAndETagJob : public PropagateNeonJob {
+ Q_OBJECT
+public:
+ UpdateMTimeAndETagJob (OwncloudPropagator* propagator, const SyncFileItem& item) : PropagateNeonJob(propagator, item) {}
+ void start() Q_DECL_OVERRIDE;
+};
+
class PropagateUploadFileLegacy: public PropagateNeonJob {
Q_OBJECT
public:
diff --git a/src/libsync/propagatorjobs.cpp b/src/libsync/propagatorjobs.cpp
index d284d66fe..7778a89be 100644
--- a/src/libsync/propagatorjobs.cpp
+++ b/src/libsync/propagatorjobs.cpp
@@ -35,15 +35,6 @@
#include
#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
#include
@@ -135,99 +126,19 @@ void PropagateLocalMkdir::start()
done(SyncFileItem::Success);
}
-/* The list of properties that is fetched in PropFind after a MKCOL */
-static const ne_propname ls_props[] = {
- { "DAV:", "getetag"},
- { "http://owncloud.org/ns", "id"},
- { NULL, NULL }
-};
-
-/*
- * Parse the PROPFIND result after a MKCOL
- */
-void PropagateRemoteMkdir::propfind_results(void *userdata,
- const ne_uri *uri,
- const ne_prop_result_set *set)
-{
- PropagateRemoteMkdir *job = static_cast(userdata);
-
- job->_item._etag = parseEtag(ne_propset_value( set, &ls_props[0] ));
-
- const char* fileId = ne_propset_value( set, &ls_props[1] );
- if (fileId) {
- job->_item._fileId = fileId;
- qDebug() << "MKCOL: " << uri << " FileID set it to " << fileId;
-
- // save the file id already so we can detect rename
- SyncJournalFileRecord record(job->_item, job->_propagator->_localDir + job->_item._renameTarget);
- job->_propagator->_journal->setFileRecord(record);
- }
-}
-
-/*
- * Called after the headers have been recieved, try to extract the fileId
- */
-void PropagateRemoteMkdir::post_headers(ne_request* req, void* userdata, const ne_status* )
-{
- const char *header = ne_get_response_header(req, "OC-FileId");
- if( header ) {
- qDebug() << "MKCOL: " << static_cast(userdata)->_item._file << " FileID from header:" << header;
- static_cast(userdata)->_item._fileId = header;
- }
-}
-
-
-void PropagateRemoteMkdir::start()
-{
- if (_propagator->_abortRequested.fetchAndAddRelaxed(0))
- return;
-
- QScopedPointer uri(
- ne_path_escape((_propagator->_remoteDir + _item._file).toUtf8()));
-
- ne_hook_post_headers(_propagator->_session, post_headers, this);
-
- int rc = ne_mkcol(_propagator->_session, uri.data());
-
- ne_unhook_post_headers(_propagator->_session, post_headers, this);
-
-
- /* Special for mkcol: it returns 405 if the directory already exists.
- * Ignore that error */
- // Wed, 15 Nov 1995 06:25:24 GMT
- QDateTime dt = QDateTime::currentDateTimeUtc();
- _item._responseTimeStamp = dt.toString("hh:mm:ss");
-
- if( updateErrorFromSession( rc , 0, 405 ) ) {
- return;
- }
-
- if (_item._fileId.isEmpty()) {
- // Owncloud 7.0.0 and before did not have a header with the file id.
- // (https://github.com/owncloud/core/issues/9000)
- // So we must get the file id using a PROPFIND
- // This is required so that wa can detect moves even if the folder is renamed on the server
- // while files are still uploading
- ne_propfind_handler *hdl = ne_propfind_create(_propagator->_session, uri.data(), 0);
- ne_propfind_named(hdl, ls_props, propfind_results, this);
- ne_propfind_destroy(hdl);
- }
-
- done(SyncFileItem::Success);
-}
-
-
void PropagateLocalRename::start()
{
if (_propagator->_abortRequested.fetchAndAddRelaxed(0))
return;
+ QString existingFile = _propagator->getFilePath(_item._file);
+ QString targetFile = _propagator->getFilePath(_item._renameTarget);
+
// if the file is a file underneath a moved dir, the _item.file is equal
// to _item.renameTarget and the file is not moved as a result.
if (_item._file != _item._renameTarget) {
emit progress(_item, 0);
- qDebug() << "MOVE " << _propagator->_localDir + _item._file << " => " << _propagator->_localDir + _item._renameTarget;
- QFile file(_propagator->_localDir + _item._file);
+ qDebug() << "MOVE " << existingFile << " => " << targetFile;
if (QString::compare(_item._file, _item._renameTarget, Qt::CaseInsensitive) != 0
&& _propagator->localFileNameClash(_item._renameTarget)) {
@@ -240,7 +151,11 @@ void PropagateLocalRename::start()
.arg(QDir::toNativeSeparators(_item._file)).arg(QDir::toNativeSeparators(_item._renameTarget)) );
return;
}
- if (!file.rename(_propagator->_localDir + _item._file, _propagator->_localDir + _item._renameTarget)) {
+
+ _propagator->addTouchedFile(existingFile);
+ _propagator->addTouchedFile(targetFile);
+ QFile file(existingFile);
+ if (!file.rename(targetFile)) {
done(SyncFileItem::NormalError, file.errorString());
return;
}
@@ -251,7 +166,7 @@ void PropagateLocalRename::start()
// store the rename file name in the item.
_item._file = _item._renameTarget;
- SyncJournalFileRecord record(_item, _propagator->_localDir + _item._renameTarget);
+ SyncJournalFileRecord record(_item, targetFile);
record._path = _item._renameTarget;
if (!_item._isDirectory) { // Directory are saved at the end
@@ -263,79 +178,4 @@ void PropagateLocalRename::start()
done(SyncFileItem::Success);
}
-bool PropagateNeonJob::updateErrorFromSession(int neon_code, ne_request* req, int ignoreHttpCode)
-{
- if( neon_code != NE_OK ) {
- qDebug("Neon error code was %d", neon_code);
- }
-
- QString errorString;
- int httpStatusCode = 0;
-
- switch(neon_code) {
- case NE_OK: /* Success, but still the possiblity of problems */
- if( req ) {
- const ne_status *status = ne_get_status(req);
-
- if (status) {
- if ( status->klass == 2 || status->code == ignoreHttpCode) {
- // Everything is ok, no error.
- return false;
- }
- errorString = QString::fromUtf8( status->reason_phrase );
- httpStatusCode = status->code;
- _item._httpErrorCode = httpStatusCode;
- }
- } else {
- errorString = QString::fromUtf8(ne_get_error(_propagator->_session));
- httpStatusCode = errorString.mid(0, errorString.indexOf(QChar(' '))).toInt();
- _item._httpErrorCode = httpStatusCode;
- if ((httpStatusCode >= 200 && httpStatusCode < 300)
- || (httpStatusCode != 0 && httpStatusCode == ignoreHttpCode)) {
- // No error
- return false;
- }
- }
- // FIXME: classify the error
- done (SyncFileItem::NormalError, errorString);
- return true;
- case NE_ERROR: /* Generic error; use ne_get_error(session) for message */
- errorString = QString::fromUtf8(ne_get_error(_propagator->_session));
- // Check if we don't need to ignore that error.
- httpStatusCode = errorString.mid(0, errorString.indexOf(QChar(' '))).toInt();
- _item._httpErrorCode = httpStatusCode;
- qDebug() << Q_FUNC_INFO << "NE_ERROR" << errorString << httpStatusCode << ignoreHttpCode;
- if (ignoreHttpCode && httpStatusCode == ignoreHttpCode)
- return false;
-
- done(SyncFileItem::NormalError, errorString);
- return true;
- case NE_LOOKUP: /* Server or proxy hostname lookup failed */
- case NE_AUTH: /* User authentication failed on server */
- case NE_PROXYAUTH: /* User authentication failed on proxy */
- case NE_CONNECT: /* Could not connect to server */
- case NE_TIMEOUT: /* Connection timed out */
- done(SyncFileItem::FatalError, QString::fromUtf8(ne_get_error(_propagator->_session)));
- return true;
- case NE_FAILED: /* The precondition failed */
- case NE_RETRY: /* Retry request (ne_end_request ONLY) */
- case NE_REDIRECT: /* See ne_redirect.h */
- default:
- done(SyncFileItem::SoftError, QString::fromUtf8(ne_get_error(_propagator->_session)));
- return true;
- }
- return false;
-}
-
-void UpdateMTimeAndETagJob::start()
-{
- QScopedPointer uri(
- ne_path_escape((_propagator->_remoteDir + _item._file).toUtf8()));
- if (!updateMTimeAndETag(uri.data(), _item._modtime))
- return;
- done(SyncFileItem::Success);
-}
-
-
-
}
diff --git a/src/libsync/propagatorjobs.h b/src/libsync/propagatorjobs.h
index d321cd663..3abe6dcc7 100644
--- a/src/libsync/propagatorjobs.h
+++ b/src/libsync/propagatorjobs.h
@@ -17,59 +17,11 @@
#include "owncloudpropagator.h"
#include
-#include
#include
#include
namespace OCC {
-/* Helper for QScopedPointer<>, to be used as the deleter.
- * QScopePointer will call the right overload of cleanup for the pointer it holds
- */
-struct ScopedPointerHelpers {
- static inline void cleanup(hbf_transfer_t *pointer) { if (pointer) hbf_free_transfer(pointer); }
- static inline void cleanup(ne_request *pointer) { if (pointer) ne_request_destroy(pointer); }
- static inline void cleanup(ne_decompress *pointer) { if (pointer) ne_decompress_destroy(pointer); }
-// static inline void cleanup(ne_propfind_handler *pointer) { if (pointer) ne_propfind_destroy(pointer); }
-};
-
-/*
- * Abstract class for neon job. Lives in the neon thread
- */
-class PropagateNeonJob : public PropagateItemJob {
- Q_OBJECT
-protected:
-
- /* Issue a PROPPATCH and PROPFIND to update the mtime, and fetch the etag
- * Return true in case of success, and false if the PROPFIND failed and the
- * error has been reported
- */
- bool updateMTimeAndETag(const char *uri, time_t);
-
- /* fetch the error code and string from the session
- in case of error, calls done with the error and returns true.
-
- If the HTTP error code is ignoreHTTPError, the error is ignored
- */
- bool updateErrorFromSession(int neon_code = 0, ne_request *req = 0, int ignoreHTTPError = 0);
-
- /*
- * to be called by the progress callback and will wait the amount of time needed.
- */
- void limitBandwidth(qint64 progress, qint64 limit);
-
- QElapsedTimer _lastTime;
- qint64 _lastProgress;
- int _httpStatusCode;
-
-public:
- PropagateNeonJob(OwncloudPropagator* propagator, const SyncFileItem &item)
- : PropagateItemJob(propagator, item), _lastProgress(0), _httpStatusCode(0) {
- moveToThread(propagator->_neonThread);
- }
-
-};
-
class PropagateLocalRemove : public PropagateItemJob {
Q_OBJECT
public:
@@ -83,29 +35,12 @@ public:
void start() Q_DECL_OVERRIDE;
};
-class PropagateRemoteMkdir : public PropagateNeonJob {
- Q_OBJECT
-public:
- PropagateRemoteMkdir (OwncloudPropagator* propagator,const SyncFileItem& item) : PropagateNeonJob(propagator, item) {}
- void start() Q_DECL_OVERRIDE;
-private:
- static void propfind_results(void *userdata, const ne_uri *uri, const ne_prop_result_set *set);
- static void post_headers(ne_request *req, void *userdata, const ne_status *status);
- friend class PropagateDirectory; // So it can access the _item;
-};
class PropagateLocalRename : public PropagateItemJob {
Q_OBJECT
public:
PropagateLocalRename (OwncloudPropagator* propagator,const SyncFileItem& item) : PropagateItemJob(propagator, item) {}
void start() Q_DECL_OVERRIDE;
-};
-
-// To support older owncloud in the
-class UpdateMTimeAndETagJob : public PropagateNeonJob{
- Q_OBJECT
-public:
- UpdateMTimeAndETagJob (OwncloudPropagator* propagator, const SyncFileItem& item) : PropagateNeonJob(propagator, item) {}
- void start() Q_DECL_OVERRIDE;
+ JobParallelism parallelism() Q_DECL_OVERRIDE { return WaitForFinishedInParentDirectory; }
};
diff --git a/src/libsync/syncengine.cpp b/src/libsync/syncengine.cpp
index 76f0ca916..abb8172bb 100644
--- a/src/libsync/syncengine.cpp
+++ b/src/libsync/syncengine.cpp
@@ -181,7 +181,7 @@ QString SyncEngine::csyncErrorToString(CSYNC_STATUS err)
errStr = tr("Aborted by the user");
break;
case CSYNC_STATUS_SERVICE_UNAVAILABLE:
- errStr = tr("The mounted directory is temporary not available on the server");
+ errStr = tr("The mounted directory is temporarily not available on the server");
break;
default:
errStr = tr("An internal error number %1 happened.").arg( (int) err );
@@ -559,6 +559,14 @@ void SyncEngine::startSync()
qDebug() << "=====sync with existing DB";
}
+ qDebug() << "=====Using Qt" << qVersion();
+#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
+ qDebug() << "=====Using SSL library version"
+ << QSslSocket::sslLibraryVersionString().toUtf8().data();
+#endif
+ // Note that this seems to output the OpenSSL build version not runtime version:
+ qDebug() << "=====Using" << ne_version_string();
+
fileRecordCount = _journal->getFileRecordCount(); // this creates the DB if it does not exist yet
bool isUpdateFrom_1_5 = _journal->isUpdateFrom_1_5();
@@ -712,9 +720,6 @@ void SyncEngine::slotDiscoveryJobFinished(int discoveryResult)
}
}
- if (_needsUpdate)
- emit(started());
-
ne_session_s *session = 0;
// that call to set property actually is a get which will return the session
csync_set_module_property(_csync_ctx, "get_dav_session", &session);
@@ -735,8 +740,8 @@ void SyncEngine::slotDiscoveryJobFinished(int discoveryResult)
// do a database commit
_journal->commit("post treewalk");
- _propagator.reset(new OwncloudPropagator (session, _localPath, _remoteUrl, _remotePath,
- _journal, &_thread));
+ _propagator = QSharedPointer(
+ new OwncloudPropagator (session, _localPath, _remoteUrl, _remotePath, _journal, &_thread));
connect(_propagator.data(), SIGNAL(completed(SyncFileItem)),
this, SLOT(slotJobCompleted(SyncFileItem)));
connect(_propagator.data(), SIGNAL(progress(SyncFileItem,quint64)),
@@ -752,6 +757,10 @@ void SyncEngine::slotDiscoveryJobFinished(int discoveryResult)
deleteStaleBlacklistEntries();
_journal->commit("post stale entry removal");
+ // Emit the started signal only after the propagator has been set up.
+ if (_needsUpdate)
+ emit(started());
+
_propagator->start(_syncedItems);
}
@@ -838,9 +847,11 @@ void SyncEngine::finalize()
qDebug() << "CSync run took " << _stopWatch.addLapTime(QLatin1String("Sync Finished"));
_stopWatch.stop();
- _propagator.reset(0);
_syncRunning = false;
emit finished();
+
+ // Delete the propagator only after emitting the signal.
+ _propagator.clear();
}
void SyncEngine::slotProgress(const SyncFileItem& item, quint64 current)
@@ -1126,6 +1137,16 @@ bool SyncEngine::estimateState(QString fn, csync_ftw_type_e t, SyncFileStatus* s
return false;
}
+qint64 SyncEngine::timeSinceFileTouched(const QString& fn) const
+{
+ // This copy is essential for thread safety.
+ QSharedPointer prop = _propagator;
+ if (prop) {
+ return prop->timeSinceFileTouched(fn);
+ }
+ return -1;
+}
+
void SyncEngine::abort()
{
csync_request_abort(_csync_ctx);
diff --git a/src/libsync/syncengine.h b/src/libsync/syncengine.h
index 848a1a6d1..fc01eb549 100644
--- a/src/libsync/syncengine.h
+++ b/src/libsync/syncengine.h
@@ -69,6 +69,12 @@ public:
bool estimateState(QString fn, csync_ftw_type_e t, SyncFileStatus* s);
+ /** Get the ms since a file was touched, or -1 if it wasn't.
+ *
+ * Thread-safe.
+ */
+ qint64 timeSinceFileTouched(const QString& fn) const;
+
signals:
void csyncError( const QString& );
void csyncUnavailable();
@@ -140,7 +146,7 @@ private:
QString _remoteUrl;
QString _remotePath;
SyncJournalDb *_journal;
- QScopedPointer _propagator;
+ QSharedPointer _propagator;
QString _lastDeleted; // if the last item was a path and it has been deleted
QSet _seenFiles;
QThread _thread;
diff --git a/src/libsync/syncjournaldb.cpp b/src/libsync/syncjournaldb.cpp
index d006816e6..78fc2e3cf 100644
--- a/src/libsync/syncjournaldb.cpp
+++ b/src/libsync/syncjournaldb.cpp
@@ -158,11 +158,6 @@ bool SyncJournalDb::checkConnect()
return sqlFail("Set PRAGMA case_sensitivity", pragma1);
}
- // Hide 'em all!
- FileSystem::setFileHidden(databaseFilePath(), true);
- FileSystem::setFileHidden(databaseFilePath() + "-wal", true);
- FileSystem::setFileHidden(databaseFilePath() + "-shm", true);
-
/* Because insert are so slow, e do everything in a transaction, and one need to call commit */
startTransaction();
@@ -349,6 +344,11 @@ bool SyncJournalDb::checkConnect()
// don't start a new transaction now
commitInternal(QString("checkConnect End"), false);
+ // Hide 'em all!
+ FileSystem::setFileHidden(databaseFilePath(), true);
+ FileSystem::setFileHidden(databaseFilePath() + "-wal", true);
+ FileSystem::setFileHidden(databaseFilePath() + "-shm", true);
+
return rc;
}
@@ -1164,8 +1164,9 @@ void SyncJournalDb::setPollInfo(const SyncJournalDb::PollInfo& info)
}
if (info._url.isEmpty()) {
+ qDebug() << "Deleting Poll job" << info._file;
SqlQuery query("DELETE FROM poll WHERE path=?", _db);
- query.bindValue(0, info._file);
+ query.bindValue(1, info._file);
if( !query.exec() ) {
qDebug() << "SQL error in setPollInfo: "<< query.error();
} else {
@@ -1173,9 +1174,9 @@ void SyncJournalDb::setPollInfo(const SyncJournalDb::PollInfo& info)
}
} else {
SqlQuery query("INSERT OR REPLACE INTO poll (path, modtime, pollpath) VALUES( ? , ? , ? )", _db);
- query.bindValue(0, info._file);
- query.bindValue(1, QString::number(info._modtime));
- query.bindValue(2, info._url);
+ query.bindValue(1, info._file);
+ query.bindValue(2, QString::number(info._modtime));
+ query.bindValue(3, info._url);
if( !query.exec() ) {
qDebug() << "SQL error in setPollInfo: "<< query.error();
} else {
diff --git a/src/libsync/syncjournaldb.h b/src/libsync/syncjournaldb.h
index c174ff6cb..2f82f4b4e 100644
--- a/src/libsync/syncjournaldb.h
+++ b/src/libsync/syncjournaldb.h
@@ -154,10 +154,12 @@ private:
QList _avoidReadFromDbOnNextSyncFilter;
};
-bool operator==(const SyncJournalDb::DownloadInfo & lhs,
- const SyncJournalDb::DownloadInfo & rhs);
-bool operator==(const SyncJournalDb::UploadInfo & lhs,
- const SyncJournalDb::UploadInfo & rhs);
+bool OWNCLOUDSYNC_EXPORT
+operator==(const SyncJournalDb::DownloadInfo & lhs,
+ const SyncJournalDb::DownloadInfo & rhs);
+bool OWNCLOUDSYNC_EXPORT
+operator==(const SyncJournalDb::UploadInfo & lhs,
+ const SyncJournalDb::UploadInfo & rhs);
} // namespace OCC
#endif // SYNCJOURNALDB_H
diff --git a/src/libsync/syncjournalfilerecord.h b/src/libsync/syncjournalfilerecord.h
index 3c8e1599e..aac9ce0fb 100644
--- a/src/libsync/syncjournalfilerecord.h
+++ b/src/libsync/syncjournalfilerecord.h
@@ -44,8 +44,9 @@ public:
int _mode;
};
-bool operator==(const SyncJournalFileRecord & lhs,
- const SyncJournalFileRecord & rhs);
+bool OWNCLOUDSYNC_EXPORT
+operator==(const SyncJournalFileRecord & lhs,
+ const SyncJournalFileRecord & rhs);
class SyncJournalBlacklistRecord
{
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 9075449f4..40a076a28 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -27,8 +27,8 @@ endif(UNIX AND NOT APPLE)
owncloud_add_test(CSyncSqlite "")
owncloud_add_test(NetrcParser ../src/cmd/netrcparser.cpp)
-owncloud_add_test(OwnSql ../src/libsync/ownsql.cpp)
-owncloud_add_test(SyncJournalDB ../src/libsync/syncjournaldb.cpp)
+owncloud_add_test(OwnSql "")
+owncloud_add_test(SyncJournalDB "")
diff --git a/test/testfolderwatcher.h b/test/testfolderwatcher.h
index 4fbf77326..c8f9834d3 100644
--- a/test/testfolderwatcher.h
+++ b/test/testfolderwatcher.h
@@ -10,7 +10,7 @@
#include
-#include "folderwatcher_linux.h"
+#include "folderwatcher.h"
#include "utility.h"
using namespace OCC;
@@ -21,9 +21,12 @@ class TestFolderWatcher : public QObject
public slots:
void slotFolderChanged( const QString& path ) {
- qDebug() << "COMPARE: " << path << _checkMark;
- QVERIFY(_checkMark == path);
- _checkMark.clear();
+ if (_skipNotifications.contains(path)) {
+ return;
+ }
+ if (_requiredNotifications.contains(path)) {
+ _receivedNotifications.insert(path);
+ }
}
void slotEnd() { // in case something goes wrong...
@@ -36,7 +39,16 @@ private:
FolderWatcher *_watcher;
QEventLoop _loop;
QTimer _timer;
- QString _checkMark;
+ QSet _requiredNotifications;
+ QSet _receivedNotifications;
+ QSet _skipNotifications;
+
+ void processAndWait()
+ {
+ _loop.processEvents();
+ Utility::usleep(200000);
+ _loop.processEvents();
+ }
private slots:
void initTestCase() {
@@ -52,68 +64,105 @@ private slots:
rootDir.mkpath(_root + "/a2/b3/c3");
Utility::writeRandomFile( _root+"/a1/random.bin");
Utility::writeRandomFile( _root+"/a1/b2/todelete.bin");
- Utility::writeRandomFile( _root+"/a2/movefile");
+ Utility::writeRandomFile( _root+"/a2/renamefile");
+ Utility::writeRandomFile( _root+"/a1/movefile");
_watcher = new FolderWatcher(_root);
- QObject::connect(_watcher, SIGNAL(folderChanged(QString)), this, SLOT(slotFolderChanged(QString)));
- _timer.singleShot(3000, this, SLOT(slotEnd()));
+ QObject::connect(_watcher, SIGNAL(pathChanged(QString)), this, SLOT(slotFolderChanged(QString)));
+ _timer.singleShot(5000, this, SLOT(slotEnd()));
+ }
+
+ void init()
+ {
+ _receivedNotifications.clear();
+ _requiredNotifications.clear();
+ _skipNotifications.clear();
+ }
+
+ void checkNotifications()
+ {
+ processAndWait();
+ QCOMPARE(_receivedNotifications, _requiredNotifications);
}
void testACreate() { // create a new file
+ QString file(_root + "/foo.txt");
QString cmd;
- _checkMark = _root;
- cmd = QString("echo \"xyz\" > %1/foo.txt").arg(_root);
+ _requiredNotifications.insert(file);
+ cmd = QString("echo \"xyz\" > %1").arg(file);
qDebug() << "Command: " << cmd;
system(cmd.toLocal8Bit());
- _loop.processEvents();
- QVERIFY(_checkMark.isEmpty()); // the slot clears the checkmark.
+ checkNotifications();
}
void testATouch() { // touch an existing file.
+ QString file(_root + "/a1/random.bin");
+ _requiredNotifications.insert(file);
+#ifdef Q_OS_WIN
+ Utility::writeRandomFile(QString("%1/a1/random.bin").arg(_root));
+#else
QString cmd;
- cmd = QString("/usr/bin/touch %1/a1/random.bin").arg(_root);
- _checkMark = _root+"/a1";
+ cmd = QString("/usr/bin/touch %1").arg(file);
qDebug() << "Command: " << cmd;
system(cmd.toLocal8Bit());
+#endif
- _loop.processEvents();
- QVERIFY(_checkMark.isEmpty()); // the slot clears the checkmark.
+ checkNotifications();
}
void testCreateADir() {
- _checkMark = _root+"/a1/b1";
+ QString file(_root+"/a1/b1/new_dir");
+ _requiredNotifications.insert(file);
+ //_skipNotifications.insert(_root + "/a1/b1/new_dir");
QDir dir;
- dir.mkdir( _root + "/a1/b1/new_dir");
- QVERIFY(QFile::exists(_root + "/a1/b1/new_dir"));
- _loop.processEvents();
- QVERIFY(_checkMark.isEmpty()); // the slot clears the checkmark.
+ dir.mkdir(file);
+ QVERIFY(QFile::exists(file));
+
+ checkNotifications();
}
void testRemoveADir() {
- _checkMark = _root+"/a1/b3";
+ QString file(_root+"/a1/b3/c3");
+ _requiredNotifications.insert(file);
QDir dir;
- QVERIFY(dir.rmdir(_root+"/a1/b3/c3"));
- _loop.processEvents();
- QVERIFY(_checkMark.isEmpty()); // the slot clears the checkmark.
+ QVERIFY(dir.rmdir(file));
+
+ checkNotifications();
}
void testRemoveAFile() {
- _checkMark = _root+"/a1/b2";
- QVERIFY(QFile::exists(_root+"/a1/b2/todelete.bin"));
- QFile::remove(_root+"/a1/b2/todelete.bin");
- QVERIFY(!QFile::exists(_root+"/a1/b2/todelete.bin"));
- _loop.processEvents();
- QVERIFY(_checkMark.isEmpty()); // the slot clears the checkmark.
+ QString file(_root+"/a1/b2/todelete.bin");
+ _requiredNotifications.insert(file);
+ QVERIFY(QFile::exists(file));
+ QFile::remove(file);
+ QVERIFY(!QFile::exists(file));
+
+ checkNotifications();
+ }
+
+ void testRenameAFile() {
+ QString file1(_root+"/a2/renamefile");
+ QString file2(_root+"/a2/renamefile.renamed");
+ _requiredNotifications.insert(file1);
+ _requiredNotifications.insert(file2);
+ QVERIFY(QFile::exists(file1));
+ QFile::rename(file1, file2);
+ QVERIFY(QFile::exists(file2));
+
+ checkNotifications();
}
void testMoveAFile() {
- _checkMark = _root+"/a2";
- QVERIFY(QFile::exists(_root+"/a2/movefile"));
- QFile::rename(_root+"/a2/movefile", _root+"/a2/movefile.renamed" );
- QVERIFY(QFile::exists(_root+"/a2/movefile.renamed"));
- _loop.processEvents();
- QVERIFY(_checkMark.isEmpty()); // the slot clears the checkmark.
+ QString old_file(_root+"/a1/movefile");
+ QString new_file(_root+"/a2/movefile.renamed");
+ _requiredNotifications.insert(old_file);
+ _requiredNotifications.insert(new_file);
+ QVERIFY(QFile::exists(old_file));
+ QFile::rename(old_file, new_file);
+ QVERIFY(QFile::exists(new_file));
+
+ checkNotifications();
}
void cleanupTestCase() {
diff --git a/translations/mirall_ca.ts b/translations/mirall_ca.ts
index fff6dd6cf..915f77fab 100644
--- a/translations/mirall_ca.ts
+++ b/translations/mirall_ca.ts
@@ -386,12 +386,12 @@ Temps restant total %5
Activitat de sincronització
-
+
-
+
@@ -400,17 +400,17 @@ Això podria ser perquè la carpeta ha estat reconfigurada silenciosament, o que
Esteu segur que voleu executar aquesta operació?
-
+
Esborra tots els fitxers?
-
+
Esborra tots els fitxers
-
+
Mantén els fitxers
@@ -637,22 +637,22 @@ Esteu segur que voleu executar aquesta operació?
Mirall::GETFileJob
-
+
No s'ha rebut cap E-Tag del servidor, comproveu el Proxy/Gateway
-
+
Hem rebut un E-Tag diferent en la represa. Es comprovarà la pròxima vegada.
-
+
-
+
Temps de connexió excedit
@@ -1113,8 +1113,12 @@ No és aconsellada usar-la.
-
- No s'ha pogut connectar de forma segura. Voleu connectar sense encriptació (no recomanat)?
+
+
@@ -1306,27 +1310,27 @@ No és aconsellada usar-la.
Mirall::PropagateDownloadFileLegacy
-
+
L'usuari ha aturat la sincronització.
-
+
No s'ha rebut cap E-Tag del servidor, comproveu el Proxy/Gateway
-
+
hem rebut un E-Tag diferent en la represa. Es comprovarà la pròxima vegada.
-
+
-
+
El fitxer %1 no es pot baixar perquè hi ha un xoc amb el nom d'un fitxer local!
@@ -1334,12 +1338,17 @@ No és aconsellada usar-la.
Mirall::PropagateDownloadFileQNAM
-
+
El fitxer %1 no es pot baixar perquè hi ha un xoc amb el nom d'un fitxer local!
-
+
+
+
+
+
+
@@ -1425,18 +1434,18 @@ No és aconsellada usar-la.
Mirall::PropagateUploadFileLegacy
-
-
+
+
El fitxer local ha canviat durant la sincronització, es sincronitzarà quan arribi complet
-
+
L'usuari ha aturat la sincronització.
-
+
El fitxer s'ha editat localment però és part d'una compartició només de lectura. S'ha restaurat i la vostra edició és en el fitxer conflictiu.
@@ -1444,23 +1453,23 @@ No és aconsellada usar-la.
Mirall::PropagateUploadFileQNAM
-
+
El fitxer s'ha editat localment però és part d'una compartició només de lectura. S'ha restaurat i la vostra edició és en el fitxer en conflicte.
-
+
El fitxer local s'ha eliminat durant la sincronització.
-
+
El fitxer local ha canviat durant la sincronització.
-
+
El servidor no ha reconegut l'últim fragment. (No hi havia e-Tag)
@@ -1538,16 +1547,27 @@ No és aconsellada usar-la.
L'estat de sincronització s'ha copiat al porta-retalls.
-
-
- Actualment no s'ha ignorat cap fitxer a causa d'errors anteriors.
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
Mirall::SelectiveSyncDialog
@@ -1634,12 +1654,12 @@ No és aconsellada usar-la.
Mirall::ShibbolethCredentials
-
+
Error d'accés
-
+
Cal identificar-se com a usuari %1
@@ -2047,69 +2067,69 @@ No és aconsellada usar-la.
El fitxer conté caràcters no vàlids que no es poden sincronitzar entre plataformes.
-
+
No es pot inicialitzar un periòdic de sincronització
-
+
No es pot obrir el diari de sincronització
-
-
+
+
-
+
No es permet perquè no teniu permisos per afegir subcarpetes en aquesta carpeta
-
+
No es permet perquè no teniu permisos per afegir una carpeta inferior
-
+
No es permet perquè no teniu permisos per afegir fitxers en aquesta carpeta
-
+
No es permet pujar aquest fitxer perquè només és de lectura en el servidor, es restaura
-
-
+
+
No es permet l'eliminació, es restaura
-
+
Fitxers locals i carpeta compartida esborrats.
-
+
No es permet moure'l, l'element es restaura
-
+
No es permet moure perquè %1 només és de lectura
-
+
el destí
-
+
l'origen
diff --git a/translations/mirall_cs.ts b/translations/mirall_cs.ts
index f331fea6e..7b85addc6 100644
--- a/translations/mirall_cs.ts
+++ b/translations/mirall_cs.ts
@@ -198,7 +198,7 @@
- Hledám '%1'
+ Prohledávám '%1'
@@ -386,12 +386,12 @@ Celkový zbývající čas %5
Průběh synchronizace
-
+
Nezdařilo se přečtení systémového exclude souboru
-
+
@@ -400,17 +400,17 @@ Toto může být způsobeno změnou v nastavení synchronizace složky nebo tím
Opravdu chcete provést tuto akci?
-
+
Odstranit všechny soubory?
-
+
Odstranit všechny soubory
-
+
Ponechat soubory
@@ -637,22 +637,22 @@ Opravdu chcete provést tuto akci?
Mirall::GETFileJob
-
+
Ze serveru nebyl obdržen E-Tag, zkontrolujte proxy/bránu
-
+
Obdrželi jsme jiný E-Tag pro pokračování. Zkusím znovu příště.
-
+
Server odpověděl chybným rozsahem obsahu
-
+
Vypršel čas spojení
@@ -1113,8 +1113,16 @@ Nedoporučuje se jí používat.
-
- Nemohu se připojit zabezpečeně. Přejete si místo toho připojit nezabezpečeně (nedoporučuje se)?
+
+ Nelze se připojit zabezpečeně:
+
+%1
+
+Chcete se místo toho připojit nezabezpečeně (nedoporučuje se)?
@@ -1306,27 +1314,27 @@ Nedoporučuje se jí používat.
Mirall::PropagateDownloadFileLegacy
-
+
Synchronizace zrušena uživatelem.
-
+
Ze serveru nebyl obdržen E-Tag, zkontrolujte proxy/bránu
-
+
Obdrželi jsme jiný E-Tag pro pokračování. Zkusím znovu příště.
-
+
Server odpověděl chybným rozsahem obsahu
-
+
Soubor %1 nemohl být stažen z důvodu kolize názvu se souborem v místním systému!
@@ -1334,12 +1342,17 @@ Nedoporučuje se jí používat.
Mirall::PropagateDownloadFileQNAM
-
+
Soubor %1 nemohl být stažen z důvodu kolize názvu se souborem v místním systému!
-
+
+
+ Soubor nemohl být kompletně stažen.
+
+
+
Soubor %1 nemohl být uložen z důvodu kolize názvu se souborem v místním systému!
@@ -1380,7 +1393,7 @@ Nedoporučuje se jí používat.
- Nezdařilo se odstranění adresáře '%1';
+ Nepodařilo se odstranit adresář '%1';
@@ -1425,18 +1438,18 @@ Nedoporučuje se jí používat.
Mirall::PropagateUploadFileLegacy
-
-
+
+
Místní soubor byl změněn během synchronizace, bude sesynchronizován, jakmile bude kompletní
-
+
Synchronizace zrušena uživatelem.
-
+
Soubor zde byl editován, ale je součástí sdílení pouze pro čtení. Původní soubor byl obnoven a editovaná verze je uložena v konfliktním souboru.
@@ -1444,23 +1457,23 @@ Nedoporučuje se jí používat.
Mirall::PropagateUploadFileQNAM
-
+
Soubor zde byl editován, ale je součástí sdílení pouze pro čtení. Původní soubor byl obnoven a editovaná verze je uložena v konfliktním souboru.
-
+
Místní soubor byl odstraněn během synchronizace.
-
+
Místní soubor byl změněn během synchronizace.
-
+
Server nepotvrdil poslední část dat. (Nebyl nalezen e-tag)
@@ -1538,18 +1551,32 @@ Nedoporučuje se jí používat.
Stav synchronizace byl zkopírován do schránky.
-
-
- Nyní nejsou v seznamu ignorovaných žádné soubory kvůli předchozím chybám.
+
+
+ V současné době nejsou na černé listině žádné soubory kvůli předchozím chybovým stavům a neprobíhá žádné stahování.
-
+
- %n soubor je ignorován kvůli předchozím chybovým hlášením.
-Zkuste ho znovu synchronizovat.%n soubory jsou ignorovány kvůli předchozím chybovým hlášením.
-Zkuste je znovu synchronizovat.%n souborů je ignorováno kvůli předchozím chybovým hlášením.
-Zkuste je znovu synchronizovat.
+
+ %n soubor je ignorován kvůli předchozím chybovým hlášením.
+%n soubory jsou ignorovány kvůli předchozím chybovým hlášením.
+%n souborů je ignorováno kvůli předchozím chybovým hlášením.
+
+
+
+
+
+ %n soubor je částečně stažený.
+%n soubory jsou částečně stažené.
+%n souborů je částečně staženo.
+
+
+
+
+
+ Zkuste je znovu synchronizovat.
@@ -1562,7 +1589,7 @@ Zkuste je znovu synchronizovat.
- Neoznačené adresáře budou <b>odstraněny</b> z lokálního souborového systému a nebudou již synchronizovány na tento počítač
+ Neoznačené adresáře budou <b>odstraněny</b> z místního souborového systému a nebudou již synchronizovány na tento počítač
@@ -1637,12 +1664,12 @@ Zkuste je znovu synchronizovat.
Mirall::ShibbolethCredentials
-
+
Chyba přihlášení
-
+
Musíte se přihlásit jako uživatel %1
@@ -2050,69 +2077,69 @@ Zkuste je znovu synchronizovat.
Soubor obsahuje alespoň jeden neplatný znak, který narušuje synchronizaci v prostředí více platforem.
-
+
Nemohu inicializovat synchronizační žurnál.
-
+
Nelze otevřít synchronizační žurnál
-
-
+
+
Ignorováno podle nastavení "vybrat co synchronizovat"
-
+
Není povoleno, protože nemáte oprávnění vytvářet podadresáře v tomto adresáři.
-
+
Není povoleno, protože nemáte oprávnění vytvořit rodičovský adresář
-
+
Není povoleno, protože nemáte oprávnění přidávat soubory do tohoto adresáře
-
+
Není povoleno nahrát tento soubor, protože je na serveru uložen pouze pro čtení, obnovuji
-
-
+
+
Odstranění není povoleno, obnovuji
-
+
Místní soubory a sdílený adresář byly odstraněny.
-
+
Přesun není povolen, položka obnovena
-
+
Přesun není povolen, protože %1 je pouze pro čtení
-
+
cílové umístění
-
+
zdroj
@@ -2248,7 +2275,7 @@ Zkuste je znovu synchronizovat.
- Hledám '%1'
+ Prohledávám '%1'
diff --git a/translations/mirall_de.ts b/translations/mirall_de.ts
index b6572315e..f94a87abe 100644
--- a/translations/mirall_de.ts
+++ b/translations/mirall_de.ts
@@ -387,12 +387,12 @@ Gesamtzeit übrig %5
Synchronisierungsaktivität
-
+
Systemeigene Ausschlussdatei kann nicht gelesen werden
-
+
@@ -401,17 +401,17 @@ Vielleicht wurde der Ordner neu konfiguriert, oder alle Dateien wurden händisch
Sind Sie sicher, dass sie diese Operation durchführen wollen?
-
+
Alle Dateien löschen?
-
+
Lösche alle Dateien
-
+
Dateien behalten
@@ -461,7 +461,7 @@ Sind Sie sicher, dass sie diese Operation durchführen wollen?
- Setup-Fehler.
+ Installationsfehler.
@@ -638,22 +638,22 @@ Sind Sie sicher, dass sie diese Operation durchführen wollen?
Mirall::GETFileJob
-
+
Kein E-Tag vom Server empfangen, bitte Proxy / Gateway überprüfen
-
+
Es wurde ein unterschiedlicher E-Tag zum Fortfahren empfangen. Bitte beim nächsten mal nochmal versuchen.
-
+
Server hat falschen Bereich für den Inhalt zurück gegeben
-
+
Zeitüberschreitung der Verbindung
@@ -744,7 +744,7 @@ Aktivierte Elemente werden ebenfalls gelöscht, wenn diese das Löschen eines Ve
- Konnte Datei nicht öffnen
+ Datei konnte nicht geöffnet werden
@@ -840,7 +840,7 @@ Aktivierte Elemente werden ebenfalls gelöscht, wenn diese das Löschen eines Ve
- <nobr>Datei '%1'<br/>kann nicht zum Schreiben geöffnet werden.<br/><br/>Die Protokolldatei kann <b>nicht</b> gespeichert werden!</nobr>
+ <nobr>Datei »%1«<br/>kann nicht zum Schreiben geöffnet werden.<br/><br/>Die Protokolldatei kann <b>nicht</b> gespeichert werden!</nobr>
@@ -1114,8 +1114,16 @@ Es ist nicht ratsam, diese zu benutzen.
-
- Die Verbindung kann nicht sicher hergestellt werden. Möchten Sie stattdessen unverschlüsselt verbinden (nicht empfohlen)?
+
+ Die Verbindung kann nicht sicher hergestellt werden:
+
+%1
+
+Möchten Sie stattdessen unverschlüsselt verbinden (nicht empfohlen)?
@@ -1252,7 +1260,7 @@ Es ist nicht ratsam, diese zu benutzen.
- Kann den Ordner nicht entfernen und sichern, da der Ordner oder einer seiner Dateien in einem anderen Programm geöffnet ist. Bitte schließen Sie den Ordner ode die Datei oder beenden Sie das Setup.
+ Der Ordner kann nicht entfernt und gesichert werden, da der Ordner oder einer seiner Dateien in einem anderen Programm geöffnet ist. Bitte schließen Sie den Ordner oder die Datei oder beenden Sie die Installation.
@@ -1307,27 +1315,27 @@ Es ist nicht ratsam, diese zu benutzen.
Mirall::PropagateDownloadFileLegacy
-
+
Synchronisation wurde durch den Nutzer abgebrochen.
-
+
Kein E-Tag vom Server empfangen, bitte Proxy / Gateway überprüfen
-
+
Es wurde ein unterschiedlicher E-Tag zum Fortfahren empfangen. Bitte beim nächsten mal nochmal versuchen.
-
+
Server hat falschen Bereich für den Inhalt zurück gegeben
-
+
Die Datei %1 kann aufgrund eines Konfliktes mit dem lokalen Dateinamen nicht herunter geladen werden!
@@ -1335,12 +1343,17 @@ Es ist nicht ratsam, diese zu benutzen.
Mirall::PropagateDownloadFileQNAM
-
+
Die Datei %1 kann aufgrund eines Konfliktes mit dem lokalen Dateinamen nicht herunter geladen werden!
-
+
+
+ Die Datei konnte nicht vollständig herunter geladen werden.
+
+
+
Die Datei %1 kann aufgrund eines Konfliktes mit dem lokalen Dateinamen nicht gespeichert geladen werden!
@@ -1426,18 +1439,18 @@ Es ist nicht ratsam, diese zu benutzen.
Mirall::PropagateUploadFileLegacy
-
-
+
+
Eine lokale Datei wurde während der Synchronisation geändert, synchronisieren Sie nochmals sobald die aktuelle Datei vollständig angekommen ist
-
+
Synchronisation wurde durch den Nutzer abgebrochen.
-
+
Die Datei wurde von einer Nur-Lese-Freigabe lokal bearbeitet. Die Datei wurde wiederhergestellt und Ihre Bearbeitung ist in der Konflikte-Datei.
@@ -1445,23 +1458,23 @@ Es ist nicht ratsam, diese zu benutzen.
Mirall::PropagateUploadFileQNAM
-
+
Die Datei wurde von einer Nur-Lese-Freigabe lokal bearbeitet. Die Datei wurde wiederhergestellt und Ihre Bearbeitung ist in der Konflikte-Datei.
-
+
Die lokale Datei wurde während der Synchronisation gelöscht.
-
+
Eine lokale Datei wurde während der Synchronisation geändert.
-
+
Der Server hat den letzten Block nicht bestätigt. (Der E-Tag war nicht vorhanden)
@@ -1539,17 +1552,28 @@ Es ist nicht ratsam, diese zu benutzen.
Der Synchronisationsstatus wurde in die Zwischenablage kopiert.
-
-
- Aktuell werden keine Dateien, aufgrund vorheriger Fehler, ignoriert.
+
+
+ Aktuell werden keine Dateien, aufgrund vorheriger Fehler und keine laufenden Downloads, ignoriert.
-
+
- %n Datei wurde aufgrund eines vorherigen Fehlers ignoriert.
-Versuchen Sie diese nochmals zu synchronisieren.%n Dateien werden aufgrund vorheriger Fehler ignoriert.
-Versuchen Sie diese nochmals zu synchronisieren.
+
+ %n Datei wird aufgrund vorheriger Fehler ignoriert.%n Dateien werden aufgrund vorheriger Fehler ignoriert.
+
+
+
+
+
+ %n Datei ist teilweise heruntergeladen.%n Dateien sind teilweise heruntergeladen.
+
+
+
+
+
+ Versuchen, diese nochmals zu synchronisieren.
@@ -1637,12 +1661,12 @@ Versuchen Sie diese nochmals zu synchronisieren.
Mirall::ShibbolethCredentials
-
+
Log-In Fehler
-
+
Sie müssen sich als %1 einloggen
@@ -2050,69 +2074,69 @@ Versuchen Sie diese nochmals zu synchronisieren.
Die Datei beinhaltet ungültige Zeichen und kann nicht plattformübergreifend synchronisiert werden.
-
+
Synchronisationsbericht konnte nicht initialisiert werden.
-
+
Synchronisationsbericht kann nicht geöffnet werden
-
-
+
+
Aufgrund der »Zu synchronisierende Elemente auswählen«-Sperrliste ignoriert
-
+
Nicht erlaubt, da Sie keine Rechte zur Erstellung von Unterordnern haben
-
+
Nicht erlaubt, da Sie keine Rechte zur Erstellung von Hauptordnern haben
-
+
Nicht erlaubt, da Sie keine Rechte zum Hinzufügen von Dateien in diesen Ordner haben
-
+
Das Hochladen dieser Datei ist nicht erlaubt, da die Datei auf dem Server schreibgeschützt ist, Wiederherstellung
-
-
+
+
Löschen nicht erlaubt, Wiederherstellung
-
+
Lokale Dateien und Freigabeordner wurden entfernt.
-
+
Verschieben nicht erlaubt, Element wiederhergestellt
-
+
Verschieben nicht erlaubt, da %1 schreibgeschützt ist
-
+
Das Ziel
-
+
Die Quelle
@@ -2183,7 +2207,7 @@ Versuchen Sie diese nochmals zu synchronisieren.
- Ordner '%1' öffnen
+ Ordner »%1« öffnen
@@ -2641,7 +2665,7 @@ Versuchen Sie diese nochmals zu synchronisieren.
- Setup-Fehler
+ Installationsfehler
diff --git a/translations/mirall_el.ts b/translations/mirall_el.ts
index 670822226..24d6f07ee 100644
--- a/translations/mirall_el.ts
+++ b/translations/mirall_el.ts
@@ -387,12 +387,12 @@ Total time left %5
Δραστηριότητα Συγχρονισμού
-
+
Αδυναμία ανάγνωσης αρχείου αποκλεισμού συστήματος
-
+
@@ -401,17 +401,17 @@ Are you sure you want to perform this operation?
Είστε σίγουροι ότι θέλετε να εκτελέσετε αυτή τη λειτουργία;
-
+
Αφαίρεση Όλων των Αρχείων;
-
+
Αφαίρεση όλων των αρχείων
-
+
Διατήρηση αρχείων
@@ -638,22 +638,22 @@ Are you sure you want to perform this operation?
Mirall::GETFileJob
-
+
Δεν ελήφθη E-Tag από το διακομιστή, ελέγξτε το διακομιστή μεσολάβησης/πύλη
-
+
Ελήφθη διαφορετικό E-Tag για συνέχιση. Επανάληψη την επόμενη φορά.
-
+
Ο διακομιστής επέστρεψε εσφαλμένο πεδίο τιμών
-
+
Λήξη Χρόνου Αναμονής Σύνδεσης
@@ -1114,8 +1114,12 @@ It is not advisable to use it.
-
- Αδυναμία ασφαλούς σύνδεσης. Θα θέλατε να συνδεθείτε χωρίς κρυπτογράφηση παρ'όλα αυτά (δεν προτείνεται);
+
+
@@ -1307,27 +1311,27 @@ It is not advisable to use it.
Mirall::PropagateDownloadFileLegacy
-
+
Ο συγχρονισμός ματαιώθηκε από τον χρήστη.
-
+
Δεν ελήφθη E-Tag από τον διακομιστή, ελέγξτε τον διακομιστή μεσολάβησης/πύλη
-
+
Ελήφθη διαφορετικό E-Tag για συνέχιση. Επανάληψη την επόμενη φορά.
-
+
Ο διακομιστής επέστρεψε εσφαλμένο πεδίο τιμών
-
+
Το αρχείο %1 δεν είναι δυνατό να ληφθεί λόγω διένεξης με το όνομα ενός τοπικού αρχείου!
@@ -1335,12 +1339,17 @@ It is not advisable to use it.
Mirall::PropagateDownloadFileQNAM
-
+
Το αρχείο %1 δεν είναι δυνατό να ληφθεί λόγω διένεξης με το όνομα ενός τοπικού αρχείου!
-
+
+
+
+
+
+
@@ -1376,12 +1385,12 @@ It is not advisable to use it.
-
+ Σφάλμα αφαίρεσης '%1': %2;
-
+ Αδυναμία αφαίρεσης καταλόγου '%1';
@@ -1426,18 +1435,18 @@ It is not advisable to use it.
Mirall::PropagateUploadFileLegacy
-
-
+
+
Το τοπικό αρχείο τροποποιήθηκε κατά τη διάρκεια του συγχρονισμού, θα συγχρονιστεί και πάλι όταν φτάσει πλήρως
-
+
Ο συγχρονισμός ματαιώθηκε από τον χρήστη.
-
+
Το αρχείο υπέστη επεξεργασία τοπικά αλλά είναι τμήμα ενός διαμοιρασμένου καταλόγου μόνο για ανάγνωση. Επαναφέρθηκε και το επεξεργασμένο βρίσκεται στο αρχείο συγκρούσεων.
@@ -1445,23 +1454,23 @@ It is not advisable to use it.
Mirall::PropagateUploadFileQNAM
-
+
Το αρχείο υπέστη επεξεργασία τοπικά αλλά είναι τμήμα ενός διαμοιρασμένου καταλόγου μόνο για ανάγνωση. Επαναφέρθηκε και το επεξεργασμένο βρίσκεται στο αρχείο συγκρούσεων.
-
+
Το τοπικό αρχείο αφαιρέθηκε κατά το συγχρονισμό.
-
+
Το τοπικό αρχείο τροποποιήθηκε κατά τον συγχρονισμό.
-
+
Ο διακομιστής δεν αναγνώρισε το τελευταίο τμήμα. (Δεν υπήρχε e-tag)
@@ -1539,17 +1548,26 @@ It is not advisable to use it.
Η κατάσταση συγχρονισμού αντιγράφηκε στο πρόχειρο.
-
-
- Προς το παρόν κανένα αρχείο δεν θα αγνοηθεί λόγω προηγούμενων σφαλμάτων.
+
+
+
-
+
- %n αρχείο αγνοήθηκε λόγω προηγούμενων σφαλμάτων.
-Προσπαθείστε να τα συγχρονίσετε ξανά.%n αρχεία αγνοήθηκαν λόγω προηγούμενων σφαλμάτων.
-Προσπαθείστε να τα συγχρονίσετε ξανά.
+
+
+
+
+
+
+
+
+
+
+
+ Προσπάθεια για συγχρονισμό αυτών ξανά.
@@ -1637,12 +1655,12 @@ It is not advisable to use it.
Mirall::ShibbolethCredentials
-
+
Σφάλμα Σύνδεσης
-
+
Πρέπει να εισέλθετε σαν χρήστης %1
@@ -2050,69 +2068,69 @@ It is not advisable to use it.
Το αρχείο περιέχει άκυρους χαρακτήρες που δεν μπορούν να συγχρονιστούν σε όλα τα συστήματα.
-
+
Αδυναμία προετοιμασίας αρχείου συγχρονισμού.
-
+
Αδυναμία ανοίγματος του αρχείου συγχρονισμού
-
-
+
+
Αγνοήθηκε εξαιτίας της μαύρης λίστας "διάλεξε τι να συγχρονιστεί"
-
+
Δεν επιτρέπεται επειδή δεν έχετε δικαιώματα να προσθέσετε υπο-καταλόγους σε αυτό τον κατάλογο
-
+
Δεν επιτρέπεται επειδή δεν έχετε δικαιώματα να προσθέσετε στο γονεϊκό κατάλογο
-
+
Δεν επιτρέπεται επειδή δεν έχεται δικαιώματα να προσθέσετε αρχεία σε αυτόν τον κατάλογο
-
+
Δεν επιτρέπεται να μεταφορτώσετε αυτό το αρχείο επειδή είναι μόνο για ανάγνωση στο διακομιστή, αποκατάσταση σε εξέλιξη
-
-
+
+
Δεν επιτρέπεται η αφαίρεση, αποκατάσταση σε εξέλιξη
-
+
Οι τοπικοί φάκελοι και ο φάκελος κοινής χρήσης αφαιρέθηκαν.
-
+
Η μετακίνηση δεν επιτρέπεται, το αντικείμενο αποκαταστάθηκε
-
+
Η μετακίνηση δεν επιτρέπεται επειδή το %1 είναι μόνο για ανάγνωση
-
+
ο προορισμός
-
+
η προέλευση
diff --git a/translations/mirall_en.ts b/translations/mirall_en.ts
index 735f443a0..abde7ab52 100644
--- a/translations/mirall_en.ts
+++ b/translations/mirall_en.ts
@@ -387,29 +387,29 @@ Total time left %5
-
+
-
+
-
+
-
+
-
+
@@ -636,22 +636,22 @@ Are you sure you want to perform this operation?
Mirall::GETFileJob
-
+
-
+
-
+
-
+
@@ -1108,7 +1108,11 @@ It is not advisable to use it.
-
+
@@ -1301,27 +1305,27 @@ It is not advisable to use it.
Mirall::PropagateDownloadFileLegacy
-
+
-
+
-
+
-
+
-
+
@@ -1329,12 +1333,17 @@ It is not advisable to use it.
Mirall::PropagateDownloadFileQNAM
-
+
-
+
+
+
+
+
+
@@ -1420,18 +1429,18 @@ It is not advisable to use it.
Mirall::PropagateUploadFileLegacy
-
-
+
+
-
+
-
+
@@ -1439,23 +1448,23 @@ It is not advisable to use it.
Mirall::PropagateUploadFileQNAM
-
+
-
+
-
+
-
+
@@ -1533,19 +1542,33 @@ It is not advisable to use it.
-
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Mirall::SelectiveSyncDialog
@@ -1632,12 +1655,12 @@ It is not advisable to use it.
Mirall::ShibbolethCredentials
-
+
-
+
@@ -2043,69 +2066,69 @@ It is not advisable to use it.
-
+
-
+
-
-
+
+
-
+
-
+
-
+
-
+
-
-
+
+
-
+
-
+
-
+
-
+
-
+
diff --git a/translations/mirall_es.ts b/translations/mirall_es.ts
index 382c6b290..8ea2cb097 100644
--- a/translations/mirall_es.ts
+++ b/translations/mirall_es.ts
@@ -386,12 +386,12 @@ Tiempo restante %5
Actividad en la Sincronización
-
+
No se pudo leer el archivo de exclusión del sistema
-
+
@@ -400,17 +400,17 @@ Esto se puede deber a que la carpeta fue reconfigurada de forma silenciosa o a q
Está seguro de que desea realizar esta operación?
-
+
Eliminar todos los archivos?
-
+
Eliminar todos los archivos
-
+
Conservar archivos
@@ -637,22 +637,22 @@ Está seguro de que desea realizar esta operación?
Mirall::GETFileJob
-
+
No se recibió ninguna e-tag del servidor, revisar el proxy/gateway
-
+
Se recibió una e-tag distinta para reanudar. Se intentará nuevamente.
-
+
El servidor devolvió un content-range erróneo
-
+
Tiempo de espera de conexión agotado
@@ -1113,8 +1113,16 @@ No se recomienda usarlo.
-
- No se pudo hacer una conexión segura. ¿Desea conectarse de forma insegura (no recomendado)?
+
+ No se pudo conectar cifrado:
+
+%1
+
+Desea conectar a cambio sin encriptación (no recomendado)?
@@ -1306,27 +1314,27 @@ No se recomienda usarlo.
Mirall::PropagateDownloadFileLegacy
-
+
La sincronización ha sido Interrumpida por el usuario
-
+
No se recibió ninguna e-tag del servidor, revisar el proxy/gateway
-
+
Se recibió una e-tag distinta para reanudar. Se intentará nuevamente.
-
+
El servidor devolvió un content-range erróneo
-
+
¡El fichero %1 no puede ser descargado debido al nombre de la clase de un fichero local!
@@ -1334,12 +1342,17 @@ No se recomienda usarlo.
Mirall::PropagateDownloadFileQNAM
-
+
¡El fichero %1 no puede ser descargado debido al nombre de la clase de un fichero local!
-
+
+
+ No se pudo descargar el archivo completamente.
+
+
+
¡ El fichero %1 no puede guardar debido a un conflicto con el nombre de otro fichero local !
@@ -1425,18 +1438,18 @@ No se recomienda usarlo.
Mirall::PropagateUploadFileLegacy
-
-
+
+
Fichero local modificado mientras se sincronizaba, sincronice otra vez cuando termine de editar
-
+
La sincronización ha sido Interrumpida por el usuario
-
+
El archivo fue modificado localmente, pero es parte de una carpeta compartida en modo de solo lectura. Ha sido recuperado y tu modificación está en el archivo de conflicto.
@@ -1444,23 +1457,23 @@ No se recomienda usarlo.
Mirall::PropagateUploadFileQNAM
-
+
El archivo fue modificado localmente, pero es parte de una carpeta compartida en modo de solo lectura. Ha sido recuperado y tu modificación está en el archivo de conflicto.
-
+
El archivo local fue eliminado durante la sincronización.
-
+
Un archivo local fue modificado durante la sincronización.
-
+
El servidor no reconoció la última parte. (No había una e-tag presente.)
@@ -1538,17 +1551,30 @@ No se recomienda usarlo.
El informe de sincronización fue copiado al portapapeles.
-
-
- Actualmente no hay ficheros ignorados por errores previos.
+
+
+ Actualmente no hay archivos ignorados debido a errores previos y a que no hay descargas en progreso.
-
+
- %n archivo ha sido ignorado por causa de errores previos.
- Intente volver a sincronizarlo.%n archivos han sido ignorados por causa de errores previos.
- Intente volver a sincronizarlos.
+
+ %n Archivos han sido ignorados debido a errores previos.
+%n Archivos han sido ignorados debido a errores previos.
+
+
+
+
+
+ %n archivos han sido parcialmente descargados.
+%n archivos han sido parcialmente descargados.
+
+
+
+
+
+ Intentar sincronizar de nuevo
@@ -1636,12 +1662,12 @@ No se recomienda usarlo.
Mirall::ShibbolethCredentials
-
+
Error al iniciar sesión
-
+
Debe iniciar sesión como el usuario %1
@@ -2049,69 +2075,69 @@ No se recomienda usarlo.
El fichero contiene caracteres inválidos que no pueden ser sincronizados con la plataforma.
-
+
No se pudo inicializar un registro (journal) de sincronización.
-
+
No es posible abrir el diario de sincronización
-
-
+
+
Ignorado por que se encuentra en la lista negra de "elige que vas a sincronizar"
-
+
No está permitido, porque no tiene permisos para añadir subcarpetas en este directorio.
-
+
No está permitido porque no tiene permisos para añadir un directorio
-
+
No está permitido, porque no tiene permisos para crear archivos en este directorio
-
+
No está permitido subir este archivo porque es de solo lectura en el servidor, restaurando.
-
-
+
+
No está permitido borrar, restaurando.
-
+
Se eliminaron los archivos locales y la carpeta compartida.
-
+
No está permitido mover, elemento restaurado.
-
+
No está permitido mover, porque %1 es solo lectura.
-
+
destino
-
+
origen
@@ -2317,7 +2343,7 @@ No se recomienda usarlo.
- &Iniciar una sincronización limpia(Borra la carpeta local!)
+ &Iniciar una sincronización limpia (borra la carpeta local)
diff --git a/translations/mirall_es_AR.ts b/translations/mirall_es_AR.ts
index 2c8329306..05e24e7fb 100644
--- a/translations/mirall_es_AR.ts
+++ b/translations/mirall_es_AR.ts
@@ -385,12 +385,12 @@ Total time left %5
Actividad de Sync
-
+
-
+
@@ -399,17 +399,17 @@ Esto se puede deber a que el directorio fue reconfigurado de manera silenciosa o
¿Estás seguro de que querés realizar esta operación?
-
+
¿Borrar todos los archivos?
-
+
Borrar todos los archivos
-
+
Conservar archivos
@@ -636,22 +636,22 @@ Esto se puede deber a que el directorio fue reconfigurado de manera silenciosa o
Mirall::GETFileJob
-
+
-
+
-
+
-
+
@@ -1110,7 +1110,11 @@ It is not advisable to use it.
-
+
@@ -1303,27 +1307,27 @@ It is not advisable to use it.
Mirall::PropagateDownloadFileLegacy
-
+
Sincronizaciójn abortada por el usuario.
-
+
-
+
-
+
-
+
@@ -1331,12 +1335,17 @@ It is not advisable to use it.
Mirall::PropagateDownloadFileQNAM
-
+
-
+
+
+
+
+
+
@@ -1422,18 +1431,18 @@ It is not advisable to use it.
Mirall::PropagateUploadFileLegacy
-
-
+
+
Los archivos locales han cambiado durante la sincronización, la primera vez ha funcionado completamente
-
+
Sincronizaciójn abortada por el usuario.
-
+
@@ -1441,23 +1450,23 @@ It is not advisable to use it.
Mirall::PropagateUploadFileQNAM
-
+
-
+
-
+
-
+
@@ -1535,16 +1544,27 @@ It is not advisable to use it.
El estado de sincronización ha sido copiado al portapapeles
-
-
- Actualmente ningún archivo es ignorado por errores previos.
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
Mirall::SelectiveSyncDialog
@@ -1631,12 +1651,12 @@ It is not advisable to use it.
Mirall::ShibbolethCredentials
-
+
-
+
@@ -2042,69 +2062,69 @@ It is not advisable to use it.
El archivo contiene caracteres inválidos que no pueden ser sincronizados entre plataforma.
-
+
Imposible inicializar un diario de sincronización.
-
+
-
-
+
+
-
+
-
+
-
+
-
+
-
-
+
+
-
+
-
+
-
+
-
+
-
+
diff --git a/translations/mirall_et.ts b/translations/mirall_et.ts
index a3a409524..c8ea6ea06 100644
--- a/translations/mirall_et.ts
+++ b/translations/mirall_et.ts
@@ -386,12 +386,12 @@ Aega kokku jäänud %5
Sünkroniseerimise tegevus
-
+
Süsteemi väljajätmiste faili lugemine ebaõnnestus
-
+
@@ -400,17 +400,17 @@ See võib olla põhjustatud kataloogi ümberseadistusest või on toimunud kõiki
Oled kindel, et soovid seda operatsiooni teostada?
-
+
Kustutada kõik failid?
-
+
Kustutada kõik failid
-
+
Säilita failid
@@ -637,22 +637,22 @@ Oled kindel, et soovid seda operatsiooni teostada?
Mirall::GETFileJob
-
+
Ühtegi E-Silti ei saabunud serverist, kontrolli puhverserverit/lüüsi.
-
+
Saime jätkamiseks erineva E-Sildi. Proovin järgmine kord uuesti.
-
+
Server tagastas vale vahemiku
-
+
Ühenduse aegumine
@@ -1113,8 +1113,12 @@ Selle kasutamine pole soovitatav.
-
- Ei suutnud turvaliselt ühenduda. Soovid minna üle krüpteerimata ühendusele (pole soovitatav)?
+
+
@@ -1306,27 +1310,27 @@ Selle kasutamine pole soovitatav.
Mirall::PropagateDownloadFileLegacy
-
+
Sünkroniseering katkestati kasutaja poolt.
-
+
Ühtegi E-Silti ei saabunud serverist, kontrolli puhverserverit/lüüsi.
-
+
Saime jätkamiseks erineva E-Sildi. Proovin järgmine kord uuesti.
-
+
Server tagastas vale vahemiku
-
+
Faili %1 ei saa alla laadida kuna on konflikt kohaliku faili nimega.
@@ -1334,12 +1338,17 @@ Selle kasutamine pole soovitatav.
Mirall::PropagateDownloadFileQNAM
-
+
Faili %1 ei saa alla laadida kuna on konflikt kohaliku faili nimega.
-
+
+
+
+
+
+
Faili %1 ei saa salvestada kuna on nime konflikt kohaliku failiga!
@@ -1425,18 +1434,18 @@ Selle kasutamine pole soovitatav.
Mirall::PropagateUploadFileLegacy
-
-
+
+
Kohalik fail muutus sünkroniseerimise ajal, sünkroniseerin kuni ülekanne on täielik
-
+
Sünkroniseering katkestati kasutaja poolt.
-
+
Faili on lokaalselt muudetud, kuid see on osa kirjutamisõiguseta jagamisest. See on taastatud ning sinu muudatus on konfliktses failis.
@@ -1444,23 +1453,23 @@ Selle kasutamine pole soovitatav.
Mirall::PropagateUploadFileQNAM
-
+
Faili on lokaalselt muudetud, kuid see on osa kirjutamisõiguseta jagamisest. See on taastatud ning sinu muudatus on konfliktses failis.
-
+
Kohalik fail on eemaldatud sünkroniseeringu käigus.
-
+
Kohalik fail muutus sünkroniseeringu käigus.
-
+
Server ei tunnistanud viimast tükki. (E-silt puudus).
@@ -1538,17 +1547,29 @@ Selle kasutamine pole soovitatav.
Sünkroniseeringu staatus on kopeeritud lõikepuhvrisse.
-
-
- Hetkel ei ignoreerita ühtegi faili eelnenud vigade tõttu.
+
+
+ Hetkel ei ignoreerita ühtegi faili eelnenud vigade tõttu ja ühtegi allalaadimist ei toimu
-
+
- %n faili ignoreeriti eelnenud vigade tõttu.
-Proovi uuesti sünkroniseerida.%n faili ignoreeriti eelnenud vigade tõttu.
-Proovi uuesti sünkroniseerida.
+
+ %n fail on ignoreeritud eelnenud vigade tõttu%n faili on ignoreeritud eelnenud vigade tõttu
+
+
+
+
+
+ %n fail on osaliselt allalaaditud
+%n fail on osaliselt allalaaditud
+
+
+
+
+
+ Proovi neid uuesti sünkroniseerida.
@@ -1636,12 +1657,12 @@ Proovi uuesti sünkroniseerida.
Mirall::ShibbolethCredentials
-
+
Sisselogimise viga
-
+
Pead sisse logima kui kasutaja %1
@@ -2049,69 +2070,69 @@ Proovi uuesti sünkroniseerida.
Fail sisaldab sobimatuid sümboleid, mida ei saa sünkroniseerida erinevate platvormide vahel.
-
+
Ei suuda lähtestada sünkroniseeringu zurnaali.
-
+
Ei suuda avada sünkroniseeringu zurnaali
-
-
+
+
"Vali, mida sünkroniseerida" musta nimekirja tõttu vahele jäetud
-
+
Pole lubatud, kuna sul puuduvad õigused lisada sellesse kataloogi lisada alam-kataloogi
-
+
Pole lubatud, kuna sul puuduvad õigused lisada ülemkataloog
-
+
Pole lubatud, kuna sul puuduvad õigused sellesse kataloogi faile lisada
-
+
Pole lubatud üles laadida, kuna tegemist on ainult-loetava serveriga, taastan
-
-
+
+
Eemaldamine pole lubatud, taastan
-
+
Kohalikud failid ja jagatud kaustad eemaldatud.
-
+
Liigutamine pole lubatud, üksus taastatud
-
+
Liigutamien pole võimalik kuna %1 on ainult lugemiseks
-
+
sihtkoht
-
+
allikas
diff --git a/translations/mirall_eu.ts b/translations/mirall_eu.ts
index 221647b11..065185216 100644
--- a/translations/mirall_eu.ts
+++ b/translations/mirall_eu.ts
@@ -386,12 +386,12 @@ Geratzen den denbora %5
Sinkronizazio Jarduerak
-
+
-
+
@@ -400,17 +400,17 @@ Izan daiteke karpeta isilpean birkonfiguratu delako edo fitxategi guztiak eskuz
Ziur zaude eragiketa hau egin nahi duzula?
-
+
Ezabatu Fitxategi Guztiak?
-
+
Ezabatu fitxategi guztiak
-
+
Mantendu fitxategiak
@@ -637,22 +637,22 @@ Ziur zaude eragiketa hau egin nahi duzula?
Mirall::GETFileJob
-
+
Ez da E-Tagik jaso zerbitzaritik, egiaztatu Proxy/Gateway
-
+
-
+
-
+
Konexioa denboraz kanpo
@@ -1113,8 +1113,12 @@ Ez da gomendagarria erabltzea.
-
- Ezin da modu seguruan konektatu. Nahi duzu enkriptatu gabe konektatu (ez da gomendagarria)?
+
+
@@ -1306,27 +1310,27 @@ Ez da gomendagarria erabltzea.
Mirall::PropagateDownloadFileLegacy
-
+
Sinkronizazioa erabiltzaileak bertan behera utzi du
-
+
Ez da E-Tagik jaso zerbitzaritik, egiaztatu Proxy/Gateway
-
+
-
+
-
+
@@ -1334,12 +1338,17 @@ Ez da gomendagarria erabltzea.
Mirall::PropagateDownloadFileQNAM
-
+
-
+
+
+
+
+
+
@@ -1425,18 +1434,18 @@ Ez da gomendagarria erabltzea.
Mirall::PropagateUploadFileLegacy
-
-
+
+
-
+
Sinkronizazioa erabiltzaileak bertan behera utzi du
-
+
@@ -1444,23 +1453,23 @@ Ez da gomendagarria erabltzea.
Mirall::PropagateUploadFileQNAM
-
+
-
+
Fitxategi lokala ezabatu da sinkronizazioan.
-
+
Fitxategi lokala aldatu da sinkronizazioan.
-
+
@@ -1538,16 +1547,27 @@ Ez da gomendagarria erabltzea.
Sinkronizazio egoera arbelera kopiatu da.
-
-
- Oraintxe ez da fitxategirik baztertzen aurreko erroreak direla eta.
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
Mirall::SelectiveSyncDialog
@@ -1634,12 +1654,12 @@ Ez da gomendagarria erabltzea.
Mirall::ShibbolethCredentials
-
+
Errorea sartzean
-
+
@@ -2045,69 +2065,69 @@ Ez da gomendagarria erabltzea.
-
+
Ezin izan da sinkronizazio egunerokoa hasieratu.
-
+
-
-
+
+
-
+
-
+
-
+
-
+
-
-
+
+
Ezabatzeko baimenik gabe, berrezartzen
-
+
-
+
Mugitzea ez dago baimenduta, elementua berrezarri da
-
+
Mugitzea ez dago baimenduta %1 irakurtzeko bakarrik delako
-
+
helburua
-
+
jatorria
diff --git a/translations/mirall_fa.ts b/translations/mirall_fa.ts
index e9708daa9..ff2f4697e 100644
--- a/translations/mirall_fa.ts
+++ b/translations/mirall_fa.ts
@@ -385,29 +385,29 @@ Total time left %5
فعالیت همگام سازی
-
+
-
+
-
+
-
+
-
+
نگه داشتن فایل ها
@@ -634,22 +634,22 @@ Are you sure you want to perform this operation?
Mirall::GETFileJob
-
+
-
+
-
+
-
+
تایم اوت اتصال
@@ -1106,7 +1106,11 @@ It is not advisable to use it.
-
+
@@ -1299,27 +1303,27 @@ It is not advisable to use it.
Mirall::PropagateDownloadFileLegacy
-
+
-
+
-
+
-
+
-
+
@@ -1327,12 +1331,17 @@ It is not advisable to use it.
Mirall::PropagateDownloadFileQNAM
-
+
-
+
+
+
+
+
+
@@ -1418,18 +1427,18 @@ It is not advisable to use it.
Mirall::PropagateUploadFileLegacy
-
-
+
+
-
+
-
+
@@ -1437,23 +1446,23 @@ It is not advisable to use it.
Mirall::PropagateUploadFileQNAM
-
+
-
+
-
+
-
+
@@ -1531,16 +1540,27 @@ It is not advisable to use it.
-
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
Mirall::SelectiveSyncDialog
@@ -1627,12 +1647,12 @@ It is not advisable to use it.
Mirall::ShibbolethCredentials
-
+
-
+
@@ -2038,69 +2058,69 @@ It is not advisable to use it.
-
+
-
+
-
-
+
+
-
+
-
+
-
+
-
+
-
-
+
+
-
+
-
+
-
+
-
+
-
+
diff --git a/translations/mirall_fi.ts b/translations/mirall_fi.ts
index 121ae4c31..e3e356fc8 100644
--- a/translations/mirall_fi.ts
+++ b/translations/mirall_fi.ts
@@ -121,7 +121,7 @@
- <b>Huomio:</b> Joillakin kansioilla, mukaan lukien verkon yli liitetyt tai jaetut kansiot, voivat olla erilaisten rajoitusten piirissä.
+ <b>Huomio:</b> Jotkin kansiot, mukaan lukien verkon yli liitetyt tai jaetut kansiot, voivat olla eri rajoitusten piirissä.
@@ -216,7 +216,7 @@ Aikaa jäljellä yhteensä %5
- Muodosta yhteys - <a href="%1">%2</a>.
+ Muodostetty yhteys kohteeseen <a href="%1">%2</a>.
@@ -386,29 +386,29 @@ Aikaa jäljellä yhteensä %5
Synkronointiaktiviteetti
-
+
-
+
-
+
Poistetaanko kaikki tiedostot?
-
+
Poista kaikki tiedostot
-
+
Säilytä tiedostot
@@ -487,7 +487,7 @@ Are you sure you want to perform this operation?
-
+ Synkronoidaan kaikki tilisi tiedostot polkuun
@@ -635,22 +635,22 @@ Are you sure you want to perform this operation?
Mirall::GETFileJob
-
+
-
+
-
+
-
+
Yhteys aikakatkaistiin
@@ -1062,7 +1062,7 @@ saattaa kysyä lisäoikeuksia toimenpiteen aikana.
-
+ Lisäasetuksien päivitys
@@ -1109,8 +1109,12 @@ Osoitteen käyttäminen ei ole suositeltavaa.
-
- Salattua yhteyttä ei voitu muodostaa. Haluatko sen muodostaa salaamattoman yhteyden? (ei suositeltu)
+
+
@@ -1302,27 +1306,27 @@ Osoitteen käyttäminen ei ole suositeltavaa.
Mirall::PropagateDownloadFileLegacy
-
+
Synkronointi peruttiin käyttäjän toimesta.
-
+
-
+
-
+
-
+
@@ -1330,12 +1334,17 @@ Osoitteen käyttäminen ei ole suositeltavaa.
Mirall::PropagateDownloadFileQNAM
-
+
-
+
+
+
+
+
+
@@ -1345,7 +1354,7 @@ Osoitteen käyttäminen ei ole suositeltavaa.
-
+ ; Palauttaminen epäonnistui:
@@ -1371,7 +1380,7 @@ Osoitteen käyttäminen ei ole suositeltavaa.
-
+ Virhe poistaessa '%1': %2;
@@ -1421,18 +1430,18 @@ Osoitteen käyttäminen ei ole suositeltavaa.
Mirall::PropagateUploadFileLegacy
-
-
+
+
-
+
Synkronointi peruttiin käyttäjän toimesta.
-
+
@@ -1440,23 +1449,23 @@ Osoitteen käyttäminen ei ole suositeltavaa.
Mirall::PropagateUploadFileQNAM
-
+
-
+
Paikallinen tiedosto poistettiin synkronoinnin aikana.
-
+
Paikallinen tiedosto muuttui synkronoinnin aikana.
-
+
@@ -1521,7 +1530,7 @@ Osoitteen käyttäminen ei ole suositeltavaa.
-
+ Kopioi toimilista leikepöydälle.
@@ -1534,16 +1543,27 @@ Osoitteen käyttäminen ei ole suositeltavaa.
Synkronointitila on kopioitu leikepöydälle.
-
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
Mirall::SelectiveSyncDialog
@@ -1555,7 +1575,7 @@ Osoitteen käyttäminen ei ole suositeltavaa.
-
+ Ilman valintaa olevat kansiot <b>poistetaan</b> paikallisesta tiedostojärjestelmästä, eikä niitä synkronoida enää jatkossa tämän tietokoneen kanssa
@@ -1630,12 +1650,12 @@ Osoitteen käyttäminen ei ole suositeltavaa.
Mirall::ShibbolethCredentials
-
+
Kirjautumisvirhe
-
+
Kirjaudu käyttäjänä %1
@@ -2043,69 +2063,69 @@ Osoitteen käyttäminen ei ole suositeltavaa.
Tiedosto sisältää virheellisiä merkkejä, joiden vuoksi sitä voi synkronoida eri käyttöjärjestelmien välillä.
-
+
-
+
-
-
+
+
-
+
-
+
-
+
Ei sallittu, koska sinulla ei ole oikeutta lisätä tiedostoja kyseiseen kansioon
-
+
-
-
+
+
Poistaminen ei ole sallittua, palautetaan
-
+
Paikalliset tiedostot ja jakokansio poistettu.
-
+
Siirtäminen ei ole sallittua, kohde palautettu
-
+
Siirto ei ole sallittu, koska %1 on "vain luku"-tilassa
-
+
kohde
-
+
lähde
diff --git a/translations/mirall_fr.ts b/translations/mirall_fr.ts
index eb50088a0..2d33b2cc0 100644
--- a/translations/mirall_fr.ts
+++ b/translations/mirall_fr.ts
@@ -14,7 +14,7 @@
- &Choisir
+ &Choisir...
@@ -37,7 +37,7 @@
- Ajouter le dossier
+ Ajouter un dossier
@@ -311,7 +311,7 @@ Temps restant total %5
- %1: %2
+ %1 : %2
@@ -386,12 +386,12 @@ Temps restant total %5
Activité de synchronisation
-
+
Impossible de lire le fichier d'exclusion du système
-
+
@@ -400,17 +400,17 @@ Cela est peut-être du à une reconfiguration silencieuse du dossier, ou parce q
Voulez-vous réellement effectuer cette opération ?
-
+
Supprimer tous les fichiers ?
-
+
Supprimer tous les fichiers
-
+
Garder les fichiers
@@ -455,7 +455,7 @@ Voulez-vous réellement effectuer cette opération ?
- La dernière synchronisation s'est achevée avec succès mais avec des messages d'avertissement sur des fichiers individuels.
+ La dernière synchronisation s'est achevée avec succès mais avec des messages d'avertissement à propos de certains fichiers.
@@ -494,7 +494,7 @@ Voulez-vous réellement effectuer cette opération ?
- Chemin distant: %1
+ Chemin distant : %1
@@ -503,7 +503,7 @@ Voulez-vous réellement effectuer cette opération ?
- Ajouter le dossier
+ Ajouter un dossier
@@ -614,7 +614,7 @@ Voulez-vous réellement effectuer cette opération ?
- Vous êtes déjà en cours de synchronisation de tous vos fichiers. Synchroniser un autre dossier n'est <b>pas</b> possible actuellement. Si vous voulez synchroniser de multiples dossiers, veuillez supprimer la synchronisation en cours du dossier racine.
+ Vous sychronisez déjà tous vos fichiers. Synchroniser un autre dossier n'est <b>pas</b> possible actuellement. Si vous voulez synchroniser plusieurs dossiers, veuillez supprimer la synchronisation du dossier racine qui est configurée actuellement.
@@ -637,22 +637,22 @@ Voulez-vous réellement effectuer cette opération ?
Mirall::GETFileJob
-
+
Aucun E-Tag reçu du serveur, vérifiez le proxy / la passerelle
-
+
Nous avons reçu un E-Tag différent pour reprendre le téléchargement. Nouvel essai la prochaine fois.
-
+
Le serveur a retourné une gamme de contenu erronée
-
+
Temps de connexion expiré
@@ -711,7 +711,7 @@ Voulez-vous réellement effectuer cette opération ?
- Veuillez entrer %1 mot de passe pour l'utilisateur '%2':
+ Veuillez entrer le mot de passe %1 pour l'utilisateur '%2' :
@@ -1031,7 +1031,7 @@ peut demander des privilèges additionnels durant le processus.
- Connecter à %1
+ Connexion à %1
@@ -1074,7 +1074,7 @@ peut demander des privilèges additionnels durant le processus.
- Connecter à %1
+ Connexion à %1
@@ -1084,7 +1084,7 @@ peut demander des privilèges additionnels durant le processus.
- Mettre à jour les identifiants de connexion de l'utilisateur
+ Modification des identifiants de connexion
@@ -1092,7 +1092,7 @@ peut demander des privilèges additionnels durant le processus.
- Connecter à %1
+ Connexion à %1
@@ -1113,8 +1113,16 @@ Il est déconseillé de l'utiliser.
-
- Impossible de se connecter en toute sécurité. Voulez-vous vous connecter sans chiffrement à la place (non recommandé) ?
+
+ Impossible de se connecter en toute sécurité.
+
+%1
+
+Voulez-vous vous connecter sans chiffrement à la place (non recommandé) ?
@@ -1124,7 +1132,7 @@ Il est déconseillé de l'utiliser.
- Mettre à jour le serveur %1
+ Modification de l'adresse du serveur %1
@@ -1148,7 +1156,7 @@ Il est déconseillé de l'utiliser.
- <font color="green">Connecté avec succès à %1: %2 version %3 (%4)</font><br/><br/>
+ <font color="green">Connecté avec succès à %1 : %2 version %3 (%4)</font><br/><br/>
@@ -1184,7 +1192,7 @@ Il est déconseillé de l'utiliser.
- Échec de la connexion à %1 pour %2:<br/>%3
+ Échec de la connexion à %1 pour %2 :<br/>%3
@@ -1287,7 +1295,7 @@ Il est déconseillé de l'utiliser.
- Votre compte est synchronisé intégralement avec le répertoire local <i>%1</i>
+ Votre compte est intégralement synchronisé avec le répertoire local <i>%1</i>
@@ -1306,40 +1314,45 @@ Il est déconseillé de l'utiliser.
Mirall::PropagateDownloadFileLegacy
-
+
La synchronisation a été interrompue par l'utilisateur.
-
+
Aucun E-Tag reçu du serveur, vérifiez le proxy / la passerelle
-
+
Nous avons reçu un E-Tag différent pour reprendre le téléchargement. Nouvel essai la prochaine fois.
-
+
Le serveur a retourné une gamme de contenu erronnée
-
+
- File %1 ne peut pas être téléchargé en raison d'un conflit sur le nom du fichier local.
+ Le fichier %1 ne peut pas être téléchargé en raison d'un conflit sur le nom du fichier local.
Mirall::PropagateDownloadFileQNAM
-
+
- File %1 ne peut pas être téléchargé en raison d'un conflit sur le nom du fichier local.
+ Le fichier %1 ne peut pas être téléchargé en raison d'un conflit sur le nom du fichier local.
-
+
+
+ Le fichier n'a pas pu être téléchargé intégralement.
+
+
+
Le fichier %1 n'a pas pu être sauvegardé en raison d'un conflit sur le nom du fichier local !
@@ -1425,18 +1438,18 @@ Il est déconseillé de l'utiliser.
Mirall::PropagateUploadFileLegacy
-
-
+
+
Fichier local modifié pendant la synchronisation, la synchronisation redémarrera lorsque ce sera terminé
-
+
La synchronisation a été interrompue par l'utilisateur.
-
+
Le fichier a été modifié localement mais appartient à un partage en lecture seule. Il a été restauré et vos modifications sont présentes dans le fichiers de confit.
@@ -1444,23 +1457,23 @@ Il est déconseillé de l'utiliser.
Mirall::PropagateUploadFileQNAM
-
+
Le fichier a été modifié localement mais appartient à un partage en lecture seule. Il a été restauré et vos modifications sont présentes dans le fichiers de confit.
-
+
Fichier local supprimé pendant la synchronisation.
-
+
Fichier local modifié pendant la synchronisation.
-
+
Le serveur n'a pas acquitté le dernier morceau (aucun e-tag n'était présent).
@@ -1538,17 +1551,29 @@ Il est déconseillé de l'utiliser.
L'état de synchronisation a été copié dans le presse-papier.
-
-
- Actuellement aucun fichier n'a été ignoré en raison d'erreurs précédentes.
+
+
+ Actuellement aucun fichier n'a été ignoré en raison d'erreurs précédentes, et aucun téléchargement n'est en cours.
-
+
- %n fichier a été ignoré à cause de précédentes erreurs.
-Essayez de le synchroniser à nouveau.%n fichiers ont été ignorés à cause de précédentes erreurs.
-Essayez de les synchroniser à nouveau.
+
+ %n fichiers ont été ignorés à cause d'erreurs précédentes.
+%n fichiers ont été ignorés à cause d'erreurs précédentes.
+
+
+
+
+
+ %n fichiers sont partiellement téléchargés.%n fichiers sont partiellement téléchargés.
+
+
+
+
+
+ Essayez de les synchroniser à nouveau.
@@ -1636,12 +1661,12 @@ Essayez de les synchroniser à nouveau.
Mirall::ShibbolethCredentials
-
+
Erreur de connexion
-
+
Vous devez vous connecter en tant qu'utilisateur %1
@@ -2049,69 +2074,69 @@ Essayez de les synchroniser à nouveau.
Le fichier contient des caractères non valides qui ne peuvent être synchronisés entre plate-formes.
-
+
Impossible d'initialiser un journal de synchronisation.
-
+
Impossible d'ouvrir le journal de synchronisation
-
-
+
+
Ignoré à cause de la liste noire du contenu à synchroniser.
-
+
Non autorisé car vous n'avez pas la permission d'ajouter des sous-dossiers dans ce dossier
-
+
Non autorisé car vous n'avez pas la permission d'ajouter des dossiers parents
-
+
Non autorisé car vous n'avez pas la permission d'ajouter des fichiers dans ce dossier
-
+
Non autorisé à envoyer ce fichier car il est en lecture seule sur le serveur. Restauration
-
-
+
+
Non autorisé à supprimer. Restauration
-
+
Fichiers locaux et répertoire de partage supprimés.
-
+
Déplacement non autorisé, élément restauré
-
+
Déplacement non autorisé car %1 est en mode lecture seule
-
+
la destination
-
+
la source
@@ -2121,7 +2146,7 @@ Essayez de les synchroniser à nouveau.
- %1: %2
+ %1 : %2
@@ -2192,7 +2217,7 @@ Essayez de les synchroniser à nouveau.
- Calcul du quota en cours...
+ Calcul du quota...
@@ -2237,7 +2262,7 @@ Essayez de les synchroniser à nouveau.
- %1% sur %2 utilisés
+ %1% de %2 utilisés
@@ -2302,7 +2327,7 @@ Essayez de les synchroniser à nouveau.
- Synchroniser tout le contenu du serveur
+ Synchroniser tout le contenu de votre compte
@@ -2327,7 +2352,7 @@ Essayez de les synchroniser à nouveau.
- &Garder des données locales
+ &Garder les données locales
@@ -2576,7 +2601,7 @@ Essayez de les synchroniser à nouveau.
- téléchargement
+ téléchargement de
diff --git a/translations/mirall_gl.ts b/translations/mirall_gl.ts
index 3a7e3078b..59d8b1a96 100644
--- a/translations/mirall_gl.ts
+++ b/translations/mirall_gl.ts
@@ -106,7 +106,7 @@
-
+ Escolla qué sincronizar
@@ -163,7 +163,7 @@
-
+ ficheiro %1 de %2
@@ -198,7 +198,7 @@
-
+ Atopando '%1'
@@ -373,12 +373,12 @@ Tempo total restante %5
%1 names a file.
-
+ %1 e %2 non se puideron sincronizar debido a erros. Vexa os detalles no rexistro.
-
+ %1 non se puido sincronizar debe a un erro. Vexa os detalles no rexistro.
@@ -386,12 +386,12 @@ Tempo total restante %5
Actividade de sincronización
-
+
-
+ Non se puido ler o ficheiro de exclusión do sistema
-
+
@@ -400,17 +400,17 @@ Isto podería ser debido a que o cartafol foi reconfigurado en silencio, ou a qu
Confirma que quere realizar esta operación?
-
+
Retirar todos os ficheiros?
-
+
Retirar todos os ficheiros
-
+
Manter os ficheiros
@@ -622,7 +622,7 @@ Confirma que quere realizar esta operación?
-
+ Escolla qué sincronizar: Opcionalmente pode deselecionar subcartafoles que non desexe sincronizar.
@@ -637,22 +637,22 @@ Confirma que quere realizar esta operación?
Mirall::GETFileJob
-
+
Non se recibiu a «E-Tag» do servidor, comprobe o proxy e/ou a pasarela
-
+
Recibiuse unha «E-Tag» diferente para continuar. Tentándoo outra vez.
-
+
O servidor devolveu un intervalo de contidos estragado
-
+
Esgotouse o tempo de conexión
@@ -1018,7 +1018,7 @@ actualización pode pedir privilexios adicionais durante o proceso.
-
+ O estado da actualización é descoñecido: non se comprobaron as actualizacións.
@@ -1113,8 +1113,12 @@ Recomendámoslle que non o use.
-
- Non é posíbel conectar de forma segura. Quere, aínda así, conectar sen cifrar (non recomendado)?
+
+
@@ -1282,7 +1286,7 @@ Recomendámoslle que non o use.
-
+ Abrir %1 no navegador
@@ -1306,27 +1310,27 @@ Recomendámoslle que non o use.
Mirall::PropagateDownloadFileLegacy
-
+
A sincronización foi interrompida polo usuario.
-
+
Non se recibiu a «E-Tag» do servidor, comprobe o proxy e/ou a pasarela
-
+
Recibiuse unha «E-Tag» diferente para continuar. Tentándoo outra vez.
-
+
O servidor devolveu un intervalo de contidos estragado
-
+
Non é posíbel descargar o ficheiro %1 por mor dunha colisión co nome dun ficheiro local!
@@ -1334,15 +1338,20 @@ Recomendámoslle que non o use.
Mirall::PropagateDownloadFileQNAM
-
+
Non é posíbel descargar o ficheiro %1 por mor dunha colisión co nome dun ficheiro local!
-
-
+
+
+
+
+
+ O ficheiro %1 non se gardou debido a unha colisión co nome dun ficheiro local!
+
Mirall::PropagateItemJob
@@ -1375,12 +1384,12 @@ Recomendámoslle que non o use.
-
+ Erro eliminando '%1': %2;
-
+ Non se puido eliminar o directorio '%1';
@@ -1425,18 +1434,18 @@ Recomendámoslle que non o use.
Mirall::PropagateUploadFileLegacy
-
-
+
+
O ficheiro local cambiou durante a sincronización, sincronizando unha vez quedou completado
-
+
A sincronización foi interrompida polo usuario.
-
+
O ficheiro foi editado localmente mais é parte dunha compartición de só lectura. O ficheiro foi restaurado e a súa edición atopase no ficheiro de conflitos.
@@ -1444,23 +1453,23 @@ Recomendámoslle que non o use.
Mirall::PropagateUploadFileQNAM
-
+
O ficheiro foi editado localmente mais é parte dunha compartición de só lectura. O ficheiro foi restaurado e a súa edición atopase no ficheiro de conflitos.
-
+
O ficheiro local retirarase durante a sincronización.
-
+
O ficheiro local cambiou durante a sincronización.
-
+
O servidor non recoñeceu o último fragmento. (Non hai e-tag presente)
@@ -1538,28 +1547,39 @@ Recomendámoslle que non o use.
O estado de sincronización foi copiado no portapapeis.
-
-
- Actualmente non hai ficheiros ignorados por mor de erros anteriores.
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
Mirall::SelectiveSyncDialog
-
+ Escolla qué sincronizar
-
+ Os cartafoles non selecionados serán <b>eliminados</b> do seu sistema de ficheiros local e non se voltarán a sincronizar con esta computadora
@@ -1634,12 +1654,12 @@ Recomendámoslle que non o use.
Mirall::ShibbolethCredentials
-
+
Erro de acceso
-
+
Ten que rexistrarse como usuario %1
@@ -2014,7 +2034,7 @@ Recomendámoslle que non o use.
-
+ O directorio montado non está temporalmente dispoñible no servidor
@@ -2047,69 +2067,69 @@ Recomendámoslle que non o use.
O ficheiro conten caracteres incorrectos que non poden sincronizarse entre distintas plataformas.
-
+
Non é posíbel iniciar un rexistro de sincronización.
-
+
Non foi posíbel abrir o rexistro de sincronización
-
-
+
+
-
+ Ignorado debido a lista negra de "escolla qué sincronizar"
-
+
Non está permitido xa que non ten permiso para engadir subdirectorios nese directorio
-
+
Non está permitido xa que non ten permiso para engadir un directorio pai
-
+
Non está permitido xa que non ten permiso para engadir ficheiros nese directorio
-
+
Non está permitido o envío xa que o ficheiro é só de lectura no servidor, restaurando
-
-
+
+
Non está permitido retiralo, restaurando
-
+
-
+ Ficheiros locáis e cartafol compartido eliminados.
-
+
Nos está permitido movelo, elemento restaurado
-
+
Bon está permitido movelo xa que %1 é só de lectura
-
+
o destino
-
+
a orixe
@@ -2155,7 +2175,7 @@ Recomendámoslle que non o use.
-
+ Non existen cartafoles de sincronización configurados.
@@ -2245,7 +2265,7 @@ Recomendámoslle que non o use.
-
+ Atopando '%1'
@@ -2273,7 +2293,7 @@ Recomendámoslle que non o use.
-
+ <p>Versión %2. Para máis información visite <a href="%3">%4</a></p><p><small>Por Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz e outros.<br/>Baseado en Mirall de Duncan Mac-Vicar P.</small></p><p>Copyright ownCloud, Inc.</p><p>Licenciado baixo a GNU General Public License (GPL) Version 2.0<br/>ownCloud e o Logo ownCloud son marcas rexistradas de ownCloud, Inc. nos Estados Unidos, outros países ou en ambos.</p>
@@ -2300,12 +2320,12 @@ Recomendámoslle que non o use.
-
+ Sincronice todo o contido do servidor
-
+ Escolla qué sincronizar
@@ -2315,7 +2335,7 @@ Recomendámoslle que non o use.
-
+ &Iniciar unha nova sincronización (Elimina o cartafol local!)
diff --git a/translations/mirall_hu.ts b/translations/mirall_hu.ts
index c2c66d6d0..2c579e9b0 100644
--- a/translations/mirall_hu.ts
+++ b/translations/mirall_hu.ts
@@ -385,29 +385,29 @@ Total time left %5
-
+
-
+
-
+
El legyen távolítva az összes fájl?
-
+
Összes fájl eltávolítása
-
+
Fájlok megtartása
@@ -634,22 +634,22 @@ Are you sure you want to perform this operation?
Mirall::GETFileJob
-
+
-
+
-
+
-
+
@@ -1106,7 +1106,11 @@ It is not advisable to use it.
-
+
@@ -1299,27 +1303,27 @@ It is not advisable to use it.
Mirall::PropagateDownloadFileLegacy
-
+
-
+
-
+
-
+
-
+
@@ -1327,12 +1331,17 @@ It is not advisable to use it.
Mirall::PropagateDownloadFileQNAM
-
+
-
+
+
+
+
+
+
@@ -1418,18 +1427,18 @@ It is not advisable to use it.
Mirall::PropagateUploadFileLegacy
-
-
+
+
-
+
-
+
@@ -1437,23 +1446,23 @@ It is not advisable to use it.
Mirall::PropagateUploadFileQNAM
-
+
-
+
-
+
-
+
@@ -1531,16 +1540,27 @@ It is not advisable to use it.
-
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
Mirall::SelectiveSyncDialog
@@ -1627,12 +1647,12 @@ It is not advisable to use it.
Mirall::ShibbolethCredentials
-
+
-
+
@@ -2038,69 +2058,69 @@ It is not advisable to use it.
-
+
-
+
-
-
+
+
-
+
-
+
-
+
-
+
-
-
+
+
-
+
-
+
-
+
-
+
-
+
diff --git a/translations/mirall_it.ts b/translations/mirall_it.ts
index 425027791..a0296167f 100644
--- a/translations/mirall_it.ts
+++ b/translations/mirall_it.ts
@@ -386,12 +386,12 @@ Totale tempo rimanente %5
Sincronizza attività
-
+
Impossibile leggere il file di esclusione di sistema
-
+
@@ -400,17 +400,17 @@ Ciò potrebbe accadere in caso di riconfigurazione della cartella o di rimozione
Sei sicuro di voler eseguire questa operazione?
-
+
Vuoi rimuovere tutti i file?
-
+
Rimuovi tutti i file
-
+
Mantieni i file
@@ -637,22 +637,22 @@ Sei sicuro di voler eseguire questa operazione?
Mirall::GETFileJob
-
+
Nessun e-tag ricevuto dal server, controlla il proxy/gateway
-
+
Abbiamo ricevuto un e-tag diverso per il recupero. Riprova più tardi.
-
+
Il server ha restituito un content-range errato
-
+
Connessione scaduta
@@ -1112,8 +1112,16 @@ Non è consigliabile utilizzarlo.
-
- Impossibile connettersi in modo sicuro. Vuoi provare a connetterti senza cifratura (non consigliato)?
+
+ Impossibile connettersi in modo sicuro:
+
+%1
+
+Vuoi invece connetterti senza cifratura (non consigliato)?
@@ -1305,27 +1313,27 @@ Non è consigliabile utilizzarlo.
Mirall::PropagateDownloadFileLegacy
-
+
Sincronizzazione interrotta dall'utente.
-
+
Nessun e-tag ricevuto dal server, controlla il proxy/gateway
-
+
Abbiamo ricevuto un e-tag diverso per il recupero. Riprova più tardi.
-
+
Il server ha restituito un content-range errato
-
+
Il file %1 non può essere scaricato a causa di un conflitto con un file locale.
@@ -1333,12 +1341,17 @@ Non è consigliabile utilizzarlo.
Mirall::PropagateDownloadFileQNAM
-
+
Il file %1 non può essere scaricato a causa di un conflitto con un file locale.
-
+
+
+ Il file non può essere scaricato completamente.
+
+
+
Il file %1 non può essere salvato a causa di un conflitto con un file locale.
@@ -1424,18 +1437,18 @@ Non è consigliabile utilizzarlo.
Mirall::PropagateUploadFileLegacy
-
-
+
+
Un file locale è cambiato durante la sincronizzazione, nuova sincronizzazione alla ricezione.
-
+
Sincronizzazione interrotta dall'utente.
-
+
Il file è stato modificato localmente, ma è parte di una condivisione in sola lettura. È stato ripristinato e la tua modifica è nel file di conflitto.
@@ -1443,23 +1456,23 @@ Non è consigliabile utilizzarlo.
Mirall::PropagateUploadFileQNAM
-
+
Il file è stato modificato localmente, ma è parte di una condivisione in sola lettura. È stato ripristinato e la tua modifica è nel file di conflitto.
-
+
Il file locale è stato rimosso durante la sincronizzazione.
-
+
Un file locale è cambiato durante la sincronizzazione.
-
+
Il server non ha riconosciuto l'ultimo pezzo. (Non era presente alcun e-tag)
@@ -1537,17 +1550,30 @@ Non è consigliabile utilizzarlo.
Lo stato di sincronizzazione è stato copiato negli appunti.
-
-
- Attualmente nessun file è ignorato a causa di errori precedenti.
+
+
+ Attualmente nessun file è ignorato a causa di errori precedenti e non ci sono scaricamenti in corso.
-
+
+
%n file sono ignorati a causa di errori precedenti.
-Prova a sincronizzare nuovamente.%n file sono ignorati a causa di errori precedenti.
-Prova a sincronizzare nuovamente.
+%n file sono ignorati a causa di errori precedenti.
+
+
+
+
+
+ %n file sono stati scaricati parzialmente.
+ %n file sono stati scaricati parzialmente.
+
+
+
+
+
+ Prova a sincronizzarli nuovamente.
@@ -1635,12 +1661,12 @@ Prova a sincronizzare nuovamente.
Mirall::ShibbolethCredentials
-
+
Errore di accesso
-
+
Devi accedere con l'utente %1
@@ -2048,69 +2074,69 @@ Prova a sincronizzare nuovamente.
Il file contiene caratteri non validi che non possono essere sincronizzati su diverse piattaforme.
-
+
Impossibile inizializzare il registro di sincronizzazione.
-
+
Impossibile aprire il registro di sincronizzazione
-
-
+
+
Ignorato in base alla lista nera per la scelta di cosa sincronizzare
-
+
Non consentito poiché non disponi dei permessi per aggiungere sottocartelle in quella cartella
-
+
Non consentito poiché non disponi dei permessi per aggiungere la cartella superiore
-
+
Non consentito poiché non disponi dei permessi per aggiungere file in quella cartella
-
+
Il caricamento di questo file non è consentito poiché è in sola lettura sul server, ripristino
-
-
+
+
Rimozione non consentita, ripristino
-
+
I file locali e la cartella condivisa sono stati rimossi.
-
+
Spostamento non consentito, elemento ripristinato
-
+
Spostamento non consentito poiché %1 è in sola lettura
-
+
la destinazione
-
+
l'origine
diff --git a/translations/mirall_ja.ts b/translations/mirall_ja.ts
index b36ac2a10..e5be379c4 100644
--- a/translations/mirall_ja.ts
+++ b/translations/mirall_ja.ts
@@ -386,12 +386,12 @@ Total time left %5
同期アクティビティ
-
+
システム上の除外ファイルを読み込めません
-
+
@@ -400,17 +400,17 @@ Are you sure you want to perform this operation?
本当にこの操作を実行しますか?
-
+
すべてのファイルを削除しますか?
-
+
すべてのファイルを削除
-
+
ファイルを残す
@@ -637,22 +637,22 @@ Are you sure you want to perform this operation?
Mirall::GETFileJob
-
+
サーバーからE-Tagを受信できません。プロキシ/ゲートウェイを確認してください。
-
+
同期再開時に違う E-Tagを受信しました。次回リトライします。
-
+
サーバーが間違ったcontent-rangeを返しました
-
+
接続タイムアウト
@@ -1111,8 +1111,16 @@ It is not advisable to use it.
-
- 安全に接続できませんでした。暗号化せずに接続しますか?(非推奨)
+
+ 安全な接続ができませんでした:
+
+%1
+
+非暗号化接続しますか?(推奨されません)
@@ -1304,27 +1312,27 @@ It is not advisable to use it.
Mirall::PropagateDownloadFileLegacy
-
+
同期はユーザーによって中止されました。
-
+
サーバーからE-Tagを受信できません。プロキシ/ゲートウェイを確認してください。
-
+
同期再開時に違う E-Tagを受信しました。次回リトライします。
-
+
サーバーが間違ったcontent-rangeを返しました
-
+
ファイル %1 はローカルファイル名が衝突しているためダウンロードできません!
@@ -1332,12 +1340,17 @@ It is not advisable to use it.
Mirall::PropagateDownloadFileQNAM
-
+
ファイル %1 はローカルファイル名が衝突しているためダウンロードできません!
-
+
+
+
+
+
+
%1 はローカルファイル名が衝突しているため保存できません!
@@ -1423,18 +1436,18 @@ It is not advisable to use it.
Mirall::PropagateUploadFileLegacy
-
-
+
+
同期中にローカルファイルが変更されました。完了してからもう一度同期してください。
-
+
同期はユーザーによって中止されました。
-
+
ファイルがローカルで編集されましたが、読み込み専用の共有の一部です。それは復元され、あなたの編集は競合するファイル内にあります。
@@ -1442,23 +1455,23 @@ It is not advisable to use it.
Mirall::PropagateUploadFileQNAM
-
+
ファイルがローカルで編集されましたが、読み込み専用の共有の一部です。ファイルは復元され、あなたの編集は競合するファイル内にあります。
-
+
ローカルファイルを同期時に削除します。
-
+
ローカルのファイルが同期中に変更されました。
-
+
サーバーは最終チャンクを認識しません。(e-tag が存在しません)
@@ -1536,16 +1549,28 @@ It is not advisable to use it.
同期状況をクリップボードにコピーしました。
-
-
- 処理前にエラーが発生したため、ファイルは何も除外されていません。
+
+
+ 以前のエラーのため無視したファイルはありません。進行中のダウンロードもありません。
-
+
- 直前のエラーのため、%n個のファイルが無視されました。
-もう一度同期してください。
+
+ 前のエラーのため、%n個のファイルが無視されました。
+
+
+
+
+
+ %nファイルのダウンロードが不完全です。
+
+
+
+
+
+ これらをもう一度同期してください。
@@ -1633,12 +1658,12 @@ It is not advisable to use it.
Mirall::ShibbolethCredentials
-
+
ログインエラー
-
+
ユーザー %1 としてログインする必要があります
@@ -2046,69 +2071,69 @@ It is not advisable to use it.
ファイルに無効な文字が含まれているため、クロスプラットフォーム環境での同期ができません。
-
+
同期ジャーナルの初期化ができません。
-
+
同期ジャーナルを開くことができません
-
-
+
+
"同期対象先" ブラックリストにより無視されました。
-
+
そのディレクトリにサブディレクトリを追加する権限がありません
-
+
親ディレクトリを追加する権限がありません
-
+
そのディレクトリにファイルを追加する権限がありません
-
+
サーバーでは読み取り専用となっているため、このファイルをアップロードすることはできません、復元しています
-
-
+
+
削除できません、復元しています
-
+
ローカルファイルと共有フォルダが削除されました。
-
+
移動できません、項目を復元しました
-
+
%1 は読み取り専用のため移動できません
-
+
移動先
-
+
移動元
diff --git a/translations/mirall_nl.ts b/translations/mirall_nl.ts
index 57e72a438..4c4b2f819 100644
--- a/translations/mirall_nl.ts
+++ b/translations/mirall_nl.ts
@@ -386,12 +386,12 @@ Totaal resterende tijd %5
Synchronisatie-activiteit
-
+
Kon het systeem-uitsluitingsbestand niet lezen
-
+
@@ -400,17 +400,17 @@ Dit kan komen doordat de map ongemerkt opnieuw geconfigureerd is of doordat alle
Weet u zeker dat u deze bewerking wilt uitvoeren?
-
+
Verwijder alle bestanden?
-
+
Verwijder alle bestanden
-
+
Bewaar bestanden
@@ -637,22 +637,22 @@ Weet u zeker dat u deze bewerking wilt uitvoeren?
Mirall::GETFileJob
-
+
Geen E-Tag ontvangen van de server, controleer Proxy/Gateway
-
+
We ontvingen een afwijkende E-Tag om door te gaan. We proberen het later opnieuw.
-
+
Server retourneerde verkeerde content-bandbreedte
-
+
Verbindingstime-out
@@ -1113,8 +1113,16 @@ We adviseren deze site niet te gebruiken.
-
- Kon geen beveiligde verbinding maken. Wilt u een onversleutelde verbinding maken (niet aan te raden)?
+
+ Kon geen beveiligde verbinding maken:
+
+%1
+
+Wilt u een onversleutelde verbinding maken (niet aanbevolen)?
@@ -1306,27 +1314,27 @@ We adviseren deze site niet te gebruiken.
Mirall::PropagateDownloadFileLegacy
-
+
Synchronisatie afgebroken door gebruiker.
-
+
Geen E-Tag ontvangen van de server, controleer Proxy/Gateway
-
+
We ontvingen een afwijkende E-Tag om door te gaan. We proberen het later opnieuw.
-
+
Server retourneerde verkeerde content-bandbreedte
-
+
Bestand %1 kan niet worden gedownload omdat de naam conflicteert met een lokaal bestand
@@ -1334,12 +1342,17 @@ We adviseren deze site niet te gebruiken.
Mirall::PropagateDownloadFileQNAM
-
+
Bestand %1 kan niet worden gedownload omdat de naam conflicteert met een lokaal bestand
-
+
+
+ Het bestand kon niet volledig worden gedownload.
+
+
+
Bestand %1 kan niet worden opgeslagen wegens een lokaal bestandsnaam conflict!
@@ -1425,18 +1438,18 @@ We adviseren deze site niet te gebruiken.
Mirall::PropagateUploadFileLegacy
-
-
+
+
Een lokaal bestand is gewijzigd tijdens het synchroniseren, wordt gesynchroniseerd als het volledig is aangekomen.
-
+
Synchronisatie afgebroken door gebruiker.
-
+
Het bestand is lokaal bewerkt, maar hoort bij een alleen-lezen share. Het originele bestand is teruggezet en uw bewerking staat in het conflicten bestand.
@@ -1444,23 +1457,23 @@ We adviseren deze site niet te gebruiken.
Mirall::PropagateUploadFileQNAM
-
+
Het bestand is lokaal bewerkt, maar hoort bij een alleen-lezen share. Het originele bestand is teruggezet en uw bewerking staat in het conflicten bestand.
-
+
Het lokale bestand werd verwijderd tijdens sync.
-
+
Lokaal bestand gewijzigd bij sync.
-
+
De server heeft het laatste deel niet bevestigd (er was geen e-tag aanwezig)
@@ -1538,17 +1551,29 @@ We adviseren deze site niet te gebruiken.
Het synchronisatie overzicht is gekopieerd naar het klembord.
-
-
- Er zijn nu geen bestanden genegeerd vanwege eerdere fouten.
+
+
+ Er worden op dit moment geen bestanden genegeerd vanwege eerdere fouten er zijn geen downloads bezig.
-
+
- %1 bestand genegeerd vanwege eerdere fouten.
-Probeer opnieuw te synchroniseren.%1 bestanden zijn genegeerd vanwege eerdere fouten.
-Probeer opnieuw te synchroniseren.
+
+ %n bestand genegeerd wegens eerdere fouten.%n bestanden genegeerd wegens eerdere fouten.
+
+
+
+
+
+ %n bestand gedeeltelijk gedownload.
+%n bestanden gedeeltelijk gedownload.
+
+
+
+
+
+ Probeer deze opnieuw te synchen.
@@ -1636,12 +1661,12 @@ Probeer opnieuw te synchroniseren.
Mirall::ShibbolethCredentials
-
+
Inlogfout
-
+
U moet inloggen als gebruiker %1
@@ -2041,7 +2066,7 @@ Probeer opnieuw te synchroniseren.
- De file is opgenomen op de negeerlijst.
+ Het bestand is opgenomen op de negeerlijst.
@@ -2049,69 +2074,69 @@ Probeer opnieuw te synchroniseren.
Bestand bevat ongeldige karakters die niet tussen platformen gesynchroniseerd kunnen worden.
-
+
- Niet in staat om een synchornisatie journaal te starten.
+ Niet in staat om een synchronisatie transactielog te starten.
-
+
- Kan het sync journal niet openen
+ Kan het sync transactielog niet openen
-
-
+
+
Genegeerd vanwege de "kies wat te synchen" zwarte lijst
-
+
Niet toegestaan, omdat u geen rechten hebt om sub-directories aan te maken in die directory
-
+
Niet toegestaan, omdat u geen rechten hebt om een bovenliggende directories toe te voegen
-
+
Niet toegestaan, omdat u geen rechten hebt om bestanden in die directory toe te voegen
-
+
Niet toegestaan om dit bestand te uploaden, omdat het alleen-lezen is op de server, herstellen
-
-
+
+
Niet toegestaan te verwijderen, herstellen
-
+
Lokale bestanden en share-map verwijderd.
-
+
Verplaatsen niet toegestaan, object hersteld
-
+
Verplaatsen niet toegestaan omdat %1 alleen-lezen is
-
+
bestemming
-
+
bron
@@ -2380,7 +2405,7 @@ Probeer opnieuw te synchroniseren.
- Server adres:
+ Server &adres:
@@ -2429,7 +2454,7 @@ Probeer opnieuw te synchroniseren.
- &Geen wachtwoorden opslaan op de lokale machine.
+ &Sla geen wachtwoorden op op de lokale machine.
@@ -2439,12 +2464,12 @@ Probeer opnieuw te synchroniseren.
- Voer de url in van de ownCloud-server waarmee u wilt verbinden (met http of https).
+ Voer de URL in van de server waarmee u wilt verbinden (zonder http of https).
- Server&adres
+ Server &adres
@@ -2560,7 +2585,7 @@ Probeer opnieuw te synchroniseren.
- Bestandssysteem toegangsfout
+ Toegangsfout van het bestandssysteem
diff --git a/translations/mirall_pl.ts b/translations/mirall_pl.ts
index 203ee4d1d..e9ee7b788 100644
--- a/translations/mirall_pl.ts
+++ b/translations/mirall_pl.ts
@@ -386,12 +386,12 @@ Pozostało czasu %5
Aktywności synchronizacji
-
+
Nie można przeczytać pliku wyłączeń
-
+
@@ -400,17 +400,17 @@ Mogło się tak zdarzyć z powodu niezauważonej rekonfiguracji folderu, lub te
Czy jesteś pewien/pewna, że chcesz wykonać tę operację?
-
+
Usunąć wszystkie pliki?
-
+
Usuń wszystkie pliki
-
+
Pozostaw pliki
@@ -637,22 +637,22 @@ Czy jesteś pewien/pewna, że chcesz wykonać tę operację?
Mirall::GETFileJob
-
+
Nie otrzymano E-Tag z serwera, sprawdź Proxy/Bramę
-
+
Otrzymaliśmy inny E-Tag wznowienia. Spróbuje ponownie następnym razem.
-
+
Serwer zwrócił błędną zakres zawartości
-
+
Limit czasu połączenia
@@ -1113,8 +1113,12 @@ Niezalecane jest jego użycie.
-
- Nie udało się połączyć bezpiecznie. Czy chcesz nawiązać połączenie nieszyfrowane (niezalecane)?
+
+
@@ -1306,27 +1310,27 @@ Niezalecane jest jego użycie.
Mirall::PropagateDownloadFileLegacy
-
+
Synchronizacja anulowane przez użytkownika.
-
+
Nie otrzymano E-Tag z serwera, sprawdź Proxy/Bramę
-
+
Otrzymaliśmy inny E-Tag wznowienia. Spróbuje ponownie następnym razem.
-
+
Serwer zwrócił błędną zakres zawartości
-
+
Nie można pobrać pliku %1 ze względu na konflikt nazwy pliku lokalnego!
@@ -1334,12 +1338,17 @@ Niezalecane jest jego użycie.
Mirall::PropagateDownloadFileQNAM
-
+
Nie można pobrać pliku %1 ze względu na konflikt nazwy pliku lokalnego!
-
+
+
+
+
+
+
@@ -1425,18 +1434,18 @@ Niezalecane jest jego użycie.
Mirall::PropagateUploadFileLegacy
-
-
+
+
Lokalny plik zmienił się podczas synchronizacji, synchronizuję ponownie ponieważ dotarł w całości.
-
+
Synchronizacja anulowane przez użytkownika.
-
+
Plik był edytowany lokalnie ale jest częścią udziału z prawem tylko do odczytu. Został przywrócony i Twoja edycja jest w pliku konfliktu
@@ -1444,23 +1453,23 @@ Niezalecane jest jego użycie.
Mirall::PropagateUploadFileQNAM
-
+
Plik był edytowany lokalnie ale jest częścią udziału z prawem tylko do odczytu. Został przywrócony i Twoja edycja jest w pliku konfliktu
-
+
Pliki lokalny został usunięty podczas synchronizacji.
-
+
Lokalny plik zmienił się podczas synchronizacji.
-
+
Serwer nie potwierdził ostatniego łańcucha danych. (Nie było żadnego e-tag-u)
@@ -1538,16 +1547,27 @@ Niezalecane jest jego użycie.
Status synchronizacji został skopiowany do schowka.
-
-
- Obecnie nie ma plików, które są ignorowane z powodu wcześniejszych błędów.
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
Mirall::SelectiveSyncDialog
@@ -1634,12 +1654,12 @@ Niezalecane jest jego użycie.
Mirall::ShibbolethCredentials
-
+
Błąd logowania
-
+
Musisz zalogować się jako użytkownik %1
@@ -2047,69 +2067,69 @@ Niezalecane jest jego użycie.
Plik zawiera nieprawidłowe znaki, które nie mogą być synchronizowane wieloplatformowo.
-
+
Nie można zainicjować synchronizacji dziennika.
-
+
Nie można otworzyć dziennika synchronizacji
-
-
+
+
-
+
Nie masz uprawnień do dodawania podkatalogów w tym katalogu.
-
+
Nie masz uprawnień by dodać katalog nadrzędny
-
+
Nie masz uprawnień by dodać pliki w tym katalogu
-
+
Wgrywanie niedozwolone, ponieważ plik jest tylko do odczytu na serwerze, przywracanie
-
-
+
+
Brak uprawnień by usunąć, przywracanie
-
+
-
+
Przenoszenie niedozwolone, obiekt przywrócony
-
+
Przenoszenie niedozwolone, ponieważ %1 jest tylko do odczytu
-
+
docelowy
-
+
źródło
diff --git a/translations/mirall_pt.ts b/translations/mirall_pt.ts
index 7d8ea3b67..cff0335f6 100644
--- a/translations/mirall_pt.ts
+++ b/translations/mirall_pt.ts
@@ -9,17 +9,17 @@
- Escollha a pasta local a sincronizar
+ Escolha a pasta local no seu computador para sincronizar
- &Escolha...
+ &Escolher ...
- Nome do &directorio:
+ Nome da &diretoria:
@@ -32,17 +32,17 @@
- Seleccione a pasta de destino
+ Selecione a pasta de destino remota
- Adicionar pasta
+ Adicionar Pasta
- Actualizar
+ Atualizar
@@ -70,28 +70,28 @@
- Editar ficheiros ignorados
+ Editar Ficheiros Ignorados
- Modificar conta
+ Modificar Conta
- Conta a sincronizar
+ Conta a Sincronizar
- Ligado a <server> como <user>
+ Conetado com <server> como <user>
- Pausa
+ Pausar
@@ -101,22 +101,22 @@
- Adicionar Pasta...
+ Adicionar Pasta ...
- Escolher o que sincronizar
+ Escolher o Que Sincronizar
- Utilização do armazenamento
+ Utilização do Armazenamento
- A obter estatísticas de utilização...
+ A obter estatísticas da utilização ...
@@ -126,12 +126,12 @@
- Resumir
+ Retomar
- Confirme a remoção da pasta
+ Confirmar Remover Pasta
@@ -141,7 +141,7 @@
- Confirmar reposição da pasta
+ Confirmar Repor Pasta
@@ -168,12 +168,12 @@
- %1 (%3%) de %2 de espaço utilizado.
+ %1 (%3%) de %2 de espaço do servidor em uso.
- Sem ligação a %1 em <a href="%2">%3</a>.
+ Sem coneção para %1 em <a href="%2">%3</a>.
@@ -183,7 +183,7 @@
- A sincronização está a decorrer
+ Sincronização em Execução
@@ -204,29 +204,29 @@
Example text: "uploading foobar.png (1MB of 2MB) time left 2 minutes at a rate of 24Kb/s"
- %1 %2 (%3 de %4) %5 faltando a uma taxa de %6/s
+ %1 %2 (%3 de %4) %5 restante, a uma taxa de %6/s
-
-
+ %1 of %2, ficheiro %3 de %4
+Tempo total restante %5
- Conectado a <a href="%1">%2</a>.
+ Conetado a <a href="%1">%2</a>.
- Conectado a <a href="%1">%2</a> como <i>%3</i>.
+ Conetado a <a href="%1">%2</a> como <i>%3</i>.
- Histórico de utilização de armazenamento não disponível.
+ Atualmente não está disponível nenhuma informação da utilização do armazenamento.
@@ -234,22 +234,22 @@ Total time left %5
- Autenticação necessária
+ Autenticação Requerida
- Introduza o nome de utilizador e password para '%1' em %2.
+ Insira o nome de utilizador e a senha para '%1' em %2.
- &Utilizador
+ &Utilizador:
- Password&:
+ &Senha:
@@ -273,12 +273,12 @@ Total time left %5
- Não foi possível ligar a %1
+ Não foi possível conetar a %1
- tempo limite
+ tempo expirado
@@ -291,7 +291,7 @@ Total time left %5
- Impossível criar 'csync-context'
+ Não é possível criar 'csync-context'
@@ -306,7 +306,7 @@ Total time left %5
- Não é possível ler %1
+ %1 não é legível.
@@ -335,18 +335,18 @@ Total time left %5
%1 names a file.
- Fez o download de %1
+ %1 foi transferido.
- Os ficheiros %1 e %2 foram actualizados.
+ %1 e %2 outros ficheiros foram atualizados.
%1 names a file.
- %1 foi actualizado.
+ %1 foi atualizado.
@@ -383,15 +383,15 @@ Total time left %5
- Actividade de sincronicação
+ Atividade de Sincronização
-
+
Não foi possível ler o ficheiro system exclude
-
+
@@ -399,17 +399,17 @@ Are you sure you want to perform this operation?
Se você, ou o seu administrador, reiniciou a sua conta no servidor, escolha "Manter os ficheiros". Se quer apagar os seus dados, escolha "Remover todos os ficheiros".
-
+
Remover todos os ficheiros?
-
+
Remover todos os ficheiros
-
+
Manter os ficheiros
@@ -434,22 +434,22 @@ Se você, ou o seu administrador, reiniciou a sua conta no servidor, escolha &q
- A aguardar o inicio da sincronização.
+ A aguardar para iniciar a sincronização.
- A preparar para sincronização.
+ A preparar para sincronizar.
- A sincronização está a correr.
+ A sincronização está em execução.
- A última sincronização foi efectuada com sucesso.
+ A última sincronização foi efetuada com sucesso.
@@ -469,12 +469,12 @@ Se você, ou o seu administrador, reiniciou a sua conta no servidor, escolha &q
- A sincronização está em pausa.
+ A sincronização está pausada.
- %1 (Sincronização em pausa)
+ %1 (A sincronização está pausada)
@@ -488,12 +488,12 @@ Se você, ou o seu administrador, reiniciou a sua conta no servidor, escolha &q
- A sincronizar todos os ficheiros sua conta com
+ A sincronizar todos os ficheiros na sua conta com
- Pasta remota: %1
+ Caminho remoto: %1
@@ -502,7 +502,7 @@ Se você, ou o seu administrador, reiniciou a sua conta no servidor, escolha &q
- Acrescentar pasta
+ Adicionar Pasta
@@ -510,7 +510,7 @@ Se você, ou o seu administrador, reiniciou a sua conta no servidor, escolha &q
- Escolha a pasta local a sincronizar.
+ Clique para selecionar a pasta local para sincronizar.
@@ -636,22 +636,22 @@ Se você, ou o seu administrador, reiniciou a sua conta no servidor, escolha &q
Mirall::GETFileJob
-
+
Nenhum E-Tag recebido do servidor, verifique Proxy / gateway
-
+
Recebemos um e-Tag diferente para resumir. Tentando uma próxima vez.
-
+
O servidor retornou o alcance-conteúdo errado
-
+
O tempo de ligação expirou
@@ -705,12 +705,12 @@ Se você, ou o seu administrador, reiniciou a sua conta no servidor, escolha &q
- Introduza a Palavra-passe
+ Insira a Senha
- Por favor introduza %1 password para o utilizador '%2':
+ Por favor, insira %1 senha para o utilizador '%2':
@@ -728,7 +728,7 @@ Se você, ou o seu administrador, reiniciou a sua conta no servidor, escolha &q
- Apagar
+ Remover
@@ -851,7 +851,7 @@ Itens verificados também serão removidos se evitarem que um diretório seja re
- <p>A nova serão do %1 Cliente está disponivel.</p><p><b>%2</b> está disponível para descarga. A versão instalada é a %3.</p>
+ <p>A nova serão do %1 Cliente está disponivel.</p><p><b>%2</b> está disponível para transferência. A versão instalada é a %3.</p>
@@ -947,17 +947,17 @@ Itens verificados também serão removidos se evitarem que um diretório seja re
- Nome do servidor proxy.
+ Nome do servidor proxy
- Nome de utilizador para o servidor proxy.
+ Nome de utilizador para o servidor proxy
- Password para o servidor proxy.
+ Senha para o servidor proxy.
@@ -975,7 +975,7 @@ Itens verificados também serão removidos se evitarem que um diretório seja re
- Nova actualização disponível
+ Nova atualização disponível
@@ -1006,7 +1006,7 @@ for additional privileges during the process.
- Uma nova versão %1 está disponível. Por favor use o sistema de actualização para instalar.
+ Nova versão %1 disponível. Por favor use a ferramenta de atualização do sistema para a instalar.
@@ -1016,7 +1016,7 @@ for additional privileges during the process.
- Estado de actualização é desconhecido: não foi possível procurar novas actualizações
+ Estado de actualização é desconhecido: não foi possível procurar novas actualizações.
@@ -1110,8 +1110,16 @@ It is not advisable to use it.
-
- Não foi possível estabelecer uma ligação segura. Deseja utilizar uma ligação não segura?(não recomendado)?
+
+ Não foi possível ligar com segurança:
+
+%1
+
+Em vez disso deseja utilizar uma ligação não codificada (não recomendado)?
@@ -1303,27 +1311,27 @@ It is not advisable to use it.
Mirall::PropagateDownloadFileLegacy
-
+
A sincronização foi cancelada pelo utilizador.
-
+
Nenhum E-Tag recebido do servidor, verifique Proxy / gateway
-
+
Recebemos um e-Tag diferente para resumir. Tentando uma próxima vez.
-
+
O servidor retornou o alcance-conteúdo errado
-
+
O ficheiro %1 não pode ser descarregado devido a conflito com um nome de ficheiro local!
@@ -1331,12 +1339,17 @@ It is not advisable to use it.
Mirall::PropagateDownloadFileQNAM
-
+
O ficheiro %1 não pode ser descarregado devido a conflito com um nome de ficheiro local!
-
+
+
+ Não foi possível transferir o ficheiro na totalidade.
+
+
+
Ficheiro %1 não pode ser guardado devido à existência de um ficheiro local com o mesmo nome.
@@ -1422,18 +1435,18 @@ It is not advisable to use it.
Mirall::PropagateUploadFileLegacy
-
-
+
+
Ficheiro local foi alterado durante a sincronização. A sincronizar quando chegar na totalidade
-
+
A sincronização foi cancelada pelo utilizador.
-
+
O ficheiro foi editado localmente mas faz parte de uma prtilha só de leitura. Foi restaurado mas a edição está no ficheiro de conflito.
@@ -1441,23 +1454,23 @@ It is not advisable to use it.
Mirall::PropagateUploadFileQNAM
-
+
O ficheiro foi editado localmente mas faz parte de uma prtilha só de leitura. Foi restaurado mas a edição está no ficheiro de conflito.
-
+
O arquivo local foi removido durante a sincronização.
-
+
Ficheiro local alterado durante a sincronização.
-
+
O servidor não reconheceu o último bloco. (Nenhuma e-tag estava presente)
@@ -1535,17 +1548,30 @@ It is not advisable to use it.
O estado da sincronização foi copiada para a área de transferência.
-
-
- Devido a erros anteriores, nenhum ficheiro é ignorado.
+
+
+ Atualmente os ficheiros não são ignorados devido a erros anteriores e não existem transferências em progresso
-
+
- %n ficheiros são ignorados devido a erros anteriores.
-Tente sincronizá-los novamente.%n ficheiros são ignorados devido a erros anteriores.
-Tente sincronizá-los novamente.
+
+ é ignorado %n ficheiro devido a erros anteriores.
+são ignorados %n ficheiros devido a erros anteriores.
+
+
+
+
+
+ %n ficheiro foi parcialmente transferido.
+%n ficheiros foram parcialmente transferidos.
+
+
+
+
+
+ Tente sincronizar estes também.
@@ -1633,12 +1659,12 @@ Tente sincronizá-los novamente.
Mirall::ShibbolethCredentials
-
+
Erro de login
-
+
Deve fazer o login como utilizador %1.
@@ -2047,69 +2073,69 @@ Por favor utilize um servidor de sincronização horária (NTP), no servidor e n
O ficheiro contém caracteres inválidos que não podem ser sincronizados pelas várias plataformas.
-
+
Impossível inicializar sincronização 'journal'.
-
+
Impossível abrir o jornal de sincronismo
-
-
+
+
Ignorado devido à blacklist de escolha para sincronização
-
+
Não permitido, porque não tem permissão para adicionar sub-directórios ao directório
-
+
Não permitido, porque não tem permissão para adicionar o directório principal
-
+
Não permitido, porque não tem permissão para adicionar ficheiros no directório
-
+
Não é permitido fazer o envio deste ficheiro porque é só de leitura no servidor, restaurando
-
-
+
+
Não autorizado para remoção, restaurando
-
+
Ficheiros locais e pasta partilhada removidos.
-
+
Mover não foi permitido, item restaurado
-
+
Mover não foi autorizado porque %1 é só de leitura
-
+
o destino
-
+
a origem
@@ -2220,12 +2246,12 @@ Por favor utilize um servidor de sincronização horária (NTP), no servidor e n
- Entrar...
+ Iniciar sessão...
- Sair
+ Terminar sessão
@@ -2255,7 +2281,7 @@ Por favor utilize um servidor de sincronização horária (NTP), no servidor e n
- Sincronizando %1 (%2 faltando)
+ A sincronizar %1 (%2 em falta)
@@ -2265,7 +2291,7 @@ Por favor utilize um servidor de sincronização horária (NTP), no servidor e n
- Actualizado
+ Atualizado
@@ -2273,7 +2299,7 @@ Por favor utilize um servidor de sincronização horária (NTP), no servidor e n
- <p>Versão %2. Para mais informação visita <a href="%3">%4</a></p><p><small>Por Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz and others.<br/>Baseado em Mirall por Duncan Mac-Vicar P.</small></p><p>Copyright ownCloud, Inc.</p><p>Licenciado sob a GNU General Public License (GPL) Versão 2.0<br/>ownCloud e ownCloud Logo são marcas registadas de ownCloud, Inc. nos Estados Unidos da América, em outros países, ou ambos.</p>
+ <p>Versão %2. Para mais informações visite <a href="%3">%4</a></p><p><small>Por Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz and others.<br/>Baseado em Mirall por Duncan Mac-Vicar P.</small></p><p>Copyright ownCloud, Inc.</p><p>Licenciado sob a GNU General Public License (GPL) Versão 2.0<br/>ownCloud e ownCloud Logo são marcas registadas de ownCloud, Inc. nos Estados Unidos da América, em outros países, ou ambos.</p>
@@ -2353,7 +2379,7 @@ Por favor utilize um servidor de sincronização horária (NTP), no servidor e n
- &Password
+ &Senha
@@ -2412,22 +2438,22 @@ Por favor utilize um servidor de sincronização horária (NTP), no servidor e n
- Password&:
+ &Senha:
- Introduza a sua palavra-passe do ownCloud
+ Introduza a sua senha do ownCloud
- Não permitir que a palavra-passe seja guardada.
+ Não permitir que a senha seja guardada localmente.
- &Não guardar a password
+ &Não guardar a senha na máquina local
diff --git a/translations/mirall_pt_BR.ts b/translations/mirall_pt_BR.ts
index 7af8da783..1f30273f7 100644
--- a/translations/mirall_pt_BR.ts
+++ b/translations/mirall_pt_BR.ts
@@ -386,12 +386,12 @@ Total de tempo que falta 5%
Atividade de Sincronização
-
+
Não foi possível ler o sistema de arquivo de exclusão
-
+
@@ -400,17 +400,17 @@ Isso pode ser porque a pasta foi silenciosamente reconfigurada, ou todos os arqu
Você tem certeza que quer executar esta operação?
-
+
Deseja Remover Todos os Arquivos?
-
+
Remover todos os arquivos
-
+
Manter arquivos
@@ -637,22 +637,22 @@ Você tem certeza que quer executar esta operação?
Mirall::GETFileJob
-
+
Nenhuma E-Tag recebida do servidor, verifique Proxy / gateway
-
+
Recebemos um e-Tag diferente para resumir. Tente uma próxima vez.
-
+
O servidor retornou erro numa série-de-conteúdo
-
+
Conexão Finalizada
@@ -1111,8 +1111,16 @@ It is not advisable to use it.
-
- Não foi possível conectar com segurança. Você deseja se conectar sem usar criptografia (não recomendado)?
+
+ Não foi possível conectar com segurança:
+
+%1
+
+Você deseja se conectar sem criptografia (não recomendado)?
@@ -1304,27 +1312,27 @@ It is not advisable to use it.
Mirall::PropagateDownloadFileLegacy
-
+
A sincronização foi abortada pelo usuário.
-
+
Nenhuma E-Tag recebida do servidor, verifique Proxy / gateway
-
+
Recebemos um e-Tag diferente para resumir. Tente uma próxima vez.
-
+
O servidor retornou erro numa série-de-conteúdo
-
+
O arquivo %1 não pode ser baixado por causa de um confronto local no nome do arquivo!
@@ -1332,12 +1340,17 @@ It is not advisable to use it.
Mirall::PropagateDownloadFileQNAM
-
+
O arquivo %1 não pode ser baixado por causa de um confronto local no nome do arquivo!
-
+
+
+ O arquivo não pode ser baixado completamente.
+
+
+
O arquivo %1 não pode ser salvo por causa de um confronto com um nome de arquivo local!
@@ -1423,18 +1436,18 @@ It is not advisable to use it.
Mirall::PropagateUploadFileLegacy
-
-
+
+
Arquivo local alterado durante a sincronização, sincronizando uma vez que chegou completamente
-
+
A sincronização foi abortada pelo usuário.
-
+
O arquivo foi editado localmente mas faz parte de compartilhamento só de leitura. Ele foi restaurado mas sua edição está em conflito com o arquivo.
@@ -1442,23 +1455,23 @@ It is not advisable to use it.
Mirall::PropagateUploadFileQNAM
-
+
O arquivo foi editado localmente mas faz parte de compartilhamento só de leitura. Ele foi restaurado mas sua edição está em conflito com o arquivo.
-
+
O arquivo local foi removido durante a sincronização.
-
+
Arquivo local modificado durante a sincronização.
-
+
O servidor não reconheceu o último bloco. (Nenhuma e-tag estava presente)
@@ -1536,15 +1549,29 @@ It is not advisable to use it.
O estado de sincronização foi copiado para a área de transferência.
-
-
- Correntemente nenhum arquivo será ignorado por causa de erros prévios.
+
+
+ Atualmente não há arquivos ignorados devido a erros anteriores e nenhum downloads está em andamento.
-
+
-
+
+ %n arquivo foi ignorado por causa dos erros anteriores.
+%n arquivos foram ignorados por causa dos erros anteriores.
+
+
+
+
+
+ %n arquivo está parcialmente baixado.
+%n arquivos forão parcialmente baixados.
+
+
+
+
+ Tente sincronizar estes novamente.
@@ -1632,12 +1659,12 @@ It is not advisable to use it.
Mirall::ShibbolethCredentials
-
+
Erro de Login
-
+
Você deve entrar como usuário %1
@@ -2045,69 +2072,69 @@ It is not advisable to use it.
Arquivos que contém caracteres inválidos não podem ser sincronizados através de plataformas.
-
+
Impossibilitado de iniciar a sincronização.
-
+
Não é possível abrir o arquivo de sincronização
-
-
+
+
Ignorado por causa da lista negra "escolher o que sincronizar"
-
+
Não permitido porque você não tem permissão de criar sub-pastas nesta pasta
-
+
Não permitido porque você não tem permissão de criar pastas mãe
-
+
Não permitido porque você não tem permissão de adicionar arquivos a esta pasta
-
+
Não é permitido fazer o upload deste arquivo porque ele é somente leitura no servidor, restaurando
-
-
+
+
Não é permitido remover, restaurando
-
+
Arquivos locais e pasta compartilhada removida.
-
+
Não é permitido mover, item restaurado
-
+
Não é permitido mover porque %1 é somente para leitura
-
+
o destino
-
+
a fonte
diff --git a/translations/mirall_ru.ts b/translations/mirall_ru.ts
index 018950bda..298726c05 100644
--- a/translations/mirall_ru.ts
+++ b/translations/mirall_ru.ts
@@ -198,7 +198,7 @@
-
+ Ищем '%1'
@@ -386,12 +386,12 @@ Total time left %5
Журнал синхронизации
-
+
Невозможно прочесть исключенный системный файл
-
+
@@ -400,17 +400,17 @@ Are you sure you want to perform this operation?
Вы уверены, что хотите выполнить операцию?
-
+
Удалить все файлы?
-
+
Удалить все файлы
-
+
Сохранить файлы
@@ -637,22 +637,22 @@ Are you sure you want to perform this operation?
Mirall::GETFileJob
-
+
E-Tag от сервера на получен, проверьте сетевые настройки (настройки прокси, шлюз).
-
+
Мы получили другой E-Tag для возобновления. Повторите попытку позже.
-
+
Сервер вернул неверный диапазон содержания
-
+
Тайм-аут подключения
@@ -1113,8 +1113,16 @@ It is not advisable to use it.
-
- Не удалось безопасно подключиться . Вы хотите подключиться в незашифрованном виде(не рекомендуется)?
+
+ Не удаётся установить защищённое подключение к:
+
+%1
+
+Хотите установить незашифрованное подключение (не рекомендуется)?
@@ -1306,27 +1314,27 @@ It is not advisable to use it.
Mirall::PropagateDownloadFileLegacy
-
+
Синхронизация прервана пользователем.
-
+
E-Tag от сервера на получен, проверьте сетевые настройки (настройки прокси, шлюз).
-
+
Мы получили другой E-Tag для возобновления. Повторите попытку позже.
-
+
Сервер вернул неверный диапазон содержания
-
+
Файл %1 не может быть загружен из-за локальных конфликтов имен!
@@ -1334,14 +1342,19 @@ It is not advisable to use it.
Mirall::PropagateDownloadFileQNAM
-
+
Файл %1 не может быть загружен из-за локальных конфликтов имен!
-
+
+
+ Невозможно полностью загрузить файл.
+
+
+
-
+ Файл %1 не может быть сохранён из-за совпадения его имени с локальным файлом!
@@ -1425,18 +1438,18 @@ It is not advisable to use it.
Mirall::PropagateUploadFileLegacy
-
-
+
+
Локальный файл изменился в процессе синхронизации, повторяем процесс
-
+
Синхронизация прервана пользователем.
-
+
Этот файл был изменен локально, но является частью опубликованной папки с правами только для чтения. Он восстановлен и ваши изменения находятся в файле конфликтов.
@@ -1444,23 +1457,23 @@ It is not advisable to use it.
Mirall::PropagateUploadFileQNAM
-
+
Этот файл был изменен локально, но является частью опубликованной папки с правами только для чтения. Он восстановлен и ваши изменения находятся в файле конфликтов.
-
+
Локальный файл был удалён в процессе синхронизации.
-
+
Локальный файл изменился в процессе синхронизации.
-
+
Сервер не смог подтвердить последний отрезок данных. (Отсутствовали теги e-tag)
@@ -1538,18 +1551,33 @@ It is not advisable to use it.
Статус синхронизации скопирован в буфер обмена.
-
-
- На данный момент файлы, игнорируемые из-за ошибок, отсутствуют.
+
+
+ В настоящий момент из-за предыдущих ошибок ни один из файлов не игнорируется и нет ни одной активной загрузки.
-
+
- %n файл проигнорированы из-за предыдущих ошибок.
-Попробуйте синхронизировать их ещё раз.%n файлов проигнорированы из-за предыдущих ошибок.
-Попробуйте синхронизировать их ещё раз.%n файла проигнорированы из-за предыдущих ошибок.
-Попробуйте синхронизировать их ещё раз.
+
+ %n файл игнорируется из-за предыдущих ошибок.
+
+%n файла игнорируются из-за предыдущих ошибок.
+%n файлов игнорируются из-за предыдущих ошибок.
+
+
+
+
+
+ %n файл частично загружен.
+%n файла частично загружены.
+%n файлов частично загружены.
+
+
+
+
+
+ Попробуйте синхронизировать позже
@@ -1562,7 +1590,7 @@ It is not advisable to use it.
-
+ Неотмеченные папки будут <b>удалены</b> из вашей локальной файловой системы и больше не будут синхронизироваться на этом компьютере
@@ -1637,12 +1665,12 @@ It is not advisable to use it.
Mirall::ShibbolethCredentials
-
+
Ошибка входа
-
+
Вы должны войти как пользователь %1
@@ -2050,69 +2078,69 @@ It is not advisable to use it.
Файл содержит недопустимые символы, которые невозможно синхронизировать между платформами.
-
+
Не удалось инициализировать журнал синхронизации.
-
+
Не удаётся открыть журнал синхронизации
-
-
+
+
Игнорируется из-за черного списка в "выбрать что синхронизировать"
-
+
Недопустимо из-за отсутствия у вас разрешений на добавление подпапок в этой папке
-
+
Недопустимо из-за отсутствия у вас разрешений на добавление родительской папки
-
+
Недопустимо из-за отсутствия у вас разрешений на добавление файлов в эту папку
-
+
Недопустимо отправить этот файл поскольку на севрере он помечен только для чтения, восстанавливаем
-
-
+
+
Недопустимо удалить, восстанавливаем
-
+
Локальные файлы и папки, добавленные в общий доступ, удалены.
-
+
Перемещение недопустимо, элемент восстановлен
-
+
Перемещение недопустимо, поскольку %1 помечен только для чтения
-
+
Назначение
-
+
Источник
@@ -2248,7 +2276,7 @@ It is not advisable to use it.
-
+ Ищем '%1'
diff --git a/translations/mirall_sk.ts b/translations/mirall_sk.ts
index 27ee09d7d..568a656a0 100644
--- a/translations/mirall_sk.ts
+++ b/translations/mirall_sk.ts
@@ -386,12 +386,12 @@ Celkom zostáva %5
Aktivita synchronizácie
-
+
-
+
@@ -400,17 +400,17 @@ Toto môže byť kvôli tichej rekonfigurácii priečinka, prípadne boli všetk
Ste si istý, že chcete uskutočniť danú operáciu?
-
+
Odstrániť všetky súbory?
-
+
Odstrániť všetky súbory
-
+
Ponechať súbory
@@ -637,22 +637,22 @@ Ste si istý, že chcete uskutočniť danú operáciu?
Mirall::GETFileJob
-
+
Zo servera nebol prijatý E-Tag, skontrolujte proxy/bránu
-
+
Prijali sme iný E-Tag pre pokračovanie. Skúsim to neskôr znovu.
-
+
Server vrátil nesprávnu hodnotu Content-range
-
+
Spojenie vypršalo
@@ -1113,8 +1113,12 @@ Nie je vhodné ju používať.
-
- Nemožno sa bezpečne pripojiť. Chcete sa pripojiť nešifrovane (neodporúča sa)?
+
+
@@ -1306,27 +1310,27 @@ Nie je vhodné ju používať.
Mirall::PropagateDownloadFileLegacy
-
+
Synchronizácia zrušená používateľom.
-
+
Zo servera nebol prijatý E-Tag, skontrolujte proxy/bránu
-
+
Prijali sme iný E-Tag pre pokračovanie. Skúsim to neskôr znovu.
-
+
Server vrátil nesprávnu hodnotu Content-range
-
+
Súbor %1 nie je možné stiahnuť, pretože súbor s rovnakým menom už existuje!
@@ -1334,12 +1338,17 @@ Nie je vhodné ju používať.
Mirall::PropagateDownloadFileQNAM
-
+
Súbor %1 nie je možné stiahnuť, pretože súbor s rovnakým menom už existuje!
-
+
+
+
+
+
+
@@ -1425,18 +1434,18 @@ Nie je vhodné ju používať.
Mirall::PropagateUploadFileLegacy
-
-
+
+
Lokálny súbor bol počas synchronizácie zmenený, zosynchronizuje sa, akonáhle bude kompletný
-
+
Synchronizácia zrušená používateľom.
-
+
Súbor bol zmenený, ale je súčasťou zdieľania len na čítanie. Pôvodný súbor bol obnovený a upravená verzia je uložená v konfliktnom súbore.
@@ -1444,23 +1453,23 @@ Nie je vhodné ju používať.
Mirall::PropagateUploadFileQNAM
-
+
Súbor bol zmenený, ale je súčasťou zdieľania len na čítanie. Pôvodný súbor bol obnovený a upravená verzia je uložená v konfliktnom súbore.
-
+
Lokálny súbor bol odstránený počas synchronizácie.
-
+
Lokálny súbor bol zmenený počas synchronizácie.
-
+
Server nepotvrdil posledný kúsok. (Nebol prítomný e-tag)
@@ -1538,16 +1547,27 @@ Nie je vhodné ju používať.
Stav synchronizácie bol nakopírovaný do schránky.
-
-
- V súčastnosti nie sú na čiernej listine žiadne súbory kvôli predchádzajúcim chybovým stavom.
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
Mirall::SelectiveSyncDialog
@@ -1634,12 +1654,12 @@ Nie je vhodné ju používať.
Mirall::ShibbolethCredentials
-
+
Chybné prihlásenie
-
+
Musíte sa prihlásiť ako používateľ %1
@@ -2047,69 +2067,69 @@ Nie je vhodné ju používať.
Súbor obsahuje neplatné znaky, ktoré nemôžu byť zosynchronizované medzi platformami.
-
+
Nemôžem inicializovať synchronizačný žurnál.
-
+
Nemožno otvoriť sync žurnál
-
-
+
+
-
+
Nie je dovolené, pretože nemáte oprávnenie pridávať do tohto adresára podadresáre.
-
+
Nie je dovolené, pretože nemáte oprávnenie pridať nadradený adresár.
-
+
Nie je dovolené, pretože nemáte oprávnenie pridávať do tohto adresára súbory.
-
+
Nie je dovolené tento súbor nahrať, pretože je na serveri iba na čítanie. Obnovuje sa.
-
-
+
+
Nie je dovolené odstrániť. Obnovuje sa.
-
+
-
+
Presunutie nie je dovolené. Položka obnovená.
-
+
Presunutie nie je dovolené, pretože %1 je na serveri iba na čítanie
-
+
cieľ
-
+
zdroj
@@ -2300,7 +2320,7 @@ Nie je vhodné ju používať.
-
+ Synchronizovať všetko zo servera
diff --git a/translations/mirall_sl.ts b/translations/mirall_sl.ts
index 7113bfec7..d879b38b7 100644
--- a/translations/mirall_sl.ts
+++ b/translations/mirall_sl.ts
@@ -386,12 +386,12 @@ Skupaj še %5
Dejavnost usklajevanja
-
+
Ni mogoče prebrati sistemske izločitvene datoteke
-
+
@@ -400,17 +400,17 @@ Mapa je bila morda odstranjena ali pa so bile nastavitve spremenjene.
Ali sta prepričani, da želite izvesti to opravilo?
-
+
Ali naj bodo odstranjene vse datoteke?
-
+
Odstrani vse datoteke
-
+
Ohrani datoteke
@@ -637,22 +637,22 @@ Ali sta prepričani, da želite izvesti to opravilo?
Mirall::GETFileJob
-
+
Ni prejete oznake s strežnika. Preveriti je treba podatke posredovalnega strežnika ali prehoda.
-
+
Prejeta je različna oznaka za nadaljevanje opravila. Ponovni poskus bo izveden kasneje.
-
+
Odziv strežnika kaže na neveljaven obseg vsebine
-
+
Povezava časovno pretekla
@@ -1113,8 +1113,16 @@ Uporaba ni priporočljiva.
-
- Ni mogoče vzpostaviti varne povezave. Ali želite vzpostaviti nešifrirano povezavo (ni priporočljivo)?
+
+ Ni mogoče vzpostaviti varne povezave:
+
+%1
+
+Ali želite vzpostaviti nešifrirano povezavo (ni priporočljivo)?
@@ -1306,27 +1314,27 @@ Uporaba ni priporočljiva.
Mirall::PropagateDownloadFileLegacy
-
+
Usklajevanje je bilo prekinjeno s strani uporabnika
-
+
Ni prejete oznake s strežnika. Preveriti je treba podatke posredovalnega strežnika ali prehoda.
-
+
Prejeta je različna oznaka za nadaljevanje opravila. Ponovni poskus bo izveden kasneje.
-
+
Odziv strežnika kaže na neveljaven obseg vsebine
-
+
Datoteke %1 ni možno prejeti, zaradi neskladja z imenom krajevne datoteke!
@@ -1334,15 +1342,20 @@ Uporaba ni priporočljiva.
Mirall::PropagateDownloadFileQNAM
-
+
Datoteke %1 ni mogoče prejeti zaradi neskladja z imenom krajevne datoteke!
-
-
+
+
+
+
+
+ Datoteke %1 ni mogoče shraniti zaradi neskladja z imenom obstoječe datoteke!
+
Mirall::PropagateItemJob
@@ -1375,12 +1388,12 @@ Uporaba ni priporočljiva.
-
+ Napaka odstranjevanja '%1': %2;
-
+ Ni mogoče odstraniti mape '%1';
@@ -1425,18 +1438,18 @@ Uporaba ni priporočljiva.
Mirall::PropagateUploadFileLegacy
-
-
+
+
Krajevna datoteka je bila med usklajevanjem spremenjena. Usklajena bo, ko bo shranjena.
-
+
Usklajevanje je bilo prekinjeno s strani uporabnika
-
+
Datoteka je bila krajevno spremenjena, vendar pa je označena za souporabo le za branje. Izvorna datoteka je obnovljena, vaše spremembe pa so zabeležene v datoteki spora.
@@ -1444,23 +1457,23 @@ Uporaba ni priporočljiva.
Mirall::PropagateUploadFileQNAM
-
+
Datoteka je bila krajevno spremenjena, vendar pa je označena za souporabo le za branje. Izvorna datoteka je obnovljena, vaše spremembe pa so zabeležene v datoteki spora.
-
+
Krajevna datoteka je bila me usklajevanjem odstranjena.
-
+
Krajevna datoteka je bila med usklajevanjem spremenjena.
-
+
Strežnik ni prepoznal zadnjega niza besed. (ni določenih e-oznak)
@@ -1538,19 +1551,34 @@ Uporaba ni priporočljiva.
Stanje usklajevanja je kopirano v odložišče.
-
-
- Trenutno zaradi predhodnih napak ni prezrta nobena datoteka.
+
+
+ Trenutno zaradi predhodnih napak ni prezrta nobena datoteka in ni dejavnih prejemov.
-
+
- %n datoteka je prezrta zaradi predhodnih napak.
-Datoteko poskusite uskladiti znova.%n datoteki sta prezrti zaradi predhodnih napak.
-Datoteki poskusite uskladiti znova.%n datoteke so prezrte zaradi predhodnih napak.
-Datoteke poskusite uskladiti znova.%n datotek je prezrtih zaradi predhodnih napak.
-Datoteke poskusite uskladiti znova.
+
+ Zaradi predhodnih napak je prezrta %n datoteka.
+Zaradi predhodnih napak sta prezrti %n datoteki.
+Zaradi predhodnih napak so prezrte %n datoteke.
+Zaradi predhodnih napak je prezrtih %n datotek.
+
+
+
+
+
+ Prenos %n datoteke še ni končan.
+Prenos %n datotek še ni končan.
+Prenos %n datotek še ni končan.
+Prenos %n datotek še ni končan.
+
+
+
+
+
+ Poskusi s ponovnim usklajevanje.
@@ -1638,12 +1666,12 @@ Datoteke poskusite uskladiti znova.
Mirall::ShibbolethCredentials
-
+
Napaka prijave
-
+
Prijaviti se je treba kot uporabnik %1
@@ -2051,69 +2079,69 @@ Datoteke poskusite uskladiti znova.
Ime datoteke vsebuje neveljavne znake, ki niso podprti na vseh okoljih.
-
+
Dnevnika usklajevanja ni mogoče začeti.
-
+
Ni mogoče odpreti dnevnika usklajevanja
-
-
+
+
Prezrto, ker ni neizbrano za usklajevanje
-
+
Ni ustreznih dovoljenj za dodajanje podmap v izbrano mapo.
-
+
Ni ustreznih dovoljenj za dodajanje nadrejene mape.
-
+
Ni ustreznih dovoljenj za dodajanje datotek v izbrano mapo.
-
+
Ni dovoljeno pošiljati te datoteke, ker ima določena dovoljenja le za branje. Datoteka bo obnovljena na izvorno različico.
-
-
+
+
Odstranitev ni dovoljena, datoteka bo obnovljena.
-
+
Krajevne datoteke in mape v souporabi so odstranjene.
-
+
Premikanje ni dovoljeno, datoteka bo obnovljena.
-
+
Premikanje ni dovoljeno, ker je nastavljeno določilo %1 le za branje.
-
+
cilj
-
+
vir
diff --git a/translations/mirall_sv.ts b/translations/mirall_sv.ts
index 3eeb0d7c1..81f9b3775 100644
--- a/translations/mirall_sv.ts
+++ b/translations/mirall_sv.ts
@@ -386,12 +386,12 @@ Total tid kvar %5
Synk aktivitet
-
+
-
+
@@ -400,17 +400,17 @@ Detta kan bero på att konfigurationen för mappen ändrats, eller att alla file
Är du säker på att du vill fortsätta?
-
+
Ta bort alla filer?
-
+
Ta bort alla filer
-
+
Behåll filer
@@ -637,22 +637,22 @@ Detta kan bero på att konfigurationen för mappen ändrats, eller att alla file
Mirall::GETFileJob
-
+
Ingen e-tag mottogs från servern, kontrollera proxy/gateway
-
+
Vi mottog en helt annan e-tag för att återuppta. Försök igen nästa gång.
-
+
-
+
Anslutningen avbröts på grund av timeout
@@ -1113,8 +1113,12 @@ Det är inte lämpligt använda den.
-
- Kunde inte ansluta säkert. Vill du ansluta okrypterat istället (rekommenderas ej)?
+
+
@@ -1306,27 +1310,27 @@ Det är inte lämpligt använda den.
Mirall::PropagateDownloadFileLegacy
-
+
Synkningen avbröts av användare.
-
+
Ingen E-Tag mottogs från servern, kontrollera proxy/gateway
-
+
Vi mottog en helt annan E-Tag för att återuppta. Försöker igen nästa gång.
-
+
-
+
Fil %1 kan inte laddas ner på grund av namnkonflikt med en lokal fil!
@@ -1334,12 +1338,17 @@ Det är inte lämpligt använda den.
Mirall::PropagateDownloadFileQNAM
-
+
Fil %1 kan inte laddas ner på grund av namnkonflikt med en lokal fil!
-
+
+
+
+
+
+
@@ -1425,18 +1434,18 @@ Det är inte lämpligt använda den.
Mirall::PropagateUploadFileLegacy
-
-
+
+
Lokal fil ändrades under synk, synkar när den har anlänt komplett
-
+
Synkningen avbröts av användare.
-
+
Filen ändrades lokalt men är en del av en endast-läsbar delning. Den återställs och din editering är i konflikt filen.
@@ -1444,23 +1453,23 @@ Det är inte lämpligt använda den.
Mirall::PropagateUploadFileQNAM
-
+
Filen ändrades lokalt men är en del av en endast-läsbar delning. Den återställdes och din editering är i konflikt filen.
-
+
Den lokala filen togs bort under synkronisering.
-
+
Lokal fil ändrades under synk.
-
+
Servern bekräftade inte det sista fil-fragmentet (Ingen e-tag fanns tillgänglig)
@@ -1538,16 +1547,27 @@ Det är inte lämpligt använda den.
Synkroniseringsstatus har kopierats till urklipp.
-
-
- För närvarande ignoreras inga filer på grund av föregående fel.
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
Mirall::SelectiveSyncDialog
@@ -1634,12 +1654,12 @@ Det är inte lämpligt använda den.
Mirall::ShibbolethCredentials
-
+
Login fel
-
+
Du måste logga in som en användare %1
@@ -2047,69 +2067,69 @@ Det är inte lämpligt använda den.
Filen innehåller ogiltiga tecken som inte kan synkas oberoende av plattform.
-
+
Kan inte initialisera en synk journal.
-
+
Kunde inte öppna synk journalen
-
-
+
+
Ignorerad eftersom den är svartlistad i "välj vad som ska synkas"
-
+
Går ej att genomföra då du saknar rättigheter att lägga till underkataloger i den katalogen
-
+
Går ej att genomföra då du saknar rättigheter att lägga till någon moderkatalog
-
+
Går ej att genomföra då du saknar rättigheter att lägga till filer i den katalogen
-
+
Inte behörig att ladda upp denna fil då den är skrivskyddad på servern, återställer
-
-
+
+
Inte behörig att radera, återställer
-
+
Lokala filer och mappar som är delade är borttagna.
-
+
Det gick inte att genomföra flytten, objektet återställs
-
+
Det gick inte att genomföra flytten då %1 är skrivskyddad
-
+
destinationen
-
+
källan
diff --git a/translations/mirall_th.ts b/translations/mirall_th.ts
index 3d85fc164..e171e4363 100644
--- a/translations/mirall_th.ts
+++ b/translations/mirall_th.ts
@@ -385,29 +385,29 @@ Total time left %5
-
+
-
+
-
+
-
+
-
+
@@ -634,22 +634,22 @@ Are you sure you want to perform this operation?
Mirall::GETFileJob
-
+
-
+
-
+
-
+
@@ -1106,7 +1106,11 @@ It is not advisable to use it.
-
+
@@ -1299,27 +1303,27 @@ It is not advisable to use it.
Mirall::PropagateDownloadFileLegacy
-
+
-
+
-
+
-
+
-
+
@@ -1327,12 +1331,17 @@ It is not advisable to use it.
Mirall::PropagateDownloadFileQNAM
-
+
-
+
+
+
+
+
+
@@ -1418,18 +1427,18 @@ It is not advisable to use it.
Mirall::PropagateUploadFileLegacy
-
-
+
+
-
+
-
+
@@ -1437,23 +1446,23 @@ It is not advisable to use it.
Mirall::PropagateUploadFileQNAM
-
+
-
+
-
+
-
+
@@ -1531,16 +1540,27 @@ It is not advisable to use it.
-
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
Mirall::SelectiveSyncDialog
@@ -1627,12 +1647,12 @@ It is not advisable to use it.
Mirall::ShibbolethCredentials
-
+
-
+
@@ -2038,69 +2058,69 @@ It is not advisable to use it.
-
+
-
+
-
-
+
+
-
+
-
+
-
+
-
+
-
-
+
+
-
+
-
+
-
+
-
+
-
+
diff --git a/translations/mirall_tr.ts b/translations/mirall_tr.ts
index 0e9c78fbf..77a5e1b20 100644
--- a/translations/mirall_tr.ts
+++ b/translations/mirall_tr.ts
@@ -386,12 +386,12 @@ Toplam kalan süre: %5
Eşitleme Etkinliği
-
+
Sistem hariç tutulma dosyası okunamadı
-
+
@@ -400,17 +400,17 @@ Bu, klasörün sessizce yeniden yapılandırılması veya tüm dosyaların el il
Bu işlemi gerçekleştirmek istediğinize emin misiniz?
-
+
Tüm Dosyalar Kaldırılsın mı?
-
+
Tüm dosyaları kaldır
-
+
Dosyaları koru
@@ -435,7 +435,7 @@ Bu işlemi gerçekleştirmek istediğinize emin misiniz?
- Eşitleme başlatmak için bekleniyor.
+ Eşitleme başlatmak için bekliyor.
@@ -637,22 +637,22 @@ Bu işlemi gerçekleştirmek istediğinize emin misiniz?
Mirall::GETFileJob
-
+
Sunucudan E-Etiket alınamadı, Vekil sunucu/Ağ geçidini denetleyin.
-
+
Devam etmek üzere farklı bir E-Etiket aldık. Sonraki işlemde yeniden denenecek.
-
+
Sunucu yanlış içerik aralığı döndürdü
-
+
Bağlantı Zaman Aşımı
@@ -1113,8 +1113,16 @@ Kullanmanız önerilmez.
-
- Güvenli olarak bağlanılamadı. Bunun yerine şifrelenmemiş bağlantı yapmak ister misiniz (önerilmez)?
+
+ Güvenli olarak bağlanılamadı:
+
+%1
+
+Bunun yerine şifrelenmemiş bağlantı yapmak ister misiniz (önerilmez)?
@@ -1306,27 +1314,27 @@ Kullanmanız önerilmez.
Mirall::PropagateDownloadFileLegacy
-
+
Eşitleme kullanıcı tarafından iptal edildi.
-
+
Sunucudan E-Etiket alınamadı, Vekil sunucu/Ağ geçidini denetleyin.
-
+
Devam etmek üzere farklı bir E-Etiket aldık. Sonraki işlemde yeniden denenecek.
-
+
Sunucu yanlış içerik aralığı döndürdü
-
+
%1 dosyası, yerel dosya adı çakışması nedeniyle indirilemiyor!
@@ -1334,14 +1342,19 @@ Kullanmanız önerilmez.
Mirall::PropagateDownloadFileQNAM
-
+
%1 dosyası, yerel dosya adı çakışması nedeniyle indirilemiyor!
-
+
+
+ Dosya tamamıyla indirilemedi.
+
+
+
- Yerel bir dosya ismi ile çakıştığından, %1 dosyası kaydedilemedi.
+ Yerel bir dosya ismi ile çakıştığından, %1 dosyası kaydedilemedi!
@@ -1425,18 +1438,18 @@ Kullanmanız önerilmez.
Mirall::PropagateUploadFileLegacy
-
-
+
+
Eşitleme sırasında yerel dosya değişti, tamamen ulaştıktan sonra bir kez eşitlenecek
-
+
Eşitleme kullanıcı tarafından iptal edildi.
-
+
Dosya yerel olarak düzenlendi ancak salt okunur paylaşımın bir parçası. Geri yüklendi ve düzenlemeniz çakışan dosyada.
@@ -1444,23 +1457,23 @@ Kullanmanız önerilmez.
Mirall::PropagateUploadFileQNAM
-
+
Dosya yerel olarak düzenlendi ancak salt okunur paylaşımın bir parçası. Geri yüklendi ve düzenlemeniz çakışan dosyada.
-
+
Eşitleme sırasında yerel dosya kaldırıldı.
-
+
Eşitleme sırasında yerel dosya değişti.
-
+
Sunucu son yığını onaylamadı. (Mevcut e-etiket bulunamadı)
@@ -1538,17 +1551,30 @@ Kullanmanız önerilmez.
Eşitleme durumu panoya kopyalandı.
-
-
- Önceki hata koşullarından dolayı yoksayılmış dosya yok.
+
+
+ Önceki hatalar nedeniyle hiçbir dosya yolsayılmadı ve süren bir indirme yok.
-
+
- %n dosya önceki hatalar nedeniyle yoksayıldı.
-Tekrar eşitleyi deneyin.em.%n dosya önceki hatalar nedeniyle yoksayıldı.
-Tekrar eşitleyi deneyin.em.
+
+ önceki hatalardan dolayı %n dosya yoksayıldı.
+önceki hatalardan dolayı %n dosya yoksayıldı.
+
+
+
+
+
+ %n dosya kısmen karşıya indirilebildi.
+%n dosya kısmen karşıya indirilebildi.
+
+
+
+
+
+ Bunları tekrar eşitlemeyi deneyin.
@@ -1636,12 +1662,12 @@ Tekrar eşitleyi deneyin.em.
Mirall::ShibbolethCredentials
-
+
Oturum Açma Hatası
-
+
%1 kullanıcısı olarak oturum açmalısınız
@@ -2016,7 +2042,7 @@ Tekrar eşitleyi deneyin.em.
- Bağlanan dizin geçici olup sunucuda mevcut değildir
+ Bağlanan dizin geçici olarak sunucuda kullanılamıyor
@@ -2049,69 +2075,69 @@ Tekrar eşitleyi deneyin.em.
Dosya, çapraz platform arasında eşitlenemeyecek karakterler içeriyor.
-
+
Bir eşitleme günlüğü başlatılamadı.
-
+
Eşitleme günlüğü açılamıyor
-
-
+
+
"Eşitlenecekleri seçin" kara listesinde olduğundan yoksayıldı.
-
+
Bu dizine alt dizin ekleme yetkiniz olmadığından izin verilmedi
-
+
Üst dizin ekleme yetkiniz olmadığından izin verilmedi
-
+
Bu dizine dosya ekleme yetkiniz olmadığından izin verilmedi
-
+
Sunucuda salt okunur olduğundan, bu dosya yüklenemedi, geri alınıyor
-
-
+
+
Kaldırmaya izin verilmedi, geri alınıyor
-
+
Yerel dosyalar ve paylaşım klasörü kaldırıldı.
-
+
Taşımaya izin verilmedi, öge geri alındı
-
+
%1 salt okunur olduğundan taşımaya izin verilmedi
-
+
hedef
-
+
kaynak
@@ -2129,7 +2155,7 @@ Tekrar eşitleyi deneyin.em.
- <p>Sürüm %1 Daha fazla bilgi için lütfen <a href='%2'>%3</a> adresini ziyaret edin.</p><p>Telif hakkı ownCloud, Inc.</p><p>Dağıtım %4 ve GNU Genel Kamu Lisansı (GPL) Sürüm 2.0 ile lisanslanmıştır olup <br/>%5 ve %5 logoları ABD ve/veya diğer ülkelerde %4 tescili markalarıdır.</p>
+ <p>Sürüm %1 Daha fazla bilgi için lütfen <a href='%2'>%3</a> adresini ziyaret edin.</p><p>Telif hakkı ownCloud, Inc.</p><p>%4 tarafından dağıtılmakta ve GNU Genel Kamu Lisansı (GPL) Sürüm 2.0 ile lisanslanmıştır olup <br/>%5 ve %5 logoları ABD ve/veya diğer ülkelerde %4 tescili markalarıdır.</p>
@@ -2275,7 +2301,7 @@ Tekrar eşitleyi deneyin.em.
- <p>Sürüm %2. Daha fazla bilgi için lütfen <a href="%3">%4</a> adresini ziyaret edin.</p><p><small>By Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz ve diğerleri.<br>Duncan Mac-Vicar P. tarafından yazılmış Mirall tabanlıdır.</small></p><p>Telif hakkı ownCloud, Inc.</p><p>GNU Genel Kamu Lisansı (GPL) Sürüm 2.0 ile lisanslanmıştır.<br>ownCloud ve ownCloud logoları <br>ABD ve/veya diğer ülkelerde ownCloud, Inc.'nin tescili markalarıdır.</p>
+ <p>Sürüm %2. Daha fazla bilgi için lütfen <a href="%3">%4</a> adresini ziyaret edin.</p><p><small>Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz ve diğerleri.<br/>Duncan Mac-Vicar P. tarafından yazılmış Mirall tabanlıdır.</small></p><p>Telif hakkı ownCloud, Inc.</p><p>GNU Genel Kamu Lisansı (GPL) Sürüm 2.0 ile lisanslanmıştır.<br/>ownCloud ve ownCloud logoları ABD ve/veya diğer ülkelerde ownCloud, Inc.'nin tescili markalarıdır.</p>
diff --git a/translations/mirall_uk.ts b/translations/mirall_uk.ts
index 61c5009a5..71e3ae99b 100644
--- a/translations/mirall_uk.ts
+++ b/translations/mirall_uk.ts
@@ -386,12 +386,12 @@ Total time left %5
Журнал синхронізації
-
+
Неможливо прочитати виключений системний файл
-
+
@@ -400,17 +400,17 @@ Are you sure you want to perform this operation?
Ви дійсно бажаєте продовжити цю операцію?
-
+
Видалити усі файли?
-
+
Видалити усі файли
-
+
Зберегти файли
@@ -637,22 +637,22 @@ Are you sure you want to perform this operation?
Mirall::GETFileJob
-
+
Не отримано E-Tag від серверу, перевірте мережеві налаштування (проксі, шлюз)
-
+
Ми отримали інший E-Tag для відновлення. Спробуйте ще раз пізніше.
-
+
Сервер повернув невірний content-range
-
+
Тайм-аут З'єднання
@@ -1113,8 +1113,16 @@ It is not advisable to use it.
-
- Не вдалося безпечно підключитися. Бажаєте підключитися без шифрування (не рекомендується)?
+
+ Не вдалося безпечно підключитися.
+
+%1
+
+Бажаєте підключитися без шифрування (не рекомендується)?
@@ -1306,27 +1314,27 @@ It is not advisable to use it.
Mirall::PropagateDownloadFileLegacy
-
+
Синхронізація перервана користувачем.
-
+
Не отримано E-Tag від серверу, перевірте мережеві налаштування (проксі, шлюз)
-
+
Ми отримали інший E-Tag для відновлення. Спробуйте ще раз пізніше.
-
+
Сервер повернув невірний content-range
-
+
Файл %1 не завантажено, через локальний конфлікт ім'я!
@@ -1334,14 +1342,19 @@ It is not advisable to use it.
Mirall::PropagateDownloadFileQNAM
-
+
Файл %1 не завантажено, через локальний конфлікт ім'я!
-
+
+
+ Файл не може бути завантажений повністю.
+
+
+
-
+ Файл %1 не збережено, через локальний конфлікт ім'я!
@@ -1375,12 +1388,12 @@ It is not advisable to use it.
-
+ Помилка при видалені '%1': %2;
-
+ Неможливо видалити теку '%1';
@@ -1425,18 +1438,18 @@ It is not advisable to use it.
Mirall::PropagateUploadFileLegacy
-
-
+
+
Локальний файл змінився під час синхронізації, повторюємо процес
-
+
Синхронізація перервана користувачем.
-
+
Файл було змінено локально, але він розташований в теці з правами лише на перегляд. Файл відновлено, а ваші зміни розташовані в теці конфліктів.
@@ -1444,23 +1457,23 @@ It is not advisable to use it.
Mirall::PropagateUploadFileQNAM
-
+
Файл було змінено локально, але він розташований в теці з правами лише на перегляд. Файл відновлено, а ваші зміни розташовані в теці конфліктів.
-
+
Локальний файл було видалено під час синхронізації.
-
+
Локальний файл змінився під час синхронізації.
-
+
Сервер не зміг підтвердити останній відрізок даних. (Були відсутні e-tag)
@@ -1538,15 +1551,32 @@ It is not advisable to use it.
Протокол синхронізації був скопійований в буфер обміну.
-
-
- На даний час, проігноровані файли відсутні через помилки.
+
+
+ На даний час жоден файл не ігнорується, через попередні помилки, та немає активних завантажень.
-
+
-
+
+ %n файл проігноровано, через попередні помилки.
+%n файлів проігноровано, через попередні помилки.
+%n файлів проігноровано, через попередні помилки.
+
+
+
+
+
+ %n файл частково завантажений.
+%n файли частково завантажені.
+%n файли частково завантажені.
+
+
+
+
+
+ Спробуйте синхронізувати ще раз.
@@ -1559,7 +1589,7 @@ It is not advisable to use it.
-
+ Не позначені теки будуть <b>видалені</b> з вашої системи та більше не будуть синхронізуватися
@@ -1634,12 +1664,12 @@ It is not advisable to use it.
Mirall::ShibbolethCredentials
-
+
Помилка входу
-
+
Ви маєте увійти як %1
@@ -2014,7 +2044,7 @@ It is not advisable to use it.
-
+ Змонтована тека тимчасово недоступна на сервері
@@ -2047,69 +2077,69 @@ It is not advisable to use it.
Файл містить недопустимі символи, через це синхронізація між платформами неможлива.
-
+
Не вдалося ініціалізувати протокол синхронізації.
-
+
Не вдається відкрити протокол синхронізації
-
-
+
+
Ігнорується через чорний список в "обрати що синхронізувати"
-
+
Не дозволено через відсутність прав на додавання підкаталогів в цій теці.
-
+
Не дозволено через відсутність прав на додавання батьківської теки.
-
+
Не дозволено через відсутність прав на додавання файлів в цю теку.
-
+
Не дозволено завантажувати цей файл, оскільки він має дозвіл лише на перегляд, відновлюємо
-
-
+
+
Не дозволено видаляти, відновлюємо
-
+
Локальні файли та теки в загальному доступі було видалено.
-
+
Переміщення не дозволено, елемент відновлено
-
+
Переміщення не дозволено, оскільки %1 помічений тільки для перегляду
-
+
призначення
-
+
джерело
diff --git a/translations/mirall_zh_CN.ts b/translations/mirall_zh_CN.ts
index 39b739602..bd3f8c8c7 100644
--- a/translations/mirall_zh_CN.ts
+++ b/translations/mirall_zh_CN.ts
@@ -385,12 +385,12 @@ Total time left %5
同步活动
-
+
-
+
@@ -399,17 +399,17 @@ Are you sure you want to perform this operation?
你确定执行该操作吗?
-
+
删除所有文件?
-
+
删除所有文件
-
+
保持所有文件
@@ -636,22 +636,22 @@ Are you sure you want to perform this operation?
Mirall::GETFileJob
-
+
未能收到来自服务器的 E-Tag,请检查代理/网关
-
+
我们收到了不同的恢复 E-Tag,将在下次尝试。
-
+
-
+
连接超时
@@ -1110,7 +1110,11 @@ It is not advisable to use it.
-
+
@@ -1303,27 +1307,27 @@ It is not advisable to use it.
Mirall::PropagateDownloadFileLegacy
-
+
同步被用户撤销。
-
+
未能收到来自服务器的 E-Tag,请检查代理/网关
-
+
我们收到了不同的恢复 E-Tag,将在下次尝试。
-
+
-
+
@@ -1331,12 +1335,17 @@ It is not advisable to use it.
Mirall::PropagateDownloadFileQNAM
-
+
-
+
+
+
+
+
+
@@ -1422,18 +1431,18 @@ It is not advisable to use it.
Mirall::PropagateUploadFileLegacy
-
-
+
+
-
+
同步被用户撤销。
-
+
@@ -1441,23 +1450,23 @@ It is not advisable to use it.
Mirall::PropagateUploadFileQNAM
-
+
-
+
-
+
本地文件在同步时已修改。
-
+
@@ -1535,16 +1544,27 @@ It is not advisable to use it.
-
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
Mirall::SelectiveSyncDialog
@@ -1631,12 +1651,12 @@ It is not advisable to use it.
Mirall::ShibbolethCredentials
-
+
登录错误
-
+
@@ -2044,69 +2064,69 @@ It is not advisable to use it.
-
+
无法初始化同步日志
-
+
无法打开同步日志
-
-
+
+
-
+
-
+
-
+
-
+
-
-
+
+
-
+
-
+
-
+
-
+
-
+
diff --git a/translations/mirall_zh_TW.ts b/translations/mirall_zh_TW.ts
index 8cbffb9f5..0d1a0e49b 100644
--- a/translations/mirall_zh_TW.ts
+++ b/translations/mirall_zh_TW.ts
@@ -385,29 +385,29 @@ Total time left %5
同步啟用
-
+
-
+
-
+
移除所有檔案?
-
+
移除所有檔案
-
+
保留檔案
@@ -634,22 +634,22 @@ Are you sure you want to perform this operation?
Mirall::GETFileJob
-
+
-
+
-
+
-
+
@@ -1106,7 +1106,11 @@ It is not advisable to use it.
-
+
@@ -1299,27 +1303,27 @@ It is not advisable to use it.
Mirall::PropagateDownloadFileLegacy
-
+
-
+
-
+
-
+
-
+
@@ -1327,12 +1331,17 @@ It is not advisable to use it.
Mirall::PropagateDownloadFileQNAM
-
+
-
+
+
+
+
+
+
@@ -1418,18 +1427,18 @@ It is not advisable to use it.
Mirall::PropagateUploadFileLegacy
-
-
+
+
-
+
-
+
@@ -1437,23 +1446,23 @@ It is not advisable to use it.
Mirall::PropagateUploadFileQNAM
-
+
-
+
-
+
-
+
@@ -1531,16 +1540,27 @@ It is not advisable to use it.
-
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
Mirall::SelectiveSyncDialog
@@ -1627,12 +1647,12 @@ It is not advisable to use it.
Mirall::ShibbolethCredentials
-
+
-
+
@@ -2038,69 +2058,69 @@ It is not advisable to use it.
-
+
-
+
-
-
+
+
-
+
-
+
-
+
-
+
-
-
+
+
-
+
-
+
-
+
-
+
-
+