Comparar commits
1 Commits
| Autor | SHA1 | Data | |
|---|---|---|---|
| 07e2e54a99 |
@@ -1,15 +1,6 @@
|
||||
ChangeLog
|
||||
=========
|
||||
|
||||
version 2.2.4 (release 2016-09-27)
|
||||
* Dolphin Plugin: Use the Application name for the socket path (#5172)
|
||||
* SyncEngine: Fix renaming of folder when file are changed (#5195)
|
||||
* Selective Sync: Fix HTTP request loop and show error in view (#5154)
|
||||
* ConnectionValidator: properly handle error in status.php request (#5188)
|
||||
* Discovery: Set thread priority to low (#5017)
|
||||
* ExcludeFiles: Fix when the folder casing is not the same in the settings and in the FS
|
||||
* ShareLink: Ensure the password line edit is enabled (#5117)
|
||||
|
||||
version 2.2.3 (release 2016-08-08)
|
||||
* SyncEngine: Fix detection of backup (#5104)
|
||||
* Fix bug with overriding URL in config (#5016)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Auto-generated - do not modify
|
||||
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Toon opmerkingen bij deze versie"
|
||||
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Toon opmerkingen bij deze uitgave"
|
||||
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Gevonden ${APPLICATION_EXECUTABLE} proces(sen) moet worden gestopt.$\nWilt u dat het installatieprogramma dat voor u doet?"
|
||||
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Stoppen ${APPLICATION_EXECUTABLE} processen."
|
||||
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Het te stoppen proces is niet gevonden!"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Mostrar notas de lançamento"
|
||||
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Encontrados ${APPLICATION_EXECUTABLE} processo(s) em execução que precisa(m) de ser interrompido(s).$\nDeseja que o instalador o(s) termine por si?"
|
||||
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "A terminar os processos de ${APPLICATION_EXECUTABLE}."
|
||||
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Não foi encontrado o processo para terminar!"
|
||||
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Não foi encontrado nenhum processo para terminar!"
|
||||
StrCpy $PageReinstall_NEW_Field_1 "Está instalada no sistema uma versão antiga de ${APPLICATION_NAME}. É recomendado que desinstale a versão atual antes de instalar a mais recente. Selecione a operação que deseja executar e clique em $\"Seguinte$\" para continuar."
|
||||
StrCpy $PageReinstall_NEW_Field_2 "Desinstalar antes de instalar"
|
||||
StrCpy $PageReinstall_NEW_Field_3 "Não desinstale"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Mostrar las notas de la versión"
|
||||
StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "El/los proceso/s ${APPLICATION_EXECUTABLE} debe/n ser detenidos.$\n¿Quiere que el instalador lo haga por usted?"
|
||||
StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Deteniendo el/los proceso/s ${APPLICATION_EXECUTABLE}."
|
||||
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "¡Proceso a finalizar no encontrado!"
|
||||
StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "¡Proceso para finalizar no encontrado!"
|
||||
StrCpy $PageReinstall_NEW_Field_1 "Una versión anterior de ${APPLICATION_NAME} se encuentra instalada en el sistema. Se recomienda de instalar la versión actual antes de instalar la nueva. Seleccione la operacion deseada y haga click en Siguiente para continuar."
|
||||
StrCpy $PageReinstall_NEW_Field_2 "Desinstalar antes de instalar"
|
||||
StrCpy $PageReinstall_NEW_Field_3 "No desinstalar"
|
||||
|
||||
@@ -37,7 +37,7 @@ enum csync_exclude_type_e {
|
||||
typedef enum csync_exclude_type_e CSYNC_EXCLUDE_TYPE;
|
||||
|
||||
#ifdef WITH_UNIT_TESTING
|
||||
int OCSYNC_EXPORT _csync_exclude_add(c_strlist_t **inList, const char *string);
|
||||
int _csync_exclude_add(c_strlist_t **inList, const char *string);
|
||||
#endif
|
||||
|
||||
/**
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
|
||||
extern "C" {
|
||||
#include "csync_private.h"
|
||||
#include "csync_rename.h"
|
||||
}
|
||||
|
||||
#include <map>
|
||||
@@ -94,9 +93,5 @@ char* csync_rename_adjust_path_source(CSYNC* ctx, const char* path)
|
||||
return c_strdup(path);
|
||||
}
|
||||
|
||||
bool csync_rename_count(CSYNC *ctx) {
|
||||
csync_rename_s* d = csync_rename_s::get(ctx);
|
||||
return d->folder_renamed_from.size();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -32,8 +32,6 @@ char OCSYNC_EXPORT *csync_rename_adjust_path(CSYNC *ctx, const char *path);
|
||||
char OCSYNC_EXPORT *csync_rename_adjust_path_source(CSYNC *ctx, const char *path);
|
||||
void OCSYNC_EXPORT csync_rename_destroy(CSYNC *ctx);
|
||||
void OCSYNC_EXPORT csync_rename_record(CSYNC *ctx, const char *from, const char *to);
|
||||
/* Return the amount of renamed item recorded */
|
||||
bool OCSYNC_EXPORT csync_rename_count(CSYNC *ctx);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -56,8 +56,6 @@ assertLocalAndRemoteDir( '', 0);
|
||||
printInfo( "Testing with a .sys.admin#recall#" );
|
||||
system("echo 'dir/file2.dat' > ". $tmpdir . ".sys.admin\#recall\#");
|
||||
system("echo 'dir/file3.dat' >> ". $tmpdir . ".sys.admin\#recall\#");
|
||||
system("echo 'nonexistant' >> ". $tmpdir . ".sys.admin\#recall\#");
|
||||
system("echo '/tmp/t_recall/file4.dat' >> ". $tmpdir . ".sys.admin\#recall\#");
|
||||
glob_put( "$tmpdir/.sys.admin\#recall\#", "" );
|
||||
|
||||
csync();
|
||||
@@ -70,10 +68,6 @@ assert( -e glob(localDir().'dir/file3_.sys.admin#recall#-*.dat' ) );
|
||||
assert( -e glob(localDir().'dir/file2.dat' ) );
|
||||
assert( -e glob(localDir().'dir/file3.dat' ) );
|
||||
|
||||
assert( !-e glob(localDir().'nonexistant*' ) );
|
||||
assert( !-e glob('/tmp/t_recall/file4_.sys.admin#recall#-*.dat' ) );
|
||||
assert( -e glob('/tmp/t_recall/file4.dat' ) );
|
||||
|
||||
#Remove the recall file
|
||||
unlink(localDir() . ".sys.admin#recall#");
|
||||
|
||||
|
||||
@@ -199,6 +199,12 @@ the database by comparing the files and their modification times. This process
|
||||
ensures that both server and client are synchronized using the appropriate NTP
|
||||
time before restarting the client following a database removal.
|
||||
|
||||
Pressing ``F5`` while in the Account Settings Dialog enables you to "reset" the
|
||||
journal. This function can be used to recreate the journal database.
|
||||
|
||||
.. note:: We recommend that you use this function only when advised to do so by
|
||||
ownCloud support staff.
|
||||
|
||||
Custom WebDAV Properties
|
||||
------------------------
|
||||
|
||||
|
||||
+1
-2
@@ -42,8 +42,7 @@ repositories`_ to see all the Linux client repos.
|
||||
echo 'deb-src
|
||||
http://download.opensuse.org/repositories/isv:/ownCloud:/desktop/Debian_8.0/ /' >> /etc/apt/sources.list.d/owncloud-client.list
|
||||
|
||||
2. Install the dependencies using the following commands for your specific Linux
|
||||
distribution. Make sure the repositories for source packages are enabled.
|
||||
2. Install the dependencies using the following commands for your specific Linux distribution:
|
||||
|
||||
* Debian/Ubuntu: ``apt-get update; apt-get build-dep owncloud-client``
|
||||
* openSUSE/SLES: ``zypper ref; zypper si -d owncloud-client``
|
||||
|
||||
@@ -292,129 +292,6 @@ X-GNOME-Autostart-Delay=3
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
Comment[oc]=@APPLICATION_NAME@ sincronizacion del client
|
||||
GenericName[oc]=Dorsièr de Sincronizacion
|
||||
|
||||
@@ -4,7 +4,6 @@ if( UNIX AND NOT APPLE )
|
||||
|
||||
configure_file(syncstate.py syncstate.py COPYONLY)
|
||||
configure_file(syncstate.py syncstate_nemo.py COPYONLY)
|
||||
configure_file(syncstate.py syncstate_caja.py COPYONLY)
|
||||
|
||||
# Call the setupappname.sh script to set the custom app name.
|
||||
set (cmd "${CMAKE_CURRENT_SOURCE_DIR}/setappname.sh")
|
||||
@@ -19,17 +18,9 @@ if( UNIX AND NOT APPLE )
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
||||
ERROR_VARIABLE errors OUTPUT_VARIABLE out)
|
||||
|
||||
# Create a caja plugin script from the nautilus one.
|
||||
# cajacmd copies the syncstate.py and performs string replacement.
|
||||
set (cajacmd "${CMAKE_CURRENT_SOURCE_DIR}/createcajaplugin.sh")
|
||||
execute_process(COMMAND ${cajacmd}
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
||||
ERROR_VARIABLE errors OUTPUT_VARIABLE out)
|
||||
|
||||
|
||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/syncstate.py DESTINATION ${DATADIR}/nautilus-python/extensions RENAME syncstate-${APPLICATION_SHORTNAME}.py)
|
||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/syncstate_nemo.py DESTINATION ${DATADIR}/nemo-python/extensions RENAME syncstate-${APPLICATION_SHORTNAME}.py)
|
||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/syncstate_caja.py DESTINATION ${DATADIR}/caja-python/extensions RENAME syncstate-${APPLICATION_SHORTNAME}.py)
|
||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/syncstate.py DESTINATION ${DATADIR}/nautilus-python/extensions)
|
||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/syncstate_nemo.py DESTINATION ${DATADIR}/nemo-python/extensions RENAME syncstate.py)
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# this script creates a plugin for caja, just by replacing
|
||||
# all occurences of Nautilus with Caja (case sensitive).
|
||||
|
||||
sed -i.org -e 's/Nautilus/Caja/g' syncstate_caja.py
|
||||
sed -i.org -e 's/nautilus/caja/g' syncstate_caja.py
|
||||
+161
-17
@@ -1,21 +1,165 @@
|
||||
The MIT License (MIT)
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (c) 2011 Morgan Leborgne
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
This version of the GNU Lesser General Public License incorporates
|
||||
the terms and conditions of version 3 of the GNU General Public
|
||||
License, supplemented by the additional permissions listed below.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
0. Additional Definitions.
|
||||
|
||||
As used herein, "this License" refers to version 3 of the GNU Lesser
|
||||
General Public License, and the "GNU GPL" refers to version 3 of the GNU
|
||||
General Public License.
|
||||
|
||||
"The Library" refers to a covered work governed by this License,
|
||||
other than an Application or a Combined Work as defined below.
|
||||
|
||||
An "Application" is any work that makes use of an interface provided
|
||||
by the Library, but which is not otherwise based on the Library.
|
||||
Defining a subclass of a class defined by the Library is deemed a mode
|
||||
of using an interface provided by the Library.
|
||||
|
||||
A "Combined Work" is a work produced by combining or linking an
|
||||
Application with the Library. The particular version of the Library
|
||||
with which the Combined Work was made is also called the "Linked
|
||||
Version".
|
||||
|
||||
The "Minimal Corresponding Source" for a Combined Work means the
|
||||
Corresponding Source for the Combined Work, excluding any source code
|
||||
for portions of the Combined Work that, considered in isolation, are
|
||||
based on the Application, and not on the Linked Version.
|
||||
|
||||
The "Corresponding Application Code" for a Combined Work means the
|
||||
object code and/or source code for the Application, including any data
|
||||
and utility programs needed for reproducing the Combined Work from the
|
||||
Application, but excluding the System Libraries of the Combined Work.
|
||||
|
||||
1. Exception to Section 3 of the GNU GPL.
|
||||
|
||||
You may convey a covered work under sections 3 and 4 of this License
|
||||
without being bound by section 3 of the GNU GPL.
|
||||
|
||||
2. Conveying Modified Versions.
|
||||
|
||||
If you modify a copy of the Library, and, in your modifications, a
|
||||
facility refers to a function or data to be supplied by an Application
|
||||
that uses the facility (other than as an argument passed when the
|
||||
facility is invoked), then you may convey a copy of the modified
|
||||
version:
|
||||
|
||||
a) under this License, provided that you make a good faith effort to
|
||||
ensure that, in the event an Application does not supply the
|
||||
function or data, the facility still operates, and performs
|
||||
whatever part of its purpose remains meaningful, or
|
||||
|
||||
b) under the GNU GPL, with none of the additional permissions of
|
||||
this License applicable to that copy.
|
||||
|
||||
3. Object Code Incorporating Material from Library Header Files.
|
||||
|
||||
The object code form of an Application may incorporate material from
|
||||
a header file that is part of the Library. You may convey such object
|
||||
code under terms of your choice, provided that, if the incorporated
|
||||
material is not limited to numerical parameters, data structure
|
||||
layouts and accessors, or small macros, inline functions and templates
|
||||
(ten or fewer lines in length), you do both of the following:
|
||||
|
||||
a) Give prominent notice with each copy of the object code that the
|
||||
Library is used in it and that the Library and its use are
|
||||
covered by this License.
|
||||
|
||||
b) Accompany the object code with a copy of the GNU GPL and this license
|
||||
document.
|
||||
|
||||
4. Combined Works.
|
||||
|
||||
You may convey a Combined Work under terms of your choice that,
|
||||
taken together, effectively do not restrict modification of the
|
||||
portions of the Library contained in the Combined Work and reverse
|
||||
engineering for debugging such modifications, if you also do each of
|
||||
the following:
|
||||
|
||||
a) Give prominent notice with each copy of the Combined Work that
|
||||
the Library is used in it and that the Library and its use are
|
||||
covered by this License.
|
||||
|
||||
b) Accompany the Combined Work with a copy of the GNU GPL and this license
|
||||
document.
|
||||
|
||||
c) For a Combined Work that displays copyright notices during
|
||||
execution, include the copyright notice for the Library among
|
||||
these notices, as well as a reference directing the user to the
|
||||
copies of the GNU GPL and this license document.
|
||||
|
||||
d) Do one of the following:
|
||||
|
||||
0) Convey the Minimal Corresponding Source under the terms of this
|
||||
License, and the Corresponding Application Code in a form
|
||||
suitable for, and under terms that permit, the user to
|
||||
recombine or relink the Application with a modified version of
|
||||
the Linked Version to produce a modified Combined Work, in the
|
||||
manner specified by section 6 of the GNU GPL for conveying
|
||||
Corresponding Source.
|
||||
|
||||
1) Use a suitable shared library mechanism for linking with the
|
||||
Library. A suitable mechanism is one that (a) uses at run time
|
||||
a copy of the Library already present on the user's computer
|
||||
system, and (b) will operate properly with a modified version
|
||||
of the Library that is interface-compatible with the Linked
|
||||
Version.
|
||||
|
||||
e) Provide Installation Information, but only if you would otherwise
|
||||
be required to provide such information under section 6 of the
|
||||
GNU GPL, and only to the extent that such information is
|
||||
necessary to install and execute a modified version of the
|
||||
Combined Work produced by recombining or relinking the
|
||||
Application with a modified version of the Linked Version. (If
|
||||
you use option 4d0, the Installation Information must accompany
|
||||
the Minimal Corresponding Source and Corresponding Application
|
||||
Code. If you use option 4d1, you must provide the Installation
|
||||
Information in the manner specified by section 6 of the GNU GPL
|
||||
for conveying Corresponding Source.)
|
||||
|
||||
5. Combined Libraries.
|
||||
|
||||
You may place library facilities that are a work based on the
|
||||
Library side by side in a single library together with other library
|
||||
facilities that are not Applications and are not covered by this
|
||||
License, and convey such a combined library under terms of your
|
||||
choice, if you do both of the following:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work based
|
||||
on the Library, uncombined with any other library facilities,
|
||||
conveyed under the terms of this License.
|
||||
|
||||
b) Give prominent notice with the combined library that part of it
|
||||
is a work based on the Library, and explaining where to find the
|
||||
accompanying uncombined form of the same work.
|
||||
|
||||
6. Revised Versions of the GNU Lesser General Public License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions
|
||||
of the GNU Lesser General Public License from time to time. Such new
|
||||
versions will be similar in spirit to the present version, but may
|
||||
differ in detail to address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Library as you received it specifies that a certain numbered version
|
||||
of the GNU Lesser General Public License "or any later version"
|
||||
applies to it, you have the option of following the terms and
|
||||
conditions either of that published version or of any later version
|
||||
published by the Free Software Foundation. If the Library as you
|
||||
received it does not specify a version number of the GNU Lesser
|
||||
General Public License, you may choose any version of the GNU Lesser
|
||||
General Public License ever published by the Free Software Foundation.
|
||||
|
||||
If the Library as you received it specifies that a proxy can decide
|
||||
whether future versions of the GNU Lesser General Public License shall
|
||||
apply, that proxy's public statement of acceptance of any version is
|
||||
permanent authorization for you to choose that version for the
|
||||
Library.
|
||||
|
||||
+20
-23
@@ -1,27 +1,24 @@
|
||||
/*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2011 Morgan Leborgne
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
*
|
||||
* This file is part of QProgressIndicator,
|
||||
* an open-source recent files menu widget
|
||||
*
|
||||
* Copyright (C) 2009 - 2010 Morgan Leborgne
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with QRecentFilesMenu. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#include "QProgressIndicator.h"
|
||||
|
||||
#include <QPainter>
|
||||
|
||||
+24
-27
@@ -1,27 +1,24 @@
|
||||
/*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2011 Morgan Leborgne
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
*
|
||||
* This file is part of QProgressIndicator,
|
||||
* an open-source recent files menu widget
|
||||
*
|
||||
* Copyright (C) 2009 - 2010 Morgan Leborgne
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 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 Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with QRecentFilesMenu. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#ifndef QPROGRESSINDICATOR_H
|
||||
#define QPROGRESSINDICATOR_H
|
||||
|
||||
@@ -67,8 +64,8 @@ public:
|
||||
*/
|
||||
const QColor & color() const { return m_color; }
|
||||
|
||||
virtual QSize sizeHint() const;
|
||||
int heightForWidth(int w) const;
|
||||
virtual QSize sizeHint() const Q_DECL_OVERRIDE;
|
||||
int heightForWidth(int w) const Q_DECL_OVERRIDE;
|
||||
public slots:
|
||||
/*! Starts the spin animation.
|
||||
\sa stopAnimation isAnimated
|
||||
@@ -98,8 +95,8 @@ public slots:
|
||||
*/
|
||||
void setColor(const QColor & color);
|
||||
protected:
|
||||
virtual void timerEvent(QTimerEvent * event);
|
||||
virtual void paintEvent(QPaintEvent * event);
|
||||
virtual void timerEvent(QTimerEvent * event) Q_DECL_OVERRIDE;
|
||||
virtual void paintEvent(QPaintEvent * event) Q_DECL_OVERRIDE;
|
||||
private:
|
||||
int m_angle;
|
||||
int m_timerId;
|
||||
|
||||
+1
-1
@@ -11,4 +11,4 @@ Qt 4.4.x.
|
||||
|
||||
## License
|
||||
|
||||
MIT
|
||||
LGPL
|
||||
|
||||
externo
+2678
-3731
Diferenças do arquivo suprimidas por serem muito extensas
Carregar Diff
externo
+267
-421
Diferenças do arquivo suprimidas por serem muito extensas
Carregar Diff
+1
-34
@@ -29,7 +29,6 @@
|
||||
#include "syncengine.h"
|
||||
#include "syncjournaldb.h"
|
||||
#include "config.h"
|
||||
#include "connectionvalidator.h"
|
||||
|
||||
#include "cmd.h"
|
||||
|
||||
@@ -47,9 +46,6 @@
|
||||
|
||||
using namespace OCC;
|
||||
|
||||
|
||||
static void nullMessageHandler(QtMsgType, const char *) {}
|
||||
|
||||
struct CmdOptions {
|
||||
QString source_dir;
|
||||
QString target_url;
|
||||
@@ -58,7 +54,6 @@ struct CmdOptions {
|
||||
QString password;
|
||||
QString proxy;
|
||||
bool silent;
|
||||
bool bundleRequests;
|
||||
bool trustSSL;
|
||||
bool useNetrc;
|
||||
bool interactive;
|
||||
@@ -74,8 +69,6 @@ struct CmdOptions {
|
||||
// So we have to use a global variable
|
||||
CmdOptions *opts = 0;
|
||||
|
||||
const qint64 timeoutToUseMsec = qMax(1000, ConnectionValidator::DefaultCallingIntervalMsec - 5*1000);
|
||||
|
||||
class EchoDisabler
|
||||
{
|
||||
public:
|
||||
@@ -158,7 +151,6 @@ void help()
|
||||
std::cout << std::endl;
|
||||
std::cout << "Options:" << std::endl;
|
||||
std::cout << " --silent, -s Don't be so verbose" << std::endl;
|
||||
std::cout << " --bundle-requests, -b Bundle Requests if supported" << std::endl;
|
||||
std::cout << " --httpproxy [proxy] Specify a http proxy to use." << std::endl;
|
||||
std::cout << " Proxy is http://server:port" << std::endl;
|
||||
std::cout << " --trust Trust the SSL certification." << std::endl;
|
||||
@@ -226,8 +218,6 @@ void parseOptions( const QStringList& app_args, CmdOptions *options )
|
||||
options->silent = true;
|
||||
} else if( option == "--trust") {
|
||||
options->trustSSL = true;
|
||||
} else if( option == "-b" || option == "--bundle-requests") {
|
||||
options->bundleRequests = true;
|
||||
} else if( option == "-n") {
|
||||
options->useNetrc = true;
|
||||
} else if( option == "-h") {
|
||||
@@ -296,7 +286,6 @@ int main(int argc, char **argv) {
|
||||
|
||||
CmdOptions options;
|
||||
options.silent = false;
|
||||
options.bundleRequests = false;
|
||||
options.trustSSL = false;
|
||||
options.useNetrc = false;
|
||||
options.interactive = true;
|
||||
@@ -307,11 +296,6 @@ int main(int argc, char **argv) {
|
||||
|
||||
parseOptions( app.arguments(), &options );
|
||||
|
||||
csync_set_log_level(options.silent ? 1 : 11);
|
||||
if (options.silent) {
|
||||
qInstallMsgHandler(nullMessageHandler);
|
||||
}
|
||||
|
||||
AccountPtr account = Account::create();
|
||||
|
||||
if( !account ) {
|
||||
@@ -405,30 +389,13 @@ int main(int argc, char **argv) {
|
||||
account->setCredentials(cred);
|
||||
account->setSslErrorHandler(sslErrorHandler);
|
||||
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
|
||||
//obtain capabilities using event loop
|
||||
QEventLoop loop;
|
||||
|
||||
JsonApiJob *job = new JsonApiJob(account, QLatin1String("ocs/v1.php/cloud/capabilities"));
|
||||
job->setTimeout(timeoutToUseMsec);
|
||||
QObject::connect(job, &JsonApiJob::jsonReceived, [&](const QVariantMap &json) {
|
||||
auto caps = json.value("ocs").toMap().value("data").toMap().value("capabilities");
|
||||
qDebug() << "Server capabilities" << caps;
|
||||
account->setCapabilities(caps.toMap());
|
||||
loop.quit();
|
||||
});
|
||||
job->start();
|
||||
|
||||
loop.exec();
|
||||
#endif
|
||||
account->setBundleRequestsIfCapable(options.bundleRequests);
|
||||
|
||||
// much lower age than the default since this utility is usually made to be run right after a change in the tests
|
||||
SyncEngine::minimumFileAgeForUpload = 0;
|
||||
|
||||
int restartCount = 0;
|
||||
restart_sync:
|
||||
|
||||
csync_set_log_level(options.silent ? 1 : 11);
|
||||
|
||||
opts = &options;
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@ AccountManager *AccountManager::instance()
|
||||
|
||||
bool AccountManager::restore()
|
||||
{
|
||||
auto settings = Utility::settingsWithGroup(QLatin1String(accountsC));
|
||||
auto settings = Account::settingsWithGroup(QLatin1String(accountsC));
|
||||
|
||||
// If there are no accounts, check the old format.
|
||||
if (settings->childGroups().isEmpty()
|
||||
@@ -69,7 +69,9 @@ bool AccountManager::restore()
|
||||
bool AccountManager::restoreFromLegacySettings()
|
||||
{
|
||||
// try to open the correctly themed settings
|
||||
auto settings = Utility::settingsWithGroup(Theme::instance()->appName());
|
||||
auto settings = Account::settingsWithGroup(Theme::instance()->appName());
|
||||
|
||||
bool migratedCreds = false;
|
||||
|
||||
// if the settings file could not be opened, the childKeys list is empty
|
||||
// then try to load settings from a very old place
|
||||
@@ -100,6 +102,7 @@ bool AccountManager::restoreFromLegacySettings()
|
||||
qDebug() << "Migrate oC config if " << oCUrl << " == " << overrideUrl << ":"
|
||||
<< (oCUrl == overrideUrl ? "Yes" : "No");
|
||||
if( oCUrl == overrideUrl ) {
|
||||
migratedCreds = true;
|
||||
settings.reset( oCSettings );
|
||||
} else {
|
||||
delete oCSettings;
|
||||
@@ -111,6 +114,9 @@ bool AccountManager::restoreFromLegacySettings()
|
||||
// Try to load the single account.
|
||||
if (!settings->childKeys().isEmpty()) {
|
||||
if (auto acc = loadAccountHelper(*settings)) {
|
||||
if (migratedCreds) {
|
||||
acc->setMigrated(true);
|
||||
}
|
||||
addAccount(acc);
|
||||
return true;
|
||||
}
|
||||
@@ -120,7 +126,7 @@ bool AccountManager::restoreFromLegacySettings()
|
||||
|
||||
void AccountManager::save(bool saveCredentials)
|
||||
{
|
||||
auto settings = Utility::settingsWithGroup(QLatin1String(accountsC));
|
||||
auto settings = Account::settingsWithGroup(QLatin1String(accountsC));
|
||||
settings->setValue(QLatin1String(versionC), 2);
|
||||
foreach (const auto &acc, _accounts) {
|
||||
settings->beginGroup(acc->account()->id());
|
||||
@@ -136,7 +142,7 @@ void AccountManager::save(bool saveCredentials)
|
||||
void AccountManager::saveAccount(Account* a)
|
||||
{
|
||||
qDebug() << "Saving account" << a->url().toString();
|
||||
auto settings = Utility::settingsWithGroup(QLatin1String(accountsC));
|
||||
auto settings = Account::settingsWithGroup(QLatin1String(accountsC));
|
||||
settings->beginGroup(a->id());
|
||||
saveAccountHelper(a, *settings, false); // don't save credentials they might not have been loaded yet
|
||||
settings->endGroup();
|
||||
@@ -148,7 +154,7 @@ void AccountManager::saveAccount(Account* a)
|
||||
void AccountManager::saveAccountState(AccountState* a)
|
||||
{
|
||||
qDebug() << "Saving account state" << a->account()->url().toString();
|
||||
auto settings = Utility::settingsWithGroup(QLatin1String(accountsC));
|
||||
auto settings = Account::settingsWithGroup(QLatin1String(accountsC));
|
||||
settings->beginGroup(a->account()->id());
|
||||
a->writeToSettings(*settings);
|
||||
settings->endGroup();
|
||||
@@ -203,13 +209,6 @@ void AccountManager::saveAccountHelper(Account* acc, QSettings& settings, bool s
|
||||
|
||||
AccountPtr AccountManager::loadAccountHelper(QSettings& settings)
|
||||
{
|
||||
auto urlConfig = settings.value(QLatin1String(urlC));
|
||||
if (!urlConfig.isValid()) {
|
||||
// No URL probably means a corrupted entry in the account settings
|
||||
qDebug() << "No URL for account " << settings.group();
|
||||
return AccountPtr();
|
||||
}
|
||||
|
||||
auto acc = createAccount();
|
||||
|
||||
QString authType = settings.value(QLatin1String(authTypeC)).toString();
|
||||
@@ -221,7 +220,7 @@ AccountPtr AccountManager::loadAccountHelper(QSettings& settings)
|
||||
acc->setUrl(overrideUrl);
|
||||
authType = forceAuth;
|
||||
} else {
|
||||
acc->setUrl(urlConfig.toUrl());
|
||||
acc->setUrl(settings.value(QLatin1String(urlC)).toUrl());
|
||||
}
|
||||
acc->_serverVersion = settings.value(QLatin1String(serverVersionC)).toString();
|
||||
|
||||
@@ -274,7 +273,7 @@ void AccountManager::deleteAccount(AccountState* account)
|
||||
auto copy = *it; // keep a reference to the shared pointer so it does not delete it just yet
|
||||
_accounts.erase(it);
|
||||
|
||||
auto settings = Utility::settingsWithGroup(QLatin1String(accountsC));
|
||||
auto settings = Account::settingsWithGroup(QLatin1String(accountsC));
|
||||
settings->remove(account->account()->id());
|
||||
|
||||
emit accountRemoved(account);
|
||||
|
||||
@@ -117,10 +117,6 @@ AccountSettings::AccountSettings(AccountState *accountState, QWidget *parent) :
|
||||
|
||||
connect(ui->selectiveSyncApply, SIGNAL(clicked()), _model, SLOT(slotApplySelectiveSync()));
|
||||
connect(ui->selectiveSyncCancel, SIGNAL(clicked()), _model, SLOT(resetFolders()));
|
||||
connect(ui->bigFolderApply, SIGNAL(clicked(bool)), _model, SLOT(slotApplySelectiveSync()));
|
||||
connect(ui->bigFolderSyncAll, SIGNAL(clicked(bool)), _model, SLOT(slotSyncAllPendingBigFolders()));
|
||||
connect(ui->bigFolderSyncNone, SIGNAL(clicked(bool)), _model, SLOT(slotSyncNoPendingBigFolders()));
|
||||
|
||||
connect(FolderMan::instance(), SIGNAL(folderListChanged(Folder::Map)), _model, SLOT(resetFolders()));
|
||||
connect(this, SIGNAL(folderChanged()), _model, SLOT(resetFolders()));
|
||||
|
||||
@@ -321,7 +317,7 @@ void AccountSettings::slotFolderWizardAccepted()
|
||||
// The user already accepted the selective sync dialog. everything is in the white list
|
||||
f->journalDb()->setSelectiveSyncList(SyncJournalDb::SelectiveSyncWhiteList,
|
||||
QStringList() << QLatin1String("/"));
|
||||
folderMan->scheduleAllFolders();
|
||||
folderMan->slotScheduleAllFolders();
|
||||
emit folderChanged();
|
||||
}
|
||||
}
|
||||
@@ -360,7 +356,7 @@ void AccountSettings::slotRemoveCurrentFolder()
|
||||
return;
|
||||
}
|
||||
|
||||
folderMan->removeFolder( folderMan->folder(alias) );
|
||||
folderMan->slotRemoveFolder( folderMan->folder(alias) );
|
||||
_model->removeRow(row);
|
||||
|
||||
// single folder fix to show add-button and hide remove-button
|
||||
@@ -468,7 +464,7 @@ void AccountSettings::slotSyncCurrentFolderNow()
|
||||
QString alias = _model->data( selected, FolderStatusDelegate::FolderAliasRole ).toString();
|
||||
FolderMan *folderMan = FolderMan::instance();
|
||||
|
||||
folderMan->scheduleFolder(folderMan->folder(alias));
|
||||
folderMan->slotScheduleSync(folderMan->folder(alias));
|
||||
}
|
||||
|
||||
void AccountSettings::slotOpenOC()
|
||||
@@ -639,13 +635,12 @@ void AccountSettings::refreshSelectiveSyncStatus()
|
||||
}
|
||||
|
||||
if (msg.isEmpty()) {
|
||||
ui->selectiveSyncButtons->setVisible(true);
|
||||
ui->bigFolderUi->setVisible(false);
|
||||
ui->selectiveSyncNotification->setVisible(false);
|
||||
ui->selectiveSyncNotification->setText(QString());
|
||||
} else {
|
||||
ui->selectiveSyncNotification->setVisible(true);
|
||||
QString wholeMsg = tr("There are new folders that were not synchronized because they are too big: ") + msg;
|
||||
ui->selectiveSyncNotification->setText(wholeMsg);
|
||||
ui->selectiveSyncButtons->setVisible(false);
|
||||
ui->bigFolderUi->setVisible(true);
|
||||
shouldBeVisible = true;
|
||||
}
|
||||
|
||||
|
||||
@@ -154,105 +154,44 @@
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QWidget" name="bigFolderUi" native="true">
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QLabel" name="selectiveSyncNotification">
|
||||
<property name="styleSheet">
|
||||
<string notr="true">color: red</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||
<item>
|
||||
<widget class="QPushButton" name="bigFolderSyncAll">
|
||||
<property name="text">
|
||||
<string>Synchronize all</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="bigFolderSyncNone">
|
||||
<property name="text">
|
||||
<string>Synchronize none</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="bigFolderApply">
|
||||
<property name="text">
|
||||
<string>Apply manual changes</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
<widget class="QLabel" name="selectiveSyncNotification">
|
||||
<property name="styleSheet">
|
||||
<string notr="true">color: red</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QWidget" name="selectiveSyncButtons" native="true">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QPushButton" name="selectiveSyncCancel">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Minimum" vsizetype="Maximum">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Cancel</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="selectiveSyncApply">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Minimum" vsizetype="Maximum">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Apply</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
<widget class="QPushButton" name="selectiveSyncCancel">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Minimum" vsizetype="Maximum">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Cancel</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="selectiveSyncApply">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Minimum" vsizetype="Maximum">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Apply</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
|
||||
@@ -306,7 +306,7 @@ void AccountState::slotCredentialsAsked(AbstractCredentials* credentials)
|
||||
|
||||
std::unique_ptr<QSettings> AccountState::settings()
|
||||
{
|
||||
auto s = Utility::settingsWithGroup(QLatin1String("Accounts"));
|
||||
auto s = _account->settingsWithGroup(QLatin1String("Accounts"));
|
||||
s->beginGroup(_account->id());
|
||||
return s;
|
||||
}
|
||||
|
||||
@@ -336,14 +336,9 @@ void Application::slotownCloudWizardDone( int res )
|
||||
_checkConnectionTimer.start();
|
||||
slotCheckConnection();
|
||||
|
||||
// If one account is configured: enable autostart
|
||||
bool shouldSetAutoStart = (accountMan->accounts().size() == 1);
|
||||
#ifdef Q_OS_MAC
|
||||
// Don't auto start when not being 'installed'
|
||||
shouldSetAutoStart = shouldSetAutoStart
|
||||
&& QCoreApplication::applicationDirPath().startsWith("/Applications/");
|
||||
#endif
|
||||
Utility::setLaunchOnStartup(_theme->appName(), _theme->appNameGUI(), shouldSetAutoStart);
|
||||
// The very first time an account is configured: enabled autostart
|
||||
// TODO: Doing this every time the account wizard finishes will annoy users.
|
||||
Utility::setLaunchOnStartup(_theme->appName(), _theme->appNameGUI(), true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -79,6 +79,21 @@ void ShibbolethCredentials::setAccount(Account* account)
|
||||
}
|
||||
}
|
||||
|
||||
bool ShibbolethCredentials::changed(AbstractCredentials* credentials) const
|
||||
{
|
||||
ShibbolethCredentials* other(qobject_cast< ShibbolethCredentials* >(credentials));
|
||||
|
||||
if (!other) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (_shibCookie != other->_shibCookie || _user != other->_user) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
QString ShibbolethCredentials::authType() const
|
||||
{
|
||||
return QString::fromLatin1("shibboleth");
|
||||
@@ -127,7 +142,7 @@ void ShibbolethCredentials::fetchFromKeychain()
|
||||
} else {
|
||||
_url = _account->url();
|
||||
ReadPasswordJob *job = new ReadPasswordJob(Theme::instance()->appName());
|
||||
job->setSettings(Utility::settingsWithGroup(Theme::instance()->appName(), job).release());
|
||||
job->setSettings(_account->settingsWithGroup(Theme::instance()->appName(), job).release());
|
||||
job->setInsecureFallback(false);
|
||||
job->setKey(keychainKey(_account->url().toString(), "shibAssertion"));
|
||||
connect(job, SIGNAL(finished(QKeychain::Job*)), SLOT(slotReadJobDone(QKeychain::Job*)));
|
||||
@@ -246,7 +261,7 @@ void ShibbolethCredentials::slotReadJobDone(QKeychain::Job *job)
|
||||
addToCookieJar(_shibCookie);
|
||||
}
|
||||
// access
|
||||
job->setSettings(Utility::settingsWithGroup(Theme::instance()->appName(), job).release());
|
||||
job->setSettings(_account->settingsWithGroup(Theme::instance()->appName(), job).release());
|
||||
|
||||
_ready = true;
|
||||
_stillValid = true;
|
||||
@@ -305,7 +320,7 @@ QByteArray ShibbolethCredentials::shibCookieName()
|
||||
void ShibbolethCredentials::storeShibCookie(const QNetworkCookie &cookie)
|
||||
{
|
||||
WritePasswordJob *job = new WritePasswordJob(Theme::instance()->appName());
|
||||
job->setSettings(Utility::settingsWithGroup(Theme::instance()->appName(), job).release());
|
||||
job->setSettings(_account->settingsWithGroup(Theme::instance()->appName(), job).release());
|
||||
// we don't really care if it works...
|
||||
//connect(job, SIGNAL(finished(QKeychain::Job*)), SLOT(slotWriteJobDone(QKeychain::Job*)));
|
||||
job->setKey(keychainKey(_account->url().toString(), "shibAssertion"));
|
||||
@@ -316,7 +331,7 @@ void ShibbolethCredentials::storeShibCookie(const QNetworkCookie &cookie)
|
||||
void ShibbolethCredentials::removeShibCookie()
|
||||
{
|
||||
DeletePasswordJob *job = new DeletePasswordJob(Theme::instance()->appName());
|
||||
job->setSettings(Utility::settingsWithGroup(Theme::instance()->appName(), job).release());
|
||||
job->setSettings(_account->settingsWithGroup(Theme::instance()->appName(), job).release());
|
||||
job->setKey(keychainKey(_account->url().toString(), "shibAssertion"));
|
||||
job->start();
|
||||
}
|
||||
|
||||
@@ -48,6 +48,7 @@ public:
|
||||
ShibbolethCredentials(const QNetworkCookie &cookie);
|
||||
|
||||
void setAccount(Account* account) Q_DECL_OVERRIDE;
|
||||
bool changed(AbstractCredentials* credentials) const Q_DECL_OVERRIDE;
|
||||
QString authType() const Q_DECL_OVERRIDE;
|
||||
QString user() const Q_DECL_OVERRIDE;
|
||||
QNetworkAccessManager* getQNAM() const Q_DECL_OVERRIDE;
|
||||
|
||||
+58
-35
@@ -58,6 +58,7 @@ Folder::Folder(const FolderDefinition& definition,
|
||||
, _wipeDb(false)
|
||||
, _proxyDirty(true)
|
||||
, _lastSyncDuration(0)
|
||||
, _forceSyncOnPollTimeout(false)
|
||||
, _consecutiveFailingSyncs(0)
|
||||
, _consecutiveFollowUpSyncs(0)
|
||||
, _journal(definition.localPath)
|
||||
@@ -111,11 +112,6 @@ Folder::Folder(const FolderDefinition& definition,
|
||||
connect(_engine.data(), SIGNAL(seenLockedFile(QString)), FolderMan::instance(), SLOT(slotSyncOnceFileUnlocks(QString)));
|
||||
connect(_engine.data(), SIGNAL(aboutToPropagate(SyncFileItemVector&)),
|
||||
SLOT(slotLogPropagationStart()));
|
||||
|
||||
_scheduleSelfTimer.setSingleShot(true);
|
||||
_scheduleSelfTimer.setInterval(SyncEngine::minimumFileAgeForUpload);
|
||||
connect(&_scheduleSelfTimer, SIGNAL(timeout()),
|
||||
SLOT(slotScheduleThisFolder()));
|
||||
}
|
||||
|
||||
Folder::~Folder()
|
||||
@@ -225,7 +221,7 @@ QString Folder::remotePath() const
|
||||
|
||||
QUrl Folder::remoteUrl() const
|
||||
{
|
||||
return Utility::concatUrlPath(_accountState->account()->davUrl(), remotePath());
|
||||
return Account::concatUrlPath(_accountState->account()->davUrl(), remotePath());
|
||||
}
|
||||
|
||||
bool Folder::syncPaused() const
|
||||
@@ -279,7 +275,7 @@ void Folder::slotRunEtagJob()
|
||||
|
||||
AccountPtr account = _accountState->account();
|
||||
|
||||
if (_requestEtagJob) {
|
||||
if (!_requestEtagJob.isNull()) {
|
||||
qDebug() << Q_FUNC_INFO << remoteUrl().toString() << "has ETag job queued, not trying to sync";
|
||||
return;
|
||||
}
|
||||
@@ -289,15 +285,47 @@ void Folder::slotRunEtagJob()
|
||||
return;
|
||||
}
|
||||
|
||||
// Do the ordinary etag check for the root folder and schedule a
|
||||
// sync if it's different.
|
||||
bool forceSyncIntervalExpired =
|
||||
quint64(_timeSinceLastSyncDone.elapsed()) > ConfigFile().forceSyncInterval();
|
||||
bool syncAgainAfterFail = _consecutiveFailingSyncs > 0 && _consecutiveFailingSyncs < 3;
|
||||
|
||||
_requestEtagJob = new RequestEtagJob(account, remotePath(), this);
|
||||
_requestEtagJob->setTimeout(60*1000);
|
||||
// check if the etag is different when retrieved
|
||||
QObject::connect(_requestEtagJob, SIGNAL(etagRetreived(QString)), this, SLOT(etagRetreived(QString)));
|
||||
FolderMan::instance()->slotScheduleETagJob(alias(), _requestEtagJob);
|
||||
// The _requestEtagJob is auto deleting itself on finish. Our guard pointer _requestEtagJob will then be null.
|
||||
// There are several conditions under which we trigger a full-discovery sync:
|
||||
// * When a suitably long time has passed since the last sync finished
|
||||
// * When the last sync failed (only a couple of times)
|
||||
// * When the last sync requested another sync to be done (only a couple of times)
|
||||
//
|
||||
// Note that the etag check (see below) and the file watcher may also trigger
|
||||
// syncs.
|
||||
if (forceSyncIntervalExpired
|
||||
|| _forceSyncOnPollTimeout
|
||||
|| syncAgainAfterFail) {
|
||||
|
||||
if (forceSyncIntervalExpired) {
|
||||
qDebug() << "** Force Sync, because it has been " << _timeSinceLastSyncDone.elapsed() << "ms "
|
||||
<< "since the last sync";
|
||||
}
|
||||
if (_forceSyncOnPollTimeout) {
|
||||
qDebug() << "** Force Sync, because it was requested";
|
||||
}
|
||||
if (syncAgainAfterFail) {
|
||||
qDebug() << "** Force Sync, because the last"
|
||||
<< _consecutiveFailingSyncs << "syncs failed, last status:"
|
||||
<< _syncResult.statusString();
|
||||
}
|
||||
_forceSyncOnPollTimeout = false;
|
||||
emit scheduleToSync(this);
|
||||
|
||||
} else {
|
||||
// Do the ordinary etag check for the root folder and only schedule a real
|
||||
// sync if it's different.
|
||||
|
||||
_requestEtagJob = new RequestEtagJob(account, remotePath(), this);
|
||||
_requestEtagJob->setTimeout(60*1000);
|
||||
// check if the etag is different
|
||||
QObject::connect(_requestEtagJob, SIGNAL(etagRetreived(QString)), this, SLOT(etagRetreived(QString)));
|
||||
FolderMan::instance()->slotScheduleETagJob(alias(), _requestEtagJob);
|
||||
// The _requestEtagJob is auto deleting itself on finish. Our guard pointer _requestEtagJob will then be null.
|
||||
}
|
||||
}
|
||||
|
||||
void Folder::etagRetreived(const QString& etag)
|
||||
@@ -310,7 +338,7 @@ void Folder::etagRetreived(const QString& etag)
|
||||
if (_lastEtag != etag) {
|
||||
qDebug() << "* Compare etag with previous etag: last:" << _lastEtag << ", received:" << etag << "-> CHANGED";
|
||||
_lastEtag = etag;
|
||||
slotScheduleThisFolder();
|
||||
emit scheduleToSync(this);
|
||||
}
|
||||
|
||||
_accountState->tagLastSuccessfullETagRequest();
|
||||
@@ -570,10 +598,7 @@ void Folder::slotWatchedPathChanged(const QString& path)
|
||||
}
|
||||
|
||||
emit watchedFileChangedExternally(path);
|
||||
|
||||
// Also schedule this folder for a sync, but only after some delay:
|
||||
// The sync will not upload files that were changed too recently.
|
||||
scheduleThisFolderSoon();
|
||||
emit scheduleToSync(this);
|
||||
}
|
||||
|
||||
void Folder::slotThreadTreeWalkResult(const SyncFileItemVector& items)
|
||||
@@ -733,6 +758,8 @@ void Folder::startSync(const QStringList &pathList)
|
||||
|
||||
QMetaObject::invokeMethod(_engine.data(), "startSync", Qt::QueuedConnection);
|
||||
|
||||
// disable events until syncing is done
|
||||
// _watcher->setEventsEnabled(false);
|
||||
emit syncStarted();
|
||||
}
|
||||
|
||||
@@ -796,6 +823,9 @@ void Folder::slotSyncFinished(bool success)
|
||||
bubbleUpSyncResult();
|
||||
|
||||
bool anotherSyncNeeded = _engine->isAnotherSyncNeeded();
|
||||
// _watcher->setEventsEnabledDelayed(2000);
|
||||
|
||||
|
||||
|
||||
if (_csyncError) {
|
||||
_syncResult.setStatus(SyncResult::Error);
|
||||
@@ -854,10 +884,11 @@ void Folder::slotSyncFinished(bool success)
|
||||
// Maybe force a follow-up sync to take place, but only a couple of times.
|
||||
if (anotherSyncNeeded && _consecutiveFollowUpSyncs <= 3)
|
||||
{
|
||||
// Sometimes another sync is requested because a local file is still
|
||||
// changing, so wait at least a small amount of time before syncing
|
||||
// the folder again.
|
||||
scheduleThisFolderSoon();
|
||||
_forceSyncOnPollTimeout = true;
|
||||
// We will make sure that the poll timer occurs soon enough.
|
||||
// delay 1s, 4s, 9s
|
||||
int c = _consecutiveFollowUpSyncs;
|
||||
QTimer::singleShot(c*c * 1000, this, SLOT(slotRunEtagJob() ));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -938,17 +969,7 @@ void Folder::slotLogPropagationStart()
|
||||
_fileLog->logLap("Propagation starts");
|
||||
}
|
||||
|
||||
void Folder::slotScheduleThisFolder()
|
||||
{
|
||||
FolderMan::instance()->scheduleFolder(this);
|
||||
}
|
||||
|
||||
void Folder::scheduleThisFolderSoon()
|
||||
{
|
||||
if (!_scheduleSelfTimer.isActive()) {
|
||||
_scheduleSelfTimer.start();
|
||||
}
|
||||
}
|
||||
|
||||
void Folder::slotAboutToRemoveAllFiles(SyncFileItem::Direction, bool *cancel)
|
||||
{
|
||||
@@ -972,8 +993,10 @@ void Folder::slotAboutToRemoveAllFiles(SyncFileItem::Direction, bool *cancel)
|
||||
*cancel = msgBox.clickedButton() == keepBtn;
|
||||
if (*cancel) {
|
||||
wipe();
|
||||
// speed up next sync
|
||||
_lastEtag.clear();
|
||||
slotScheduleThisFolder();
|
||||
_forceSyncOnPollTimeout = true;
|
||||
QTimer::singleShot(50, this, SLOT(slotRunEtagJob()));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+2
-19
@@ -178,7 +178,6 @@ public:
|
||||
qint64 msecSinceLastSync() const { return _timeSinceLastSyncDone.elapsed(); }
|
||||
qint64 msecLastSyncDuration() const { return _lastSyncDuration; }
|
||||
int consecutiveFollowUpSyncs() const { return _consecutiveFollowUpSyncs; }
|
||||
int consecutiveFailingSyncs() const { return _consecutiveFailingSyncs; }
|
||||
|
||||
/// Saves the folder data in the account's settings.
|
||||
void saveToSettings() const;
|
||||
@@ -195,21 +194,11 @@ public:
|
||||
*/
|
||||
bool isFileExcludedRelative(const QString& relativePath) const;
|
||||
|
||||
/** Calls schedules this folder on the FolderMan after a short delay.
|
||||
*
|
||||
* This should be used in situations where a sync should be triggered
|
||||
* because a local file was modified. Syncs don't upload files that were
|
||||
* modified too recently, and this delay ensures the modification is
|
||||
* far enough in the past.
|
||||
*
|
||||
* The delay doesn't reset with subsequent calls.
|
||||
*/
|
||||
void scheduleThisFolderSoon();
|
||||
|
||||
signals:
|
||||
void syncStateChange();
|
||||
void syncStarted();
|
||||
void syncFinished(const SyncResult &result);
|
||||
void scheduleToSync(Folder*);
|
||||
void progressInfo(const ProgressInfo& progress);
|
||||
void newBigFolderDiscovered(const QString &); // A new folder bigger than the threshold was discovered
|
||||
void syncPausedChanged(Folder*, bool paused);
|
||||
@@ -277,11 +266,6 @@ private slots:
|
||||
|
||||
void slotLogPropagationStart();
|
||||
|
||||
/** Adds this folder to the list of scheduled folders in the
|
||||
* FolderMan.
|
||||
*/
|
||||
void slotScheduleThisFolder();
|
||||
|
||||
private:
|
||||
bool setIgnoredFiles();
|
||||
|
||||
@@ -318,6 +302,7 @@ private:
|
||||
QElapsedTimer _timeSinceLastSyncDone;
|
||||
QElapsedTimer _timeSinceLastSyncStart;
|
||||
qint64 _lastSyncDuration;
|
||||
bool _forceSyncOnPollTimeout;
|
||||
|
||||
/// The number of syncs that failed in a row.
|
||||
/// Reset when a sync is successful.
|
||||
@@ -332,8 +317,6 @@ private:
|
||||
ClientProxy _clientProxy;
|
||||
|
||||
QScopedPointer<SyncRunFileLog> _fileLog;
|
||||
|
||||
QTimer _scheduleSelfTimer;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
+45
-79
@@ -64,17 +64,11 @@ FolderMan::FolderMan(QObject *parent) :
|
||||
connect(&_startScheduledSyncTimer, SIGNAL(timeout()),
|
||||
SLOT(slotStartScheduledFolderSync()));
|
||||
|
||||
_timeScheduler.setInterval(5000);
|
||||
_timeScheduler.setSingleShot(false);
|
||||
connect(&_timeScheduler, SIGNAL(timeout()),
|
||||
SLOT(slotScheduleFolderByTime()));
|
||||
_timeScheduler.start();
|
||||
|
||||
connect(AccountManager::instance(), SIGNAL(accountRemoved(AccountState*)),
|
||||
SLOT(slotRemoveFoldersForAccount(AccountState*)));
|
||||
|
||||
connect(_lockWatcher.data(), SIGNAL(fileUnlocked(QString)),
|
||||
SLOT(slotWatchedFileUnlocked(QString)));
|
||||
SLOT(slotScheduleFolderOwningFile(QString)));
|
||||
}
|
||||
|
||||
FolderMan *FolderMan::instance()
|
||||
@@ -106,6 +100,8 @@ void FolderMan::unloadFolder( Folder *f )
|
||||
}
|
||||
_folderMap.remove( f->alias() );
|
||||
|
||||
disconnect(f, SIGNAL(scheduleToSync(Folder*)),
|
||||
this, SLOT(slotScheduleSync(Folder*)));
|
||||
disconnect(f, SIGNAL(syncStarted()),
|
||||
this, SLOT(slotFolderSyncStarted()));
|
||||
disconnect(f, SIGNAL(syncFinished(SyncResult)),
|
||||
@@ -135,7 +131,7 @@ int FolderMan::unloadAndDeleteAllFolders()
|
||||
}
|
||||
_lastSyncFolder = 0;
|
||||
_currentSyncFolder = 0;
|
||||
_scheduledFolders.clear();
|
||||
_scheduleQueue.clear();
|
||||
emit scheduleQueueChanged();
|
||||
|
||||
Q_ASSERT(_folderMap.count() == 0);
|
||||
@@ -191,7 +187,7 @@ int FolderMan::setupFolders()
|
||||
{
|
||||
unloadAndDeleteAllFolders();
|
||||
|
||||
auto settings = Utility::settingsWithGroup(QLatin1String("Accounts"));
|
||||
auto settings = Account::settingsWithGroup(QLatin1String("Accounts"));
|
||||
const auto accountsWithSettings = settings->childGroups();
|
||||
if (accountsWithSettings.isEmpty()) {
|
||||
int r = setupFoldersMigration();
|
||||
@@ -215,7 +211,7 @@ int FolderMan::setupFolders()
|
||||
if (FolderDefinition::load(*settings, folderAlias, &folderDefinition)) {
|
||||
Folder* f = addFolderInternal(std::move(folderDefinition), account.data());
|
||||
if (f) {
|
||||
scheduleFolder(f);
|
||||
slotScheduleSync(f);
|
||||
emit folderSyncStateChange(f);
|
||||
}
|
||||
}
|
||||
@@ -248,7 +244,7 @@ int FolderMan::setupFoldersMigration()
|
||||
foreach ( const QString& alias, list ) {
|
||||
Folder *f = setupFolderFromOldConfigFile( alias, accountState );
|
||||
if( f ) {
|
||||
scheduleFolder(f);
|
||||
slotScheduleSync(f);
|
||||
emit folderSyncStateChange(f);
|
||||
}
|
||||
}
|
||||
@@ -426,7 +422,7 @@ void FolderMan::slotFolderSyncPaused( Folder *f, bool paused )
|
||||
|
||||
if (!paused) {
|
||||
_disabledFolders.remove(f);
|
||||
scheduleFolder(f);
|
||||
slotScheduleSync(f);
|
||||
} else {
|
||||
_disabledFolders.insert(f);
|
||||
}
|
||||
@@ -466,11 +462,11 @@ Folder *FolderMan::folder( const QString& alias )
|
||||
return 0;
|
||||
}
|
||||
|
||||
void FolderMan::scheduleAllFolders()
|
||||
void FolderMan::slotScheduleAllFolders()
|
||||
{
|
||||
foreach( Folder *f, _folderMap.values() ) {
|
||||
if (f && f->canSync()) {
|
||||
scheduleFolder( f );
|
||||
slotScheduleSync( f );
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -490,7 +486,7 @@ void FolderMan::slotSyncOnceFileUnlocks(const QString& path)
|
||||
* if a folder wants to be synced, it calls this slot and is added
|
||||
* to the queue. The slot to actually start a sync is called afterwards.
|
||||
*/
|
||||
void FolderMan::scheduleFolder( Folder *f )
|
||||
void FolderMan::slotScheduleSync( Folder *f )
|
||||
{
|
||||
if( !f ) {
|
||||
qWarning() << "slotScheduleSync called with null folder";
|
||||
@@ -500,7 +496,7 @@ void FolderMan::scheduleFolder( Folder *f )
|
||||
|
||||
qDebug() << "Schedule folder " << alias << " to sync!";
|
||||
|
||||
if( ! _scheduledFolders.contains(f) ) {
|
||||
if( ! _scheduleQueue.contains(f) ) {
|
||||
if( !f->canSync() ) {
|
||||
qDebug() << "Folder is not ready to sync, not scheduled!";
|
||||
_socketApi->slotUpdateFolderView(f);
|
||||
@@ -508,7 +504,7 @@ void FolderMan::scheduleFolder( Folder *f )
|
||||
}
|
||||
f->prepareToSync();
|
||||
emit folderSyncStateChange(f);
|
||||
_scheduledFolders.enqueue(f);
|
||||
_scheduleQueue.enqueue(f);
|
||||
emit scheduleQueueChanged();
|
||||
} else {
|
||||
qDebug() << " II> Sync for folder " << alias << " already scheduled, do not enqueue!";
|
||||
@@ -572,7 +568,7 @@ void FolderMan::slotAccountStateChanged()
|
||||
if (f
|
||||
&& f->canSync()
|
||||
&& f->accountState() == accountState) {
|
||||
scheduleFolder(f);
|
||||
slotScheduleSync(f);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@@ -584,7 +580,7 @@ void FolderMan::slotAccountStateChanged()
|
||||
_currentSyncFolder->slotTerminateSync();
|
||||
}
|
||||
|
||||
QMutableListIterator<Folder*> it(_scheduledFolders);
|
||||
QMutableListIterator<Folder*> it(_scheduleQueue);
|
||||
while (it.hasNext()) {
|
||||
Folder* f = it.next();
|
||||
if (f->accountState() == accountState) {
|
||||
@@ -599,7 +595,7 @@ void FolderMan::slotAccountStateChanged()
|
||||
// this is not the same as Pause and Resume of folders.
|
||||
void FolderMan::setSyncEnabled( bool enabled )
|
||||
{
|
||||
if (!_syncEnabled && enabled && !_scheduledFolders.isEmpty()) {
|
||||
if (!_syncEnabled && enabled && !_scheduleQueue.isEmpty()) {
|
||||
// We have things in our queue that were waiting for the connection to come back on.
|
||||
startScheduledSyncSoon();
|
||||
}
|
||||
@@ -608,19 +604,19 @@ void FolderMan::setSyncEnabled( bool enabled )
|
||||
emit( folderSyncStateChange(0) );
|
||||
}
|
||||
|
||||
void FolderMan::startScheduledSyncSoon()
|
||||
void FolderMan::startScheduledSyncSoon(qint64 msMinimumDelay)
|
||||
{
|
||||
if (_startScheduledSyncTimer.isActive()) {
|
||||
return;
|
||||
}
|
||||
if (_scheduledFolders.empty()) {
|
||||
if (_scheduleQueue.empty()) {
|
||||
return;
|
||||
}
|
||||
if (_currentSyncFolder) {
|
||||
return;
|
||||
}
|
||||
|
||||
qint64 msDelay = 100; // 100ms minimum delay
|
||||
qint64 msDelay = msMinimumDelay;
|
||||
qint64 msSinceLastSync = 0;
|
||||
|
||||
// Require a pause based on the duration of the last sync run.
|
||||
@@ -635,6 +631,15 @@ void FolderMan::startScheduledSyncSoon()
|
||||
msDelay = qMax(msDelay, pause);
|
||||
}
|
||||
|
||||
// Punish consecutive follow-up syncs with longer delays.
|
||||
if (Folder* nextFolder = _scheduleQueue.head()) {
|
||||
int followUps = nextFolder->consecutiveFollowUpSyncs();
|
||||
if (followUps >= 2) {
|
||||
// This is okay due to the 1min maximum delay limit below.
|
||||
msDelay *= qPow(followUps, 2);
|
||||
}
|
||||
}
|
||||
|
||||
// Delays beyond one minute seem too big, particularly since there
|
||||
// could be things later in the queue that shouldn't be punished by a
|
||||
// long delay!
|
||||
@@ -643,7 +648,11 @@ void FolderMan::startScheduledSyncSoon()
|
||||
// Time since the last sync run counts against the delay
|
||||
msDelay = qMax(1ll, msDelay - msSinceLastSync);
|
||||
|
||||
qDebug() << "Starting the next scheduled sync in" << (msDelay/1000) << "seconds";
|
||||
// A minimum of delay here is essential as the sync will not upload
|
||||
// files that were changed too recently.
|
||||
msDelay = qMax(SyncEngine::minimumFileAgeForUpload, msDelay);
|
||||
|
||||
qDebug() << "Scheduling a sync in" << (msDelay/1000) << "seconds";
|
||||
_startScheduledSyncTimer.start(msDelay);
|
||||
}
|
||||
|
||||
@@ -664,15 +673,15 @@ void FolderMan::slotStartScheduledFolderSync()
|
||||
return;
|
||||
}
|
||||
|
||||
qDebug() << "XX slotScheduleFolderSync: folderQueue size: " << _scheduledFolders.count();
|
||||
if( _scheduledFolders.isEmpty() ) {
|
||||
qDebug() << "XX slotScheduleFolderSync: folderQueue size: " << _scheduleQueue.count();
|
||||
if( _scheduleQueue.isEmpty() ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Find the first folder in the queue that can be synced.
|
||||
Folder* f = 0;
|
||||
while( !_scheduledFolders.isEmpty() ) {
|
||||
f = _scheduledFolders.dequeue();
|
||||
while( !_scheduleQueue.isEmpty() ) {
|
||||
f = _scheduleQueue.dequeue();
|
||||
Q_ASSERT(f);
|
||||
|
||||
if( f->canSync() ) {
|
||||
@@ -702,7 +711,7 @@ void FolderMan::slotEtagPollTimerTimeout()
|
||||
if (_currentSyncFolder == f) {
|
||||
continue;
|
||||
}
|
||||
if (_scheduledFolders.contains(f)) {
|
||||
if (_scheduleQueue.contains(f)) {
|
||||
continue;
|
||||
}
|
||||
if (_disabledFolders.contains(f)) {
|
||||
@@ -731,7 +740,7 @@ void FolderMan::slotRemoveFoldersForAccount(AccountState* accountState)
|
||||
}
|
||||
|
||||
foreach (const auto &f, foldersToRemove) {
|
||||
removeFolder(f);
|
||||
slotRemoveFolder(f);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -757,54 +766,10 @@ void FolderMan::slotServerVersionChanged(Account *account)
|
||||
}
|
||||
}
|
||||
|
||||
void FolderMan::slotWatchedFileUnlocked(const QString& path)
|
||||
void FolderMan::slotScheduleFolderOwningFile(const QString& path)
|
||||
{
|
||||
if (Folder* f = folderForPath(path)) {
|
||||
f->scheduleThisFolderSoon();
|
||||
}
|
||||
}
|
||||
|
||||
void FolderMan::slotScheduleFolderByTime()
|
||||
{
|
||||
foreach (auto& f, _folderMap) {
|
||||
// Never schedule if syncing is disabled or when we're currently
|
||||
// querying the server for etags
|
||||
if (!f->canSync() || f->etagJob()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
auto msecsSinceSync = f->msecSinceLastSync();
|
||||
|
||||
// Possibly it's just time for a new sync run
|
||||
bool forceSyncIntervalExpired =
|
||||
quint64(msecsSinceSync) > ConfigFile().forceSyncInterval();
|
||||
if (forceSyncIntervalExpired) {
|
||||
qDebug() << "** scheduling folder" << f->alias()
|
||||
<< "because it has been" << msecsSinceSync << "ms "
|
||||
<< "since the last sync";
|
||||
|
||||
scheduleFolder(f);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Retry a couple of times after failure
|
||||
bool syncAgainAfterFail = f->consecutiveFailingSyncs() > 0 && f->consecutiveFailingSyncs() < 3;
|
||||
qint64 syncAgainAfterFailDelay = 10 * 1000; // 10s for the first retry-after-fail
|
||||
if (f->consecutiveFailingSyncs() > 1)
|
||||
syncAgainAfterFailDelay = 60 * 1000; // 60s for each further attempt
|
||||
if (syncAgainAfterFail
|
||||
&& msecsSinceSync > syncAgainAfterFailDelay) {
|
||||
qDebug() << "** scheduling folder" << f->alias()
|
||||
<< "because the last"
|
||||
<< f->consecutiveFailingSyncs() << "syncs failed, last status:"
|
||||
<< f->syncResult().statusString()
|
||||
<< "time since last sync:" << msecsSinceSync;
|
||||
|
||||
scheduleFolder(f);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Do we want to retry failing syncs or another-sync-needed runs more often?
|
||||
slotScheduleSync(f);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -862,6 +827,7 @@ Folder* FolderMan::addFolderInternal(FolderDefinition folderDefinition, AccountS
|
||||
}
|
||||
|
||||
// See matching disconnects in unloadFolder().
|
||||
connect(folder, SIGNAL(scheduleToSync(Folder*)), SLOT(slotScheduleSync(Folder*)));
|
||||
connect(folder, SIGNAL(syncStarted()), SLOT(slotFolderSyncStarted()));
|
||||
connect(folder, SIGNAL(syncFinished(SyncResult)), SLOT(slotFolderSyncFinished(SyncResult)));
|
||||
connect(folder, SIGNAL(syncStateChange()), SLOT(slotForwardFolderSyncStateChange()));
|
||||
@@ -914,7 +880,7 @@ QStringList FolderMan::findFileInLocalFolders( const QString& relPath, const Acc
|
||||
return re;
|
||||
}
|
||||
|
||||
void FolderMan::removeFolder( Folder *f )
|
||||
void FolderMan::slotRemoveFolder( Folder *f )
|
||||
{
|
||||
if( !f ) {
|
||||
qWarning() << "!! Can not remove null folder";
|
||||
@@ -929,7 +895,7 @@ void FolderMan::removeFolder( Folder *f )
|
||||
terminateSyncProcess();
|
||||
}
|
||||
|
||||
if (_scheduledFolders.removeAll(f) > 0) {
|
||||
if (_scheduleQueue.removeAll(f) > 0) {
|
||||
emit scheduleQueueChanged();
|
||||
}
|
||||
|
||||
@@ -1296,7 +1262,7 @@ void FolderMan::setIgnoreHiddenFiles(bool ignore)
|
||||
|
||||
QQueue<Folder*> FolderMan::scheduleQueue() const
|
||||
{
|
||||
return _scheduledFolders;
|
||||
return _scheduleQueue;
|
||||
}
|
||||
|
||||
Folder *FolderMan::currentSyncFolder() const
|
||||
|
||||
+43
-94
@@ -37,26 +37,6 @@ class LockWatcher;
|
||||
/**
|
||||
* @brief The FolderMan class
|
||||
* @ingroup gui
|
||||
*
|
||||
* The FolderMan knows about all loaded folders and is responsible for
|
||||
* scheduling them when necessary.
|
||||
*
|
||||
* A folder is scheduled if:
|
||||
* - The configured force-sync-interval has expired
|
||||
* (_timeScheduler and slotScheduleFolderByTime())
|
||||
*
|
||||
* - A folder watcher receives a notification about a file change
|
||||
* (_folderWatchers and Folder::slotWatchedPathChanged())
|
||||
*
|
||||
* - The folder etag on the server has changed
|
||||
* (_etagPollTimer)
|
||||
*
|
||||
* - The locks of a monitored file are released
|
||||
* (_lockWatcher and slotWatchedFileUnlocked())
|
||||
*
|
||||
* - There was a sync error or a follow-up sync is requested
|
||||
* (_timeScheduler and slotScheduleFolderByTime()
|
||||
* and Folder::slotSyncFinished())
|
||||
*/
|
||||
class FolderMan : public QObject
|
||||
{
|
||||
@@ -74,9 +54,6 @@ public:
|
||||
*/
|
||||
Folder* addFolder(AccountState* accountState, const FolderDefinition& folderDefinition);
|
||||
|
||||
/** Removes a folder */
|
||||
void removeFolder( Folder* );
|
||||
|
||||
/** Returns the folder which the file or directory stored in path is in */
|
||||
Folder* folderForPath(const QString& path);
|
||||
|
||||
@@ -149,24 +126,6 @@ public:
|
||||
*/
|
||||
Folder* currentSyncFolder() const;
|
||||
|
||||
/** Removes all folders */
|
||||
int unloadAndDeleteAllFolders();
|
||||
|
||||
/**
|
||||
* If enabled is set to false, no new folders will start to sync.
|
||||
* The current one will finish.
|
||||
*/
|
||||
void setSyncEnabled( bool );
|
||||
|
||||
/** Queues a folder for syncing. */
|
||||
void scheduleFolder(Folder*);
|
||||
|
||||
/** Queues all folders for syncing. */
|
||||
void scheduleAllFolders();
|
||||
|
||||
void setDirtyProxy(bool value = true);
|
||||
void setDirtyNetworkLimits();
|
||||
|
||||
signals:
|
||||
/**
|
||||
* signal to indicate a folder has changed its sync state.
|
||||
@@ -180,12 +139,41 @@ signals:
|
||||
*/
|
||||
void scheduleQueueChanged();
|
||||
|
||||
/**
|
||||
* Emitted whenever the list of configured folders changes.
|
||||
*/
|
||||
void folderListChanged(const Folder::Map &);
|
||||
|
||||
public slots:
|
||||
void slotRemoveFolder( Folder* );
|
||||
void slotFolderSyncPaused(Folder *, bool paused);
|
||||
void slotFolderCanSyncChanged();
|
||||
|
||||
void slotFolderSyncStarted();
|
||||
void slotFolderSyncFinished( const SyncResult& );
|
||||
|
||||
/**
|
||||
* Terminates the current folder sync.
|
||||
*
|
||||
* It does not switch the folder to paused state.
|
||||
*/
|
||||
void terminateSyncProcess();
|
||||
|
||||
/* delete all folder objects */
|
||||
int unloadAndDeleteAllFolders();
|
||||
|
||||
// if enabled is set to false, no new folders will start to sync.
|
||||
// the current one will finish.
|
||||
void setSyncEnabled( bool );
|
||||
|
||||
void slotScheduleAllFolders();
|
||||
|
||||
void setDirtyProxy(bool value = true);
|
||||
void setDirtyNetworkLimits();
|
||||
|
||||
// slot to add a folder to the syncing queue
|
||||
void slotScheduleSync(Folder*);
|
||||
// slot to schedule an ETag job
|
||||
void slotScheduleETagJob ( const QString &alias, RequestEtagJob *job);
|
||||
void slotEtagJobDestroyed (QObject*);
|
||||
void slotRunOneEtagJob();
|
||||
|
||||
/**
|
||||
* Schedules folders of newly connected accounts, terminates and
|
||||
@@ -202,22 +190,10 @@ public slots:
|
||||
* Triggers a sync run once the lock on the given file is removed.
|
||||
*
|
||||
* Automatically detemines the folder that's responsible for the file.
|
||||
* See slotWatchedFileUnlocked().
|
||||
*/
|
||||
void slotSyncOnceFileUnlocks(const QString& path);
|
||||
|
||||
// slot to schedule an ETag job (from Folder only)
|
||||
void slotScheduleETagJob ( const QString &alias, RequestEtagJob *job);
|
||||
|
||||
private slots:
|
||||
void slotFolderSyncPaused(Folder *, bool paused);
|
||||
void slotFolderCanSyncChanged();
|
||||
void slotFolderSyncStarted();
|
||||
void slotFolderSyncFinished( const SyncResult& );
|
||||
|
||||
void slotRunOneEtagJob();
|
||||
void slotEtagJobDestroyed (QObject*);
|
||||
|
||||
// slot to take the next folder from queue and start syncing.
|
||||
void slotStartScheduledFolderSync();
|
||||
void slotEtagPollTimerTimeout();
|
||||
@@ -231,29 +207,12 @@ private slots:
|
||||
void slotServerVersionChanged(Account* account);
|
||||
|
||||
/**
|
||||
* A file whose locks were being monitored has become unlocked.
|
||||
*
|
||||
* This schedules the folder for synchronization that contains
|
||||
* Schedules the folder for synchronization that contains
|
||||
* the file with the given path.
|
||||
*/
|
||||
void slotWatchedFileUnlocked(const QString& path);
|
||||
|
||||
/**
|
||||
* Schedules folders whose time to sync has come.
|
||||
*
|
||||
* Either because a long time has passed since the last sync or
|
||||
* because of previous failures.
|
||||
*/
|
||||
void slotScheduleFolderByTime();
|
||||
void slotScheduleFolderOwningFile(const QString& path);
|
||||
|
||||
private:
|
||||
/**
|
||||
* Terminates the current folder sync.
|
||||
*
|
||||
* It does not switch the folder to paused state.
|
||||
*/
|
||||
void terminateSyncProcess();
|
||||
|
||||
/** Adds a new folder, does not add it to the account settings and
|
||||
* does not set an account on the new folder.
|
||||
*/
|
||||
@@ -263,7 +222,7 @@ private:
|
||||
void unloadFolder( Folder * );
|
||||
|
||||
/** Will start a sync after a bit of delay. */
|
||||
void startScheduledSyncSoon();
|
||||
void startScheduledSyncSoon(qint64 msMinimumDelay = 0);
|
||||
|
||||
// finds all folder configuration files
|
||||
// and create the folders
|
||||
@@ -279,29 +238,19 @@ private:
|
||||
Folder *_currentSyncFolder;
|
||||
QPointer<Folder> _lastSyncFolder;
|
||||
bool _syncEnabled;
|
||||
QTimer _etagPollTimer;
|
||||
QPointer<RequestEtagJob> _currentEtagJob; // alias of Folder running the current RequestEtagJob
|
||||
|
||||
/// Watching for file changes in folders
|
||||
QMap<QString, FolderWatcher*> _folderWatchers;
|
||||
|
||||
/// Starts regular etag query jobs
|
||||
QTimer _etagPollTimer;
|
||||
/// The currently running etag query
|
||||
QPointer<RequestEtagJob> _currentEtagJob;
|
||||
|
||||
/// Watches files that couldn't be synced due to locks
|
||||
QScopedPointer<LockWatcher> _lockWatcher;
|
||||
|
||||
/// Occasionally schedules folders
|
||||
QTimer _timeScheduler;
|
||||
|
||||
/// Scheduled folders that should be synced as soon as possible
|
||||
QQueue<Folder*> _scheduledFolders;
|
||||
|
||||
/// Picks the next scheduled folder and starts the sync
|
||||
QTimer _startScheduledSyncTimer;
|
||||
|
||||
QScopedPointer<SocketApi> _socketApi;
|
||||
|
||||
/** The aliases of folders that shall be synced. */
|
||||
QQueue<Folder*> _scheduleQueue;
|
||||
|
||||
/** When the timer expires one of the scheduled syncs will be started. */
|
||||
QTimer _startScheduledSyncTimer;
|
||||
|
||||
bool _appRestartRequired;
|
||||
|
||||
static FolderMan *_instance;
|
||||
|
||||
@@ -785,7 +785,7 @@ void FolderStatusModel::slotApplySelectiveSync()
|
||||
foreach(const auto &it, changes) {
|
||||
folder->journalDb()->avoidReadFromDbOnNextSync(it);
|
||||
}
|
||||
FolderMan::instance()->scheduleFolder(folder);
|
||||
FolderMan::instance()->slotScheduleSync(folder);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1046,77 +1046,6 @@ void FolderStatusModel::resetFolders()
|
||||
setAccountState(_accountState);
|
||||
}
|
||||
|
||||
void FolderStatusModel::slotSyncAllPendingBigFolders()
|
||||
{
|
||||
for (int i = 0; i < _folders.count(); ++i) {
|
||||
if (!_folders[i]._fetched) {
|
||||
_folders[i]._folder->journalDb()->setSelectiveSyncList(SyncJournalDb::SelectiveSyncUndecidedList, QStringList());
|
||||
continue;
|
||||
}
|
||||
auto folder = _folders.at(i)._folder;
|
||||
|
||||
bool ok;
|
||||
auto undecidedList = folder->journalDb()->getSelectiveSyncList(SyncJournalDb::SelectiveSyncUndecidedList, &ok);
|
||||
if( !ok ) {
|
||||
qDebug() << Q_FUNC_INFO << "Could not read selective sync list from db.";
|
||||
return;
|
||||
}
|
||||
|
||||
// If this folder had no undecided entries, skip it.
|
||||
if (undecidedList.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Remove all undecided folders from the blacklist
|
||||
auto blackList = folder->journalDb()->getSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, &ok);
|
||||
if( !ok ) {
|
||||
qDebug() << Q_FUNC_INFO << "Could not read selective sync list from db.";
|
||||
return;
|
||||
}
|
||||
foreach (const auto& undecidedFolder, undecidedList) {
|
||||
blackList.removeAll(undecidedFolder);
|
||||
}
|
||||
folder->journalDb()->setSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, blackList);
|
||||
|
||||
// Add all undecided folders to the white list
|
||||
auto whiteList = folder->journalDb()->getSelectiveSyncList(SyncJournalDb::SelectiveSyncWhiteList, &ok);
|
||||
if( !ok ) {
|
||||
qDebug() << Q_FUNC_INFO << "Could not read selective sync list from db.";
|
||||
return;
|
||||
}
|
||||
whiteList += undecidedList;
|
||||
folder->journalDb()->setSelectiveSyncList(SyncJournalDb::SelectiveSyncWhiteList, whiteList);
|
||||
|
||||
// Clear the undecided list
|
||||
folder->journalDb()->setSelectiveSyncList(SyncJournalDb::SelectiveSyncUndecidedList, QStringList());
|
||||
|
||||
// Trigger a sync
|
||||
if (folder->isBusy()) {
|
||||
folder->slotTerminateSync();
|
||||
}
|
||||
// The part that changed should not be read from the DB on next sync because there might be new folders
|
||||
// (the ones that are no longer in the blacklist)
|
||||
foreach (const auto &it, undecidedList) {
|
||||
folder->journalDb()->avoidReadFromDbOnNextSync(it);
|
||||
}
|
||||
FolderMan::instance()->scheduleFolder(folder);
|
||||
}
|
||||
|
||||
resetFolders();
|
||||
}
|
||||
|
||||
void FolderStatusModel::slotSyncNoPendingBigFolders()
|
||||
{
|
||||
for (int i = 0; i < _folders.count(); ++i) {
|
||||
auto folder = _folders.at(i)._folder;
|
||||
|
||||
// clear the undecided list
|
||||
folder->journalDb()->setSelectiveSyncList(SyncJournalDb::SelectiveSyncUndecidedList, QStringList());
|
||||
}
|
||||
|
||||
resetFolders();
|
||||
}
|
||||
|
||||
void FolderStatusModel::slotNewBigFolder()
|
||||
{
|
||||
auto f = qobject_cast<Folder *>(sender());
|
||||
|
||||
@@ -107,8 +107,6 @@ public slots:
|
||||
void slotUpdateFolderState(Folder *);
|
||||
void slotApplySelectiveSync();
|
||||
void resetFolders();
|
||||
void slotSyncAllPendingBigFolders();
|
||||
void slotSyncNoPendingBigFolders();
|
||||
void slotSetProgress(const ProgressInfo &progress);
|
||||
|
||||
private slots:
|
||||
|
||||
@@ -126,7 +126,7 @@ void IgnoreListEditor::slotUpdateLocalIgnoreList()
|
||||
// ignored (because the remote etag did not change) (issue #3172)
|
||||
foreach (Folder* folder, folderMan->map()) {
|
||||
folder->journalDb()->forceRemoteDiscoveryNextSync();
|
||||
folderMan->scheduleFolder(folder);
|
||||
folderMan->slotScheduleSync(folder);
|
||||
}
|
||||
|
||||
ExcludedFiles::instance().reloadExcludes();
|
||||
|
||||
@@ -15,7 +15,6 @@
|
||||
#include "filesystem.h"
|
||||
|
||||
#include <QTimer>
|
||||
#include <QDebug>
|
||||
|
||||
using namespace OCC;
|
||||
|
||||
@@ -31,7 +30,6 @@ LockWatcher::LockWatcher(QObject* parent)
|
||||
|
||||
void LockWatcher::addFile(const QString& path)
|
||||
{
|
||||
qDebug() << "Watching for lock of" << path << "being released";
|
||||
_watchedPaths.insert(path);
|
||||
}
|
||||
|
||||
@@ -41,7 +39,6 @@ void LockWatcher::checkFiles()
|
||||
|
||||
foreach (const QString& path, _watchedPaths) {
|
||||
if (!FileSystem::isFileLocked(path)) {
|
||||
qDebug() << "Lock of" << path << "was released";
|
||||
emit fileUnlocked(path);
|
||||
unlocked.insert(path);
|
||||
}
|
||||
|
||||
@@ -66,7 +66,7 @@ void OcsJob::start()
|
||||
req.setRawHeader("Ocs-APIREQUEST", "true");
|
||||
req.setRawHeader("Content-Type", "application/x-www-form-urlencoded");
|
||||
|
||||
QUrl url = Utility::concatUrlPath(account()->url(), path());
|
||||
QUrl url = Account::concatUrlPath(account()->url(), path());
|
||||
QBuffer *buffer = new QBuffer;
|
||||
|
||||
if (_verb == "GET") {
|
||||
@@ -107,7 +107,7 @@ bool OcsJob::finished()
|
||||
if (!success) {
|
||||
qDebug() << "Could not parse reply to"
|
||||
<< _verb
|
||||
<< Utility::concatUrlPath(account()->url(), path())
|
||||
<< Account::concatUrlPath(account()->url(), path())
|
||||
<< _params
|
||||
<< ":" << replyData;
|
||||
}
|
||||
@@ -117,7 +117,7 @@ bool OcsJob::finished()
|
||||
if (!_passStatusCodes.contains(statusCode)) {
|
||||
qDebug() << "Reply to"
|
||||
<< _verb
|
||||
<< Utility::concatUrlPath(account()->url(), path())
|
||||
<< Account::concatUrlPath(account()->url(), path())
|
||||
<< _params
|
||||
<< "has unexpected status code:" << statusCode << replyData;
|
||||
emit ocsError(statusCode, message);
|
||||
|
||||
+85
-165
@@ -56,7 +56,7 @@ ownCloudGui::ownCloudGui(Application *parent) :
|
||||
_settingsDialog(new SettingsDialog(this)),
|
||||
#endif
|
||||
_logBrowser(0),
|
||||
_contextMenuVisibleOsx(false),
|
||||
_contextMenuVisible(false),
|
||||
_recentActionsMenu(0),
|
||||
_qdbusmenuWorkaround(false),
|
||||
_folderOpenActionMapper(new QSignalMapper(this)),
|
||||
@@ -67,7 +67,7 @@ ownCloudGui::ownCloudGui(Application *parent) :
|
||||
_tray->setParent(this);
|
||||
|
||||
// for the beginning, set the offline icon until the account was verified
|
||||
_tray->setIcon( Theme::instance()->folderOfflineIcon(/*systray?*/ true, /*currently visible?*/ false));
|
||||
_tray->setIcon( Theme::instance()->folderOfflineIcon(true));
|
||||
|
||||
connect(_tray.data(), SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
|
||||
SLOT(slotTrayClicked(QSystemTrayIcon::ActivationReason)));
|
||||
@@ -93,9 +93,9 @@ ownCloudGui::ownCloudGui(Application *parent) :
|
||||
this,SLOT(slotSyncStateChange(Folder*)));
|
||||
|
||||
connect( AccountManager::instance(), SIGNAL(accountAdded(AccountState*)),
|
||||
SLOT(updateContextMenuNeeded()));
|
||||
SLOT(setupContextMenuIfVisible()));
|
||||
connect( AccountManager::instance(), SIGNAL(accountRemoved(AccountState*)),
|
||||
SLOT(updateContextMenuNeeded()));
|
||||
SLOT(setupContextMenuIfVisible()));
|
||||
|
||||
connect( Logger::instance(), SIGNAL(guiLog(QString,QString)),
|
||||
SLOT(slotShowTrayMessage(QString,QString)));
|
||||
@@ -194,7 +194,7 @@ void ownCloudGui::slotTrayClicked( QSystemTrayIcon::ActivationReason reason )
|
||||
void ownCloudGui::slotSyncStateChange( Folder* folder )
|
||||
{
|
||||
slotComputeOverallSyncStatus();
|
||||
updateContextMenuNeeded();
|
||||
setupContextMenuIfVisible();
|
||||
|
||||
if( !folder ) {
|
||||
return; // Valid, just a general GUI redraw was needed.
|
||||
@@ -216,7 +216,7 @@ void ownCloudGui::slotSyncStateChange( Folder* folder )
|
||||
void ownCloudGui::slotFoldersChanged()
|
||||
{
|
||||
slotComputeOverallSyncStatus();
|
||||
updateContextMenuNeeded();
|
||||
setupContextMenuIfVisible();
|
||||
}
|
||||
|
||||
void ownCloudGui::slotOpenPath(const QString &path)
|
||||
@@ -226,7 +226,7 @@ void ownCloudGui::slotOpenPath(const QString &path)
|
||||
|
||||
void ownCloudGui::slotAccountStateChanged()
|
||||
{
|
||||
updateContextMenuNeeded();
|
||||
setupContextMenuIfVisible();
|
||||
slotComputeOverallSyncStatus();
|
||||
}
|
||||
|
||||
@@ -262,7 +262,7 @@ void ownCloudGui::slotComputeOverallSyncStatus()
|
||||
}
|
||||
|
||||
if (!problemAccounts.empty()) {
|
||||
_tray->setIcon(Theme::instance()->folderOfflineIcon(true, contextMenuVisible()));
|
||||
_tray->setIcon(Theme::instance()->folderOfflineIcon(true));
|
||||
#ifdef Q_OS_WIN
|
||||
// Windows has a 128-char tray tooltip length limit.
|
||||
QStringList accountNames;
|
||||
@@ -289,11 +289,11 @@ void ownCloudGui::slotComputeOverallSyncStatus()
|
||||
}
|
||||
|
||||
if (allSignedOut) {
|
||||
_tray->setIcon(Theme::instance()->folderOfflineIcon(true, contextMenuVisible()));
|
||||
_tray->setIcon(Theme::instance()->folderOfflineIcon(true));
|
||||
_tray->setToolTip(tr("Please sign in"));
|
||||
return;
|
||||
} else if (allPaused) {
|
||||
_tray->setIcon(Theme::instance()->syncStateIcon(SyncResult::Paused, true, contextMenuVisible()));
|
||||
_tray->setIcon(Theme::instance()->syncStateIcon(SyncResult::Paused, true));
|
||||
_tray->setToolTip(tr("Account synchronization is disabled"));
|
||||
return;
|
||||
}
|
||||
@@ -323,12 +323,12 @@ void ownCloudGui::slotComputeOverallSyncStatus()
|
||||
trayMessage = tr("No sync folders configured.");
|
||||
}
|
||||
|
||||
QIcon statusIcon = Theme::instance()->syncStateIcon( overallResult.status(), true, contextMenuVisible());
|
||||
QIcon statusIcon = Theme::instance()->syncStateIcon( overallResult.status(), true);
|
||||
_tray->setIcon( statusIcon );
|
||||
_tray->setToolTip(trayMessage);
|
||||
} else {
|
||||
// undefined because there are no folders.
|
||||
QIcon icon = Theme::instance()->syncStateIcon(SyncResult::Problem, true, contextMenuVisible());
|
||||
QIcon icon = Theme::instance()->syncStateIcon(SyncResult::Problem, true);
|
||||
_tray->setIcon( icon );
|
||||
_tray->setToolTip(tr("There are no sync folders configured."));
|
||||
}
|
||||
@@ -400,160 +400,41 @@ void ownCloudGui::addAccountContextMenu(AccountStatePtr accountState, QMenu *men
|
||||
|
||||
}
|
||||
|
||||
void ownCloudGui::slotContextMenuAboutToShow()
|
||||
{
|
||||
// For some reason on OS X _contextMenu->isVisible returns always false
|
||||
qDebug() << "";
|
||||
_contextMenuVisibleOsx = true;
|
||||
|
||||
// Update icon in sys tray, as it might change depending on the context menu state
|
||||
slotComputeOverallSyncStatus();
|
||||
}
|
||||
|
||||
void ownCloudGui::slotContextMenuAboutToHide()
|
||||
{
|
||||
// For some reason on OS X _contextMenu->isVisible returns always false
|
||||
qDebug() << "";
|
||||
_contextMenuVisibleOsx = false;
|
||||
|
||||
// Update icon in sys tray, as it might change depending on the context menu state
|
||||
slotComputeOverallSyncStatus();
|
||||
}
|
||||
|
||||
bool ownCloudGui::contextMenuVisible() const
|
||||
{
|
||||
#ifdef Q_OS_MAC
|
||||
return _contextMenuVisibleOsx;
|
||||
#else
|
||||
return _contextMenu->isVisible();
|
||||
#endif
|
||||
}
|
||||
|
||||
static bool minimalTrayMenu()
|
||||
{
|
||||
static QByteArray var = qgetenv("OWNCLOUD_MINIMAL_TRAY_MENU");
|
||||
return !var.isEmpty();
|
||||
}
|
||||
|
||||
static bool updateWhileVisible()
|
||||
|
||||
void ownCloudGui::slotContextMenuAboutToShow()
|
||||
{
|
||||
static QByteArray var = qgetenv("OWNCLOUD_TRAY_UPDATE_WHILE_VISIBLE");
|
||||
if (var == "1") {
|
||||
return true;
|
||||
} else if (var == "0") {
|
||||
return false;
|
||||
} else {
|
||||
// triggers bug on OS X: https://bugreports.qt.io/browse/QTBUG-54845
|
||||
// or flickering on Xubuntu
|
||||
return false;
|
||||
}
|
||||
// For some reason on OS X _contextMenu->isVisible returns always false
|
||||
qDebug() << "";
|
||||
_contextMenuVisible = true;
|
||||
}
|
||||
|
||||
static QByteArray forceQDBusTrayWorkaround()
|
||||
void ownCloudGui::slotContextMenuAboutToHide()
|
||||
{
|
||||
static QByteArray var = qgetenv("OWNCLOUD_FORCE_QDBUS_TRAY_WORKAROUND");
|
||||
return var;
|
||||
// For some reason on OS X _contextMenu->isVisible returns always false
|
||||
qDebug() << "";
|
||||
_contextMenuVisible = false;
|
||||
}
|
||||
|
||||
void ownCloudGui::setupContextMenu()
|
||||
{
|
||||
if (_contextMenu) {
|
||||
return;
|
||||
}
|
||||
|
||||
_contextMenu.reset(new QMenu());
|
||||
_contextMenu->setTitle(Theme::instance()->appNameGUI() );
|
||||
|
||||
_recentActionsMenu = new QMenu(tr("Recent Changes"), _contextMenu.data());
|
||||
|
||||
// this must be called only once after creating the context menu, or
|
||||
// it will trigger a bug in Ubuntu's SNI bridge patch (11.10, 12.04).
|
||||
_tray->setContextMenu(_contextMenu.data());
|
||||
|
||||
// The tray menu is surprisingly problematic. Being able to switch to
|
||||
// a minimal version of it is a useful workaround and testing tool.
|
||||
if (minimalTrayMenu()) {
|
||||
_contextMenu->addAction(_actionQuit);
|
||||
if (!_contextMenu) {
|
||||
_contextMenu.reset(new QMenu());
|
||||
_recentActionsMenu = new QMenu(tr("Recent Changes"), _contextMenu.data());
|
||||
_tray->setContextMenu(_contextMenu.data());
|
||||
_contextMenu->addAction(_actionQuit);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// Enables workarounds for bugs introduced in Qt 5.5.0
|
||||
// In particular QTBUG-47863 #3672 (tray menu fails to update and
|
||||
// becomes unresponsive) and QTBUG-48068 #3722 (click signal is
|
||||
// emitted several times)
|
||||
// The Qt version check intentionally uses 5.0.0 (where platformMenu()
|
||||
// was introduced) instead of 5.5.0 to avoid issues where the Qt
|
||||
// version used to build is different from the one used at runtime.
|
||||
// If we build with 5.6.1 or newer, we can skip this because the
|
||||
// bugs should be fixed there.
|
||||
#ifdef Q_OS_LINUX
|
||||
#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) && (QT_VERSION < QT_VERSION_CHECK(5, 6, 0))
|
||||
if (qVersion() == QByteArray("5.5.0")) {
|
||||
QObject* platformMenu = reinterpret_cast<QObject*>(_tray->contextMenu()->platformMenu());
|
||||
if (platformMenu
|
||||
&& platformMenu->metaObject()->className() == QLatin1String("QDBusPlatformMenu")) {
|
||||
_qdbusmenuWorkaround = true;
|
||||
qDebug() << "Enabled QDBusPlatformMenu workaround";
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
if (forceQDBusTrayWorkaround() == "1") {
|
||||
_qdbusmenuWorkaround = true;
|
||||
} else if (forceQDBusTrayWorkaround() == "0") {
|
||||
_qdbusmenuWorkaround = false;
|
||||
}
|
||||
|
||||
// When the qdbusmenuWorkaround is necessary, we can't do on-demand updates
|
||||
// because the workaround is to hide and show the tray icon.
|
||||
if (_qdbusmenuWorkaround) {
|
||||
connect(&_workaroundBatchTrayUpdate, SIGNAL(timeout()), SLOT(updateContextMenu()));
|
||||
_workaroundBatchTrayUpdate.setInterval(30 * 1000);
|
||||
_workaroundBatchTrayUpdate.setSingleShot(true);
|
||||
} else {
|
||||
// Update the context menu whenever we're about to show it
|
||||
// to the user.
|
||||
#ifdef Q_OS_MAC
|
||||
// https://bugreports.qt.io/browse/QTBUG-54633
|
||||
connect(_contextMenu.data(), SIGNAL(aboutToShow()), SLOT(slotContextMenuAboutToShow()));
|
||||
connect(_contextMenu.data(), SIGNAL(aboutToHide()), SLOT(slotContextMenuAboutToHide()));
|
||||
#else
|
||||
connect(_contextMenu.data(), SIGNAL(aboutToShow()), SLOT(updateContextMenu()));
|
||||
#endif
|
||||
}
|
||||
|
||||
// Populate the context menu now.
|
||||
updateContextMenu();
|
||||
}
|
||||
|
||||
void ownCloudGui::updateContextMenu()
|
||||
{
|
||||
if (minimalTrayMenu()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (_qdbusmenuWorkaround) {
|
||||
// To make tray menu updates work with these bugs (see setupContextMenu)
|
||||
// we need to hide and show the tray icon. We don't want to do that
|
||||
// while it's visible!
|
||||
if (contextMenuVisible()) {
|
||||
if (!_workaroundBatchTrayUpdate.isActive()) {
|
||||
_workaroundBatchTrayUpdate.start();
|
||||
}
|
||||
return;
|
||||
}
|
||||
_tray->hide();
|
||||
}
|
||||
|
||||
_contextMenu->clear();
|
||||
slotRebuildRecentMenus();
|
||||
|
||||
// We must call deleteLater because we might be called from the press in one of the actions.
|
||||
foreach (auto menu, _accountMenus) { menu->deleteLater(); }
|
||||
_accountMenus.clear();
|
||||
|
||||
|
||||
auto accountList = AccountManager::instance()->accounts();
|
||||
|
||||
bool isConfigured = (!accountList.isEmpty());
|
||||
@@ -580,6 +461,54 @@ void ownCloudGui::updateContextMenu()
|
||||
}
|
||||
}
|
||||
|
||||
if ( _contextMenu ) {
|
||||
if (_qdbusmenuWorkaround) {
|
||||
_tray->hide();
|
||||
}
|
||||
_contextMenu->clear();
|
||||
} else {
|
||||
_contextMenu.reset(new QMenu());
|
||||
|
||||
// Update the context menu whenever we're about to show it
|
||||
// to the user.
|
||||
#ifdef Q_OS_MAC
|
||||
// https://bugreports.qt.io/browse/QTBUG-54633
|
||||
#else
|
||||
connect(_contextMenu.data(), SIGNAL(aboutToShow()), SLOT(setupContextMenu()));
|
||||
#endif
|
||||
connect(_contextMenu.data(), SIGNAL(aboutToShow()), SLOT(slotContextMenuAboutToShow()));
|
||||
connect(_contextMenu.data(), SIGNAL(aboutToHide()), SLOT(slotContextMenuAboutToHide()));
|
||||
|
||||
|
||||
_recentActionsMenu = new QMenu(tr("Recent Changes"), _contextMenu.data());
|
||||
// this must be called only once after creating the context menu, or
|
||||
// it will trigger a bug in Ubuntu's SNI bridge patch (11.10, 12.04).
|
||||
_tray->setContextMenu(_contextMenu.data());
|
||||
|
||||
// Enables workarounds for bugs introduced in Qt 5.5.0
|
||||
// In particular QTBUG-47863 #3672 (tray menu fails to update and
|
||||
// becomes unresponsive) and QTBUG-48068 #3722 (click signal is
|
||||
// emitted several times)
|
||||
// The Qt version check intentionally uses 5.0.0 (where platformMenu()
|
||||
// was introduced) instead of 5.5.0 to avoid issues where the Qt
|
||||
// version used to build is different from the one used at runtime.
|
||||
#ifdef Q_OS_LINUX
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
|
||||
QObject* platformMenu = reinterpret_cast<QObject*>(_tray->contextMenu()->platformMenu());
|
||||
if (platformMenu
|
||||
&& platformMenu->metaObject()->className() == QLatin1String("QDBusPlatformMenu")) {
|
||||
_qdbusmenuWorkaround = true;
|
||||
qDebug() << "Enabled QDBusPlatformMenu workaround";
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
_contextMenu->setTitle(Theme::instance()->appNameGUI() );
|
||||
slotRebuildRecentMenus();
|
||||
|
||||
// We must call deleteLater because we might be called from the press in one of the actions.
|
||||
foreach (auto menu, _accountMenus) { menu->deleteLater(); }
|
||||
_accountMenus.clear();
|
||||
if (accountList.count() > 1) {
|
||||
foreach (AccountStatePtr account, accountList) {
|
||||
QMenu* accountMenu = new QMenu(account->account()->displayName(), _contextMenu.data());
|
||||
@@ -652,30 +581,17 @@ void ownCloudGui::updateContextMenu()
|
||||
}
|
||||
}
|
||||
|
||||
void ownCloudGui::updateContextMenuNeeded()
|
||||
void ownCloudGui::setupContextMenuIfVisible()
|
||||
{
|
||||
// For the workaround case updating while visible is impossible. Instead
|
||||
// occasionally update the menu when it's invisible.
|
||||
if (_qdbusmenuWorkaround) {
|
||||
if (!_workaroundBatchTrayUpdate.isActive()) {
|
||||
_workaroundBatchTrayUpdate.start();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef Q_OS_MAC
|
||||
// https://bugreports.qt.io/browse/QTBUG-54845
|
||||
// We cannot update on demand or while visible -> update when invisible.
|
||||
if (!contextMenuVisible()) {
|
||||
updateContextMenu();
|
||||
if (!_contextMenuVisible) {
|
||||
setupContextMenu();
|
||||
}
|
||||
#else
|
||||
if (updateWhileVisible() && contextMenuVisible())
|
||||
updateContextMenu();
|
||||
if (_contextMenuVisible)
|
||||
setupContextMenu();
|
||||
#endif
|
||||
|
||||
// If no update was done here, we might update it on-demand due to
|
||||
// the aboutToShow() signal.
|
||||
}
|
||||
|
||||
void ownCloudGui::slotShowTrayMessage(const QString &title, const QString &msg)
|
||||
@@ -838,9 +754,13 @@ void ownCloudGui::slotUpdateProgress(const QString &folder, const ProgressInfo&
|
||||
|
||||
// Update the "Recent" menu if the context menu is being shown,
|
||||
// otherwise it'll be updated later, when the context menu is opened.
|
||||
if (updateWhileVisible() && contextMenuVisible()) {
|
||||
#ifdef Q_OS_MAC
|
||||
// https://bugreports.qt.io/browse/QTBUG-54845
|
||||
#else
|
||||
if (_contextMenuVisible) {
|
||||
slotRebuildRecentMenus();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
if (progress.isUpdatingEstimates()
|
||||
|
||||
+2
-11
@@ -24,7 +24,6 @@
|
||||
#include <QMenu>
|
||||
#include <QSignalMapper>
|
||||
#include <QSize>
|
||||
#include <QTimer>
|
||||
|
||||
namespace OCC {
|
||||
|
||||
@@ -53,16 +52,12 @@ public:
|
||||
static QSize settingsDialogSize() { return QSize(800, 500); }
|
||||
void setupOverlayIcons();
|
||||
|
||||
/// Whether the tray menu is visible
|
||||
bool contextMenuVisible() const;
|
||||
|
||||
signals:
|
||||
void setupProxy();
|
||||
|
||||
public slots:
|
||||
void setupContextMenu();
|
||||
void updateContextMenu();
|
||||
void updateContextMenuNeeded();
|
||||
void setupContextMenuIfVisible();
|
||||
void slotContextMenuAboutToShow();
|
||||
void slotContextMenuAboutToHide();
|
||||
void slotComputeOverallSyncStatus();
|
||||
@@ -109,15 +104,11 @@ private:
|
||||
QPointer<LogBrowser>_logBrowser;
|
||||
// tray's menu
|
||||
QScopedPointer<QMenu> _contextMenu;
|
||||
|
||||
// Manually tracking whether the context menu is visible, but only works
|
||||
// on OSX because aboutToHide is not reliable everywhere.
|
||||
bool _contextMenuVisibleOsx;
|
||||
bool _contextMenuVisible;
|
||||
|
||||
QMenu *_recentActionsMenu;
|
||||
QVector<QMenu*> _accountMenus;
|
||||
bool _qdbusmenuWorkaround;
|
||||
QTimer _workaroundBatchTrayUpdate;
|
||||
QMap<QString, QPointer<ShareDialog> > _shareDialogs;
|
||||
|
||||
QAction *_actionLogin;
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
#include "networkjobs.h"
|
||||
#include "sslerrordialog.h"
|
||||
#include "accountmanager.h"
|
||||
#include "clientproxy.h"
|
||||
|
||||
#include "creds/credentialsfactory.h"
|
||||
#include "creds/abstractcredentials.h"
|
||||
@@ -129,38 +128,7 @@ void OwncloudSetupWizard::slotDetermineAuthType(const QString &urlString)
|
||||
account->setUrl(url);
|
||||
// Reset the proxy which might had been determined previously in ConnectionValidator::checkServerAndAuth()
|
||||
// when there was a previous account.
|
||||
account->networkAccessManager()->setProxy(QNetworkProxy(QNetworkProxy::NoProxy));
|
||||
|
||||
// Lookup system proxy in a thread https://github.com/owncloud/client/issues/2993
|
||||
if (ClientProxy::isUsingSystemDefault()) {
|
||||
qDebug() << "Trying to look up system proxy";
|
||||
ClientProxy::lookupSystemProxyAsync(account->url(),
|
||||
this, SLOT(slotSystemProxyLookupDone(QNetworkProxy)));
|
||||
} else {
|
||||
// We want to reset the QNAM proxy so that the global proxy settings are used (via ClientProxy settings)
|
||||
account->networkAccessManager()->setProxy(QNetworkProxy(QNetworkProxy::DefaultProxy));
|
||||
// use a queued invocation so we're as asynchronous as with the other code path
|
||||
QMetaObject::invokeMethod(this, "slotContinueDetermineAuth", Qt::QueuedConnection);
|
||||
}
|
||||
}
|
||||
|
||||
void OwncloudSetupWizard::slotSystemProxyLookupDone(const QNetworkProxy &proxy)
|
||||
{
|
||||
if (proxy.type() != QNetworkProxy::NoProxy) {
|
||||
qDebug() << "Setting QNAM proxy to be system proxy" << printQNetworkProxy(proxy);
|
||||
} else {
|
||||
qDebug() << "No system proxy set by OS";
|
||||
}
|
||||
AccountPtr account = _ocWizard->account();
|
||||
account->networkAccessManager()->setProxy(proxy);
|
||||
|
||||
slotContinueDetermineAuth();
|
||||
}
|
||||
|
||||
void OwncloudSetupWizard::slotContinueDetermineAuth()
|
||||
{
|
||||
AccountPtr account = _ocWizard->account();
|
||||
|
||||
account->networkAccessManager()->setProxy(QNetworkProxy(QNetworkProxy::DefaultProxy));
|
||||
// Set fake credentials before we check what credential it actually is.
|
||||
account->setCredentials(CredentialsFactory::create("dummy"));
|
||||
CheckServerJob *job = new CheckServerJob(_ocWizard->account(), this);
|
||||
@@ -168,7 +136,7 @@ void OwncloudSetupWizard::slotContinueDetermineAuth()
|
||||
connect(job, SIGNAL(instanceFound(QUrl,QVariantMap)), SLOT(slotOwnCloudFoundAuth(QUrl,QVariantMap)));
|
||||
connect(job, SIGNAL(instanceNotFound(QNetworkReply*)), SLOT(slotNoOwnCloudFoundAuth(QNetworkReply*)));
|
||||
connect(job, SIGNAL(timeout(const QUrl&)), SLOT(slotNoOwnCloudFoundAuthTimeout(const QUrl&)));
|
||||
job->setTimeout((account->url().scheme() == "https") ? 30*1000 : 10*1000);
|
||||
job->setTimeout(10*1000);
|
||||
job->start();
|
||||
}
|
||||
|
||||
|
||||
@@ -66,8 +66,6 @@ signals:
|
||||
|
||||
private slots:
|
||||
void slotDetermineAuthType(const QString&);
|
||||
void slotSystemProxyLookupDone(const QNetworkProxy &proxy);
|
||||
void slotContinueDetermineAuth();
|
||||
void slotOwnCloudFoundAuth(const QUrl&, const QVariantMap&);
|
||||
void slotNoOwnCloudFoundAuth(QNetworkReply *reply);
|
||||
void slotNoOwnCloudFoundAuthTimeout(const QUrl&url);
|
||||
|
||||
@@ -460,7 +460,7 @@ void SelectiveSyncDialog::accept()
|
||||
_folder->journalDb()->avoidReadFromDbOnNextSync(it);
|
||||
}
|
||||
|
||||
folderMan->scheduleFolder(_folder);
|
||||
folderMan->slotScheduleSync(_folder);
|
||||
}
|
||||
QDialog::accept();
|
||||
}
|
||||
|
||||
@@ -46,7 +46,6 @@ ShareDialog::ShareDialog(QPointer<AccountState> accountState,
|
||||
_userGroupWidget(NULL),
|
||||
_progressIndicator(NULL)
|
||||
{
|
||||
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
|
||||
setAttribute(Qt::WA_DeleteOnClose);
|
||||
setObjectName("SharingDialog"); // required as group for saveGeometry call
|
||||
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
#include <QClipboard>
|
||||
#include <QFileInfo>
|
||||
#include <QDesktopServices>
|
||||
#include <QMessageBox>
|
||||
|
||||
namespace OCC {
|
||||
|
||||
@@ -491,20 +490,13 @@ void ShareLinkWidget::slotPushButtonMailLinkPressed()
|
||||
{
|
||||
QString fileName = _sharePath.mid(_sharePath.lastIndexOf('/') + 1);
|
||||
|
||||
if (!QDesktopServices::openUrl(QUrl(QString(
|
||||
"mailto: "
|
||||
"?subject=I shared %1 with you"
|
||||
"&body=%2").arg(
|
||||
fileName,
|
||||
_shareUrl),
|
||||
QUrl::TolerantMode))) {
|
||||
QMessageBox::warning(
|
||||
this,
|
||||
tr("Could not open email client"),
|
||||
tr("There was an error when launching the email client to "
|
||||
"create a new message. Maybe no default email client is "
|
||||
"configured?"));
|
||||
}
|
||||
QDesktopServices::openUrl(QUrl(QString(
|
||||
"mailto: "
|
||||
"?subject=I shared %1 with you"
|
||||
"&body=%2").arg(
|
||||
fileName,
|
||||
_shareUrl),
|
||||
QUrl::TolerantMode));
|
||||
}
|
||||
|
||||
void ShareLinkWidget::slotCheckBoxEditingClicked()
|
||||
|
||||
@@ -344,12 +344,12 @@ QSharedPointer<LinkShare> ShareManager::parseLinkShare(const QVariantMap &data)
|
||||
url = QUrl(data.value("url").toString());
|
||||
} else if (_account->serverVersionInt() >= (8 << 16)) {
|
||||
// From ownCloud server version 8 on, a different share link scheme is used.
|
||||
url = QUrl(Utility::concatUrlPath(_account->url(), QString("index.php/s/%1").arg(data.value("token").toString())).toString());
|
||||
url = QUrl(Account::concatUrlPath(_account->url(), QString("index.php/s/%1").arg(data.value("token").toString())).toString());
|
||||
} else {
|
||||
QList<QPair<QString, QString>> queryArgs;
|
||||
queryArgs.append(qMakePair(QString("service"), QString("files")));
|
||||
queryArgs.append(qMakePair(QString("t"), data.value("token").toString()));
|
||||
url = QUrl(Utility::concatUrlPath(_account->url(), QLatin1String("public.php"), queryArgs).toString());
|
||||
url = QUrl(Account::concatUrlPath(_account->url(), QLatin1String("public.php"), queryArgs).toString());
|
||||
}
|
||||
|
||||
QDate expireDate;
|
||||
|
||||
@@ -267,12 +267,6 @@
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="QRadioButton" name="rSelectiveSync">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
|
||||
@@ -128,11 +128,6 @@ QNetworkReply *AbstractNetworkJob::davRequest(const QByteArray &verb, const QUrl
|
||||
return addTimer(_account->davRequest(verb, url, req, data));
|
||||
}
|
||||
|
||||
QNetworkReply *AbstractNetworkJob::multipartRequest(const QString &relPath, QNetworkRequest req, QHttpMultiPart *multiPart)
|
||||
{
|
||||
return addTimer(_account->multipartRequest(relPath, req, multiPart));
|
||||
}
|
||||
|
||||
QNetworkReply* AbstractNetworkJob::getRequest(const QString &relPath)
|
||||
{
|
||||
return addTimer(_account->getRequest(relPath));
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
#include "accountfwd.h"
|
||||
|
||||
class QUrl;
|
||||
class QHttpMultiPart;
|
||||
|
||||
namespace OCC {
|
||||
|
||||
@@ -79,7 +78,6 @@ protected:
|
||||
QNetworkReply* headRequest(const QString &relPath);
|
||||
QNetworkReply* headRequest(const QUrl &url);
|
||||
QNetworkReply* deleteRequest(const QUrl &url);
|
||||
QNetworkReply* multipartRequest(const QString &relPath, QNetworkRequest req, QHttpMultiPart *multiPart);
|
||||
|
||||
int maxRedirects() const { return 10; }
|
||||
virtual bool finished() = 0;
|
||||
|
||||
+80
-33
@@ -40,7 +40,6 @@ Account::Account(QObject *parent)
|
||||
, _capabilities(QVariantMap())
|
||||
, _davPath( Theme::instance()->webDavPath() )
|
||||
, _wasMigrated(false)
|
||||
, _bundleRequests(true)
|
||||
{
|
||||
qRegisterMetaType<AccountPtr>("AccountPtr");
|
||||
}
|
||||
@@ -77,13 +76,6 @@ AccountPtr Account::sharedFromThis()
|
||||
return _sharedThis.toStrongRef();
|
||||
}
|
||||
|
||||
QString Account::davFilesPath() const
|
||||
{
|
||||
//TODO DO NOT HARCODE PATH, GET IT FROM THE SERVER!!!!
|
||||
QString dfp("remote.php/dav/files/");
|
||||
dfp.append(_credentials->user());
|
||||
return dfp;
|
||||
}
|
||||
|
||||
QString Account::displayName() const
|
||||
{
|
||||
@@ -102,6 +94,30 @@ QString Account::id() const
|
||||
return _id;
|
||||
}
|
||||
|
||||
static bool isEqualExceptProtocol(const QUrl &url1, const QUrl &url2)
|
||||
{
|
||||
return (url1.host() != url2.host() ||
|
||||
url1.port() != url2.port() ||
|
||||
url1.path() != url2.path());
|
||||
}
|
||||
|
||||
bool Account::changed(AccountPtr other, bool ignoreUrlProtocol) const
|
||||
{
|
||||
if (!other) {
|
||||
return false;
|
||||
}
|
||||
bool changes = false;
|
||||
if (ignoreUrlProtocol) {
|
||||
changes = isEqualExceptProtocol(_url, other->_url);
|
||||
} else {
|
||||
changes = (_url == other->_url);
|
||||
}
|
||||
|
||||
changes |= _credentials->changed(other->credentials());
|
||||
|
||||
return changes;
|
||||
}
|
||||
|
||||
AbstractCredentials *Account::credentials() const
|
||||
{
|
||||
return _credentials.data();
|
||||
@@ -141,7 +157,12 @@ void Account::setCredentials(AbstractCredentials *cred)
|
||||
|
||||
QUrl Account::davUrl() const
|
||||
{
|
||||
return Utility::concatUrlPath(url(), davPath());
|
||||
return concatUrlPath(url(), davPath());
|
||||
}
|
||||
|
||||
QList<QNetworkCookie> Account::lastAuthCookies() const
|
||||
{
|
||||
return _am->cookieJar()->cookiesForUrl(_url);
|
||||
}
|
||||
|
||||
void Account::clearCookieJar()
|
||||
@@ -188,7 +209,7 @@ QNetworkAccessManager *Account::networkAccessManager()
|
||||
|
||||
QNetworkReply *Account::headRequest(const QString &relPath)
|
||||
{
|
||||
return headRequest(Utility::concatUrlPath(url(), relPath));
|
||||
return headRequest(concatUrlPath(url(), relPath));
|
||||
}
|
||||
|
||||
QNetworkReply *Account::headRequest(const QUrl &url)
|
||||
@@ -202,7 +223,7 @@ QNetworkReply *Account::headRequest(const QUrl &url)
|
||||
|
||||
QNetworkReply *Account::getRequest(const QString &relPath)
|
||||
{
|
||||
return getRequest(Utility::concatUrlPath(url(), relPath));
|
||||
return getRequest(concatUrlPath(url(), relPath));
|
||||
}
|
||||
|
||||
QNetworkReply *Account::getRequest(const QUrl &url)
|
||||
@@ -225,7 +246,7 @@ QNetworkReply *Account::deleteRequest( const QUrl &url)
|
||||
|
||||
QNetworkReply *Account::davRequest(const QByteArray &verb, const QString &relPath, QNetworkRequest req, QIODevice *data)
|
||||
{
|
||||
return davRequest(verb, Utility::concatUrlPath(davUrl(), relPath), req, data);
|
||||
return davRequest(verb, concatUrlPath(davUrl(), relPath), req, data);
|
||||
}
|
||||
|
||||
QNetworkReply *Account::davRequest(const QByteArray &verb, const QUrl &url, QNetworkRequest req, QIODevice *data)
|
||||
@@ -237,20 +258,6 @@ QNetworkReply *Account::davRequest(const QByteArray &verb, const QUrl &url, QNet
|
||||
return _am->sendCustomRequest(req, verb, data);
|
||||
}
|
||||
|
||||
QNetworkReply *Account::multipartRequest(const QString &relPath, QNetworkRequest req, QHttpMultiPart *multiPart)
|
||||
{
|
||||
return multipartRequest(Utility::concatUrlPath(url(), relPath), req, multiPart);
|
||||
}
|
||||
|
||||
QNetworkReply *Account::multipartRequest(const QUrl &url, QNetworkRequest req, QHttpMultiPart *multiPart)
|
||||
{
|
||||
req.setUrl(url);
|
||||
#if QT_VERSION > QT_VERSION_CHECK(4, 8, 4)
|
||||
req.setSslConfiguration(this->getOrCreateSslConfig());
|
||||
#endif
|
||||
return _am->post(req, multiPart);
|
||||
}
|
||||
|
||||
void Account::setCertificate(const QByteArray certficate, const QString privateKey)
|
||||
{
|
||||
_pemCertificate=certficate;
|
||||
@@ -333,6 +340,43 @@ void Account::setUrl(const QUrl &url)
|
||||
_url = url;
|
||||
}
|
||||
|
||||
QUrl Account::concatUrlPath(const QUrl &url, const QString &concatPath,
|
||||
const QList< QPair<QString, QString> > &queryItems)
|
||||
{
|
||||
QString path = url.path();
|
||||
if (! concatPath.isEmpty()) {
|
||||
// avoid '//'
|
||||
if (path.endsWith('/') && concatPath.startsWith('/')) {
|
||||
path.chop(1);
|
||||
} // avoid missing '/'
|
||||
else if (!path.endsWith('/') && !concatPath.startsWith('/')) {
|
||||
path += QLatin1Char('/');
|
||||
}
|
||||
path += concatPath; // put the complete path together
|
||||
}
|
||||
|
||||
QUrl tmpUrl = url;
|
||||
tmpUrl.setPath(path);
|
||||
if( queryItems.size() > 0 ) {
|
||||
tmpUrl.setQueryItems(queryItems);
|
||||
}
|
||||
return tmpUrl;
|
||||
}
|
||||
|
||||
QString Account::_configFileName;
|
||||
|
||||
std::unique_ptr<QSettings> Account::settingsWithGroup(const QString& group, QObject *parent)
|
||||
{
|
||||
if (_configFileName.isEmpty()) {
|
||||
// cache file name
|
||||
ConfigFile cfg;
|
||||
_configFileName = cfg.configFile();
|
||||
}
|
||||
std::unique_ptr<QSettings> settings(new QSettings(_configFileName, QSettings::IniFormat, parent));
|
||||
settings->beginGroup(group);
|
||||
return settings;
|
||||
}
|
||||
|
||||
QVariant Account::credentialSetting(const QString &key) const
|
||||
{
|
||||
if (_credentials) {
|
||||
@@ -431,6 +475,16 @@ void Account::handleInvalidCredentials()
|
||||
emit invalidCredentials();
|
||||
}
|
||||
|
||||
bool Account::wasMigrated()
|
||||
{
|
||||
return _wasMigrated;
|
||||
}
|
||||
|
||||
void Account::setMigrated(bool mig)
|
||||
{
|
||||
_wasMigrated = mig;
|
||||
}
|
||||
|
||||
const Capabilities &Account::capabilities() const
|
||||
{
|
||||
return _capabilities;
|
||||
@@ -489,13 +543,6 @@ void Account::setNonShib(bool nonShib)
|
||||
}
|
||||
}
|
||||
|
||||
void Account::setBundleRequestsIfCapable(bool bundleRequests){
|
||||
_bundleRequests = bundleRequests;
|
||||
}
|
||||
|
||||
bool Account::bundledRequestsEnabled()
|
||||
{
|
||||
return (_bundleRequests && _capabilities.bundledRequest()) ? true : false;
|
||||
}
|
||||
|
||||
} // namespace OCC
|
||||
|
||||
+30
-37
@@ -33,7 +33,6 @@ class QSettings;
|
||||
class QNetworkReply;
|
||||
class QUrl;
|
||||
class QNetworkAccessManager;
|
||||
class QHttpMultiPart;
|
||||
|
||||
namespace OCC {
|
||||
|
||||
@@ -57,9 +56,6 @@ public:
|
||||
/**
|
||||
* @brief The Account class represents an account on an ownCloud Server
|
||||
* @ingroup libsync
|
||||
*
|
||||
* The Account has a name and url. It also has information about credentials,
|
||||
* SSL errors and certificates.
|
||||
*/
|
||||
class OWNCLOUDSYNC_EXPORT Account : public QObject {
|
||||
Q_OBJECT
|
||||
@@ -70,23 +66,13 @@ public:
|
||||
* @returns the (themeable) dav path for the account.
|
||||
*/
|
||||
QString davPath() const;
|
||||
|
||||
/**
|
||||
* @brief The possibly themed files dav path for the account. It has
|
||||
* a trailing slash.
|
||||
* @returns the (themeable) files dav path for the account.
|
||||
*/
|
||||
QString davFilesPath() const;
|
||||
void setDavPath(const QString&s) { _davPath = s; }
|
||||
void setNonShib(bool nonShib);
|
||||
|
||||
/// Functions for bundle support
|
||||
void setBundleRequestsIfCapable(bool bundleRequests);
|
||||
bool bundledRequestsEnabled();
|
||||
|
||||
static AccountPtr create();
|
||||
~Account();
|
||||
|
||||
void setSharedThis(AccountPtr sharedThis);
|
||||
AccountPtr sharedFromThis();
|
||||
|
||||
/// The name of the account as shown in the toolbar
|
||||
@@ -95,6 +81,17 @@ public:
|
||||
/// The internal id of the account.
|
||||
QString id() const;
|
||||
|
||||
/**
|
||||
* @brief Checks the Account instance is different from @param other
|
||||
*
|
||||
* @returns true, if credentials or url have changed, false otherwise
|
||||
*/
|
||||
bool changed(AccountPtr other, bool ignoreUrlProtocol) const;
|
||||
|
||||
/** Holds the accounts credentials */
|
||||
AbstractCredentials* credentials() const;
|
||||
void setCredentials(AbstractCredentials *cred);
|
||||
|
||||
/** Server url of the account */
|
||||
void setUrl(const QUrl &url);
|
||||
QUrl url() const { return _url; }
|
||||
@@ -102,12 +99,14 @@ public:
|
||||
/** Returns webdav entry URL, based on url() */
|
||||
QUrl davUrl() const;
|
||||
|
||||
/** Holds the accounts credentials */
|
||||
AbstractCredentials* credentials() const;
|
||||
void setCredentials(AbstractCredentials *cred);
|
||||
/** set and retrieve the migration flag: if an account of a branded
|
||||
* client was migrated from a former ownCloud Account, this is true
|
||||
*/
|
||||
void setMigrated(bool mig);
|
||||
bool wasMigrated();
|
||||
|
||||
QList<QNetworkCookie> lastAuthCookies() const;
|
||||
|
||||
// For creating various network requests
|
||||
QNetworkReply* headRequest(const QString &relPath);
|
||||
QNetworkReply* headRequest(const QUrl &url);
|
||||
QNetworkReply* getRequest(const QString &relPath);
|
||||
@@ -115,9 +114,6 @@ public:
|
||||
QNetworkReply* deleteRequest( const QUrl &url);
|
||||
QNetworkReply* davRequest(const QByteArray &verb, const QString &relPath, QNetworkRequest req, QIODevice *data = 0);
|
||||
QNetworkReply* davRequest(const QByteArray &verb, const QUrl &url, QNetworkRequest req, QIODevice *data = 0);
|
||||
QNetworkReply* multipartRequest(const QString &relPath, QNetworkRequest req, QHttpMultiPart *multiPart);
|
||||
QNetworkReply* multipartRequest(const QUrl &url, QNetworkRequest req, QHttpMultiPart *multiPart);
|
||||
|
||||
|
||||
/** The ssl configuration during the first connection */
|
||||
QSslConfiguration getOrCreateSslConfig();
|
||||
@@ -142,21 +138,25 @@ public:
|
||||
// pluggable handler
|
||||
void setSslErrorHandler(AbstractSslErrorHandler *handler);
|
||||
|
||||
// To be called by credentials only, for storing username and the like
|
||||
// static helper function
|
||||
static QUrl concatUrlPath(const QUrl &url, const QString &concatPath,
|
||||
const QList< QPair<QString, QString> > &queryItems = (QList<QPair<QString, QString>>()));
|
||||
|
||||
/** Returns a new settings pre-set in a specific group. The Settings will be created
|
||||
with the given parent. If no parent is specified, the caller must destroy the settings */
|
||||
static std::unique_ptr<QSettings> settingsWithGroup(const QString& group, QObject* parent = 0);
|
||||
|
||||
// to be called by credentials only
|
||||
QVariant credentialSetting(const QString& key) const;
|
||||
void setCredentialSetting(const QString& key, const QVariant &value);
|
||||
|
||||
/** Assign a client certificate */
|
||||
void setCertificate(const QByteArray certficate = QByteArray(), const QString privateKey = QString());
|
||||
|
||||
/** Access the server capabilities */
|
||||
const Capabilities &capabilities() const;
|
||||
void setCapabilities(const QVariantMap &caps);
|
||||
|
||||
/** Access the server version */
|
||||
const Capabilities &capabilities() const;
|
||||
void setServerVersion(const QString &version);
|
||||
QString serverVersion() const;
|
||||
int serverVersionInt() const;
|
||||
void setServerVersion(const QString &version);
|
||||
|
||||
/** Whether the server is too old.
|
||||
*
|
||||
@@ -171,7 +171,6 @@ public:
|
||||
bool serverVersionUnsupported() const;
|
||||
|
||||
// Fixed from 8.1 https://github.com/owncloud/client/issues/3730
|
||||
/** Detects a specific bug in older server versions */
|
||||
bool rootEtagChangesNotOnlySubFolderEtags();
|
||||
|
||||
void clearCookieJar();
|
||||
@@ -180,16 +179,12 @@ public:
|
||||
void resetNetworkAccessManager();
|
||||
QNetworkAccessManager* networkAccessManager();
|
||||
|
||||
/// Called by network jobs on credential errors, emits invalidCredentials()
|
||||
/// Called by network jobs on credential errors.
|
||||
void handleInvalidCredentials();
|
||||
|
||||
signals:
|
||||
/// Emitted whenever there's network activity
|
||||
void propagatorNetworkActivity();
|
||||
|
||||
/// Triggered by handleInvalidCredentials()
|
||||
void invalidCredentials();
|
||||
|
||||
void credentialsFetched(AbstractCredentials* credentials);
|
||||
void credentialsAsked(AbstractCredentials* credentials);
|
||||
|
||||
@@ -208,7 +203,6 @@ protected Q_SLOTS:
|
||||
|
||||
private:
|
||||
Account(QObject *parent = 0);
|
||||
void setSharedThis(AccountPtr sharedThis);
|
||||
|
||||
QWeakPointer<Account> _sharedThis;
|
||||
QString _id;
|
||||
@@ -231,7 +225,6 @@ private:
|
||||
QString _pemPrivateKey;
|
||||
QString _davPath; // defaults to value from theme, might be overwritten in brandings
|
||||
bool _wasMigrated;
|
||||
bool _bundleRequests;
|
||||
friend class AccountManager;
|
||||
};
|
||||
|
||||
|
||||
@@ -46,12 +46,6 @@ bool Capabilities::sharePublicLink() const
|
||||
}
|
||||
}
|
||||
|
||||
bool Capabilities::bundledRequest() const
|
||||
{
|
||||
bool bundle = _capabilities["dav"].toMap()["bundlerequest"].toBool();
|
||||
return bundle;
|
||||
}
|
||||
|
||||
bool Capabilities::sharePublicLinkAllowUpload() const
|
||||
{
|
||||
return _capabilities["files_sharing"].toMap()["public"].toMap()["upload"].toBool();
|
||||
|
||||
@@ -39,7 +39,6 @@ public:
|
||||
bool sharePublicLinkEnforceExpireDate() const;
|
||||
int sharePublicLinkExpireDateDays() const;
|
||||
bool shareResharing() const;
|
||||
bool bundledRequest() const;
|
||||
|
||||
/// returns true if the capabilities report notifications
|
||||
bool notificationsAvailable() const;
|
||||
|
||||
@@ -129,6 +129,7 @@ SystemProxyRunnable::SystemProxyRunnable(const QUrl &url) : QObject(), QRunnable
|
||||
|
||||
void SystemProxyRunnable::run()
|
||||
{
|
||||
qDebug() << Q_FUNC_INFO << "Starting system proxy lookup";
|
||||
qRegisterMetaType<QNetworkProxy>("QNetworkProxy");
|
||||
QList<QNetworkProxy> proxies = QNetworkProxyFactory::systemProxyForQuery(QNetworkProxyQuery(_url));
|
||||
|
||||
|
||||
@@ -57,7 +57,7 @@ private:
|
||||
QUrl _url;
|
||||
};
|
||||
|
||||
OWNCLOUDSYNC_EXPORT QString printQNetworkProxy(const QNetworkProxy &proxy);
|
||||
QString printQNetworkProxy(const QNetworkProxy &proxy);
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -611,12 +611,7 @@ void ConfigFile::setPromptDeleteFiles(bool promptDeleteFiles)
|
||||
bool ConfigFile::monoIcons() const
|
||||
{
|
||||
QSettings settings(configFile(), QSettings::IniFormat);
|
||||
bool monoDefault = false; // On Mac we want bw by default
|
||||
#ifdef Q_OS_MAC
|
||||
// OEM themes are not obliged to ship mono icons
|
||||
monoDefault = (0 == (strcmp("ownCloud",APPLICATION_NAME)));
|
||||
#endif
|
||||
return settings.value(QLatin1String(monoIconsC), monoDefault).toBool();
|
||||
return settings.value(QLatin1String(monoIconsC), false).toBool();
|
||||
}
|
||||
|
||||
void ConfigFile::setMonoIcons(bool useMonoIcons)
|
||||
|
||||
@@ -41,6 +41,7 @@ public:
|
||||
*/
|
||||
virtual void setAccount(Account* account);
|
||||
|
||||
virtual bool changed(AbstractCredentials* credentials) const = 0;
|
||||
virtual QString authType() const = 0;
|
||||
virtual QString user() const = 0;
|
||||
virtual QNetworkAccessManager* getQNAM() const = 0;
|
||||
|
||||
@@ -17,6 +17,13 @@
|
||||
namespace OCC
|
||||
{
|
||||
|
||||
bool DummyCredentials::changed(AbstractCredentials* credentials) const
|
||||
{
|
||||
DummyCredentials* dummy(dynamic_cast< DummyCredentials* >(credentials));
|
||||
|
||||
return dummy == 0;
|
||||
}
|
||||
|
||||
QString DummyCredentials::authType() const
|
||||
{
|
||||
return QString::fromLatin1("dummy");
|
||||
|
||||
@@ -27,6 +27,7 @@ public:
|
||||
|
||||
QString _user;
|
||||
QString _password;
|
||||
bool changed(AbstractCredentials* credentials) const Q_DECL_OVERRIDE;
|
||||
QString authType() const Q_DECL_OVERRIDE;
|
||||
QString user() const Q_DECL_OVERRIDE;
|
||||
QNetworkAccessManager* getQNAM() const Q_DECL_OVERRIDE;
|
||||
|
||||
@@ -71,6 +71,21 @@ HttpCredentials::HttpCredentials(const QString& user, const QString& password, c
|
||||
{
|
||||
}
|
||||
|
||||
bool HttpCredentials::changed(AbstractCredentials* credentials) const
|
||||
{
|
||||
HttpCredentials* other(qobject_cast< HttpCredentials* >(credentials));
|
||||
|
||||
if (!other) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!other || (other->user() != this->user())) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
QString HttpCredentials::authType() const
|
||||
{
|
||||
return QString::fromLatin1("http");
|
||||
@@ -132,7 +147,7 @@ void HttpCredentials::fetchFromKeychain()
|
||||
_certificatePath = _account->credentialSetting(QLatin1String(certifPathC)).toString();
|
||||
_certificatePasswd = _account->credentialSetting(QLatin1String(certifPasswdC)).toString();
|
||||
|
||||
auto settings = Utility::settingsWithGroup(Theme::instance()->appName());
|
||||
auto settings = _account->settingsWithGroup(Theme::instance()->appName());
|
||||
const QString kck = keychainKey(_account->url().toString(), _user );
|
||||
|
||||
QString key = QString::fromLatin1( "%1/data" ).arg( kck );
|
||||
@@ -214,7 +229,7 @@ void HttpCredentials::invalidateToken()
|
||||
}
|
||||
|
||||
DeletePasswordJob *job = new DeletePasswordJob(Theme::instance()->appName());
|
||||
auto settings = Utility::settingsWithGroup(Theme::instance()->appName());
|
||||
auto settings = _account->settingsWithGroup(Theme::instance()->appName());
|
||||
settings->setParent(job); // make the job parent to make setting deleted properly
|
||||
job->setSettings(settings.release());
|
||||
job->setInsecureFallback(true);
|
||||
@@ -265,7 +280,7 @@ void HttpCredentials::persist()
|
||||
_account->setCredentialSetting(QLatin1String(certifPathC), _certificatePath);
|
||||
_account->setCredentialSetting(QLatin1String(certifPasswdC), _certificatePasswd);
|
||||
WritePasswordJob *job = new WritePasswordJob(Theme::instance()->appName());
|
||||
auto settings = Utility::settingsWithGroup(Theme::instance()->appName());
|
||||
auto settings = _account->settingsWithGroup(Theme::instance()->appName());
|
||||
settings->setParent(job); // make the job parent to make setting deleted properly
|
||||
job->setSettings(settings.release());
|
||||
|
||||
|
||||
@@ -38,6 +38,7 @@ public:
|
||||
explicit HttpCredentials();
|
||||
HttpCredentials(const QString& user, const QString& password, const QString& certificatePath, const QString& certificatePasswd);
|
||||
|
||||
bool changed(AbstractCredentials* credentials) const Q_DECL_OVERRIDE;
|
||||
QString authType() const Q_DECL_OVERRIDE;
|
||||
QNetworkAccessManager* getQNAM() const Q_DECL_OVERRIDE;
|
||||
bool ready() const Q_DECL_OVERRIDE;
|
||||
|
||||
@@ -80,6 +80,17 @@ TokenCredentials::TokenCredentials(const QString& user, const QString& password,
|
||||
{
|
||||
}
|
||||
|
||||
bool TokenCredentials::changed(AbstractCredentials* credentials) const
|
||||
{
|
||||
TokenCredentials* other(dynamic_cast< TokenCredentials* >(credentials));
|
||||
|
||||
if (!other || (other->user() != this->user())) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
QString TokenCredentials::authType() const
|
||||
{
|
||||
return QString::fromLatin1("token");
|
||||
|
||||
@@ -40,6 +40,7 @@ public:
|
||||
TokenCredentials();
|
||||
TokenCredentials(const QString& user, const QString& password, const QString &token);
|
||||
|
||||
bool changed(AbstractCredentials* credentials) const Q_DECL_OVERRIDE;
|
||||
QString authType() const Q_DECL_OVERRIDE;
|
||||
QNetworkAccessManager* getQNAM() const Q_DECL_OVERRIDE;
|
||||
bool ready() const Q_DECL_OVERRIDE;
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
|
||||
#include "discoveryphase.h"
|
||||
#include <csync_private.h>
|
||||
#include <csync_rename.h>
|
||||
#include <qdebug.h>
|
||||
|
||||
#include <QUrl>
|
||||
@@ -52,7 +51,7 @@ static bool findPathInList(const QStringList &list, const QString &path)
|
||||
return pathSlash.startsWith(*it);
|
||||
}
|
||||
|
||||
bool DiscoveryJob::isInSelectiveSyncBlackList(const char *path) const
|
||||
bool DiscoveryJob::isInSelectiveSyncBlackList(const QString& path) const
|
||||
{
|
||||
if (_selectiveSyncBlackList.isEmpty()) {
|
||||
// If there is no black list, everything is allowed
|
||||
@@ -60,25 +59,13 @@ bool DiscoveryJob::isInSelectiveSyncBlackList(const char *path) const
|
||||
}
|
||||
|
||||
// Block if it is in the black list
|
||||
if (findPathInList(_selectiveSyncBlackList, QString::fromUtf8(path))) {
|
||||
return true;
|
||||
}
|
||||
return findPathInList(_selectiveSyncBlackList, path);
|
||||
|
||||
// Also try to adjust the path if there was renames
|
||||
if (csync_rename_count(_csync_ctx)) {
|
||||
QScopedPointer<char, QScopedPointerPodDeleter> adjusted(
|
||||
csync_rename_adjust_path_source(_csync_ctx, path));
|
||||
if (strcmp(adjusted.data(), path) != 0) {
|
||||
return findPathInList(_selectiveSyncBlackList, QString::fromUtf8(adjusted.data()));
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
int DiscoveryJob::isInSelectiveSyncBlackListCallback(void *data, const char *path)
|
||||
{
|
||||
return static_cast<DiscoveryJob*>(data)->isInSelectiveSyncBlackList(path);
|
||||
return static_cast<DiscoveryJob*>(data)->isInSelectiveSyncBlackList(QString::fromUtf8(path));
|
||||
}
|
||||
|
||||
bool DiscoveryJob::checkSelectiveSyncNewFolder(const QString& path)
|
||||
@@ -205,8 +192,7 @@ int get_errno_from_http_errcode( int err, const QString & reason ) {
|
||||
new_errno = EIO;
|
||||
break;
|
||||
case 503: /* Service Unavailable */
|
||||
// https://github.com/owncloud/core/pull/26145/files
|
||||
if (reason == "Storage not available" || reason == "Storage is temporarily not available") {
|
||||
if (reason == "Storage not available") {
|
||||
new_errno = ERRNO_STORAGE_UNAVAILABLE;
|
||||
} else {
|
||||
new_errno = ERRNO_SERVICE_UNAVAILABLE;
|
||||
|
||||
@@ -174,7 +174,7 @@ class DiscoveryJob : public QObject {
|
||||
* return true if the given path should be ignored,
|
||||
* false if the path should be synced
|
||||
*/
|
||||
bool isInSelectiveSyncBlackList(const char* path) const;
|
||||
bool isInSelectiveSyncBlackList(const QString &path) const;
|
||||
static int isInSelectiveSyncBlackListCallback(void *, const char *);
|
||||
bool checkSelectiveSyncNewFolder(const QString &path);
|
||||
static int checkSelectiveSyncNewFolderCallback(void*, const char*);
|
||||
|
||||
@@ -680,7 +680,7 @@ void JsonApiJob::start()
|
||||
{
|
||||
QNetworkRequest req;
|
||||
req.setRawHeader("OCS-APIREQUEST", "true");
|
||||
QUrl url = Utility::concatUrlPath(account()->url(), path());
|
||||
QUrl url = Account::concatUrlPath(account()->url(), path());
|
||||
QList<QPair<QString, QString> > params = _additionalParams;
|
||||
params << qMakePair(QString::fromLatin1("format"), QString::fromLatin1("json"));
|
||||
url.setQueryItems(params);
|
||||
|
||||
@@ -303,13 +303,6 @@ void OwncloudPropagator::start(const SyncFileItemVector& items)
|
||||
directories.push(qMakePair(QString(), _rootJob.data()));
|
||||
QVector<PropagatorJob*> directoriesToRemove;
|
||||
QString removedDirectory;
|
||||
|
||||
PropagateBundle *bundledUploadRequestsJob = new PropagateBundle(this);
|
||||
quint64 chunkSize = OwncloudPropagator::chunkSize();
|
||||
|
||||
// TODO: here we should also check somehow if bundle is not broken for specific sync - bug recovery to standard PUTs
|
||||
bool bundledRequestsEnabled = _account->bundledRequestsEnabled();
|
||||
|
||||
foreach(const SyncFileItemPtr &item, items) {
|
||||
|
||||
if (!removedDirectory.isEmpty() && item->_file.startsWith(removedDirectory)) {
|
||||
@@ -386,12 +379,6 @@ void OwncloudPropagator::start(const SyncFileItemVector& items)
|
||||
currentDirJob->append(dir);
|
||||
}
|
||||
directories.push(qMakePair(item->destination() + "/" , dir));
|
||||
} else if (bundledRequestsEnabled
|
||||
&& (item->_instruction == CSYNC_INSTRUCTION_NEW)
|
||||
&& (item->_direction == SyncFileItem::Up)
|
||||
&& (item->_size < chunkSize)) {
|
||||
//this will create list of bundle files to sync for that bundlejob
|
||||
bundledUploadRequestsJob->append(item);
|
||||
} else if (PropagateItemJob* current = createJob(item)) {
|
||||
if (item->_instruction == CSYNC_INSTRUCTION_TYPE_CHANGE) {
|
||||
// will delete directories, so defer execution
|
||||
@@ -407,21 +394,6 @@ void OwncloudPropagator::start(const SyncFileItemVector& items)
|
||||
_rootJob->append(it);
|
||||
}
|
||||
|
||||
// Root job is DirectoryJob with FullParallelizm, so we need to halt bundle till all other jobs are finished.
|
||||
// If there are no running jobs in root folder it means we can start with sending the bundle
|
||||
// If there are running jobs, we halt and wait for finish of the other job to trigger sending
|
||||
if (bundledRequestsEnabled && !bundledUploadRequestsJob->empty()) {
|
||||
bundledUploadRequestsJob->_item->_direction = SyncFileItem::Direction::Up;
|
||||
bundledUploadRequestsJob->_item->_type = SyncFileItem::Type::RequestsContainer;
|
||||
bundledUploadRequestsJob->_item->_instruction = CSYNC_INSTRUCTION_NEW;
|
||||
bundledUploadRequestsJob->_item->_size = bundledUploadRequestsJob->syncItemsSize();
|
||||
bundledUploadRequestsJob->_item->_originalFile = tr("%1 file(s)").arg(bundledUploadRequestsJob->syncItemsNumber());
|
||||
_rootJob->append(bundledUploadRequestsJob);
|
||||
}
|
||||
else{
|
||||
delete bundledUploadRequestsJob;
|
||||
}
|
||||
|
||||
connect(_rootJob.data(), SIGNAL(itemCompleted(const SyncFileItem &, const PropagatorJob &)),
|
||||
this, SIGNAL(itemCompleted(const SyncFileItem &, const PropagatorJob &)));
|
||||
connect(_rootJob.data(), SIGNAL(progress(const SyncFileItem &,quint64)), this, SIGNAL(progress(const SyncFileItem &,quint64)));
|
||||
@@ -557,7 +529,7 @@ void OwncloudPropagator::scheduleNextJob()
|
||||
}
|
||||
}
|
||||
if (_activeJobList.count() < maximumActiveJob() + likelyFinishedQuicklyCount) {
|
||||
qDebug() << "Can pump in another request! activeJobs =" << _activeJobList.count();
|
||||
qDebug() << "Can pump in another request!";
|
||||
if (_rootJob->scheduleNextJob()) {
|
||||
QTimer::singleShot(0, this, SLOT(scheduleNextJob()));
|
||||
}
|
||||
@@ -652,7 +624,6 @@ bool PropagateDirectory::scheduleNextJob()
|
||||
Q_ASSERT(_subJobs.at(i)->_state == Running);
|
||||
|
||||
auto paral = _subJobs.at(i)->parallelism();
|
||||
|
||||
if (paral == WaitForFinished) {
|
||||
return false;
|
||||
}
|
||||
@@ -721,14 +692,14 @@ void PropagateDirectory::finalize()
|
||||
SyncJournalFileRecord record(*_item, _propagator->_localDir + _item->_file);
|
||||
ok = _propagator->_journal->setFileRecordMetadata(record);
|
||||
if (!ok) {
|
||||
_hasError = _item->_status = SyncFileItem::FatalError;
|
||||
_item->_status = SyncFileItem::FatalError;
|
||||
_item->_errorString = tr("Error writing metadata to the database");
|
||||
qWarning() << "Error writing to the database for file" << _item->_file;
|
||||
}
|
||||
}
|
||||
}
|
||||
_state = Finished;
|
||||
emit finished(_hasError == SyncFileItem::NoStatus ? SyncFileItem::Success : _hasError);
|
||||
emit finished(_item->_status);
|
||||
}
|
||||
|
||||
qint64 PropagateDirectory::committedDiskSpace() const
|
||||
|
||||
@@ -324,10 +324,6 @@ public:
|
||||
emitFinished(SyncFileItem::NormalError);
|
||||
}
|
||||
|
||||
int runningNowAtRootJob() const {
|
||||
return _rootJob->_runningNow;
|
||||
}
|
||||
|
||||
// timeout in seconds
|
||||
static int httpTimeout();
|
||||
|
||||
@@ -387,7 +383,6 @@ private:
|
||||
friend class PropagateLocalMkdir;
|
||||
friend class PropagateLocalRename;
|
||||
friend class PropagateRemoteMove;
|
||||
friend class PropagateBundle;
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
@@ -49,8 +49,8 @@ QString ownCloudTheme::about() const
|
||||
"Olivier Goffart, Markus Götz and others.</small></p>"
|
||||
"<p>Copyright ownCloud GmbH</p>"
|
||||
"<p>Licensed under the GNU General Public License (GPL) Version 2.0<br/>"
|
||||
"ownCloud and the ownCloud Logo are registered trademarks of ownCloud GmbH "
|
||||
"in the United States, other countries, or both.</p>"
|
||||
"ownCloud and the ownCloud Logo are registered trademarks of ownCloud, "
|
||||
"Inc. in the United States, other countries, or both.</p>"
|
||||
)
|
||||
.arg(MIRALL_VERSION_STRING)
|
||||
.arg("https://" MIRALL_STRINGIFY(APPLICATION_DOMAIN))
|
||||
|
||||
@@ -230,12 +230,8 @@ bool SqlQuery::isPragma()
|
||||
|
||||
bool SqlQuery::exec()
|
||||
{
|
||||
if (!_stmt) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Don't do anything for selects, that is how we use the lib :-|
|
||||
if( !isSelect() && !isPragma() ) {
|
||||
if(_stmt && !isSelect() && !isPragma() ) {
|
||||
int rc, n = 0;
|
||||
do {
|
||||
rc = sqlite3_step(_stmt);
|
||||
@@ -380,10 +376,8 @@ void SqlQuery::finish()
|
||||
|
||||
void SqlQuery::reset_and_clear_bindings()
|
||||
{
|
||||
if (_stmt) {
|
||||
SQLITE_DO(sqlite3_reset(_stmt));
|
||||
SQLITE_DO(sqlite3_clear_bindings(_stmt));
|
||||
}
|
||||
SQLITE_DO(sqlite3_reset(_stmt));
|
||||
SQLITE_DO(sqlite3_clear_bindings(_stmt));
|
||||
}
|
||||
|
||||
} // namespace OCC
|
||||
|
||||
@@ -28,13 +28,11 @@ QString Progress::asResultString( const SyncFileItem& item)
|
||||
case CSYNC_INSTRUCTION_SYNC:
|
||||
case CSYNC_INSTRUCTION_NEW:
|
||||
case CSYNC_INSTRUCTION_TYPE_CHANGE:
|
||||
if (item._type != SyncFileItem::Type::RequestsContainer) {
|
||||
if (item._direction != SyncFileItem::Up) {
|
||||
return QCoreApplication::translate( "progress", "Downloaded");
|
||||
} else
|
||||
return QCoreApplication::translate( "progress", "Uploaded");
|
||||
}
|
||||
return QCoreApplication::translate( "progress", "Processed Bundle");
|
||||
if (item._direction != SyncFileItem::Up) {
|
||||
return QCoreApplication::translate( "progress", "Downloaded");
|
||||
} else {
|
||||
return QCoreApplication::translate( "progress", "Uploaded");
|
||||
}
|
||||
case CSYNC_INSTRUCTION_CONFLICT:
|
||||
return QCoreApplication::translate( "progress", "Server version downloaded, copied changed local file into conflict file");
|
||||
case CSYNC_INSTRUCTION_REMOVE:
|
||||
@@ -149,7 +147,6 @@ void ProgressInfo::reset()
|
||||
_maxBytesPerSecond = 100000.0;
|
||||
_maxFilesPerSecond = 2.0;
|
||||
_updateEstimatesTimer.stop();
|
||||
_lastCompletedItem = SyncFileItem();
|
||||
}
|
||||
|
||||
void ProgressInfo::startEstimateUpdates()
|
||||
|
||||
@@ -620,47 +620,30 @@ static QString makeRecallFileName(const QString &fn)
|
||||
return recallFileName;
|
||||
}
|
||||
|
||||
void handleRecallFile(const QString& filePath, const QString& folderPath, SyncJournalDb& journal)
|
||||
static void handleRecallFile(const QString &fn)
|
||||
{
|
||||
qDebug() << "handleRecallFile: " << filePath;
|
||||
qDebug() << "handleRecallFile: " << fn;
|
||||
|
||||
FileSystem::setFileHidden(filePath, true);
|
||||
FileSystem::setFileHidden(fn, true);
|
||||
|
||||
QFile file(filePath);
|
||||
QFile file(fn);
|
||||
if (!file.open(QIODevice::ReadOnly)) {
|
||||
qWarning() << "Could not open recall file" << file.errorString();
|
||||
return;
|
||||
}
|
||||
QFileInfo existingFile(filePath);
|
||||
QDir baseDir = existingFile.dir();
|
||||
QFileInfo existingFile(fn);
|
||||
QDir thisDir = existingFile.dir();
|
||||
|
||||
while (!file.atEnd()) {
|
||||
QByteArray line = file.readLine();
|
||||
line.chop(1); // remove trailing \n
|
||||
QString fpath = thisDir.filePath(line);
|
||||
QString rpath = makeRecallFileName(fpath);
|
||||
|
||||
QString recalledFile = QDir::cleanPath(baseDir.filePath(line));
|
||||
if (!recalledFile.startsWith(folderPath) || !recalledFile.startsWith(baseDir.path())) {
|
||||
qDebug() << "Ignoring recall of " << recalledFile;
|
||||
continue;
|
||||
}
|
||||
|
||||
// Path of the recalled file in the local folder
|
||||
QString localRecalledFile = recalledFile.mid(folderPath.size());
|
||||
|
||||
SyncJournalFileRecord record = journal.getFileRecord(localRecalledFile);
|
||||
if (!record.isValid()) {
|
||||
qDebug() << "No db entry for recall of" << localRecalledFile;
|
||||
continue;
|
||||
}
|
||||
|
||||
qDebug() << "Recalling" << localRecalledFile << "Checksum:" << record._contentChecksumType << record._contentChecksum;
|
||||
|
||||
QString targetPath = makeRecallFileName(recalledFile);
|
||||
|
||||
qDebug() << "Copy recall file: " << recalledFile << " -> " << targetPath;
|
||||
qDebug() << "Copy recall file: " << fpath << " -> " << rpath;
|
||||
// Remove the target first, QFile::copy will not overwrite it.
|
||||
FileSystem::remove(targetPath);
|
||||
QFile::copy(recalledFile, targetPath);
|
||||
FileSystem::remove(rpath);
|
||||
QFile::copy(fpath, rpath);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -817,10 +800,8 @@ void PropagateDownloadFile::downloadFinished()
|
||||
done(isConflict ? SyncFileItem::Conflict : SyncFileItem::Success);
|
||||
|
||||
// handle the special recall file
|
||||
if(!_item->_remotePerm.contains("S")
|
||||
&& (_item->_file == QLatin1String(".sys.admin#recall#")
|
||||
|| _item->_file.endsWith("/.sys.admin#recall#"))) {
|
||||
handleRecallFile(fn, _propagator->_localDir, *_propagator->_journal);
|
||||
if(_item->_file == QLatin1String(".sys.admin#recall#") || _item->_file.endsWith("/.sys.admin#recall#")) {
|
||||
handleRecallFile(fn);
|
||||
}
|
||||
|
||||
qint64 duration = _stopwatch.elapsed();
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
*/
|
||||
|
||||
#include "propagateremotemove.h"
|
||||
#include "propagatorjobs.h"
|
||||
#include "owncloudpropagator_p.h"
|
||||
#include "account.h"
|
||||
#include "syncjournalfilerecord.h"
|
||||
@@ -176,45 +175,10 @@ void PropagateRemoteMove::finalize()
|
||||
done(SyncFileItem::FatalError, tr("Error writing metadata to the database"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (_item->_isDirectory) {
|
||||
if (!adjustSelectiveSync(_propagator->_journal, _item->_file, _item->_renameTarget)) {
|
||||
done(SyncFileItem::FatalError, tr("Error writing metadata to the database"));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
_propagator->_journal->commit("Remote Rename");
|
||||
done(SyncFileItem::Success);
|
||||
}
|
||||
|
||||
bool PropagateRemoteMove::adjustSelectiveSync(SyncJournalDb *journal, const QString &from_, const QString &to_)
|
||||
{
|
||||
bool ok;
|
||||
// We only care about preserving the blacklist. The white list should anyway be empty.
|
||||
// And the undecided list will be repopulated on the next sync, if there is anything too big.
|
||||
QStringList list = journal->getSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, &ok);
|
||||
if (!ok)
|
||||
return false;
|
||||
|
||||
bool changed = false;
|
||||
Q_ASSERT(!from_.endsWith(QLatin1String("/")));
|
||||
Q_ASSERT(!to_.endsWith(QLatin1String("/")));
|
||||
QString from = from_ + QLatin1String("/");
|
||||
QString to = to_ + QLatin1String("/");
|
||||
|
||||
for (auto it = list.begin(); it != list.end(); ++it) {
|
||||
if (it->startsWith(from)) {
|
||||
*it = it->replace(0, from.size(), to);
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (changed) {
|
||||
journal->setSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, list);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -51,12 +51,6 @@ public:
|
||||
void start() Q_DECL_OVERRIDE;
|
||||
void abort() Q_DECL_OVERRIDE;
|
||||
JobParallelism parallelism() Q_DECL_OVERRIDE { return OCC::PropagatorJob::WaitForFinishedInParentDirectory; }
|
||||
|
||||
/**
|
||||
* Rename the directory in the selective sync list
|
||||
*/
|
||||
static bool adjustSelectiveSync(SyncJournalDb *journal, const QString &from, const QString &to);
|
||||
|
||||
private slots:
|
||||
void slotMoveJobFinished();
|
||||
void finalize();
|
||||
|
||||
@@ -28,12 +28,10 @@
|
||||
|
||||
#include <json.h>
|
||||
#include <QNetworkAccessManager>
|
||||
#include <QHttpMultiPart>
|
||||
#include <QFileInfo>
|
||||
#include <QDir>
|
||||
#include <cmath>
|
||||
#include <cstring>
|
||||
#include <QXmlStreamReader>
|
||||
|
||||
#if QT_VERSION < QT_VERSION_CHECK(5, 4, 2)
|
||||
namespace {
|
||||
@@ -896,601 +894,5 @@ void PropagateUploadFile::abortWithError(SyncFileItem::Status status, const QStr
|
||||
done(status, error);
|
||||
}
|
||||
|
||||
void PropagateBundle::start()
|
||||
{
|
||||
if (_propagator->_abortRequested.fetchAndAddRelaxed(0)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!_itemsToChecksum.isEmpty()) {
|
||||
//this will add checksums and remove itself from activeJobList after is completed
|
||||
_preparingBundle = true;
|
||||
_propagator->_activeJobList.append(this);
|
||||
return slotComputeTransmissionChecksum();
|
||||
}
|
||||
|
||||
//this can generate itemDone(), dont add to activeJobList
|
||||
startBundle();
|
||||
}
|
||||
|
||||
void PropagateBundle::slotComputeTransmissionChecksum()
|
||||
{
|
||||
if (_propagator->_abortRequested.fetchAndAddRelaxed(0)) {
|
||||
return;
|
||||
}
|
||||
|
||||
SyncFileItemPtr item = _itemsToChecksum.first();
|
||||
const QString filePath = _propagator->getFilePath(item->_file);
|
||||
|
||||
// remember the modtime before checksumming to be able to detect a file
|
||||
// change during the checksum calculation
|
||||
item->_modtime = FileSystem::getModTime(filePath);
|
||||
|
||||
QByteArray checksumType = contentChecksumType();
|
||||
|
||||
// Maybe the discovery already computed the checksum?
|
||||
if (item->_contentChecksumType == checksumType
|
||||
&& !item->_contentChecksum.isEmpty()) {
|
||||
// Reuse the content checksum as the transmission checksum if possible
|
||||
const auto supportedTransmissionChecksums =
|
||||
_propagator->account()->capabilities().supportedChecksumTypes();
|
||||
if (supportedTransmissionChecksums.contains(checksumType)) {
|
||||
slotStartUpload(checksumType, item->_contentChecksum);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Compute the transmission checksum.
|
||||
auto computeChecksum = new ComputeChecksum(this);
|
||||
if (uploadChecksumEnabled()) {
|
||||
computeChecksum->setChecksumType(_propagator->account()->capabilities().uploadChecksumType());
|
||||
} else {
|
||||
computeChecksum->setChecksumType(QByteArray());
|
||||
}
|
||||
|
||||
connect(computeChecksum, SIGNAL(done(QByteArray,QByteArray)),
|
||||
SLOT(slotStartUpload(QByteArray,QByteArray)));
|
||||
computeChecksum->start(filePath);
|
||||
}
|
||||
|
||||
void PropagateBundle::slotStartUpload(const QByteArray& transmissionChecksumType, const QByteArray& transmissionChecksum)
|
||||
{
|
||||
SyncFileItemPtr item = _itemsToChecksum.takeFirst();
|
||||
|
||||
item->_contentChecksum = transmissionChecksum;
|
||||
item->_contentChecksumType = transmissionChecksumType;
|
||||
|
||||
// add this item to sync list, as it now has checksum computed
|
||||
_itemsToSync.append(item);
|
||||
|
||||
_currentBundleSize += item->_size;
|
||||
_currentRequestsNumber++;
|
||||
|
||||
// Remove ourselfs from the list of active job, before any posible call to itemDone()
|
||||
_propagator->_activeJobList.removeOne(this);
|
||||
|
||||
// check if we have anything to add to our bundle
|
||||
if (!_itemsToChecksum.empty()){
|
||||
SyncFileItemPtr nextItem = _itemsToChecksum.first();
|
||||
|
||||
// if next item will exceed bundle size, send the bundle now
|
||||
// otherwise, compute next checksum
|
||||
if (((_currentBundleSize + nextItem->_size) >= chunkSize())
|
||||
|| (_currentRequestsNumber >= checkBundledRequestsLimits())){
|
||||
_currentBundleSize = 0;
|
||||
_currentRequestsNumber = 0;
|
||||
startBundle();
|
||||
} else {
|
||||
start();
|
||||
}
|
||||
} else {
|
||||
//_itemsToChecksum is already empty, send what is left in _itemsToSync.
|
||||
startBundle();
|
||||
}
|
||||
}
|
||||
|
||||
void PropagateBundle::startBundle()
|
||||
{
|
||||
if (_propagator->_abortRequested.fetchAndAddRelaxed(0)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// TODO: use QHttpMultiPartIODevice as as Upload Device
|
||||
QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::MixedType);
|
||||
|
||||
QVector<SyncFileItemPtr> syncItems;
|
||||
while (!_itemsToSync.isEmpty()){
|
||||
SyncFileItemPtr item = _itemsToSync.takeFirst();
|
||||
const QString fullFilePath = _propagator->getFilePath(item->_file);
|
||||
|
||||
if (!FileSystem::fileExists(fullFilePath)) {
|
||||
itemDone(item, SyncFileItem::SoftError, tr("File Removed"));
|
||||
continue;
|
||||
}
|
||||
|
||||
time_t prevModtime = item->_modtime; // the _item value was set in PropagateUploadFileQNAM::start()
|
||||
// but a potential checksum calculation could have taken some time during which the file could
|
||||
// have been changed again, so better check again here.
|
||||
|
||||
item->_modtime = FileSystem::getModTime(fullFilePath);
|
||||
if( prevModtime != item->_modtime ) {
|
||||
_propagator->_anotherSyncNeeded = true;
|
||||
itemDone(item, SyncFileItem::SoftError, tr("Local file changed during syncing. It will be resumed."));
|
||||
continue;
|
||||
}
|
||||
|
||||
quint64 fileSize = FileSystem::getSize(fullFilePath);
|
||||
item->_size = fileSize;
|
||||
|
||||
// But skip the file if the mtime is too close to 'now'!
|
||||
// That usually indicates a file that is still being changed
|
||||
// or not yet fully copied to the destination.
|
||||
if (fileIsStillChanging(*item)) {
|
||||
_propagator->_anotherSyncNeeded = true;
|
||||
itemDone(item, SyncFileItem::SoftError, tr("Local file changed during sync."));
|
||||
continue;
|
||||
}
|
||||
|
||||
//TODO use Upload Device to support bandwith limitation on the client
|
||||
QFile *file = new QFile(fullFilePath);
|
||||
if (! file->open(QIODevice::ReadOnly)) {
|
||||
qDebug() << "ERR: Could not prepare upload device: " << file->errorString();
|
||||
|
||||
// If the file is currently locked, we want to retry the sync
|
||||
// when it becomes available again.
|
||||
if (FileSystem::isFileLocked(fullFilePath)) {
|
||||
emit _propagator->seenLockedFile(fullFilePath);
|
||||
}
|
||||
|
||||
// Soft error because this is likely caused by the user modifying his files while syncing
|
||||
itemDone(item, SyncFileItem::SoftError, tr("ERR: Could not prepare upload device"));
|
||||
} else {
|
||||
QHttpPart bundleContent;
|
||||
bundleContent.setHeader(QNetworkRequest::ContentLengthHeader, QVariant(fileSize));
|
||||
|
||||
//TODO: dont use strings here!! Must change to variable in propagatorjobs.h!
|
||||
bundleContent.setRawHeader("X-OC-Method", QByteArray("PUT"));
|
||||
bundleContent.setRawHeader("X-OC-Path", getRemotePath(item->_file));
|
||||
bundleContent.setRawHeader("X-OC-Mtime", QByteArray::number(qint64(item->_modtime)));
|
||||
|
||||
if (!item->_contentChecksumType.isEmpty()) {
|
||||
bundleContent.setRawHeader(checkSumHeaderC,
|
||||
makeChecksumHeader(item->_contentChecksumType, item->_contentChecksum));
|
||||
}
|
||||
if(item->_file.contains(".sys.admin#recall#")) {
|
||||
// This is a file recall triggered by the admin. Note: the
|
||||
// recall list file created by the admin and downloaded by the
|
||||
// client (.sys.admin#recall#) also falls into this category
|
||||
// (albeit users are not supposed to mess up with it)
|
||||
|
||||
// We use a special tag header so that the server may decide to store this file away in some admin stage area
|
||||
// And not directly in the user's area (which would trigger redownloads etc).
|
||||
bundleContent.setRawHeader("OC-Tag", QByteArray(".sys.admin#recall#"));
|
||||
}
|
||||
|
||||
// File has to be written to multipart body immedietely, because we dont want 1000> open files till the reply comes.
|
||||
bundleContent.setBody(file->readAll());
|
||||
file->close();
|
||||
multiPart->append(bundleContent);
|
||||
syncItems.append(item);
|
||||
}
|
||||
delete file;
|
||||
}
|
||||
|
||||
if (!syncItems.isEmpty())
|
||||
{
|
||||
_propagator->_activeJobList.append(this);
|
||||
|
||||
const QString userPath = _propagator->account()->davFilesPath();
|
||||
|
||||
// job takes ownership of device via a QScopedPointer. Job deletes itself when finishing
|
||||
MultipartJob* job = new MultipartJob(_propagator->account(), userPath, multiPart, syncItems);
|
||||
job->_duration.start();
|
||||
|
||||
_jobs.append(job);
|
||||
connect(job, SIGNAL(finishedSignal()), this, SLOT(slotMultipartFinished()));
|
||||
connect(job, SIGNAL(destroyed(QObject*)), this, SLOT(slotJobDestroyed(QObject*)));
|
||||
job->start();
|
||||
_preparingBundle = false;
|
||||
|
||||
// check if there are any items to be bundled and if you can run another parallel job
|
||||
if (!_itemsToChecksum.empty() && (_propagator->_activeJobList.count() < _propagator->maximumActiveJob())) {
|
||||
start();
|
||||
}
|
||||
} else {
|
||||
delete multiPart;
|
||||
}
|
||||
}
|
||||
|
||||
//TODO this function is copied over from owncloudpropagator.cpp (not in owncloudpropagator.h)
|
||||
/** Updates, creates or removes a blacklist entry for the given item.
|
||||
*
|
||||
* Returns whether the file is in the blacklist now.
|
||||
*
|
||||
*/
|
||||
static bool blacklistCheck(SyncJournalDb* journal, const SyncFileItem& item)
|
||||
{
|
||||
SyncJournalErrorBlacklistRecord oldEntry = journal->errorBlacklistEntry(item._file);
|
||||
SyncJournalErrorBlacklistRecord newEntry = SyncJournalErrorBlacklistRecord::update(oldEntry, item);
|
||||
|
||||
if (newEntry.isValid()) {
|
||||
journal->updateErrorBlacklistEntry(newEntry);
|
||||
} else if (oldEntry.isValid()) {
|
||||
journal->wipeErrorBlacklistEntry(item._file);
|
||||
}
|
||||
|
||||
return newEntry.isValid();
|
||||
}
|
||||
|
||||
void PropagateBundle::itemDone(SyncFileItemPtr item, SyncFileItem::Status status, const QString &errorString)
|
||||
{
|
||||
if (item->_isRestoration) {
|
||||
if( status == SyncFileItem::Success || status == SyncFileItem::Conflict) {
|
||||
status = SyncFileItem::Restoration;
|
||||
} else {
|
||||
item->_errorString += tr("; Restoration Failed: %1").arg(errorString);
|
||||
}
|
||||
} else {
|
||||
if( item->_errorString.isEmpty() ) {
|
||||
item->_errorString = errorString;
|
||||
}
|
||||
}
|
||||
|
||||
if( _propagator->_abortRequested.fetchAndAddRelaxed(0) &&
|
||||
(status == SyncFileItem::NormalError || status == SyncFileItem::FatalError)) {
|
||||
// an abort request is ongoing. Change the status to Soft-Error
|
||||
status = SyncFileItem::SoftError;
|
||||
}
|
||||
|
||||
switch( status ) {
|
||||
case SyncFileItem::SoftError:
|
||||
case SyncFileItem::FatalError:
|
||||
// do not blacklist in case of soft error or fatal error.
|
||||
break;
|
||||
case SyncFileItem::NormalError:
|
||||
if (blacklistCheck(_propagator->_journal, *item) && item->_hasBlacklistEntry) {
|
||||
// do not error if the item was, and continues to be, blacklisted
|
||||
status = SyncFileItem::FileIgnored;
|
||||
item->_errorString.prepend(tr("Continue blacklisting:") + " ");
|
||||
}
|
||||
break;
|
||||
case SyncFileItem::Success:
|
||||
case SyncFileItem::Restoration:
|
||||
if( item->_hasBlacklistEntry ) {
|
||||
// wipe blacklist entry.
|
||||
_propagator->_journal->wipeErrorBlacklistEntry(item->_file);
|
||||
// remove a blacklist entry in case the file was moved.
|
||||
if( item->_originalFile != item->_file ) {
|
||||
_propagator->_journal->wipeErrorBlacklistEntry(item->_originalFile);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case SyncFileItem::Conflict:
|
||||
case SyncFileItem::FileIgnored:
|
||||
case SyncFileItem::NoStatus:
|
||||
// nothing
|
||||
break;
|
||||
}
|
||||
|
||||
item->_status = status;
|
||||
|
||||
emit itemCompleted(*item, *this);
|
||||
}
|
||||
|
||||
QByteArray PropagateBundle::getRemotePath(QString filePath){
|
||||
QString remotePath(_propagator->_remoteFolder+filePath);
|
||||
return remotePath.toStdString().c_str();
|
||||
}
|
||||
|
||||
void PropagateBundle::append(const SyncFileItemPtr &bundledFile){
|
||||
_size += bundledFile->_size;
|
||||
_itemsToChecksum.append(bundledFile);
|
||||
}
|
||||
|
||||
bool PropagateBundle::empty(){
|
||||
return _itemsToChecksum.empty();
|
||||
}
|
||||
|
||||
void PropagateBundle::slotMultipartFinished()
|
||||
{
|
||||
MultipartJob *job = qobject_cast<MultipartJob *>(sender());
|
||||
Q_ASSERT(job);
|
||||
slotJobDestroyed(job); // remove it from the _jobs list
|
||||
|
||||
qDebug() << Q_FUNC_INFO << job->reply()->request().url() << "FINISHED WITH STATUS"
|
||||
<< job->reply()->error()
|
||||
<< (job->reply()->error() == QNetworkReply::NoError ? QLatin1String("") : job->reply()->errorString())
|
||||
<< job->reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute)
|
||||
<< job->reply()->attribute(QNetworkRequest::HttpReasonPhraseAttribute);
|
||||
|
||||
_propagator->_activeJobList.removeOne(this);
|
||||
|
||||
QNetworkReply::NetworkError err = job->reply()->error();
|
||||
|
||||
#if QT_VERSION < QT_VERSION_CHECK(5, 4, 2)
|
||||
if (job->reply()->error() == QNetworkReply::OperationCanceledError && job->reply()->property(owncloudShouldSoftCancelPropertyName).isValid()) {
|
||||
// Abort the job and try again later.
|
||||
// This works around a bug in QNAM wich might reuse a non-empty buffer for the next request.
|
||||
qDebug() << "Forcing job abort on HTTP connection reset with Qt < 5.4.2.";
|
||||
_propagator->_anotherSyncNeeded = true;
|
||||
abortWithError(SyncFileItem::SoftError, tr("Forcing job abort on HTTP connection reset with Qt < 5.4.2."));
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (err != QNetworkReply::NoError) {
|
||||
_item->_httpErrorCode = job->reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
|
||||
|
||||
QByteArray replyContent = job->reply()->readAll();
|
||||
qDebug() << replyContent; // display the XML error in the debug
|
||||
QString errorString = errorMessage(job->errorString(), replyContent);
|
||||
|
||||
if (job->reply()->hasRawHeader("OC-ErrorString")) {
|
||||
errorString = job->reply()->rawHeader("OC-ErrorString");
|
||||
}
|
||||
|
||||
abortWithError(SyncFileItem::SoftError, errorString);
|
||||
return;
|
||||
}
|
||||
|
||||
// Parse DAV response
|
||||
QXmlStreamReader reader(job->reply());
|
||||
reader.addExtraNamespaceDeclaration(QXmlStreamNamespaceDeclaration("d", "DAV:"));
|
||||
|
||||
QString currentHref;
|
||||
QString currentOcPath;
|
||||
QString expectedPath(_propagator->account()->davFilesPath());
|
||||
QMap<QString, QString> itemProperties;
|
||||
QMap<QString, QMap<QString, QString> > responseObjectsProperties;
|
||||
bool insidePropstat = false;
|
||||
bool insideProp = false;
|
||||
bool insideError = false;
|
||||
|
||||
while (!reader.atEnd()) {
|
||||
QXmlStreamReader::TokenType type = reader.readNext();
|
||||
QString name = reader.name().toString();
|
||||
// Start elements with DAV:
|
||||
if (type == QXmlStreamReader::StartElement && reader.namespaceUri() == QLatin1String("DAV:")) {
|
||||
if (name == QLatin1String("href")) {
|
||||
// We don't use URL encoding in our request URL (which is the expected path) (QNAM will do it for us)
|
||||
// but the result will have URL encoding..
|
||||
QString hrefString = QString::fromUtf8(QByteArray::fromPercentEncoding(reader.readElementText().toUtf8()));
|
||||
if (!hrefString.endsWith(expectedPath)) {
|
||||
qDebug() << "Invalid href" << hrefString << "expected ending with" << expectedPath;
|
||||
}
|
||||
currentHref = hrefString;
|
||||
} else if (name == QLatin1String("response")) {
|
||||
continue;
|
||||
} else if (name == QLatin1String("propstat")) {
|
||||
insidePropstat = true;
|
||||
} else if (name == QLatin1String("status") && insidePropstat) {
|
||||
QString httpStatus = reader.readElementText();
|
||||
itemProperties.insert(name, httpStatus);
|
||||
} else if (name == QLatin1String("prop")) {
|
||||
insideProp = true;
|
||||
continue;
|
||||
} else if (name == QLatin1String("multistatus")) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (type == QXmlStreamReader::StartElement && insidePropstat && insideProp) {
|
||||
if (name == QLatin1String("oc-path")){
|
||||
currentOcPath = reader.readElementText(QXmlStreamReader::SkipChildElements);
|
||||
} else if (name == QLatin1String("error")){
|
||||
insideError = true;
|
||||
} else if (name == QLatin1String("exception") && insideError){
|
||||
itemProperties.insert(name, reader.readElementText(QXmlStreamReader::SkipChildElements));
|
||||
} else if (name == QLatin1String("message") && insideError){
|
||||
itemProperties.insert(name, reader.readElementText(QXmlStreamReader::SkipChildElements));
|
||||
} else{
|
||||
itemProperties.insert(name, reader.readElementText(QXmlStreamReader::SkipChildElements));
|
||||
}
|
||||
}
|
||||
|
||||
// End elements with DAV:
|
||||
if (type == QXmlStreamReader::EndElement) {
|
||||
if (reader.namespaceUri() == QLatin1String("DAV:")) {
|
||||
if (reader.name() == "response") {
|
||||
currentHref.clear();
|
||||
} else if (reader.name() == "propstat") {
|
||||
insidePropstat = false;
|
||||
if (!currentOcPath.isEmpty()){
|
||||
responseObjectsProperties.insert(currentOcPath, QMap<QString,QString>(itemProperties));
|
||||
}
|
||||
currentOcPath.clear();
|
||||
itemProperties.clear();
|
||||
} else if (reader.name() == "prop") {
|
||||
insideProp = false;
|
||||
} else if (reader.name() == "error") {
|
||||
insideError = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (reader.hasError()) {
|
||||
// XML Parser error? Whatever had been emitted before will come as directoryListingIterated
|
||||
qDebug() << "ERROR" << reader.errorString();
|
||||
abortWithError(SyncFileItem::SoftError, tr("Cannot parse multistatus response!"));
|
||||
return;
|
||||
}
|
||||
|
||||
QVector<SyncFileItemPtr> syncItems = job->syncItems();
|
||||
|
||||
//get the total duration, and try to estimate sync time for single item in the bundle
|
||||
quint64 avgItemDuration = job->_duration.elapsed()/syncItems.count();
|
||||
|
||||
foreach(SyncFileItemPtr item, syncItems) {
|
||||
item->_requestDuration = avgItemDuration;
|
||||
item->_responseTimeStamp = job->responseTimestamp();
|
||||
slotItemFinished(item, responseObjectsProperties);
|
||||
}
|
||||
|
||||
// performance logging
|
||||
qDebug() << "*==* duration BUNDLE UPLOAD" << syncItems.count() << "items synced"
|
||||
<< "average duration" << avgItemDuration;
|
||||
// The job might stay alive for the whole sync, release this tiny bit of memory.
|
||||
|
||||
if (_jobs.empty() && _itemsToChecksum.isEmpty()){
|
||||
done(SyncFileItem::Success);
|
||||
} else if (!_preparingBundle){
|
||||
start();
|
||||
}
|
||||
}
|
||||
|
||||
void PropagateBundle::slotItemFinished(const SyncFileItemPtr &item, QMap<QString, QMap<QString, QString> > &responseObjectsProperties)
|
||||
{
|
||||
QString itemFilePath(getRemotePath(item->_file));
|
||||
QMap<QString, QString> fileProperties = responseObjectsProperties.value(itemFilePath);
|
||||
|
||||
item->_httpErrorCode = getHttpStatusCode(fileProperties.value("status"));
|
||||
|
||||
if (200 == item->_httpErrorCode){
|
||||
// Check if the file still exists
|
||||
const QString fullFilePath(_propagator->getFilePath(item->_file));
|
||||
if( !FileSystem::fileExists(fullFilePath) ) {
|
||||
_propagator->_anotherSyncNeeded = true;
|
||||
}
|
||||
|
||||
if (! FileSystem::verifyFileUnchanged(fullFilePath, item->_size, item->_modtime)) {
|
||||
_propagator->_anotherSyncNeeded = true;
|
||||
}
|
||||
|
||||
//OC-FileID section
|
||||
if (fileProperties.contains("oc-fileid")){
|
||||
QString fid = fileProperties.value("oc-fileid");
|
||||
if( !item->_fileId.isEmpty() && item->_fileId != fid ) {
|
||||
qDebug() << "WARN: File ID changed!" << item->_fileId << fid;
|
||||
}
|
||||
item->_fileId =fid.toStdString().c_str();
|
||||
}
|
||||
|
||||
//OC-ETag section
|
||||
QByteArray ocEtag = parseEtag(fileProperties.value("oc-etag").toStdString().c_str());
|
||||
QByteArray etag = parseEtag(fileProperties.value("etag").toStdString().c_str());
|
||||
item->_etag = ocEtag.isEmpty() ? etag : ocEtag;
|
||||
if (ocEtag.length() > 0 && ocEtag != etag) {
|
||||
qDebug() << "Quite peculiar, we have an etag != OC-Etag [no problem!]" << etag << ocEtag;
|
||||
}
|
||||
|
||||
if (fileProperties.value("x-oc-mtime") != "accepted"){
|
||||
// X-OC-MTime is supported since owncloud 5.0. But not when chunking.
|
||||
// Normally Owncloud 6 always puts X-OC-MTime
|
||||
qWarning() << "Server does not support X-OC-MTime" << fileProperties.value("x-oc-mtime");
|
||||
// Well, the mtime was not set
|
||||
itemDone(item, SyncFileItem::SoftError, "Server does not support X-OC-MTime");
|
||||
return;
|
||||
}
|
||||
} else{
|
||||
//We do not check for problems with shared folder since it is only CREATE
|
||||
//TODO: if the file will support update, ensure to override checkForProblemsWithShared()
|
||||
|
||||
qDebug() << Q_FUNC_INFO << item->_file << "ERROR WITH STATUS"
|
||||
<< fileProperties.value("status")
|
||||
<< fileProperties.value("exception")
|
||||
<< fileProperties.value("message");
|
||||
|
||||
if (412 == _item->_httpErrorCode) {
|
||||
// Precondition Failed: Maybe the bad etag is in the database, we need to clear the
|
||||
// parent folder etag so we won't read from DB next sync.
|
||||
_propagator->_journal->avoidReadFromDbOnNextSync(item->_file);
|
||||
_propagator->_anotherSyncNeeded = true;
|
||||
}
|
||||
|
||||
item->_errorString = fileProperties.value("message");
|
||||
item->_status = classifyError(QNetworkReply::ContentOperationNotPermittedError, item->_httpErrorCode,
|
||||
&_propagator->_anotherSyncNeeded);
|
||||
itemDone(item, item->_status, item->_errorString);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!_propagator->_journal->setFileRecord(SyncJournalFileRecord(*item, _propagator->getFilePath(item->_file)))) {
|
||||
itemDone(item, SyncFileItem::FatalError, tr("Error writing metadata to the database"));
|
||||
return;
|
||||
}
|
||||
|
||||
// Remove from the progress database:
|
||||
_propagator->_journal->setUploadInfo(item->_file, SyncJournalDb::UploadInfo());
|
||||
_propagator->_journal->commit("upload file start");
|
||||
itemDone(item, SyncFileItem::Success);
|
||||
}
|
||||
|
||||
int PropagateBundle::getHttpStatusCode(const QString &status){
|
||||
//if cannot read code, it means that server is not supported and raise 500 Internal Server Error
|
||||
int code = 500;
|
||||
QStringList statusList = status.split(QRegExp("\\s+"));
|
||||
if (2 < statusList.size()){
|
||||
//we expect status list to be at least 3 elements and second element to be the http error code
|
||||
code = statusList.at(1).toInt();
|
||||
}
|
||||
return code;
|
||||
}
|
||||
|
||||
void PropagateBundle::slotJobDestroyed(QObject* job)
|
||||
{
|
||||
_jobs.erase(std::remove(_jobs.begin(), _jobs.end(), job) , _jobs.end());
|
||||
}
|
||||
|
||||
// This function is used whenever there is an error occuring and we need to raise status for whole the bundle
|
||||
void PropagateBundle::abortWithError(SyncFileItem::Status status, const QString &error)
|
||||
{
|
||||
foreach(auto *job, _jobs) {
|
||||
if (job->reply()) {
|
||||
qDebug() << Q_FUNC_INFO << job;
|
||||
job->reply()->abort();
|
||||
}
|
||||
}
|
||||
|
||||
done(status, error);
|
||||
}
|
||||
|
||||
MultipartJob::~MultipartJob()
|
||||
{
|
||||
// Make sure that we destroy the QNetworkReply before our _device of which it keeps an internal pointer.
|
||||
setReply(0);
|
||||
}
|
||||
|
||||
void MultipartJob::start() {
|
||||
QNetworkRequest req;
|
||||
setReply(multipartRequest(path(), req, _multipart));
|
||||
_multipart->setParent(reply()); // delete the multiPart with the job
|
||||
setupConnections(reply());
|
||||
|
||||
if( reply()->error() != QNetworkReply::NoError ) {
|
||||
qWarning() << Q_FUNC_INFO << " Network error: " << reply()->errorString();
|
||||
}
|
||||
|
||||
connect(this, SIGNAL(networkActivity()), account().data(), SIGNAL(propagatorNetworkActivity()));
|
||||
|
||||
//TODO this uses _device, and we have no access here to that
|
||||
// // For Qt versions not including https://codereview.qt-project.org/110150
|
||||
// // Also do the runtime check if compiled with an old Qt but running with fixed one.
|
||||
// // (workaround disabled on windows and mac because the binaries we ship have patched qt)
|
||||
//#if QT_VERSION < QT_VERSION_CHECK(4, 8, 7)
|
||||
// if (QLatin1String(qVersion()) < QLatin1String("4.8.7"))
|
||||
// connect(_device.data(), SIGNAL(wasReset()), this, SLOT(slotSoftAbort()));
|
||||
//#elif QT_VERSION > QT_VERSION_CHECK(5, 0, 0) && QT_VERSION < QT_VERSION_CHECK(5, 4, 2) && !defined Q_OS_WIN && !defined Q_OS_MAC
|
||||
// if (QLatin1String(qVersion()) < QLatin1String("5.4.2"))
|
||||
// connect(_device.data(), SIGNAL(wasReset()), this, SLOT(slotSoftAbort()));
|
||||
//#endif
|
||||
|
||||
AbstractNetworkJob::start();
|
||||
}
|
||||
|
||||
void MultipartJob::slotTimeout() {
|
||||
qDebug() << "Timeout" << (reply() ? reply()->request().url() : path());
|
||||
if (!reply())
|
||||
return;
|
||||
_errorString = tr("Connection Timeout");
|
||||
reply()->abort();
|
||||
}
|
||||
|
||||
#if QT_VERSION < QT_VERSION_CHECK(5, 4, 2)
|
||||
void MultipartJob::slotSoftAbort() {
|
||||
reply()->setProperty(owncloudShouldSoftCancelPropertyName, true);
|
||||
reply()->abort();
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
#include <QFile>
|
||||
#include <QDebug>
|
||||
|
||||
|
||||
namespace OCC {
|
||||
class BandwidthManager;
|
||||
|
||||
@@ -122,51 +123,6 @@ private slots:
|
||||
#endif
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief The MultipartJob class
|
||||
* @ingroup libsync
|
||||
*/
|
||||
class MultipartJob : public AbstractNetworkJob {
|
||||
Q_OBJECT
|
||||
|
||||
private:
|
||||
QVector<SyncFileItemPtr> _syncItems;
|
||||
QHttpMultiPart* _multipart;
|
||||
QString _errorString;
|
||||
public:
|
||||
QElapsedTimer _duration;
|
||||
// Takes ownership of the device
|
||||
explicit MultipartJob(AccountPtr account, const QString& path, QHttpMultiPart* multiPart, const QVector<SyncFileItemPtr> &syncItems,QObject* parent = 0)
|
||||
: AbstractNetworkJob(account, path, parent), _syncItems(syncItems), _multipart(multiPart), _errorString(QString()) {}
|
||||
~MultipartJob();
|
||||
|
||||
virtual void start() Q_DECL_OVERRIDE;
|
||||
|
||||
virtual bool finished() Q_DECL_OVERRIDE {
|
||||
emit finishedSignal();
|
||||
return true;
|
||||
}
|
||||
|
||||
QString errorString() {
|
||||
return _errorString.isEmpty() ? reply()->errorString() : _errorString;
|
||||
}
|
||||
|
||||
QVector<SyncFileItemPtr> syncItems() const {
|
||||
return _syncItems;
|
||||
}
|
||||
|
||||
virtual void slotTimeout() Q_DECL_OVERRIDE;
|
||||
|
||||
|
||||
signals:
|
||||
void finishedSignal();
|
||||
|
||||
private slots:
|
||||
#if QT_VERSION < 0x050402
|
||||
void slotSoftAbort();
|
||||
#endif
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief This job implements the asynchronous PUT
|
||||
*
|
||||
@@ -239,8 +195,6 @@ public:
|
||||
: PropagateItemJob(propagator, item), _startChunk(0), _currentChunk(0), _chunkCount(0), _transferId(0), _finished(false), _deleteExisting(false) {}
|
||||
void start() Q_DECL_OVERRIDE;
|
||||
|
||||
bool isLikelyFinishedQuickly() Q_DECL_OVERRIDE { return _item->_size < 100*1024; }
|
||||
|
||||
/**
|
||||
* Whether an existing entity with the same name may be deleted before
|
||||
* the upload.
|
||||
@@ -266,66 +220,5 @@ private:
|
||||
void abortWithError(SyncFileItem::Status status, const QString &error);
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief The PropagateBundle class
|
||||
* @ingroup libsync
|
||||
*/
|
||||
class PropagateBundle : public PropagateItemJob {
|
||||
Q_OBJECT
|
||||
|
||||
private:
|
||||
QLinkedList<SyncFileItemPtr> _itemsToSync;
|
||||
QLinkedList<SyncFileItemPtr> _itemsToChecksum;
|
||||
QVector<MultipartJob*> _jobs; /// network jobs that are currently in transit
|
||||
bool _running; // Tells that all the jobs have been finished
|
||||
bool _preparingBundle; // Tells that all the jobs have been finished
|
||||
quint64 _size; // Tells what is the total size of _itemsToSync inside the bundle
|
||||
quint64 _currentBundleSize;
|
||||
quint64 _currentRequestsNumber;
|
||||
quint64 _totalFiles;
|
||||
// measure the performance of checksum calc and upload
|
||||
Utility::StopWatch _stopWatch;
|
||||
|
||||
public:
|
||||
PropagateBundle(OwncloudPropagator* propagator)
|
||||
: PropagateItemJob(propagator, SyncFileItemPtr(new SyncFileItem)), _running(false), _preparingBundle(true), _size(0), _currentBundleSize(0), _currentRequestsNumber(0) {}
|
||||
void start() Q_DECL_OVERRIDE;
|
||||
void startBundle();
|
||||
void append(const SyncFileItemPtr &bundledFile);
|
||||
QByteArray getRemotePath(QString filePath);
|
||||
bool empty();
|
||||
bool scheduleNextJob() Q_DECL_OVERRIDE {
|
||||
if (_running != true && _propagator->runningNowAtRootJob() == 1){
|
||||
_running = true;
|
||||
QMetaObject::invokeMethod(this, "start"); // We could be in a different thread (neon jobs)
|
||||
}
|
||||
if (_state == NotYetStarted){
|
||||
_state = Running;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
quint64 syncItemsSize() const { return _size; }
|
||||
quint64 syncItemsNumber() const { return _itemsToChecksum.count(); }
|
||||
private slots:
|
||||
void slotComputeTransmissionChecksum();
|
||||
void slotStartUpload(const QByteArray& transmissionChecksumType, const QByteArray& transmissionChecksum);
|
||||
void slotMultipartFinished();
|
||||
void slotJobDestroyed(QObject *job);
|
||||
void abortWithError(SyncFileItem::Status status, const QString &error);
|
||||
|
||||
private:
|
||||
quint64 checkBundledRequestsLimits()
|
||||
{
|
||||
//TODO: obtain this value from the server or by other means
|
||||
quint64 maximumBundledFiles = 500;
|
||||
return (maximumBundledFiles/_propagator->maximumActiveJob());
|
||||
}
|
||||
quint64 chunkSize() const { return _propagator->chunkSize(); }
|
||||
int getHttpStatusCode(const QString &status);
|
||||
void slotItemFinished(const SyncFileItemPtr &item, QMap<QString, QMap<QString, QString> > &responseObjectsProperties);
|
||||
void itemDone(SyncFileItemPtr item, SyncFileItem::Status status, const QString &errorString = QString());
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
|
||||
#include "propagatorjobs.h"
|
||||
#include "owncloudpropagator_p.h"
|
||||
#include "propagateremotemove.h"
|
||||
|
||||
#include "utility.h"
|
||||
#include "syncjournaldb.h"
|
||||
#include "syncjournalfilerecord.h"
|
||||
@@ -231,7 +231,6 @@ void PropagateLocalRename::start()
|
||||
_propagator->_journal->deleteFileRecord(_item->_originalFile);
|
||||
|
||||
// store the rename file name in the item.
|
||||
const auto oldFile = _item->_file;
|
||||
_item->_file = _item->_renameTarget;
|
||||
|
||||
SyncJournalFileRecord record(*_item, targetFile);
|
||||
@@ -246,15 +245,10 @@ void PropagateLocalRename::start()
|
||||
done(SyncFileItem::FatalError, tr("Error writing metadata to the database"));
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
if (!PropagateRemoteMove::adjustSelectiveSync(_propagator->_journal, oldFile, _item->_renameTarget)) {
|
||||
done(SyncFileItem::FatalError, tr("Error writing metadata to the database"));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
_propagator->_journal->commit("localRename");
|
||||
|
||||
|
||||
done(SyncFileItem::Success);
|
||||
}
|
||||
|
||||
|
||||
@@ -1163,7 +1163,7 @@ void SyncEngine::checkForPermission()
|
||||
qDebug() << "Moving of " << (*it)->_file << " canceled because no permission to add parent folder";
|
||||
}
|
||||
(*it)->_instruction = CSYNC_INSTRUCTION_ERROR;
|
||||
(*it)->_status = SyncFileItem::SoftError;
|
||||
(*it)->_status = SyncFileItem::NormalError;
|
||||
(*it)->_errorString = tr("Not allowed because you don't have permission to add parent folder");
|
||||
}
|
||||
|
||||
|
||||
@@ -202,6 +202,7 @@ private:
|
||||
SyncJournalDb *_journal;
|
||||
QPointer<DiscoveryMainThread> _discoveryMainThread;
|
||||
QSharedPointer <OwncloudPropagator> _propagator;
|
||||
QString _lastDeleted; // if the last item was a path and it has been deleted
|
||||
|
||||
// After a sync, only the syncdb entries whose filenames appear in this
|
||||
// set will be kept. See _temporarilyUnavailablePaths.
|
||||
|
||||
@@ -45,7 +45,6 @@ public:
|
||||
|
||||
enum Type {
|
||||
UnknownType = 0,
|
||||
RequestsContainer = 1,
|
||||
File = CSYNC_FTW_TYPE_FILE,
|
||||
Directory = CSYNC_FTW_TYPE_DIR,
|
||||
SoftLink = CSYNC_FTW_TYPE_SLINK
|
||||
|
||||
@@ -318,9 +318,7 @@ bool SyncJournalDb::checkConnect()
|
||||
createQuery.bindValue(2, MIRALL_VERSION_MINOR);
|
||||
createQuery.bindValue(3, MIRALL_VERSION_PATCH);
|
||||
createQuery.bindValue(4, MIRALL_VERSION_BUILD);
|
||||
if (!createQuery.exec()) {
|
||||
return sqlFail("Update version", createQuery);
|
||||
}
|
||||
createQuery.exec();
|
||||
|
||||
} else {
|
||||
int major = versionQuery.intValue(0);
|
||||
@@ -331,15 +329,6 @@ bool SyncJournalDb::checkConnect()
|
||||
qDebug() << Q_FUNC_INFO << "possibleUpgradeFromMirall_1_8_0_or_1 detected!";
|
||||
forceRemoteDiscovery = true;
|
||||
}
|
||||
|
||||
// There was a bug in versions <2.3.0 that could lead to stale
|
||||
// local files and a remote discovery will fix them.
|
||||
// See #5190 #5242.
|
||||
if( major == 2 && minor < 3) {
|
||||
qDebug() << Q_FUNC_INFO << "upgrade form client < 2.3.0 detected! forcing remote discovery";
|
||||
forceRemoteDiscovery = true;
|
||||
}
|
||||
|
||||
// Not comparing the BUILD id here, correct?
|
||||
if( !(major == MIRALL_VERSION_MAJOR && minor == MIRALL_VERSION_MINOR && patch == MIRALL_VERSION_PATCH) ) {
|
||||
createQuery.prepare("UPDATE version SET major=?1, minor=?2, patch =?3, custom=?4 "
|
||||
@@ -378,84 +367,60 @@ bool SyncJournalDb::checkConnect()
|
||||
}
|
||||
|
||||
_getFileRecordQuery.reset(new SqlQuery(_db));
|
||||
if (_getFileRecordQuery->prepare(
|
||||
_getFileRecordQuery->prepare(
|
||||
"SELECT path, inode, uid, gid, mode, modtime, type, md5, fileid, remotePerm, filesize,"
|
||||
" ignoredChildrenRemote, contentChecksum, contentchecksumtype.name"
|
||||
" FROM metadata"
|
||||
" LEFT JOIN checksumtype as contentchecksumtype ON metadata.contentChecksumTypeId == contentchecksumtype.id"
|
||||
" WHERE phash=?1" )) {
|
||||
return sqlFail("prepare _getFileRecordQuery", *_getFileRecordQuery);
|
||||
}
|
||||
" WHERE phash=?1" );
|
||||
|
||||
_setFileRecordQuery.reset(new SqlQuery(_db) );
|
||||
if (_setFileRecordQuery->prepare("INSERT OR REPLACE INTO metadata "
|
||||
_setFileRecordQuery->prepare("INSERT OR REPLACE INTO metadata "
|
||||
"(phash, pathlen, path, inode, uid, gid, mode, modtime, type, md5, fileid, remotePerm, filesize, ignoredChildrenRemote, contentChecksum, contentChecksumTypeId) "
|
||||
"VALUES (?1 , ?2, ?3 , ?4 , ?5 , ?6 , ?7, ?8 , ?9 , ?10, ?11, ?12, ?13, ?14, ?15, ?16);" )) {
|
||||
return sqlFail("prepare _setFileRecordQuery", *_setFileRecordQuery);
|
||||
}
|
||||
"VALUES (?1 , ?2, ?3 , ?4 , ?5 , ?6 , ?7, ?8 , ?9 , ?10, ?11, ?12, ?13, ?14, ?15, ?16);" );
|
||||
|
||||
_setFileRecordChecksumQuery.reset(new SqlQuery(_db) );
|
||||
if (_setFileRecordChecksumQuery->prepare(
|
||||
_setFileRecordChecksumQuery->prepare(
|
||||
"UPDATE metadata"
|
||||
" SET contentChecksum = ?2, contentChecksumTypeId = ?3"
|
||||
" WHERE phash == ?1;")) {
|
||||
return sqlFail("prepare _setFileRecordChecksumQuery", *_setFileRecordChecksumQuery);
|
||||
}
|
||||
" WHERE phash == ?1;");
|
||||
|
||||
_setFileRecordLocalMetadataQuery.reset(new SqlQuery(_db));
|
||||
if (_setFileRecordLocalMetadataQuery->prepare(
|
||||
_setFileRecordLocalMetadataQuery->prepare(
|
||||
"UPDATE metadata"
|
||||
" SET inode=?2, modtime=?3, filesize=?4"
|
||||
" WHERE phash == ?1;")) {
|
||||
return sqlFail("prepare _setFileRecordLocalMetadataQuery", *_setFileRecordLocalMetadataQuery);
|
||||
}
|
||||
" WHERE phash == ?1;");
|
||||
|
||||
_getDownloadInfoQuery.reset(new SqlQuery(_db) );
|
||||
if (_getDownloadInfoQuery->prepare( "SELECT tmpfile, etag, errorcount FROM "
|
||||
"downloadinfo WHERE path=?1" )) {
|
||||
return sqlFail("prepare _getDownloadInfoQuery", *_getDownloadInfoQuery);
|
||||
}
|
||||
_getDownloadInfoQuery->prepare( "SELECT tmpfile, etag, errorcount FROM "
|
||||
"downloadinfo WHERE path=?1" );
|
||||
|
||||
_setDownloadInfoQuery.reset(new SqlQuery(_db) );
|
||||
if (_setDownloadInfoQuery->prepare( "INSERT OR REPLACE INTO downloadinfo "
|
||||
_setDownloadInfoQuery->prepare( "INSERT OR REPLACE INTO downloadinfo "
|
||||
"(path, tmpfile, etag, errorcount) "
|
||||
"VALUES ( ?1 , ?2, ?3, ?4 )" )) {
|
||||
return sqlFail("prepare _setDownloadInfoQuery", *_setDownloadInfoQuery);
|
||||
}
|
||||
"VALUES ( ?1 , ?2, ?3, ?4 )" );
|
||||
|
||||
_deleteDownloadInfoQuery.reset(new SqlQuery(_db) );
|
||||
if (_deleteDownloadInfoQuery->prepare( "DELETE FROM downloadinfo WHERE path=?1" )) {
|
||||
return sqlFail("prepare _deleteDownloadInfoQuery", *_deleteDownloadInfoQuery);
|
||||
}
|
||||
_deleteDownloadInfoQuery->prepare( "DELETE FROM downloadinfo WHERE path=?1" );
|
||||
|
||||
_getUploadInfoQuery.reset(new SqlQuery(_db));
|
||||
if (_getUploadInfoQuery->prepare( "SELECT chunk, transferid, errorcount, size, modtime FROM "
|
||||
"uploadinfo WHERE path=?1" )) {
|
||||
return sqlFail("prepare _getUploadInfoQuery", *_getUploadInfoQuery);
|
||||
}
|
||||
_getUploadInfoQuery->prepare( "SELECT chunk, transferid, errorcount, size, modtime FROM "
|
||||
"uploadinfo WHERE path=?1" );
|
||||
|
||||
_setUploadInfoQuery.reset(new SqlQuery(_db));
|
||||
if (_setUploadInfoQuery->prepare( "INSERT OR REPLACE INTO uploadinfo "
|
||||
_setUploadInfoQuery->prepare( "INSERT OR REPLACE INTO uploadinfo "
|
||||
"(path, chunk, transferid, errorcount, size, modtime) "
|
||||
"VALUES ( ?1 , ?2, ?3 , ?4 , ?5, ?6 )")) {
|
||||
return sqlFail("prepare _setUploadInfoQuery", *_setUploadInfoQuery);
|
||||
}
|
||||
"VALUES ( ?1 , ?2, ?3 , ?4 , ?5, ?6 )");
|
||||
|
||||
_deleteUploadInfoQuery.reset(new SqlQuery(_db));
|
||||
if (_deleteUploadInfoQuery->prepare("DELETE FROM uploadinfo WHERE path=?1" )) {
|
||||
return sqlFail("prepare _deleteUploadInfoQuery", *_deleteUploadInfoQuery);
|
||||
}
|
||||
_deleteUploadInfoQuery->prepare("DELETE FROM uploadinfo WHERE path=?1" );
|
||||
|
||||
|
||||
_deleteFileRecordPhash.reset(new SqlQuery(_db));
|
||||
if (_deleteFileRecordPhash->prepare("DELETE FROM metadata WHERE phash=?1")) {
|
||||
return sqlFail("prepare _deleteFileRecordPhash", *_deleteFileRecordPhash);
|
||||
}
|
||||
_deleteFileRecordPhash->prepare("DELETE FROM metadata WHERE phash=?1");
|
||||
|
||||
_deleteFileRecordRecursively.reset(new SqlQuery(_db));
|
||||
if (_deleteFileRecordRecursively->prepare("DELETE FROM metadata WHERE path LIKE(?||'/%')")) {
|
||||
return sqlFail("prepare _deleteFileRecordRecursively", *_deleteFileRecordRecursively);
|
||||
}
|
||||
_deleteFileRecordRecursively->prepare("DELETE FROM metadata WHERE path LIKE(?||'/%')");
|
||||
|
||||
QString sql( "SELECT lastTryEtag, lastTryModtime, retrycount, errorstring, lastTryTime, ignoreDuration, renameTarget "
|
||||
"FROM blacklist WHERE path=?1");
|
||||
@@ -465,50 +430,32 @@ bool SyncJournalDb::checkConnect()
|
||||
sql += QLatin1String(" COLLATE NOCASE");
|
||||
}
|
||||
_getErrorBlacklistQuery.reset(new SqlQuery(_db));
|
||||
if (_getErrorBlacklistQuery->prepare(sql)) {
|
||||
return sqlFail("prepare _getErrorBlacklistQuery", *_getErrorBlacklistQuery);
|
||||
}
|
||||
_getErrorBlacklistQuery->prepare(sql);
|
||||
|
||||
_setErrorBlacklistQuery.reset(new SqlQuery(_db));
|
||||
if (_setErrorBlacklistQuery->prepare("INSERT OR REPLACE INTO blacklist "
|
||||
_setErrorBlacklistQuery->prepare("INSERT OR REPLACE INTO blacklist "
|
||||
"(path, lastTryEtag, lastTryModtime, retrycount, errorstring, lastTryTime, ignoreDuration, renameTarget) "
|
||||
"VALUES ( ?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8)")) {
|
||||
return sqlFail("prepare _setErrorBlacklistQuery", *_setErrorBlacklistQuery);
|
||||
}
|
||||
"VALUES ( ?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8)");
|
||||
|
||||
_getSelectiveSyncListQuery.reset(new SqlQuery(_db));
|
||||
if (_getSelectiveSyncListQuery->prepare("SELECT path FROM selectivesync WHERE type=?1")) {
|
||||
return sqlFail("prepare _getSelectiveSyncListQuery", *_getSelectiveSyncListQuery);
|
||||
}
|
||||
_getSelectiveSyncListQuery->prepare("SELECT path FROM selectivesync WHERE type=?1");
|
||||
|
||||
_getChecksumTypeIdQuery.reset(new SqlQuery(_db));
|
||||
if (_getChecksumTypeIdQuery->prepare("SELECT id FROM checksumtype WHERE name=?1")) {
|
||||
return sqlFail("prepare _getChecksumTypeIdQuery", *_getChecksumTypeIdQuery);
|
||||
}
|
||||
_getChecksumTypeIdQuery->prepare("SELECT id FROM checksumtype WHERE name=?1");
|
||||
|
||||
_getChecksumTypeQuery.reset(new SqlQuery(_db));
|
||||
if (_getChecksumTypeQuery->prepare("SELECT name FROM checksumtype WHERE id=?1")) {
|
||||
return sqlFail("prepare _getChecksumTypeQuery", *_getChecksumTypeQuery);
|
||||
}
|
||||
_getChecksumTypeQuery->prepare("SELECT name FROM checksumtype WHERE id=?1");
|
||||
|
||||
_insertChecksumTypeQuery.reset(new SqlQuery(_db));
|
||||
if (_insertChecksumTypeQuery->prepare("INSERT OR IGNORE INTO checksumtype (name) VALUES (?1)")) {
|
||||
return sqlFail("prepare _insertChecksumTypeQuery", *_insertChecksumTypeQuery);
|
||||
}
|
||||
_insertChecksumTypeQuery->prepare("INSERT OR IGNORE INTO checksumtype (name) VALUES (?1)");
|
||||
|
||||
_getDataFingerprintQuery.reset(new SqlQuery(_db));
|
||||
if (_getDataFingerprintQuery->prepare("SELECT fingerprint FROM datafingerprint")) {
|
||||
return sqlFail("prepare _getDataFingerprintQuery", *_getDataFingerprintQuery);
|
||||
}
|
||||
_getDataFingerprintQuery->prepare("SELECT fingerprint FROM datafingerprint");
|
||||
|
||||
_setDataFingerprintQuery1.reset(new SqlQuery(_db));
|
||||
if (_setDataFingerprintQuery1->prepare("DELETE FROM datafingerprint;")) {
|
||||
return sqlFail("prepare _setDataFingerprintQuery1", *_setDataFingerprintQuery1);
|
||||
}
|
||||
_setDataFingerprintQuery1->prepare("DELETE FROM datafingerprint;");
|
||||
_setDataFingerprintQuery2.reset(new SqlQuery(_db));
|
||||
if (_setDataFingerprintQuery2->prepare("INSERT INTO datafingerprint (fingerprint) VALUES (?1);")) {
|
||||
return sqlFail("prepare _setDataFingerprintQuery2", *_setDataFingerprintQuery2);
|
||||
}
|
||||
_setDataFingerprintQuery2->prepare("INSERT INTO datafingerprint (fingerprint) VALUES (?1);");
|
||||
|
||||
// don't start a new transaction now
|
||||
commitInternal(QString("checkConnect End"), false);
|
||||
|
||||
+7
-22
@@ -115,11 +115,11 @@ QIcon Theme::trayFolderIcon( const QString& backend ) const
|
||||
* helper to load a icon from either the icon theme the desktop provides or from
|
||||
* the apps Qt resources.
|
||||
*/
|
||||
QIcon Theme::themeIcon( const QString& name, bool sysTray, bool sysTrayMenuVisible ) const
|
||||
QIcon Theme::themeIcon( const QString& name, bool sysTray ) const
|
||||
{
|
||||
QString flavor;
|
||||
if (sysTray) {
|
||||
flavor = systrayIconFlavor(_mono, sysTrayMenuVisible);
|
||||
flavor = systrayIconFlavor(_mono);
|
||||
} else {
|
||||
flavor = QLatin1String("colored");
|
||||
}
|
||||
@@ -158,14 +158,6 @@ QIcon Theme::themeIcon( const QString& name, bool sysTray, bool sysTrayMenuVisib
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef Q_OS_MAC
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)
|
||||
// This defines the icon as a template and enables automatic macOS color handling
|
||||
// See https://bugreports.qt.io/browse/QTBUG-42109
|
||||
cached.setIsMask(_mono && sysTray && !sysTrayMenuVisible);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
return cached;
|
||||
}
|
||||
|
||||
@@ -235,18 +227,11 @@ QString Theme::defaultClientFolder() const
|
||||
return appName();
|
||||
}
|
||||
|
||||
QString Theme::systrayIconFlavor(bool mono, bool sysTrayMenuVisible ) const
|
||||
QString Theme::systrayIconFlavor(bool mono) const
|
||||
{
|
||||
Q_UNUSED(sysTrayMenuVisible)
|
||||
QString flavor;
|
||||
if (mono) {
|
||||
flavor = Utility::hasDarkSystray() ? QLatin1String("white") : QLatin1String("black");
|
||||
|
||||
#ifdef Q_OS_MAC
|
||||
if (sysTrayMenuVisible) {
|
||||
flavor = QLatin1String("white");
|
||||
}
|
||||
#endif
|
||||
} else {
|
||||
flavor = QLatin1String("colored");
|
||||
}
|
||||
@@ -346,7 +331,7 @@ QVariant Theme::customMedia( CustomMediaType type )
|
||||
return re;
|
||||
}
|
||||
|
||||
QIcon Theme::syncStateIcon( SyncResult::Status status, bool sysTray, bool sysTrayMenuVisible ) const
|
||||
QIcon Theme::syncStateIcon( SyncResult::Status status, bool sysTray ) const
|
||||
{
|
||||
// FIXME: Mind the size!
|
||||
QString statusIcon;
|
||||
@@ -378,7 +363,7 @@ QIcon Theme::syncStateIcon( SyncResult::Status status, bool sysTray, bool sysTra
|
||||
statusIcon = QLatin1String("state-error");
|
||||
}
|
||||
|
||||
return themeIcon( statusIcon, sysTray, sysTrayMenuVisible );
|
||||
return themeIcon( statusIcon, sysTray );
|
||||
}
|
||||
|
||||
QIcon Theme::folderDisabledIcon( ) const
|
||||
@@ -386,9 +371,9 @@ QIcon Theme::folderDisabledIcon( ) const
|
||||
return themeIcon( QLatin1String("state-pause") );
|
||||
}
|
||||
|
||||
QIcon Theme::folderOfflineIcon(bool sysTray, bool sysTrayMenuVisible ) const
|
||||
QIcon Theme::folderOfflineIcon(bool systray) const
|
||||
{
|
||||
return themeIcon( QLatin1String("state-offline"), sysTray, sysTrayMenuVisible );
|
||||
return themeIcon( QLatin1String("state-offline"), systray );
|
||||
}
|
||||
|
||||
QColor Theme::wizardHeaderTitleColor() const
|
||||
|
||||
@@ -97,10 +97,10 @@ public:
|
||||
/**
|
||||
* get an sync state icon
|
||||
*/
|
||||
virtual QIcon syncStateIcon( SyncResult::Status, bool sysTray = false, bool sysTrayMenuVisible = false) const;
|
||||
virtual QIcon syncStateIcon( SyncResult::Status, bool sysTray = false ) const;
|
||||
|
||||
virtual QIcon folderDisabledIcon() const;
|
||||
virtual QIcon folderOfflineIcon(bool sysTray = false, bool sysTrayMenuVisible = false) const;
|
||||
virtual QIcon folderOfflineIcon(bool systray = false) const;
|
||||
virtual QIcon applicationIcon() const = 0;
|
||||
#endif
|
||||
|
||||
@@ -152,7 +152,7 @@ public:
|
||||
virtual QString enforcedLocale() const { return QString::null; }
|
||||
|
||||
/** colored, white or black */
|
||||
QString systrayIconFlavor(bool mono, bool sysTrayMenuVisible = false) const;
|
||||
QString systrayIconFlavor(bool mono) const;
|
||||
|
||||
#ifndef TOKEN_AUTH_ONLY
|
||||
/**
|
||||
@@ -304,7 +304,7 @@ public:
|
||||
|
||||
protected:
|
||||
#ifndef TOKEN_AUTH_ONLY
|
||||
QIcon themeIcon(const QString& name, bool sysTray = false, bool sysTrayMenuVisible = false) const;
|
||||
QIcon themeIcon(const QString& name, bool sysTray = false) const;
|
||||
#endif
|
||||
Theme();
|
||||
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
#include "utility.h"
|
||||
|
||||
#include "version.h"
|
||||
#include "configfile.h"
|
||||
|
||||
// Note: This file must compile without QtGui
|
||||
#include <QCoreApplication>
|
||||
@@ -587,41 +586,4 @@ void Utility::sortFilenames(QStringList& fileNames)
|
||||
#endif
|
||||
}
|
||||
|
||||
QUrl Utility::concatUrlPath(const QUrl &url, const QString &concatPath,
|
||||
const QList< QPair<QString, QString> > &queryItems)
|
||||
{
|
||||
QString path = url.path();
|
||||
if (! concatPath.isEmpty()) {
|
||||
// avoid '//'
|
||||
if (path.endsWith('/') && concatPath.startsWith('/')) {
|
||||
path.chop(1);
|
||||
} // avoid missing '/'
|
||||
else if (!path.endsWith('/') && !concatPath.startsWith('/')) {
|
||||
path += QLatin1Char('/');
|
||||
}
|
||||
path += concatPath; // put the complete path together
|
||||
}
|
||||
|
||||
QUrl tmpUrl = url;
|
||||
tmpUrl.setPath(path);
|
||||
if( queryItems.size() > 0 ) {
|
||||
tmpUrl.setQueryItems(queryItems);
|
||||
}
|
||||
return tmpUrl;
|
||||
}
|
||||
|
||||
Q_GLOBAL_STATIC(QString, g_configFileName)
|
||||
|
||||
std::unique_ptr<QSettings> Utility::settingsWithGroup(const QString& group, QObject *parent)
|
||||
{
|
||||
if (g_configFileName()->isEmpty()) {
|
||||
// cache file name
|
||||
ConfigFile cfg;
|
||||
*g_configFileName() = cfg.configFile();
|
||||
}
|
||||
std::unique_ptr<QSettings> settings(new QSettings(*g_configFileName(), QSettings::IniFormat, parent));
|
||||
settings->beginGroup(group);
|
||||
return settings;
|
||||
}
|
||||
|
||||
} // namespace OCC
|
||||
|
||||
@@ -21,10 +21,6 @@
|
||||
#include <QDateTime>
|
||||
#include <QElapsedTimer>
|
||||
#include <QMap>
|
||||
#include <QUrl>
|
||||
#include <memory>
|
||||
|
||||
class QSettings;
|
||||
|
||||
namespace OCC {
|
||||
|
||||
@@ -146,14 +142,6 @@ namespace Utility
|
||||
*/
|
||||
OWNCLOUDSYNC_EXPORT void sortFilenames(QStringList& fileNames);
|
||||
|
||||
/** Appends concatPath and queryItems to the url */
|
||||
OWNCLOUDSYNC_EXPORT QUrl concatUrlPath(
|
||||
const QUrl &url, const QString &concatPath,
|
||||
const QList< QPair<QString, QString> > &queryItems = (QList<QPair<QString, QString>>()));
|
||||
|
||||
/** Returns a new settings pre-set in a specific group. The Settings will be created
|
||||
with the given parent. If no parent is specified, the caller must destroy the settings */
|
||||
OWNCLOUDSYNC_EXPORT std::unique_ptr<QSettings> settingsWithGroup(const QString& group, QObject* parent = 0);
|
||||
}
|
||||
/** @} */ // \addtogroup
|
||||
|
||||
|
||||
@@ -27,9 +27,7 @@ ENDIF()
|
||||
|
||||
owncloud_add_test(FolderWatcher "${FolderWatcher_SRC}")
|
||||
if( UNIX AND NOT APPLE )
|
||||
if(HAVE_QT5 AND NOT BUILD_WITH_QT4)
|
||||
owncloud_add_test(InotifyWatcher "${FolderWatcher_SRC}")
|
||||
endif(HAVE_QT5 AND NOT BUILD_WITH_QT4)
|
||||
endif(UNIX AND NOT APPLE)
|
||||
|
||||
owncloud_add_test(CSyncSqlite "")
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
#include <QtTest>
|
||||
|
||||
static const QUrl sRootUrl("owncloud://somehost/owncloud/remote.php/webdav/");
|
||||
static const QUrl sBundleRootUrl("owncloud://somehost/remote.php/dav/files/");
|
||||
|
||||
inline QString generateEtag() {
|
||||
return QString::number(QDateTime::currentDateTime().toMSecsSinceEpoch(), 16);
|
||||
@@ -29,7 +28,6 @@ inline QByteArray generateFileId() {
|
||||
|
||||
class PathComponents : public QStringList {
|
||||
public:
|
||||
PathComponents(const char *path) : PathComponents{QString::fromUtf8(path)} {}
|
||||
PathComponents(const QString &path) : QStringList{path.split('/', QString::SkipEmptyParts)} { }
|
||||
PathComponents(const QStringList &pathComponents) : QStringList{pathComponents} { }
|
||||
|
||||
@@ -92,9 +90,8 @@ public:
|
||||
void mkdir(const QString &relativePath) override {
|
||||
_rootDir.mkpath(relativePath);
|
||||
}
|
||||
void rename(const QString &from, const QString &to) override {
|
||||
QVERIFY(_rootDir.exists(from));
|
||||
QVERIFY(_rootDir.rename(from, to));
|
||||
void rename(const QString &, const QString &) override {
|
||||
Q_ASSERT(!"not implemented");
|
||||
}
|
||||
};
|
||||
|
||||
@@ -460,36 +457,6 @@ public:
|
||||
qint64 readData(char *, qint64) override { return 0; }
|
||||
};
|
||||
|
||||
class FakeMoveReply : public QNetworkReply
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
FakeMoveReply(FileInfo &remoteRootFileInfo, QNetworkAccessManager::Operation op, const QNetworkRequest &request, QObject *parent)
|
||||
: QNetworkReply{parent} {
|
||||
setRequest(request);
|
||||
setUrl(request.url());
|
||||
setOperation(op);
|
||||
open(QIODevice::ReadOnly);
|
||||
|
||||
Q_ASSERT(request.url().path().startsWith(sRootUrl.path()));
|
||||
QString fileName = request.url().path().mid(sRootUrl.path().length());
|
||||
QString destPath = request.rawHeader("Destination");
|
||||
Q_ASSERT(destPath.startsWith(sRootUrl.path()));
|
||||
QString dest = destPath.mid(sRootUrl.path().length());
|
||||
remoteRootFileInfo.rename(fileName, dest);
|
||||
QMetaObject::invokeMethod(this, "respond", Qt::QueuedConnection);
|
||||
}
|
||||
|
||||
Q_INVOKABLE void respond() {
|
||||
setAttribute(QNetworkRequest::HttpStatusCodeAttribute, 201);
|
||||
emit metaDataChanged();
|
||||
emit finished();
|
||||
}
|
||||
|
||||
void abort() override { }
|
||||
qint64 readData(char *, qint64) override { return 0; }
|
||||
};
|
||||
|
||||
class FakeGetReply : public QNetworkReply
|
||||
{
|
||||
Q_OBJECT
|
||||
@@ -534,7 +501,6 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
class FakeErrorReply : public QNetworkReply
|
||||
{
|
||||
Q_OBJECT
|
||||
@@ -558,169 +524,6 @@ public:
|
||||
qint64 readData(char *, qint64) override { return 0; }
|
||||
};
|
||||
|
||||
class FakeBundlePOSTReply : public QNetworkReply
|
||||
{
|
||||
Q_OBJECT
|
||||
FileInfo *fileInfo;
|
||||
QByteArray payload;
|
||||
public:
|
||||
FakeBundlePOSTReply(FileInfo &remoteRootFileInfo, QNetworkAccessManager::Operation op, const QNetworkRequest &request, const QByteArray &postPayload, QObject *parent)
|
||||
: QNetworkReply{parent} {
|
||||
setRequest(request);
|
||||
QUrl rawUrl = request.url();
|
||||
QString bundlePath(sBundleRootUrl.path()+rawUrl.userName());
|
||||
setUrl(rawUrl);
|
||||
setOperation(op);
|
||||
open(QIODevice::ReadOnly);
|
||||
const QString davUri{QStringLiteral("DAV:")};
|
||||
const QString ocUri{QStringLiteral("http://owncloud.org/ns")};
|
||||
const QString sabUri{QStringLiteral("http://sabredav.org/ns")};
|
||||
QBuffer buffer{&payload};
|
||||
buffer.open(QIODevice::WriteOnly);
|
||||
QXmlStreamWriter xml( &buffer );
|
||||
xml.writeNamespace(davUri, "d");
|
||||
xml.writeNamespace(ocUri, "o");
|
||||
xml.writeNamespace(sabUri, "s");
|
||||
|
||||
auto writeFileResponse = [&](const FileInfo &fileInfo) {
|
||||
xml.writeStartElement(davUri, QStringLiteral("response"));
|
||||
|
||||
//TODO: no need for X-OC-PATH, href could contain that, fix client/server
|
||||
xml.writeTextElement(davUri, QStringLiteral("href"), bundlePath);
|
||||
xml.writeStartElement(davUri, QStringLiteral("propstat"));
|
||||
xml.writeStartElement(davUri, QStringLiteral("prop"));
|
||||
|
||||
xml.writeTextElement(davUri, QStringLiteral("oc-etag"), fileInfo.etag);
|
||||
xml.writeTextElement(davUri, QStringLiteral("etag"), fileInfo.etag);
|
||||
xml.writeTextElement(davUri, QStringLiteral("oc-fileid"), fileInfo.fileId);
|
||||
xml.writeTextElement(davUri, QStringLiteral("x-oc-mtime"), QStringLiteral("accepted"));
|
||||
|
||||
//TODO: this slash to be fixed on client/server
|
||||
xml.writeTextElement(davUri, QStringLiteral("oc-path"), "/"+fileInfo.path());
|
||||
xml.writeEndElement(); // prop
|
||||
xml.writeTextElement(davUri, QStringLiteral("status"), "HTTP/1.1 200 OK");
|
||||
xml.writeEndElement(); // propstat
|
||||
xml.writeEndElement(); // response
|
||||
};
|
||||
auto writeFileErrorResponse = [&](const FileInfo &fileInfo, const QString &exception, const QString &message, const QString &status) {
|
||||
xml.writeStartElement(davUri, QStringLiteral("response"));
|
||||
|
||||
//TODO: no need for X-OC-PATH, href could contain that, fix client/server
|
||||
xml.writeTextElement(davUri, QStringLiteral("href"), bundlePath);
|
||||
xml.writeStartElement(davUri, QStringLiteral("propstat"));
|
||||
xml.writeStartElement(davUri, QStringLiteral("prop"));
|
||||
xml.writeStartElement(davUri, QStringLiteral("error"));
|
||||
xml.writeTextElement(sabUri, QStringLiteral("exception"), exception);
|
||||
xml.writeTextElement(sabUri, QStringLiteral("message"), message);
|
||||
xml.writeEndElement(); // error
|
||||
|
||||
//TODO: this slash to be fixed on client/server
|
||||
xml.writeTextElement(davUri, QStringLiteral("oc-path"), "/"+fileInfo.path());
|
||||
xml.writeEndElement(); // prop
|
||||
xml.writeTextElement(davUri, QStringLiteral("status"), status);
|
||||
xml.writeEndElement(); // propstat
|
||||
xml.writeEndElement(); // response
|
||||
};
|
||||
|
||||
|
||||
if ("erroruser" == rawUrl.userName()) {
|
||||
xml.writeStartDocument();
|
||||
xml.writeStartElement(davUri, QStringLiteral("error"));
|
||||
xml.writeTextElement(sabUri, QStringLiteral("exception"), QStringLiteral("OCA\\DAV\\Connector\\Sabre\\Exception\\Forbidden"));
|
||||
xml.writeTextElement(sabUri, QStringLiteral("message"), QStringLiteral("URL endpoint has to be instance of \\OCA\\DAV\\Files\\FilesHome"));
|
||||
xml.writeTextElement(ocUri, QStringLiteral("retry"), QStringLiteral("false"));
|
||||
xml.writeTextElement(ocUri, QStringLiteral("reason"), QStringLiteral("URL endpoint has to be instance of \\OCA\\DAV\\Files\\FilesHome"));
|
||||
xml.writeEndElement(); // error
|
||||
xml.writeEndDocument();
|
||||
setAttribute(QNetworkRequest::HttpStatusCodeAttribute, 403);
|
||||
} else {
|
||||
Q_ASSERT(request.url().path().endsWith(bundlePath));
|
||||
xml.writeStartDocument();
|
||||
xml.writeStartElement(davUri, QStringLiteral("multistatus"));
|
||||
|
||||
//multipart parsing
|
||||
QString headerSectEnd = "\r\n\r\n";
|
||||
QString headerEnd = "\r\n";
|
||||
QString headerOcMethod = "X-OC-Method: ";
|
||||
QString headerConLen = "Content-Length: ";
|
||||
QString headerOcPath = "X-OC-Path: ";
|
||||
int indexOfBody = 0;
|
||||
QChar contentChar;
|
||||
|
||||
while(postPayload.indexOf(headerSectEnd,indexOfBody) + headerSectEnd.length() >=indexOfBody) {
|
||||
//find oc-method
|
||||
int indexOfheaderEnd = postPayload.indexOf(headerOcMethod,indexOfBody) + headerOcMethod.length();
|
||||
int indexOfheaderBodyEnd = postPayload.indexOf(headerEnd,indexOfheaderEnd);
|
||||
Q_ASSERT(postPayload.mid(indexOfheaderEnd,indexOfheaderBodyEnd-indexOfheaderEnd) == QString("PUT"));
|
||||
|
||||
//find oc-path
|
||||
indexOfheaderEnd = postPayload.indexOf(headerOcPath,indexOfBody) + headerOcPath.length();
|
||||
indexOfheaderBodyEnd = postPayload.indexOf(headerEnd,indexOfheaderEnd)-1;
|
||||
QString filePath(postPayload.mid(indexOfheaderEnd+1,indexOfheaderBodyEnd-indexOfheaderEnd));
|
||||
|
||||
//find content-length
|
||||
indexOfheaderEnd = postPayload.indexOf(headerConLen,indexOfBody) + headerConLen.length();
|
||||
indexOfheaderBodyEnd = postPayload.indexOf(headerEnd,indexOfheaderEnd);
|
||||
QString fileSize(postPayload.mid(indexOfheaderEnd,indexOfheaderBodyEnd-indexOfheaderEnd));
|
||||
|
||||
|
||||
//find body content and extract first letter
|
||||
indexOfheaderEnd = postPayload.indexOf(headerSectEnd,indexOfBody) + headerSectEnd.length();
|
||||
indexOfBody = indexOfheaderEnd+1;
|
||||
contentChar = postPayload.at(indexOfheaderEnd+1);
|
||||
|
||||
if ((fileInfo = remoteRootFileInfo.find(filePath))) {
|
||||
fileInfo->size = fileSize.toInt();
|
||||
fileInfo->contentChar = contentChar.toAscii();
|
||||
} else {
|
||||
// Assume that the file is filled with the same character
|
||||
fileInfo = remoteRootFileInfo.create(filePath, fileSize.toInt(), contentChar.toAscii());
|
||||
}
|
||||
|
||||
if (!fileInfo) {
|
||||
abort();
|
||||
return;
|
||||
}
|
||||
|
||||
if (filePath.endsWith("normalerrorfile")){
|
||||
writeFileErrorResponse(*fileInfo, QStringLiteral("Sabre\\DAV\\Exception\\BadRequest"), QStringLiteral("Method not allowed - file exists - update of the file is not supported!"), QStringLiteral("HTTP/1.1 400 Bad Request"));
|
||||
} else if (filePath.endsWith("fatalerrorfile")){
|
||||
writeFileErrorResponse(*fileInfo, QStringLiteral("Sabre\\DAV\\Exception\\ServiceUnavailable"), QStringLiteral("Failed to check file size"), QStringLiteral("HTTP/1.1 503 Service Unavailable"));
|
||||
} else if (filePath.endsWith("softerrorfile")){
|
||||
writeFileErrorResponse(*fileInfo, QStringLiteral("OCA\\DAV\\Connector\\Sabre\\Exception\\FileLocked"), QStringLiteral("Target file is locked by another process."), QStringLiteral("HTTP/1.1 423 Locked (WebDAV; RFC 4918)"));
|
||||
} else {
|
||||
writeFileResponse(*fileInfo);
|
||||
}
|
||||
}
|
||||
xml.writeEndElement(); // multistatus
|
||||
xml.writeEndDocument();
|
||||
setAttribute(QNetworkRequest::HttpStatusCodeAttribute, 207);
|
||||
setFinished(true);
|
||||
}
|
||||
|
||||
QMetaObject::invokeMethod(this, "respond", Qt::QueuedConnection);
|
||||
}
|
||||
|
||||
Q_INVOKABLE void respond() {
|
||||
setHeader(QNetworkRequest::ContentTypeHeader, "application/xml; charset=utf-8");
|
||||
setHeader(QNetworkRequest::ContentLengthHeader, payload.size());
|
||||
emit metaDataChanged();
|
||||
if (bytesAvailable())
|
||||
emit readyRead();
|
||||
emit finished();
|
||||
}
|
||||
|
||||
void abort() override { }
|
||||
|
||||
qint64 bytesAvailable() const override { return payload.size() + QIODevice::bytesAvailable(); }
|
||||
qint64 readData(char *data, qint64 maxlen) override {
|
||||
qint64 len = std::min(qint64{payload.size()}, maxlen);
|
||||
strncpy(data, payload.constData(), len);
|
||||
payload.remove(0, len);
|
||||
return len;
|
||||
}
|
||||
};
|
||||
|
||||
class FakeQNAM : public QNetworkAccessManager
|
||||
{
|
||||
FileInfo _remoteRootFileInfo;
|
||||
@@ -749,11 +552,7 @@ protected:
|
||||
return new FakeMkcolReply{_remoteRootFileInfo, op, request, this};
|
||||
else if (verb == QLatin1String("DELETE"))
|
||||
return new FakeDeleteReply{_remoteRootFileInfo, op, request, this};
|
||||
else if (verb == QLatin1String("MOVE"))
|
||||
return new FakeMoveReply{_remoteRootFileInfo, op, request, this};
|
||||
else if (op == QNetworkAccessManager::PostOperation) {
|
||||
return new FakeBundlePOSTReply{_remoteRootFileInfo, op, request, outgoingData->readAll(), this};
|
||||
} else {
|
||||
else {
|
||||
qDebug() << verb << outgoingData;
|
||||
Q_UNREACHABLE();
|
||||
}
|
||||
@@ -765,6 +564,7 @@ class FakeCredentials : public OCC::AbstractCredentials
|
||||
QNetworkAccessManager *_qnam;
|
||||
public:
|
||||
FakeCredentials(QNetworkAccessManager *qnam) : _qnam{qnam} { }
|
||||
virtual bool changed(AbstractCredentials *) const { return false; }
|
||||
virtual QString authType() const { return "test"; }
|
||||
virtual QString user() const { return "admin"; }
|
||||
virtual QNetworkAccessManager* getQNAM() const { return _qnam; }
|
||||
@@ -870,10 +670,6 @@ public:
|
||||
execUntilFinished();
|
||||
}
|
||||
|
||||
OCC::AccountPtr getAccount() {
|
||||
return _account;
|
||||
}
|
||||
|
||||
private:
|
||||
static void toDisk(QDir &dir, const FileInfo &templateFi) {
|
||||
foreach (const FileInfo &child, templateFi.children) {
|
||||
|
||||
@@ -50,7 +50,7 @@ private slots:
|
||||
QFETCH(QueryItems, query);
|
||||
QFETCH(QString, expected);
|
||||
QUrl baseUrl("http://example.com" + base);
|
||||
QUrl resultUrl = Utility::concatUrlPath(baseUrl, concat, query);
|
||||
QUrl resultUrl = Account::concatUrlPath(baseUrl, concat, query);
|
||||
QString result = QString::fromUtf8(resultUrl.toEncoded());
|
||||
QString expectedFull = "http://example.com" + expected;
|
||||
QCOMPARE(result, expectedFull);
|
||||
|
||||
@@ -15,7 +15,6 @@
|
||||
#include "folderman.h"
|
||||
#include "account.h"
|
||||
#include "accountstate.h"
|
||||
#include "configfile.h"
|
||||
|
||||
using namespace OCC;
|
||||
|
||||
@@ -40,7 +39,6 @@ private slots:
|
||||
{
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(5, 1, 0)
|
||||
QTemporaryDir dir;
|
||||
ConfigFile::setConfDir(dir.path()); // we don't want to pollute the user's config file
|
||||
QVERIFY(dir.isValid());
|
||||
QDir dir2(dir.path());
|
||||
QVERIFY(dir2.mkpath("sub/ownCloud1/folder/f"));
|
||||
|
||||
+2
-148
@@ -7,7 +7,6 @@
|
||||
|
||||
#include <QtTest>
|
||||
#include "syncenginetestutils.h"
|
||||
#include <syncengine.h>
|
||||
|
||||
using namespace OCC;
|
||||
|
||||
@@ -31,16 +30,6 @@ bool itemDidCompleteSuccessfully(const QSignalSpy &spy, const QString &path)
|
||||
return false;
|
||||
}
|
||||
|
||||
SyncFileItem::Status itemDidCompleteWithStatus(const QSignalSpy &spy, const QString &path)
|
||||
{
|
||||
for(const QList<QVariant> &args : spy) {
|
||||
SyncFileItem item = args[0].value<SyncFileItem>();
|
||||
if (item.destination() == path)
|
||||
return item._status;
|
||||
}
|
||||
return SyncFileItem::NoStatus;
|
||||
}
|
||||
|
||||
class TestSyncEngine : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
@@ -64,75 +53,6 @@ private slots:
|
||||
QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
|
||||
}
|
||||
|
||||
void testFileUploadBundled() {
|
||||
FakeFolder fakeFolder{FileInfo::A12_B12_C12_S12()};
|
||||
|
||||
QVariantMap capBundle;
|
||||
capBundle["bundlerequest"] = true;
|
||||
QVariantMap caps;
|
||||
caps["dav"] = capBundle;
|
||||
fakeFolder.getAccount()->setCapabilities(caps);
|
||||
|
||||
testFileUploadBundledAllFilesOK(fakeFolder);
|
||||
testFileUploadBundledErrorForFile(fakeFolder);
|
||||
|
||||
//TODO unfinished, cannot generate NetworkError
|
||||
//testFileUploadBundledNotHomeCollection(fakeFolder);
|
||||
}
|
||||
|
||||
void testFileUploadBundledAllFilesOK(FakeFolder &fakeFolder) {
|
||||
QSignalSpy completeSpy(&fakeFolder.syncEngine(), SIGNAL(itemCompleted(const SyncFileItem &, const PropagatorJob &)));
|
||||
fakeFolder.localModifier().insert("A/a3");
|
||||
fakeFolder.localModifier().insert("A/a4");
|
||||
fakeFolder.localModifier().insert("B/b0");
|
||||
fakeFolder.syncOnce();
|
||||
|
||||
//check separate files
|
||||
QVERIFY(itemDidCompleteSuccessfully(completeSpy, "A/a3"));
|
||||
QVERIFY(itemDidCompleteSuccessfully(completeSpy, "A/a4"));
|
||||
QVERIFY(itemDidCompleteSuccessfully(completeSpy, "B/b0"));
|
||||
|
||||
//check whole bundle
|
||||
QVERIFY(itemDidCompleteSuccessfully(completeSpy, ""));
|
||||
QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
|
||||
}
|
||||
|
||||
void testFileUploadBundledErrorForFile(FakeFolder &fakeFolder) {
|
||||
QSignalSpy completeSpy(&fakeFolder.syncEngine(), SIGNAL(itemCompleted(const SyncFileItem &, const PropagatorJob &)));
|
||||
fakeFolder.localModifier().insert("A/a5");
|
||||
fakeFolder.localModifier().insert("A/normalerrorfile");
|
||||
fakeFolder.localModifier().insert("A/fatalerrorfile");
|
||||
fakeFolder.localModifier().insert("A/softerrorfile");
|
||||
fakeFolder.localModifier().insert("B/b3");
|
||||
fakeFolder.syncOnce();
|
||||
|
||||
//check separate files
|
||||
QVERIFY(itemDidCompleteSuccessfully(completeSpy, "A/a5"));
|
||||
QVERIFY(SyncFileItem::NormalError == itemDidCompleteWithStatus(completeSpy, "A/normalerrorfile"));
|
||||
QVERIFY(SyncFileItem::FatalError == itemDidCompleteWithStatus(completeSpy, "A/fatalerrorfile"));
|
||||
QVERIFY(SyncFileItem::SoftError == itemDidCompleteWithStatus(completeSpy, "A/softerrorfile"));
|
||||
QVERIFY(itemDidCompleteSuccessfully(completeSpy, "B/b3"));
|
||||
|
||||
//check whole bundle
|
||||
QVERIFY(itemDidCompleteSuccessfully(completeSpy, ""));
|
||||
QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
|
||||
}
|
||||
|
||||
void testFileUploadBundledNotHomeCollection(FakeFolder &fakeFolder) {
|
||||
QSignalSpy completeSpy(&fakeFolder.syncEngine(), SIGNAL(itemCompleted(const SyncFileItem &, const PropagatorJob &)));
|
||||
fakeFolder.localModifier().insert("A/a7");
|
||||
fakeFolder.localModifier().insert("A/a8");
|
||||
fakeFolder.localModifier().insert("B/b4");
|
||||
|
||||
//add the user "erroruser" which is not a FilesHomeCollection
|
||||
fakeFolder.getAccount()->setUrl(QUrl(QStringLiteral("http://erroruser:admin@localhost/owncloud")));
|
||||
fakeFolder.syncOnce();
|
||||
|
||||
//check whole bundle
|
||||
QVERIFY(itemDidCompleteSuccessfully(completeSpy, ""));
|
||||
QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
|
||||
}
|
||||
|
||||
void testDirDownload() {
|
||||
FakeFolder fakeFolder{FileInfo::A12_B12_C12_S12()};
|
||||
QSignalSpy completeSpy(&fakeFolder.syncEngine(), SIGNAL(itemCompleted(const SyncFileItem &, const PropagatorJob &)));
|
||||
@@ -217,8 +137,8 @@ private slots:
|
||||
fakeFolder.syncOnce();
|
||||
QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
|
||||
auto oldState = fakeFolder.currentLocalState();
|
||||
QVERIFY(oldState.find("folder/folderB/folderA/file.txt"));
|
||||
QVERIFY(!oldState.find("folder/folderA/file.txt"));
|
||||
QVERIFY(oldState.find(PathComponents("folder/folderB/folderA/file.txt")));
|
||||
QVERIFY(!oldState.find(PathComponents("folder/folderA/file.txt")));
|
||||
|
||||
// This sync should not remove the file
|
||||
fakeFolder.syncOnce();
|
||||
@@ -226,72 +146,6 @@ private slots:
|
||||
QCOMPARE(fakeFolder.currentLocalState(), oldState);
|
||||
|
||||
}
|
||||
|
||||
void testSelectiveSyncModevFolder() {
|
||||
// issue #5224
|
||||
FakeFolder fakeFolder{FileInfo{ QString(), {
|
||||
FileInfo { QStringLiteral("parentFolder"), {
|
||||
FileInfo{ QStringLiteral("subFolderA"), { { QStringLiteral("fileA.txt"), 400 } } },
|
||||
FileInfo{ QStringLiteral("subFolderB"), { { QStringLiteral("fileB.txt"), 400 } } }
|
||||
}
|
||||
}}}};
|
||||
|
||||
QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
|
||||
auto expectedServerState = fakeFolder.currentRemoteState();
|
||||
|
||||
// Remove subFolderA with selectiveSync:
|
||||
fakeFolder.syncEngine().journal()->setSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList,
|
||||
{"parentFolder/subFolderA/"});
|
||||
fakeFolder.syncEngine().journal()->avoidReadFromDbOnNextSync("parentFolder/subFolderA/");
|
||||
|
||||
fakeFolder.syncOnce();
|
||||
|
||||
{
|
||||
// Nothing changed on the server
|
||||
QCOMPARE(fakeFolder.currentRemoteState(), expectedServerState);
|
||||
// The local state should not have subFolderA
|
||||
auto remoteState = fakeFolder.currentRemoteState();
|
||||
remoteState.remove("parentFolder/subFolderA");
|
||||
QCOMPARE(fakeFolder.currentLocalState(), remoteState);
|
||||
}
|
||||
|
||||
// Rename parentFolder on the server
|
||||
fakeFolder.remoteModifier().rename("parentFolder", "parentFolderRenamed");
|
||||
expectedServerState = fakeFolder.currentRemoteState();
|
||||
fakeFolder.syncOnce();
|
||||
|
||||
{
|
||||
QCOMPARE(fakeFolder.currentRemoteState(), expectedServerState);
|
||||
auto remoteState = fakeFolder.currentRemoteState();
|
||||
// The subFolderA should still be there on the server.
|
||||
QVERIFY(remoteState.find("parentFolderRenamed/subFolderA/fileA.txt"));
|
||||
// But not on the client because of the selective sync
|
||||
remoteState.remove("parentFolderRenamed/subFolderA");
|
||||
QCOMPARE(fakeFolder.currentLocalState(), remoteState);
|
||||
}
|
||||
|
||||
// Rename it again, locally this time.
|
||||
fakeFolder.localModifier().rename("parentFolderRenamed", "parentThirdName");
|
||||
fakeFolder.syncOnce();
|
||||
|
||||
{
|
||||
auto remoteState = fakeFolder.currentRemoteState();
|
||||
// The subFolderA should still be there on the server.
|
||||
QVERIFY(remoteState.find("parentThirdName/subFolderA/fileA.txt"));
|
||||
// But not on the client because of the selective sync
|
||||
remoteState.remove("parentThirdName/subFolderA");
|
||||
QCOMPARE(fakeFolder.currentLocalState(), remoteState);
|
||||
|
||||
expectedServerState = fakeFolder.currentRemoteState();
|
||||
QSignalSpy completeSpy(&fakeFolder.syncEngine(), SIGNAL(itemCompleted(const SyncFileItem &, const PropagatorJob &)));
|
||||
fakeFolder.syncOnce(); // This sync should do nothing
|
||||
QCOMPARE(completeSpy.count(), 0);
|
||||
|
||||
QCOMPARE(fakeFolder.currentRemoteState(), expectedServerState);
|
||||
QCOMPARE(fakeFolder.currentLocalState(), remoteState);
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
QTEST_GUILESS_MAIN(TestSyncEngine)
|
||||
|
||||
+65
-65
@@ -522,7 +522,7 @@
|
||||
<context>
|
||||
<name>OCC::CleanupPollsJob</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="779"/>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="772"/>
|
||||
<source>Error writing metadata to the database</source>
|
||||
<translation>Error en escriure les metadades a la base de dades</translation>
|
||||
</message>
|
||||
@@ -724,7 +724,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
|
||||
<message>
|
||||
<location filename="../src/gui/folder.cpp" line="1006"/>
|
||||
<source>Backup detected</source>
|
||||
<translation>Copia de seguretat detectada</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folder.cpp" line="1008"/>
|
||||
@@ -734,7 +734,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
|
||||
<message>
|
||||
<location filename="../src/gui/folder.cpp" line="1009"/>
|
||||
<source>Keep Local Files as Conflict</source>
|
||||
<translation>Manté els fitxers locals com a conflicte</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -817,7 +817,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1190"/>
|
||||
<source>The selected path is not a folder!</source>
|
||||
<translation>La ruta seleccionada no és un directori!</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1194"/>
|
||||
@@ -892,7 +892,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
|
||||
<translation>Error en carregar la llista de carpetes del servidor.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="205"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="204"/>
|
||||
<source>Signed out</source>
|
||||
<translation>S'ha desconnectat</translation>
|
||||
</message>
|
||||
@@ -902,96 +902,96 @@ Continuing the sync as normal will cause all your files to be overwritten by an
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="170"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="169"/>
|
||||
<source>Fetching folder list from server...</source>
|
||||
<translation>Obtenint la llista de carpetes del servidor...</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="841"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="832"/>
|
||||
<source>Checking for changes in '%1'</source>
|
||||
<translation>S'està comprovant els canvis a '%1'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="876"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="867"/>
|
||||
<source>, '%1'</source>
|
||||
<extracomment>Build a list of file names</extracomment>
|
||||
<translation>, '%1'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="879"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="870"/>
|
||||
<source>'%1'</source>
|
||||
<extracomment>Argument is a file name</extracomment>
|
||||
<translation>'%1'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="904"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="895"/>
|
||||
<source>Syncing %1</source>
|
||||
<extracomment>Example text: "Syncing 'foo.txt', 'bar.txt'"</extracomment>
|
||||
<translation>S'està sincronitzant %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="906"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="916"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="897"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="907"/>
|
||||
<source>, </source>
|
||||
<translation>, </translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="910"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="901"/>
|
||||
<source>download %1/s</source>
|
||||
<extracomment>Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated))</extracomment>
|
||||
<translation>descarrega %1/s</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="912"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="903"/>
|
||||
<source>u2193 %1/s</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="910"/>
|
||||
<source>upload %1/s</source>
|
||||
<extracomment>Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated))</extracomment>
|
||||
<translation>pujada %1/s</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="921"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="912"/>
|
||||
<source>u2191 %1/s</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="926"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="917"/>
|
||||
<source>%1 %2 (%3 of %4)</source>
|
||||
<extracomment>Example text: "uploading foobar.png (2MB of 2MB)"</extracomment>
|
||||
<translation>%1 %2 (%3 de %4)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="930"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="921"/>
|
||||
<source>%1 %2</source>
|
||||
<extracomment>Example text: "uploading foobar.png"</extracomment>
|
||||
<translation>%1 %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="947"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="938"/>
|
||||
<source>%5 left, %1 of %2, file %3 of %4</source>
|
||||
<extracomment>Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7"</extracomment>
|
||||
<translation>%5 pendent, %1 de %2, fitxer %3 de %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="953"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="944"/>
|
||||
<source>file %1 of %2</source>
|
||||
<translation>fitxer %1 de %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="993"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="984"/>
|
||||
<source>Waiting...</source>
|
||||
<translation>S'està esperant...</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="995"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="986"/>
|
||||
<source>Waiting for %n other folder(s)...</source>
|
||||
<translation><numerusform>S'està esperant %n altra carpeta...</numerusform><numerusform>S'està esperant %n altres carpetes</numerusform></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="1001"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="992"/>
|
||||
<source>Preparing to sync...</source>
|
||||
<translation>S'està preparant per sincronitzar...</translation>
|
||||
</message>
|
||||
@@ -1006,7 +1006,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
|
||||
<message>
|
||||
<location filename="../src/gui/folderwizard.cpp" line="544"/>
|
||||
<source>Add Sync Connection</source>
|
||||
<translation>Afegir una connexió de sincronització</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -1521,7 +1521,7 @@ Els elements que poden ser eliminats s'eliminaran si impedeixen que una car
|
||||
<message>
|
||||
<location filename="../src/gui/notificationwidget.cpp" line="50"/>
|
||||
<source>Created at %1</source>
|
||||
<translation>Creat el %1</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/notificationwidget.cpp" line="99"/>
|
||||
@@ -1626,12 +1626,12 @@ privilegis addicionals durant el procés.</translation>
|
||||
<message>
|
||||
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="142"/>
|
||||
<source>Sync the folder '%1'</source>
|
||||
<translation>Sincronitzar el directori '%1'</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="147"/>
|
||||
<source><p><small><strong>Warning:</strong> The local folder is not empty. Pick a resolution!</small></p></source>
|
||||
<translation><p><small><strong>Atenció:</strong> La carpeta local no està buida. Trieu una resolució!</small></p></translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="246"/>
|
||||
@@ -1741,7 +1741,7 @@ No és aconsellada usar-la.</translation>
|
||||
<message>
|
||||
<location filename="../src/gui/owncloudsetupwizard.cpp" line="181"/>
|
||||
<source>Timeout while trying to connect to %1 at %2.</source>
|
||||
<translation>S'ha esgotat el temps d'espera mentres es conectava a %1 a les %2.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/owncloudsetupwizard.cpp" line="192"/>
|
||||
@@ -1916,7 +1916,7 @@ No és aconsellada usar-la.</translation>
|
||||
<context>
|
||||
<name>OCC::PropagateDirectory</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="718"/>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="712"/>
|
||||
<source>Error writing metadata to the database</source>
|
||||
<translation>Error en escriure les metadades a la base de dades</translation>
|
||||
</message>
|
||||
@@ -1931,12 +1931,12 @@ No és aconsellada usar-la.</translation>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="376"/>
|
||||
<source>The download would reduce free disk space below %1</source>
|
||||
<translation>La descàrrega reduïrà l'espai lliure al disc per sota de %1</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="381"/>
|
||||
<source>Free space on disk is less than %1</source>
|
||||
<translation>L'espai lliure del disc dur es inferior a %1</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="496"/>
|
||||
@@ -1946,7 +1946,7 @@ No és aconsellada usar-la.</translation>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="545"/>
|
||||
<source>The file could not be downloaded completely.</source>
|
||||
<translation>No es pot descarregar el fitxer completament.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="552"/>
|
||||
@@ -1954,17 +1954,17 @@ No és aconsellada usar-la.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="711"/>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="693"/>
|
||||
<source>File %1 cannot be saved because of a local file name clash!</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="759"/>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="741"/>
|
||||
<source>File has changed since discovery</source>
|
||||
<translation>El fitxer ha canviat des de que es va descobrir</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="809"/>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="791"/>
|
||||
<source>Error writing metadata to the database</source>
|
||||
<translation>Error en escriure les metadades a la base de dades</translation>
|
||||
</message>
|
||||
@@ -2363,7 +2363,7 @@ No és aconsellada usar-la.</translation>
|
||||
<message>
|
||||
<location filename="../src/gui/sharedialog.cpp" line="98"/>
|
||||
<source>%1 Sharing</source>
|
||||
<translation>Compartint amb %1</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/sharedialog.cpp" line="73"/>
|
||||
@@ -2378,7 +2378,7 @@ No és aconsellada usar-la.</translation>
|
||||
<message>
|
||||
<location filename="../src/gui/sharedialog.cpp" line="101"/>
|
||||
<source>The server does not allow sharing</source>
|
||||
<translation>El servidor no permet la compartició de fitxers</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/sharedialog.cpp" line="113"/>
|
||||
@@ -2450,18 +2450,18 @@ No és aconsellada usar-la.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="366"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="413"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="412"/>
|
||||
<source>Public sh&aring requires a password</source>
|
||||
<translation>La comp&artició pública requereix una contrasenya</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="435"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="434"/>
|
||||
<source>Please Set Password</source>
|
||||
<translation>Establiu la contrasenya</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="500"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="501"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="498"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="499"/>
|
||||
<source>&Share link</source>
|
||||
<translation>Com&parteix l'enllaç</translation>
|
||||
</message>
|
||||
@@ -2871,12 +2871,12 @@ No és aconsellada usar-la.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1139"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1134"/>
|
||||
<source>Not allowed because you don't have permission to add parent folder</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1146"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1141"/>
|
||||
<source>Not allowed because you don't have permission to add files in that folder</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
@@ -2981,64 +2981,64 @@ No és aconsellada usar-la.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="791"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="787"/>
|
||||
<source>Unable to read from the sync journal.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="837"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="833"/>
|
||||
<source>Cannot open the sync journal</source>
|
||||
<translation>No es pot obrir el diari de sincronització</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="894"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="889"/>
|
||||
<source>File name contains at least one invalid character</source>
|
||||
<translation>El nom del fitxer conté al menys un caràcter invàlid</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1098"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1105"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1093"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1100"/>
|
||||
<source>Ignored because of the "choose what to sync" blacklist</source>
|
||||
<translation>S'ignora degut al filtre a «Trieu què sincronitzar»</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1124"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1119"/>
|
||||
<source>Not allowed because you don't have permission to add subfolders to that folder</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1166"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1161"/>
|
||||
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
|
||||
<translation>No es permet pujar aquest fitxer perquè només és de lectura en el servidor, es restaura</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1183"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1203"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1178"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1198"/>
|
||||
<source>Not allowed to remove, restoring</source>
|
||||
<translation>No es permet l'eliminació, es restaura</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1216"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1211"/>
|
||||
<source>Local files and share folder removed.</source>
|
||||
<translation>Fitxers locals i carpeta compartida esborrats.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1272"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1267"/>
|
||||
<source>Move not allowed, item restored</source>
|
||||
<translation>No es permet moure'l, l'element es restaura</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1283"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1278"/>
|
||||
<source>Move not allowed because %1 is read-only</source>
|
||||
<translation>No es permet moure perquè %1 només és de lectura</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1284"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1279"/>
|
||||
<source>the destination</source>
|
||||
<translation>el destí</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1284"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1279"/>
|
||||
<source>the source</source>
|
||||
<translation>l'origen</translation>
|
||||
</message>
|
||||
@@ -3048,7 +3048,7 @@ No és aconsellada usar-la.</translation>
|
||||
<message>
|
||||
<location filename="../src/gui/synclogdialog.ui" line="14"/>
|
||||
<source>Synchronisation Log</source>
|
||||
<translation>Registre de sincronització</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -3068,8 +3068,8 @@ No és aconsellada usar-la.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/theme.cpp" line="289"/>
|
||||
<source><p>Copyright ownCloud GmbH</p></source>
|
||||
<translation><p>Copyright ownCloud GmbH</p></translation>
|
||||
<source><p>Copyright ownCloud, Incorporated</p></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/theme.cpp" line="290"/>
|
||||
@@ -3215,7 +3215,7 @@ No és aconsellada usar-la.</translation>
|
||||
<message>
|
||||
<location filename="../src/gui/owncloudgui.cpp" line="296"/>
|
||||
<source>Account synchronization is disabled</source>
|
||||
<translation>La sincronització del compte està deshabilitada</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/owncloudgui.cpp" line="379"/>
|
||||
@@ -3293,8 +3293,8 @@ No és aconsellada usar-la.</translation>
|
||||
<name>OCC::ownCloudTheme</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/owncloudtheme.cpp" line="47"/>
|
||||
<source><p>Version %2. For more information visit <a href="%3">%4</a></p><p><small>By Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz and others.</small></p><p>Copyright ownCloud GmbH</p><p>Licensed under the GNU General Public License (GPL) Version 2.0<br/>ownCloud and the ownCloud Logo are registered trademarks of ownCloud, Inc. in the United States, other countries, or both.</p></source>
|
||||
<translation type="unfinished"/>
|
||||
<source><p>Version %2. For more information visit <a href="%3">%4</a></p><p><small>By Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz and others.</small></p><p>Copyright ownCloud, Inc.</p><p>Licensed under the GNU General Public License (GPL) Version 2.0<br/>ownCloud and the ownCloud Logo are registered trademarks of ownCloud, Inc. in the United States, other countries, or both.</p></source>
|
||||
<translation><p>Versió %2. Per més informació visiteu <a href="%3">%4</a></p><p><small>Per Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz i altres.</small></p><p>Copyright ownCloud, Inc.</p><p>amb llicència GNU General Public License (GPL) versió 2.0<br/>ownCloud i el logo d'ownCloud són marques registrades d'ownCloud, Inc. als Estats Units, altres països, o ambdós.</p></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -3642,7 +3642,7 @@ No és aconsellada usar-la.</translation>
|
||||
<message>
|
||||
<location filename="../src/libsync/progressdispatcher.cpp" line="37"/>
|
||||
<source>Server version downloaded, copied changed local file into conflict file</source>
|
||||
<translation>S'ha baixat la versió del servidor i s'ha renomenat el fitxer local com a fitxer de conflicte</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/progressdispatcher.cpp" line="39"/>
|
||||
|
||||
+48
-48
@@ -522,7 +522,7 @@
|
||||
<context>
|
||||
<name>OCC::CleanupPollsJob</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="779"/>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="772"/>
|
||||
<source>Error writing metadata to the database</source>
|
||||
<translation>Chyba zápisu metadat do databáze</translation>
|
||||
</message>
|
||||
@@ -894,7 +894,7 @@ Pokračováním v synchronizaci způsobí přepsání všech vašich souborů st
|
||||
<translation>Chyba při načítání seznamu adresářů ze serveru.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="205"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="204"/>
|
||||
<source>Signed out</source>
|
||||
<translation>Odhlášeno</translation>
|
||||
</message>
|
||||
@@ -904,96 +904,96 @@ Pokračováním v synchronizaci způsobí přepsání všech vašich souborů st
|
||||
<translation>Přidání adresáře je vypnuto, protože již synchronizujete všechny své soubory. Pokud chcete synchronizovat pouze některé adresáře, odstraňte aktuálně nastavený kořenový adresář.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="170"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="169"/>
|
||||
<source>Fetching folder list from server...</source>
|
||||
<translation>Načítání seznamu adresářů ze serveru...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="841"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="832"/>
|
||||
<source>Checking for changes in '%1'</source>
|
||||
<translation>Kontrola změn v '%1'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="876"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="867"/>
|
||||
<source>, '%1'</source>
|
||||
<extracomment>Build a list of file names</extracomment>
|
||||
<translation>, '%1'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="879"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="870"/>
|
||||
<source>'%1'</source>
|
||||
<extracomment>Argument is a file name</extracomment>
|
||||
<translation>'%1'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="904"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="895"/>
|
||||
<source>Syncing %1</source>
|
||||
<extracomment>Example text: "Syncing 'foo.txt', 'bar.txt'"</extracomment>
|
||||
<translation>Synchronizuji %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="906"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="916"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="897"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="907"/>
|
||||
<source>, </source>
|
||||
<translation>, </translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="910"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="901"/>
|
||||
<source>download %1/s</source>
|
||||
<extracomment>Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated))</extracomment>
|
||||
<translation>stahování %1/s</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="912"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="903"/>
|
||||
<source>u2193 %1/s</source>
|
||||
<translation>u2193 %1/s</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="910"/>
|
||||
<source>upload %1/s</source>
|
||||
<extracomment>Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated))</extracomment>
|
||||
<translation>nahrávání %1/s</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="921"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="912"/>
|
||||
<source>u2191 %1/s</source>
|
||||
<translation>u2191 %1/s</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="926"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="917"/>
|
||||
<source>%1 %2 (%3 of %4)</source>
|
||||
<extracomment>Example text: "uploading foobar.png (2MB of 2MB)"</extracomment>
|
||||
<translation>%1 %2 (%3 ze %4)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="930"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="921"/>
|
||||
<source>%1 %2</source>
|
||||
<extracomment>Example text: "uploading foobar.png"</extracomment>
|
||||
<translation>%1 %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="947"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="938"/>
|
||||
<source>%5 left, %1 of %2, file %3 of %4</source>
|
||||
<extracomment>Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7"</extracomment>
|
||||
<translation>%5 zbývá, %1 ze %2, soubor %3 z %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="953"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="944"/>
|
||||
<source>file %1 of %2</source>
|
||||
<translation>soubor %1 z %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="993"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="984"/>
|
||||
<source>Waiting...</source>
|
||||
<translation>Chvíli strpení...</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="995"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="986"/>
|
||||
<source>Waiting for %n other folder(s)...</source>
|
||||
<translation><numerusform>Čeká se na %n další adresář...</numerusform><numerusform>Čeká se na %n další adresáře...</numerusform><numerusform>Čeká se na %n dalších adresářů...</numerusform></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="1001"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="992"/>
|
||||
<source>Preparing to sync...</source>
|
||||
<translation>Synchronizace se připravuje...</translation>
|
||||
</message>
|
||||
@@ -1918,7 +1918,7 @@ Nedoporučuje se jí používat.</translation>
|
||||
<context>
|
||||
<name>OCC::PropagateDirectory</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="718"/>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="712"/>
|
||||
<source>Error writing metadata to the database</source>
|
||||
<translation>Chyba zápisu metadat do databáze</translation>
|
||||
</message>
|
||||
@@ -1956,17 +1956,17 @@ Nedoporučuje se jí používat.</translation>
|
||||
<translation>Stažený soubor je prázdný, přestože server oznámil, že měl být %1.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="711"/>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="693"/>
|
||||
<source>File %1 cannot be saved because of a local file name clash!</source>
|
||||
<translation>Soubor %1 nemohl být uložen z důvodu kolize názvu se souborem v místním systému!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="759"/>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="741"/>
|
||||
<source>File has changed since discovery</source>
|
||||
<translation>Soubor se mezitím změnil</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="809"/>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="791"/>
|
||||
<source>Error writing metadata to the database</source>
|
||||
<translation>Chyba zápisu metadat do databáze</translation>
|
||||
</message>
|
||||
@@ -2452,18 +2452,18 @@ Nedoporučuje se jí používat.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="366"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="413"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="412"/>
|
||||
<source>Public sh&aring requires a password</source>
|
||||
<translation>Veřejné s&dílení vyžaduje heslo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="435"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="434"/>
|
||||
<source>Please Set Password</source>
|
||||
<translation>Nastavte prosím heslo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="500"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="501"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="498"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="499"/>
|
||||
<source>&Share link</source>
|
||||
<translation>&Sdílet odkaz</translation>
|
||||
</message>
|
||||
@@ -2873,12 +2873,12 @@ Nedoporučuje se jí používat.</translation>
|
||||
<translation>Je dostupných pouze %1, pro spuštění je potřeba alespoň %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1139"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1134"/>
|
||||
<source>Not allowed because you don't have permission to add parent folder</source>
|
||||
<translation>Není povoleno, protože nemáte oprávnění vytvořit nadřazený adresář</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1146"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1141"/>
|
||||
<source>Not allowed because you don't have permission to add files in that folder</source>
|
||||
<translation>Není povoleno, protože nemáte oprávnění přidávat soubory do tohoto adresáře</translation>
|
||||
</message>
|
||||
@@ -2983,64 +2983,64 @@ Nedoporučuje se jí používat.</translation>
|
||||
<translation>Nelze načíst blacklist z místní databáze</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="791"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="787"/>
|
||||
<source>Unable to read from the sync journal.</source>
|
||||
<translation>Nelze číst ze žurnálu synchronizace.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="837"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="833"/>
|
||||
<source>Cannot open the sync journal</source>
|
||||
<translation>Nelze otevřít synchronizační žurnál</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="894"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="889"/>
|
||||
<source>File name contains at least one invalid character</source>
|
||||
<translation>Jméno souboru obsahuje aelspoň jeden neplatný znak</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1098"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1105"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1093"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1100"/>
|
||||
<source>Ignored because of the "choose what to sync" blacklist</source>
|
||||
<translation>Ignorováno podle nastavení "vybrat co synchronizovat"</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1124"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1119"/>
|
||||
<source>Not allowed because you don't have permission to add subfolders to that folder</source>
|
||||
<translation>Není povoleno, protože nemáte oprávnění přidávat podadresáře do tohoto adresáře</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1166"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1161"/>
|
||||
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
|
||||
<translation>Není povoleno nahrát tento soubor, protože je na serveru uložen pouze pro čtení, obnovuji</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1183"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1203"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1178"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1198"/>
|
||||
<source>Not allowed to remove, restoring</source>
|
||||
<translation>Odstranění není povoleno, obnovuji</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1216"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1211"/>
|
||||
<source>Local files and share folder removed.</source>
|
||||
<translation>Místní soubory a sdílený adresář byly odstraněny.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1272"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1267"/>
|
||||
<source>Move not allowed, item restored</source>
|
||||
<translation>Přesun není povolen, položka obnovena</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1283"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1278"/>
|
||||
<source>Move not allowed because %1 is read-only</source>
|
||||
<translation>Přesun není povolen, protože %1 je pouze pro čtení</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1284"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1279"/>
|
||||
<source>the destination</source>
|
||||
<translation>cílové umístění</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1284"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1279"/>
|
||||
<source>the source</source>
|
||||
<translation>zdroj</translation>
|
||||
</message>
|
||||
@@ -3070,8 +3070,8 @@ Nedoporučuje se jí používat.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/theme.cpp" line="289"/>
|
||||
<source><p>Copyright ownCloud GmbH</p></source>
|
||||
<translation><p>Copyright ownCloud GmbH</p></translation>
|
||||
<source><p>Copyright ownCloud, Incorporated</p></source>
|
||||
<translation><p>Copyright ownCloud, Incorporated</p></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/theme.cpp" line="290"/>
|
||||
@@ -3295,8 +3295,8 @@ Nedoporučuje se jí používat.</translation>
|
||||
<name>OCC::ownCloudTheme</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/owncloudtheme.cpp" line="47"/>
|
||||
<source><p>Version %2. For more information visit <a href="%3">%4</a></p><p><small>By Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz and others.</small></p><p>Copyright ownCloud GmbH</p><p>Licensed under the GNU General Public License (GPL) Version 2.0<br/>ownCloud and the ownCloud Logo are registered trademarks of ownCloud, Inc. in the United States, other countries, or both.</p></source>
|
||||
<translation><p>Verze %2. Pro další informace navštivte <a href="%3">%4</a></p><p><small>Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz a další.</small></p><p>Copyright ownCloud GmbH</p><p>Licencováno pod GNU General Public License (GPL) Version 2.0<br/>ownCloud a ownCloud logo jsou registrované obchodní známky ownCloud, Inc. ve Spojených státech, ostatních zemích nebo obojí</p></translation>
|
||||
<source><p>Version %2. For more information visit <a href="%3">%4</a></p><p><small>By Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz and others.</small></p><p>Copyright ownCloud, Inc.</p><p>Licensed under the GNU General Public License (GPL) Version 2.0<br/>ownCloud and the ownCloud Logo are registered trademarks of ownCloud, Inc. in the United States, other countries, or both.</p></source>
|
||||
<translation><p>Verze %2. Pro další informace navštivte <a href="%3">%4</a></p><p><small>Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz a další.</small></p><p>Copyright ownCloud, Inc.</p><p>Licencováno pod GNU General Public License (GPL) Version 2.0<br/>ownCloud a ownCloud logo jsou registrované obchodní známky ownCloud, Inc. ve Spojených státech, ostatních zemích nebo obojí</p></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
||||
+48
-48
@@ -522,7 +522,7 @@
|
||||
<context>
|
||||
<name>OCC::CleanupPollsJob</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="779"/>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="772"/>
|
||||
<source>Error writing metadata to the database</source>
|
||||
<translation>Fehler beim Schreiben der Metadaten in die Datenbank</translation>
|
||||
</message>
|
||||
@@ -893,7 +893,7 @@ Wenn diese Synchronisation fortgesetzt wird, werden Dateien eventuell von älter
|
||||
<translation>Fehler beim Empfang der Ordnerliste vom Server.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="205"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="204"/>
|
||||
<source>Signed out</source>
|
||||
<translation>Abgemeldet</translation>
|
||||
</message>
|
||||
@@ -903,96 +903,96 @@ Wenn diese Synchronisation fortgesetzt wird, werden Dateien eventuell von älter
|
||||
<translation>Sie können keinen weiteren Ordner hinzufügen, da Sie bereits alle Dateien synchronisieren. Falls sie mehrere Ordner synchronisieren wollen, entferen Sie zunächst den konfigurierten Wurzel-Ordner.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="170"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="169"/>
|
||||
<source>Fetching folder list from server...</source>
|
||||
<translation>Empfange Orderliste vom Server...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="841"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="832"/>
|
||||
<source>Checking for changes in '%1'</source>
|
||||
<translation>Nach Änderungen suchen in '%1'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="876"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="867"/>
|
||||
<source>, '%1'</source>
|
||||
<extracomment>Build a list of file names</extracomment>
|
||||
<translation>, '%1'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="879"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="870"/>
|
||||
<source>'%1'</source>
|
||||
<extracomment>Argument is a file name</extracomment>
|
||||
<translation>'%1'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="904"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="895"/>
|
||||
<source>Syncing %1</source>
|
||||
<extracomment>Example text: "Syncing 'foo.txt', 'bar.txt'"</extracomment>
|
||||
<translation>Synchronisiere %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="906"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="916"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="897"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="907"/>
|
||||
<source>, </source>
|
||||
<translation>, </translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="910"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="901"/>
|
||||
<source>download %1/s</source>
|
||||
<extracomment>Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated))</extracomment>
|
||||
<translation>Download %1/s</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="912"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="903"/>
|
||||
<source>u2193 %1/s</source>
|
||||
<translation>u2193 %1/s</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="910"/>
|
||||
<source>upload %1/s</source>
|
||||
<extracomment>Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated))</extracomment>
|
||||
<translation>Upload %1/s</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="921"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="912"/>
|
||||
<source>u2191 %1/s</source>
|
||||
<translation>u2191 %1/s</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="926"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="917"/>
|
||||
<source>%1 %2 (%3 of %4)</source>
|
||||
<extracomment>Example text: "uploading foobar.png (2MB of 2MB)"</extracomment>
|
||||
<translation>%1 %2 (%3 von %4)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="930"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="921"/>
|
||||
<source>%1 %2</source>
|
||||
<extracomment>Example text: "uploading foobar.png"</extracomment>
|
||||
<translation>%1 %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="947"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="938"/>
|
||||
<source>%5 left, %1 of %2, file %3 of %4</source>
|
||||
<extracomment>Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7"</extracomment>
|
||||
<translation>%5 übrig, %1 von %2, Datei %3 von %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="953"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="944"/>
|
||||
<source>file %1 of %2</source>
|
||||
<translation>Datei %1 von %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="993"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="984"/>
|
||||
<source>Waiting...</source>
|
||||
<translation>Warte...</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="995"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="986"/>
|
||||
<source>Waiting for %n other folder(s)...</source>
|
||||
<translation><numerusform>Warte auf einen anderen Ordner</numerusform><numerusform>Warte auf %n andere Ordner</numerusform></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="1001"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="992"/>
|
||||
<source>Preparing to sync...</source>
|
||||
<translation>Bereite Synchronisation vor...</translation>
|
||||
</message>
|
||||
@@ -1916,7 +1916,7 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
|
||||
<context>
|
||||
<name>OCC::PropagateDirectory</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="718"/>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="712"/>
|
||||
<source>Error writing metadata to the database</source>
|
||||
<translation>Fehler beim Schreiben der Metadaten in die Datenbank</translation>
|
||||
</message>
|
||||
@@ -1954,17 +1954,17 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
|
||||
<translation>Die heruntergeladene Datei ist leer, obwohl der Server %1 als Größe übermittelt hat.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="711"/>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="693"/>
|
||||
<source>File %1 cannot be saved because of a local file name clash!</source>
|
||||
<translation>Die Datei %1 kann aufgrund eines Konfliktes mit dem lokalen Dateinamen nicht gespeichert geladen werden!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="759"/>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="741"/>
|
||||
<source>File has changed since discovery</source>
|
||||
<translation>Datei ist seit der Entdeckung geändert worden</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="809"/>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="791"/>
|
||||
<source>Error writing metadata to the database</source>
|
||||
<translation>Fehler beim Schreiben der Metadaten in die Datenbank</translation>
|
||||
</message>
|
||||
@@ -2450,18 +2450,18 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="366"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="413"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="412"/>
|
||||
<source>Public sh&aring requires a password</source>
|
||||
<translation>Öffentliches Teilen erfordert ein P&asswort</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="435"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="434"/>
|
||||
<source>Please Set Password</source>
|
||||
<translation>Bitte wählen Sie ein Passwort:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="500"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="501"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="498"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="499"/>
|
||||
<source>&Share link</source>
|
||||
<translation>&Link teilen</translation>
|
||||
</message>
|
||||
@@ -2871,12 +2871,12 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
|
||||
<translation>Nur %1 sind verfügbar. Zum Beginnen werden mindestens %2 benötigt.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1139"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1134"/>
|
||||
<source>Not allowed because you don't have permission to add parent folder</source>
|
||||
<translation>Nicht erlaubt, da Sie keine Rechte zur Erstellung von Unterordnern haben</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1146"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1141"/>
|
||||
<source>Not allowed because you don't have permission to add files in that folder</source>
|
||||
<translation>Nicht erlaubt, da Sie keine Rechte zum Hinzufügen von Dateien in diesen Ordner haben</translation>
|
||||
</message>
|
||||
@@ -2981,64 +2981,64 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
|
||||
<translation>Fehler beim Einlesen der Blacklist aus der lokalen Datenbank</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="791"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="787"/>
|
||||
<source>Unable to read from the sync journal.</source>
|
||||
<translation>Fehler beim Einlesen des Synchronisierungsprotokolls.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="837"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="833"/>
|
||||
<source>Cannot open the sync journal</source>
|
||||
<translation>Synchronisationsbericht kann nicht geöffnet werden</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="894"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="889"/>
|
||||
<source>File name contains at least one invalid character</source>
|
||||
<translation>Der Dateiname enthält mindestens ein ungültiges Zeichen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1098"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1105"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1093"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1100"/>
|
||||
<source>Ignored because of the "choose what to sync" blacklist</source>
|
||||
<translation>Aufgrund der »Zu synchronisierende Elemente auswählen«-Sperrliste ignoriert</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1124"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1119"/>
|
||||
<source>Not allowed because you don't have permission to add subfolders to that folder</source>
|
||||
<translation>Nicht erlaubt, da Sie keine Rechte zur Erstellung von Unterordnern haben</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1166"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1161"/>
|
||||
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
|
||||
<translation>Das Hochladen dieser Datei ist nicht erlaubt, da die Datei auf dem Server schreibgeschützt ist, Wiederherstellung</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1183"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1203"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1178"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1198"/>
|
||||
<source>Not allowed to remove, restoring</source>
|
||||
<translation>Löschen nicht erlaubt, Wiederherstellung</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1216"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1211"/>
|
||||
<source>Local files and share folder removed.</source>
|
||||
<translation>Lokale Dateien und Freigabeordner wurden entfernt.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1272"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1267"/>
|
||||
<source>Move not allowed, item restored</source>
|
||||
<translation>Verschieben nicht erlaubt, Element wiederhergestellt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1283"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1278"/>
|
||||
<source>Move not allowed because %1 is read-only</source>
|
||||
<translation>Verschieben nicht erlaubt, da %1 schreibgeschützt ist</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1284"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1279"/>
|
||||
<source>the destination</source>
|
||||
<translation>Das Ziel</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1284"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1279"/>
|
||||
<source>the source</source>
|
||||
<translation>Die Quelle</translation>
|
||||
</message>
|
||||
@@ -3068,8 +3068,8 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/theme.cpp" line="289"/>
|
||||
<source><p>Copyright ownCloud GmbH</p></source>
|
||||
<translation><p>Copyright ownCloud GmbH</p></translation>
|
||||
<source><p>Copyright ownCloud, Incorporated</p></source>
|
||||
<translation><p>Copyright ownCloud, Incorporated</p></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/theme.cpp" line="290"/>
|
||||
@@ -3293,8 +3293,8 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
|
||||
<name>OCC::ownCloudTheme</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/owncloudtheme.cpp" line="47"/>
|
||||
<source><p>Version %2. For more information visit <a href="%3">%4</a></p><p><small>By Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz and others.</small></p><p>Copyright ownCloud GmbH</p><p>Licensed under the GNU General Public License (GPL) Version 2.0<br/>ownCloud and the ownCloud Logo are registered trademarks of ownCloud, Inc. in the United States, other countries, or both.</p></source>
|
||||
<translation><p>Version %2. Weitere Informationen unter <a href="%3">%4</a></p><p><small>Von Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz und anderen.</small></p><p>Copyright ownCloud GmbH</p><p>Lizensiert unter den Bedingungen der GNU General Public License (GPL) Version 2.0<br/>ownCloud und das ownCloud Logo sind eingetragene Warenzeichen der ownCloud Inc. in den USA, anderen Ländern, oder beidem.</p></translation>
|
||||
<source><p>Version %2. For more information visit <a href="%3">%4</a></p><p><small>By Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz and others.</small></p><p>Copyright ownCloud, Inc.</p><p>Licensed under the GNU General Public License (GPL) Version 2.0<br/>ownCloud and the ownCloud Logo are registered trademarks of ownCloud, Inc. in the United States, other countries, or both.</p></source>
|
||||
<translation><p>Version %2. Weitere Informationen unter <a href="%3">%4</a></p><p><small>Von Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz und anderen.</small></p><p>Copyright ownCloud, Inc.</p><p>Lizensiert unter den Bedingungen der GNU General Public License (GPL) Version 2.0<br/>ownCloud und das ownCloud Logo sind eingetragene Warenzeichen der ownCloud Inc. in den USA, anderen Ländern, oder beidem.</p></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
||||
+81
-81
@@ -522,9 +522,9 @@
|
||||
<context>
|
||||
<name>OCC::CleanupPollsJob</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="779"/>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="772"/>
|
||||
<source>Error writing metadata to the database</source>
|
||||
<translation>Σφάλμα εγγραφής μεταδεδομένων στην βάση δεδομένων</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -724,7 +724,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
|
||||
<message>
|
||||
<location filename="../src/gui/folder.cpp" line="1006"/>
|
||||
<source>Backup detected</source>
|
||||
<translation>Ανιχνεύθηκε αντίγραφο ασφαλείας</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folder.cpp" line="1008"/>
|
||||
@@ -860,7 +860,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusdelegate.cpp" line="241"/>
|
||||
<source>Synchronizing with local folder</source>
|
||||
<translation>Συγχρονισμός με τοπικό φάκελο</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusdelegate.cpp" line="285"/>
|
||||
@@ -892,7 +892,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
|
||||
<translation>Σφάλμα κατά τη φόρτωση της λίστας φακέλων από το διακομιστή.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="205"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="204"/>
|
||||
<source>Signed out</source>
|
||||
<translation>Αποσύνδεση</translation>
|
||||
</message>
|
||||
@@ -902,96 +902,96 @@ Continuing the sync as normal will cause all your files to be overwritten by an
|
||||
<translation>Η επιλογή προσθήκης φακέλου δεν είναι διαθέσιμη καθώς συγχρονίζονται ήδη όλα τα αρχεία. Για να επιλέξετε συγχρονισμό φακέλων, αφαιρέστε τον αρχικό φάκελο που έχει ρυθμιστεί.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="170"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="169"/>
|
||||
<source>Fetching folder list from server...</source>
|
||||
<translation>Λήψη λίστας φακέλων από το διακομιστή...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="841"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="832"/>
|
||||
<source>Checking for changes in '%1'</source>
|
||||
<translation>Έλεγχος αλλαγών στο '%1'.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="876"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="867"/>
|
||||
<source>, '%1'</source>
|
||||
<extracomment>Build a list of file names</extracomment>
|
||||
<translation>, '%1'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="879"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="870"/>
|
||||
<source>'%1'</source>
|
||||
<extracomment>Argument is a file name</extracomment>
|
||||
<translation>'%1'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="904"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="895"/>
|
||||
<source>Syncing %1</source>
|
||||
<extracomment>Example text: "Syncing 'foo.txt', 'bar.txt'"</extracomment>
|
||||
<translation>Συγχρονισμός %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="906"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="916"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="897"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="907"/>
|
||||
<source>, </source>
|
||||
<translation>, </translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="910"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="901"/>
|
||||
<source>download %1/s</source>
|
||||
<extracomment>Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated))</extracomment>
|
||||
<translation>λήψη %1/s</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="912"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="903"/>
|
||||
<source>u2193 %1/s</source>
|
||||
<translation>u2193 %1/s</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="910"/>
|
||||
<source>upload %1/s</source>
|
||||
<extracomment>Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated))</extracomment>
|
||||
<translation>μεταφόρτωση %1/s</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="921"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="912"/>
|
||||
<source>u2191 %1/s</source>
|
||||
<translation>u2191 %1/s</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="926"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="917"/>
|
||||
<source>%1 %2 (%3 of %4)</source>
|
||||
<extracomment>Example text: "uploading foobar.png (2MB of 2MB)"</extracomment>
|
||||
<translation>%1 %2 (%3 από %4)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="930"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="921"/>
|
||||
<source>%1 %2</source>
|
||||
<extracomment>Example text: "uploading foobar.png"</extracomment>
|
||||
<translation>%1 %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="947"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="938"/>
|
||||
<source>%5 left, %1 of %2, file %3 of %4</source>
|
||||
<extracomment>Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7"</extracomment>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="953"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="944"/>
|
||||
<source>file %1 of %2</source>
|
||||
<translation>αρχείο %1 από %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="993"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="984"/>
|
||||
<source>Waiting...</source>
|
||||
<translation>Αναμονή...</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="995"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="986"/>
|
||||
<source>Waiting for %n other folder(s)...</source>
|
||||
<translation><numerusform>Αναμονή για %n άλλο φάκελο...</numerusform><numerusform>Αναμονή για %n άλλους φακέλους...</numerusform></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="1001"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="992"/>
|
||||
<source>Preparing to sync...</source>
|
||||
<translation>Προετοιμασία για συγχρονισμό...</translation>
|
||||
</message>
|
||||
@@ -1526,7 +1526,7 @@ Items where deletion is allowed will be deleted if they prevent a directory from
|
||||
<message>
|
||||
<location filename="../src/gui/notificationwidget.cpp" line="99"/>
|
||||
<source>Closing in a few seconds...</source>
|
||||
<translation>Κλείσιμο σε λίγα δευτερόλεπτα...</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/notificationwidget.cpp" line="133"/>
|
||||
@@ -1916,9 +1916,9 @@ It is not advisable to use it.</source>
|
||||
<context>
|
||||
<name>OCC::PropagateDirectory</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="718"/>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="712"/>
|
||||
<source>Error writing metadata to the database</source>
|
||||
<translation>Σφάλμα εγγραφής μεταδεδομένων στην βάση δεδομένων</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -1954,19 +1954,19 @@ It is not advisable to use it.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="711"/>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="693"/>
|
||||
<source>File %1 cannot be saved because of a local file name clash!</source>
|
||||
<translation>Το αρχείο %1 δεν είναι δυνατό να αποθηκευτεί λόγω διένεξης με το όνομα ενός τοπικού ονόματος αρχείου!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="759"/>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="741"/>
|
||||
<source>File has changed since discovery</source>
|
||||
<translation>Το αρχείο έχει αλλάξει από όταν ανακαλύφθηκε</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="809"/>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="791"/>
|
||||
<source>Error writing metadata to the database</source>
|
||||
<translation>Σφάλμα εγγραφής μεταδεδομένων στην βάση δεδομένων</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -1992,7 +1992,7 @@ It is not advisable to use it.</source>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatorjobs.cpp" line="155"/>
|
||||
<source>could not delete file %1, error: %2</source>
|
||||
<translation>αδυναμία διαγραφής αρχείου %1, σφάλμα: %2</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatorjobs.cpp" line="163"/>
|
||||
@@ -2007,7 +2007,7 @@ It is not advisable to use it.</source>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatorjobs.cpp" line="181"/>
|
||||
<source>Error writing metadata to the database</source>
|
||||
<translation>Σφάλμα εγγραφής μεταδεδομένων στην βάση δεδομένων</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -2038,7 +2038,7 @@ It is not advisable to use it.</source>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatorjobs.cpp" line="245"/>
|
||||
<source>Error writing metadata to the database</source>
|
||||
<translation>Σφάλμα εγγραφής μεταδεδομένων στην βάση δεδομένων</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -2064,7 +2064,7 @@ It is not advisable to use it.</source>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotemkdir.cpp" line="148"/>
|
||||
<source>Error writing metadata to the database</source>
|
||||
<translation>Σφάλμα εγγραφής μεταδεδομένων στην βάση δεδομένων</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -2092,7 +2092,7 @@ It is not advisable to use it.</source>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotemove.cpp" line="175"/>
|
||||
<source>Error writing metadata to the database</source>
|
||||
<translation>Σφάλμα εγγραφής μεταδεδομένων στην βάση δεδομένων</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -2141,7 +2141,7 @@ It is not advisable to use it.</source>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateupload.cpp" line="800"/>
|
||||
<source>Error writing metadata to the database</source>
|
||||
<translation>Σφάλμα εγγραφής μεταδεδομένων στην βάση δεδομένων</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -2184,7 +2184,7 @@ It is not advisable to use it.</source>
|
||||
<message>
|
||||
<location filename="../src/gui/protocolwidget.cpp" line="78"/>
|
||||
<source>Local sync protocol</source>
|
||||
<translation>Πρωτόκολλο τοπικού συγχρονισμού</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/protocolwidget.cpp" line="80"/>
|
||||
@@ -2279,7 +2279,7 @@ It is not advisable to use it.</source>
|
||||
<message>
|
||||
<location filename="../src/gui/selectivesyncdialog.cpp" line="247"/>
|
||||
<source>An error occurred while loading the list of sub folders.</source>
|
||||
<translation>Παρουσιάστηκε σφάλμα κατά την φόρτωση της λίστας των υπο-φακέλων</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -2378,7 +2378,7 @@ It is not advisable to use it.</source>
|
||||
<message>
|
||||
<location filename="../src/gui/sharedialog.cpp" line="101"/>
|
||||
<source>The server does not allow sharing</source>
|
||||
<translation>Ο διακομιστής δεν επιτρέπει τον διαμοιρασμό</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/sharedialog.cpp" line="113"/>
|
||||
@@ -2450,18 +2450,18 @@ It is not advisable to use it.</source>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="366"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="413"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="412"/>
|
||||
<source>Public sh&aring requires a password</source>
|
||||
<translation>Ο δημόσιος &διαμοιρασμός απαιτεί κωδικό πρόσβασης</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="435"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="434"/>
|
||||
<source>Please Set Password</source>
|
||||
<translation>Παρακαλούμε ορίστε Κωδικό</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="500"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="501"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="498"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="499"/>
|
||||
<source>&Share link</source>
|
||||
<translation>Δ&ιαμοιρασμός συνδέσμου</translation>
|
||||
</message>
|
||||
@@ -2481,7 +2481,7 @@ It is not advisable to use it.</source>
|
||||
<message>
|
||||
<location filename="../src/gui/shareusergroupwidget.cpp" line="224"/>
|
||||
<source>No results for '%1'</source>
|
||||
<translation>Κανένα αποτέλεσμα για '%1'</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -2862,7 +2862,7 @@ It is not advisable to use it.</source>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="440"/>
|
||||
<source>File/Folder is ignored because it's hidden.</source>
|
||||
<translation>Το Αρχείο/ο Φάκελος αγνοήθηκε επειδή είναι κρυφό.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="701"/>
|
||||
@@ -2871,12 +2871,12 @@ It is not advisable to use it.</source>
|
||||
<translation>Μόνο %1 είναι διαθέσιμα, απαιτούνται τουλάχιστον %2 για την εκκίνηση</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1139"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1134"/>
|
||||
<source>Not allowed because you don't have permission to add parent folder</source>
|
||||
<translation>Δεν επιτρέπεται επειδή δεν έχετε δικαιώματα να προσθέσετε γονικό κατάλογο</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1146"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1141"/>
|
||||
<source>Not allowed because you don't have permission to add files in that folder</source>
|
||||
<translation>Δεν επιτρέπεται επειδή δεν έχετε δικαιώματα να προσθέσετε αρχεία σε αυτόν τον φάκελο</translation>
|
||||
</message>
|
||||
@@ -2928,7 +2928,7 @@ It is not advisable to use it.</source>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="188"/>
|
||||
<source>Access is forbidden</source>
|
||||
<translation>Δεν επιτρέπεται η πρόσβαση</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="199"/>
|
||||
@@ -2978,67 +2978,67 @@ It is not advisable to use it.</source>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="754"/>
|
||||
<source>Unable to read the blacklist from the local database</source>
|
||||
<translation>Αδυναμία ανάγνωσης της μαύρης λίστας από την τοπική βάση δεδομένων</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="791"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="787"/>
|
||||
<source>Unable to read from the sync journal.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="837"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="833"/>
|
||||
<source>Cannot open the sync journal</source>
|
||||
<translation>Αδυναμία ανοίγματος του αρχείου συγχρονισμού</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="894"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="889"/>
|
||||
<source>File name contains at least one invalid character</source>
|
||||
<translation>Το όνομα αρχείου περιέχει έναν τουλάχιστον μη έγκυρο χαρακτήρα</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1098"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1105"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1093"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1100"/>
|
||||
<source>Ignored because of the "choose what to sync" blacklist</source>
|
||||
<translation>Αγνοήθηκε εξαιτίας της μαύρης λίστας "διάλεξε τι να συγχρονιστεί"</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1124"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1119"/>
|
||||
<source>Not allowed because you don't have permission to add subfolders to that folder</source>
|
||||
<translation>Δεν επιτρέπεται επειδή δεν έχετε δικαιώματα να προσθέσετε υποφακέλους σε αυτό τον φάκελο</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1166"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1161"/>
|
||||
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
|
||||
<translation>Δεν επιτρέπεται να μεταφορτώσετε αυτό το αρχείο επειδή είναι μόνο για ανάγνωση στο διακομιστή, αποκατάσταση σε εξέλιξη</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1183"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1203"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1178"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1198"/>
|
||||
<source>Not allowed to remove, restoring</source>
|
||||
<translation>Δεν επιτρέπεται η αφαίρεση, αποκατάσταση σε εξέλιξη</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1216"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1211"/>
|
||||
<source>Local files and share folder removed.</source>
|
||||
<translation>Οι τοπικοί φάκελοι και ο φάκελος κοινής χρήσης αφαιρέθηκαν.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1272"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1267"/>
|
||||
<source>Move not allowed, item restored</source>
|
||||
<translation>Η μετακίνηση δεν επιτρέπεται, το αντικείμενο αποκαταστάθηκε</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1283"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1278"/>
|
||||
<source>Move not allowed because %1 is read-only</source>
|
||||
<translation>Η μετακίνηση δεν επιτρέπεται επειδή το %1 είναι μόνο για ανάγνωση</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1284"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1279"/>
|
||||
<source>the destination</source>
|
||||
<translation>ο προορισμός</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1284"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1279"/>
|
||||
<source>the source</source>
|
||||
<translation>η προέλευση</translation>
|
||||
</message>
|
||||
@@ -3048,7 +3048,7 @@ It is not advisable to use it.</source>
|
||||
<message>
|
||||
<location filename="../src/gui/synclogdialog.ui" line="14"/>
|
||||
<source>Synchronisation Log</source>
|
||||
<translation>Ιστορικό συγχρονισμού</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -3068,8 +3068,8 @@ It is not advisable to use it.</source>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/theme.cpp" line="289"/>
|
||||
<source><p>Copyright ownCloud GmbH</p></source>
|
||||
<translation type="unfinished"/>
|
||||
<source><p>Copyright ownCloud, Incorporated</p></source>
|
||||
<translation><p>Πνευματικά δικαιώματα ownCloud, Ανώνυμη Εταιρία</p></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/theme.cpp" line="290"/>
|
||||
@@ -3195,7 +3195,7 @@ It is not advisable to use it.</source>
|
||||
<message>
|
||||
<location filename="../src/gui/owncloudgui.cpp" line="236"/>
|
||||
<source>Unsupported Server Version</source>
|
||||
<translation>Μη υποστηριζόμενη έκδοση διακομιστή</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/owncloudgui.cpp" line="237"/>
|
||||
@@ -3215,37 +3215,37 @@ It is not advisable to use it.</source>
|
||||
<message>
|
||||
<location filename="../src/gui/owncloudgui.cpp" line="296"/>
|
||||
<source>Account synchronization is disabled</source>
|
||||
<translation>Ο λογαριασμός συγχρονισμού έχει απενεργοποιηθεί</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/owncloudgui.cpp" line="379"/>
|
||||
<source>Unpause all folders</source>
|
||||
<translation>Αναίρεση παύσης όλων των φακέλων</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/owncloudgui.cpp" line="384"/>
|
||||
<source>Pause all folders</source>
|
||||
<translation>Παύση όλων των φακέλων</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/owncloudgui.cpp" line="515"/>
|
||||
<source>Unpause all synchronization</source>
|
||||
<translation>Αναίρεση παύσης όλων των συγχρονισμών</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/owncloudgui.cpp" line="517"/>
|
||||
<source>Unpause synchronization</source>
|
||||
<translation>Αναίρεση παύσης συγχρονσμού</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/owncloudgui.cpp" line="525"/>
|
||||
<source>Pause all synchronization</source>
|
||||
<translation>Παύση όλων των συγχρονισμών</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/owncloudgui.cpp" line="527"/>
|
||||
<source>Pause synchronization</source>
|
||||
<translation>Παύση συγχρονισμού</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/owncloudgui.cpp" line="534"/>
|
||||
@@ -3293,8 +3293,8 @@ It is not advisable to use it.</source>
|
||||
<name>OCC::ownCloudTheme</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/owncloudtheme.cpp" line="47"/>
|
||||
<source><p>Version %2. For more information visit <a href="%3">%4</a></p><p><small>By Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz and others.</small></p><p>Copyright ownCloud GmbH</p><p>Licensed under the GNU General Public License (GPL) Version 2.0<br/>ownCloud and the ownCloud Logo are registered trademarks of ownCloud, Inc. in the United States, other countries, or both.</p></source>
|
||||
<translation type="unfinished"/>
|
||||
<source><p>Version %2. For more information visit <a href="%3">%4</a></p><p><small>By Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz and others.</small></p><p>Copyright ownCloud, Inc.</p><p>Licensed under the GNU General Public License (GPL) Version 2.0<br/>ownCloud and the ownCloud Logo are registered trademarks of ownCloud, Inc. in the United States, other countries, or both.</p></source>
|
||||
<translation><p>Έκδοση %2. Για περισσότερες πληροφορίες επισκεφθείτε <a href="%3">%4</a></p><p><small>Των Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz και άλλων.</small></p><p>Πνευματικά δικαιώματα ownCloud, Inc.</p><p>Αδειοδότηση υπό την GNU General Public License (GPL) Έκδοση 2.0<br/>το ownCloud και το λογότυπο ownCloud είναι σήματα κατατεθέντα της ownCloud, Inc. στις Η.Π.Α., σε άλλες χώρες ή και στα δύο</p></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -3507,7 +3507,7 @@ It is not advisable to use it.</source>
|
||||
<message>
|
||||
<location filename="../src/gui/application.cpp" line="599"/>
|
||||
<source>QT_LAYOUT_DIRECTION</source>
|
||||
<translation>QT_LAYOUT_DIRECTION</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -3515,7 +3515,7 @@ It is not advisable to use it.</source>
|
||||
<message>
|
||||
<location filename="../src/libsync/utility.cpp" line="473"/>
|
||||
<source>in the future</source>
|
||||
<translation>στο μέλλον</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<location filename="../src/libsync/utility.cpp" line="469"/>
|
||||
@@ -3530,12 +3530,12 @@ It is not advisable to use it.</source>
|
||||
<message>
|
||||
<location filename="../src/libsync/utility.cpp" line="482"/>
|
||||
<source>now</source>
|
||||
<translation>τώρα</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/utility.cpp" line="484"/>
|
||||
<source>Less than a minute ago</source>
|
||||
<translation>Λιγότερο από ένα λεπτό πριν</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<location filename="../src/libsync/utility.cpp" line="487"/>
|
||||
@@ -3573,7 +3573,7 @@ It is not advisable to use it.</source>
|
||||
<message numerus="yes">
|
||||
<location filename="../src/libsync/utility.cpp" line="319"/>
|
||||
<source>%n year(s)</source>
|
||||
<translation><numerusform>%n χρόνος</numerusform><numerusform>%n χρόνια</numerusform></translation>
|
||||
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<location filename="../src/libsync/utility.cpp" line="320"/>
|
||||
|
||||
+46
-46
@@ -530,7 +530,7 @@
|
||||
<context>
|
||||
<name>OCC::CleanupPollsJob</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="779"/>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="772"/>
|
||||
<source>Error writing metadata to the database</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -918,7 +918,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="205"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="204"/>
|
||||
<source>Signed out</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -928,91 +928,91 @@ Continuing the sync as normal will cause all your files to be overwritten by an
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="170"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="169"/>
|
||||
<source>Fetching folder list from server...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="841"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="832"/>
|
||||
<source>Checking for changes in '%1'</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="876"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="867"/>
|
||||
<source>, '%1'</source>
|
||||
<extracomment>Build a list of file names</extracomment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="879"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="870"/>
|
||||
<source>'%1'</source>
|
||||
<extracomment>Argument is a file name</extracomment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="904"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="895"/>
|
||||
<source>Syncing %1</source>
|
||||
<extracomment>Example text: "Syncing 'foo.txt', 'bar.txt'"</extracomment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="906"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="916"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="897"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="907"/>
|
||||
<source>, </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="910"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="901"/>
|
||||
<source>download %1/s</source>
|
||||
<extracomment>Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated))</extracomment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="912"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="903"/>
|
||||
<source>u2193 %1/s</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="910"/>
|
||||
<source>upload %1/s</source>
|
||||
<extracomment>Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated))</extracomment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="921"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="912"/>
|
||||
<source>u2191 %1/s</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="926"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="917"/>
|
||||
<source>%1 %2 (%3 of %4)</source>
|
||||
<extracomment>Example text: "uploading foobar.png (2MB of 2MB)"</extracomment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="930"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="921"/>
|
||||
<source>%1 %2</source>
|
||||
<extracomment>Example text: "uploading foobar.png"</extracomment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="947"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="938"/>
|
||||
<source>%5 left, %1 of %2, file %3 of %4</source>
|
||||
<extracomment>Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7"</extracomment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="953"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="944"/>
|
||||
<source>file %1 of %2</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="993"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="984"/>
|
||||
<source>Waiting...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="995"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="986"/>
|
||||
<source>Waiting for %n other folder(s)...</source>
|
||||
<translation type="unfinished">
|
||||
<numerusform></numerusform>
|
||||
@@ -1020,7 +1020,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="1001"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="992"/>
|
||||
<source>Preparing to sync...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -1937,7 +1937,7 @@ It is not advisable to use it.</source>
|
||||
<context>
|
||||
<name>OCC::PropagateDirectory</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="718"/>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="712"/>
|
||||
<source>Error writing metadata to the database</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -1975,17 +1975,17 @@ It is not advisable to use it.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="711"/>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="693"/>
|
||||
<source>File %1 cannot be saved because of a local file name clash!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="759"/>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="741"/>
|
||||
<source>File has changed since discovery</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="809"/>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="791"/>
|
||||
<source>Error writing metadata to the database</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -2471,18 +2471,18 @@ It is not advisable to use it.</source>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="366"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="413"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="412"/>
|
||||
<source>Public sh&aring requires a password</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="435"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="434"/>
|
||||
<source>Please Set Password</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="500"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="501"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="498"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="499"/>
|
||||
<source>&Share link</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -2890,12 +2890,12 @@ It is not advisable to use it.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1139"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1134"/>
|
||||
<source>Not allowed because you don't have permission to add parent folder</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1146"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1141"/>
|
||||
<source>Not allowed because you don't have permission to add files in that folder</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -3000,64 +3000,64 @@ It is not advisable to use it.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="791"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="787"/>
|
||||
<source>Unable to read from the sync journal.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="837"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="833"/>
|
||||
<source>Cannot open the sync journal</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="894"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="889"/>
|
||||
<source>File name contains at least one invalid character</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1098"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1105"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1093"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1100"/>
|
||||
<source>Ignored because of the "choose what to sync" blacklist</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1124"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1119"/>
|
||||
<source>Not allowed because you don't have permission to add subfolders to that folder</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1166"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1161"/>
|
||||
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1183"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1203"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1178"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1198"/>
|
||||
<source>Not allowed to remove, restoring</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1216"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1211"/>
|
||||
<source>Local files and share folder removed.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1272"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1267"/>
|
||||
<source>Move not allowed, item restored</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1283"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1278"/>
|
||||
<source>Move not allowed because %1 is read-only</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1284"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1279"/>
|
||||
<source>the destination</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1284"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1279"/>
|
||||
<source>the source</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -3087,7 +3087,7 @@ It is not advisable to use it.</source>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/theme.cpp" line="289"/>
|
||||
<source><p>Copyright ownCloud GmbH</p></source>
|
||||
<source><p>Copyright ownCloud, Incorporated</p></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
@@ -3312,7 +3312,7 @@ It is not advisable to use it.</source>
|
||||
<name>OCC::ownCloudTheme</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/owncloudtheme.cpp" line="47"/>
|
||||
<source><p>Version %2. For more information visit <a href="%3">%4</a></p><p><small>By Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz and others.</small></p><p>Copyright ownCloud GmbH</p><p>Licensed under the GNU General Public License (GPL) Version 2.0<br/>ownCloud and the ownCloud Logo are registered trademarks of ownCloud, Inc. in the United States, other countries, or both.</p></source>
|
||||
<source><p>Version %2. For more information visit <a href="%3">%4</a></p><p><small>By Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz and others.</small></p><p>Copyright ownCloud, Inc.</p><p>Licensed under the GNU General Public License (GPL) Version 2.0<br/>ownCloud and the ownCloud Logo are registered trademarks of ownCloud, Inc. in the United States, other countries, or both.</p></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
|
||||
+48
-48
@@ -522,7 +522,7 @@
|
||||
<context>
|
||||
<name>OCC::CleanupPollsJob</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="779"/>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="772"/>
|
||||
<source>Error writing metadata to the database</source>
|
||||
<translation>Error al escribir los metadatos en la base de datos</translation>
|
||||
</message>
|
||||
@@ -894,7 +894,7 @@ Continuar con la sincronización hará que todos los archivos sean sobreescritos
|
||||
<translation>Error mientras se cargaba la lista de carpetas desde el servidor.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="205"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="204"/>
|
||||
<source>Signed out</source>
|
||||
<translation>Cerrar sesión</translation>
|
||||
</message>
|
||||
@@ -904,96 +904,96 @@ Continuar con la sincronización hará que todos los archivos sean sobreescritos
|
||||
<translation>Añadir carpetas está deshabilitado debido a que ya están sincronizándose todos sus archivos. Si desea sincronizar múltiples carpeta, elimine la carpeta raíz actualmente configurada.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="170"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="169"/>
|
||||
<source>Fetching folder list from server...</source>
|
||||
<translation>Obtención de lista de carpetas del servidor...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="841"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="832"/>
|
||||
<source>Checking for changes in '%1'</source>
|
||||
<translation>Buscando cambios en '%1'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="876"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="867"/>
|
||||
<source>, '%1'</source>
|
||||
<extracomment>Build a list of file names</extracomment>
|
||||
<translation>, '%1'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="879"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="870"/>
|
||||
<source>'%1'</source>
|
||||
<extracomment>Argument is a file name</extracomment>
|
||||
<translation>'%1'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="904"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="895"/>
|
||||
<source>Syncing %1</source>
|
||||
<extracomment>Example text: "Syncing 'foo.txt', 'bar.txt'"</extracomment>
|
||||
<translation>Sincronizando %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="906"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="916"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="897"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="907"/>
|
||||
<source>, </source>
|
||||
<translation>, </translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="910"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="901"/>
|
||||
<source>download %1/s</source>
|
||||
<extracomment>Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated))</extracomment>
|
||||
<translation>descargando: %1/s</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="912"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="903"/>
|
||||
<source>u2193 %1/s</source>
|
||||
<translation>u2193 %1/s</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="910"/>
|
||||
<source>upload %1/s</source>
|
||||
<extracomment>Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated))</extracomment>
|
||||
<translation>cargar %1/s</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="921"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="912"/>
|
||||
<source>u2191 %1/s</source>
|
||||
<translation>u2191 %1/s</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="926"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="917"/>
|
||||
<source>%1 %2 (%3 of %4)</source>
|
||||
<extracomment>Example text: "uploading foobar.png (2MB of 2MB)"</extracomment>
|
||||
<translation>%1 %2 (%3 de %4)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="930"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="921"/>
|
||||
<source>%1 %2</source>
|
||||
<extracomment>Example text: "uploading foobar.png"</extracomment>
|
||||
<translation>%1 %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="947"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="938"/>
|
||||
<source>%5 left, %1 of %2, file %3 of %4</source>
|
||||
<extracomment>Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7"</extracomment>
|
||||
<translation>%5 restantes, %1 de %2, archivo %3 de %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="953"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="944"/>
|
||||
<source>file %1 of %2</source>
|
||||
<translation>archivo %1 de %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="993"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="984"/>
|
||||
<source>Waiting...</source>
|
||||
<translation>Esperando...</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="995"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="986"/>
|
||||
<source>Waiting for %n other folder(s)...</source>
|
||||
<translation><numerusform>Esperando por %n carpeta...</numerusform><numerusform>Esperando por %n otras carpetas...</numerusform></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="1001"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="992"/>
|
||||
<source>Preparing to sync...</source>
|
||||
<translation>Preparando para sincronizar...</translation>
|
||||
</message>
|
||||
@@ -1917,7 +1917,7 @@ No se recomienda usarla.</translation>
|
||||
<context>
|
||||
<name>OCC::PropagateDirectory</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="718"/>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="712"/>
|
||||
<source>Error writing metadata to the database</source>
|
||||
<translation>Error al escribir los metadatos en la base de datos</translation>
|
||||
</message>
|
||||
@@ -1955,17 +1955,17 @@ No se recomienda usarla.</translation>
|
||||
<translation>El archivo descargado está vacio aunque el servidor dice que deberia haber sido %1.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="711"/>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="693"/>
|
||||
<source>File %1 cannot be saved because of a local file name clash!</source>
|
||||
<translation>¡El fichero %1 no puede guardarse debido a un conflicto con el nombre de otro fichero local!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="759"/>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="741"/>
|
||||
<source>File has changed since discovery</source>
|
||||
<translation>El archivo ha cambiado desde que fue descubierto</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="809"/>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="791"/>
|
||||
<source>Error writing metadata to the database</source>
|
||||
<translation>Error al escribir los metadatos en la base de datos</translation>
|
||||
</message>
|
||||
@@ -2451,18 +2451,18 @@ No se recomienda usarla.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="366"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="413"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="412"/>
|
||||
<source>Public sh&aring requires a password</source>
|
||||
<translation>Compartir public&amente requiere contraseña</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="435"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="434"/>
|
||||
<source>Please Set Password</source>
|
||||
<translation>Por favor establece una contraseña</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="500"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="501"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="498"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="499"/>
|
||||
<source>&Share link</source>
|
||||
<translation>&Compartir enlace</translation>
|
||||
</message>
|
||||
@@ -2872,12 +2872,12 @@ No se recomienda usarla.</translation>
|
||||
<translation>Solo %1 disponible, se necesita por lo menos %2 para comenzar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1139"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1134"/>
|
||||
<source>Not allowed because you don't have permission to add parent folder</source>
|
||||
<translation>No permitido porque no tienes permiso para añadir un directorio padre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1146"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1141"/>
|
||||
<source>Not allowed because you don't have permission to add files in that folder</source>
|
||||
<translation>No permitido porque no tienes permiso para añadir archivos a ese directorio</translation>
|
||||
</message>
|
||||
@@ -2982,64 +2982,64 @@ No se recomienda usarla.</translation>
|
||||
<translation>No se pudo leer la lista de bloqueo de la base de datos local</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="791"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="787"/>
|
||||
<source>Unable to read from the sync journal.</source>
|
||||
<translation>No se ha podido leer desde el registro de sincronización</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="837"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="833"/>
|
||||
<source>Cannot open the sync journal</source>
|
||||
<translation>No es posible abrir el diario de sincronización</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="894"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="889"/>
|
||||
<source>File name contains at least one invalid character</source>
|
||||
<translation>Nombre de archivo contiene al menos un caracter no válido</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1098"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1105"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1093"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1100"/>
|
||||
<source>Ignored because of the "choose what to sync" blacklist</source>
|
||||
<translation>Ignorado porque se encuentra en la lista negra de "elija qué va a sincronizar"</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1124"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1119"/>
|
||||
<source>Not allowed because you don't have permission to add subfolders to that folder</source>
|
||||
<translation>No permitido porque no tienes permiso para añadir subdirectorios a ese directorio</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1166"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1161"/>
|
||||
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
|
||||
<translation>No está permitido subir este archivo porque es de solo lectura en el servidor, restaurando.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1183"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1203"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1178"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1198"/>
|
||||
<source>Not allowed to remove, restoring</source>
|
||||
<translation>No está permitido borrar, restaurando.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1216"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1211"/>
|
||||
<source>Local files and share folder removed.</source>
|
||||
<translation>Se han eliminado los archivos locales y la carpeta compartida.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1272"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1267"/>
|
||||
<source>Move not allowed, item restored</source>
|
||||
<translation>No está permitido mover, elemento restaurado.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1283"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1278"/>
|
||||
<source>Move not allowed because %1 is read-only</source>
|
||||
<translation>No está permitido mover, porque %1 es de sólo lectura.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1284"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1279"/>
|
||||
<source>the destination</source>
|
||||
<translation>destino</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1284"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1279"/>
|
||||
<source>the source</source>
|
||||
<translation>origen</translation>
|
||||
</message>
|
||||
@@ -3069,8 +3069,8 @@ No se recomienda usarla.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/theme.cpp" line="289"/>
|
||||
<source><p>Copyright ownCloud GmbH</p></source>
|
||||
<translation><p>Copyright ownCloud GmbH</p></translation>
|
||||
<source><p>Copyright ownCloud, Incorporated</p></source>
|
||||
<translation><p>Copyright ownCloud, incorporado</p></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/theme.cpp" line="290"/>
|
||||
@@ -3294,8 +3294,8 @@ No se recomienda usarla.</translation>
|
||||
<name>OCC::ownCloudTheme</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/owncloudtheme.cpp" line="47"/>
|
||||
<source><p>Version %2. For more information visit <a href="%3">%4</a></p><p><small>By Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz and others.</small></p><p>Copyright ownCloud GmbH</p><p>Licensed under the GNU General Public License (GPL) Version 2.0<br/>ownCloud and the ownCloud Logo are registered trademarks of ownCloud, Inc. in the United States, other countries, or both.</p></source>
|
||||
<translation><p>Version %2. Para más información visita <a href="%3">%4</a></p><p><small>By Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz and others.</small></p><p>Copyright ownCloud GmbH</p><p>Licensed under the GNU General Public License (GPL) Version 2.0<br/>ownCloud and the ownCloud Logo are registered trademarks of ownCloud, Inc. in the United States, other countries, or both.</p></translation>
|
||||
<source><p>Version %2. For more information visit <a href="%3">%4</a></p><p><small>By Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz and others.</small></p><p>Copyright ownCloud, Inc.</p><p>Licensed under the GNU General Public License (GPL) Version 2.0<br/>ownCloud and the ownCloud Logo are registered trademarks of ownCloud, Inc. in the United States, other countries, or both.</p></source>
|
||||
<translation><p>Versión %2. Para más información, visite <a href="%3">%4</a></p><p><small>Creado por Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz y otros.</small></p><p>Copyright ownCloud, Inc.</p><p>Está bajo la Licencia General Pública (GPL, en inglés) GNU Versión 2.0<br/>ownCloud y el logo de ownCloud son marcas registradas de ownCloud, Inc. en los Estados Unidos, otros países, o ambos.</p></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
||||
@@ -522,7 +522,7 @@
|
||||
<context>
|
||||
<name>OCC::CleanupPollsJob</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="779"/>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="772"/>
|
||||
<source>Error writing metadata to the database</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
@@ -889,7 +889,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="205"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="204"/>
|
||||
<source>Signed out</source>
|
||||
<translation>Desautentificado</translation>
|
||||
</message>
|
||||
@@ -899,96 +899,96 @@ Continuing the sync as normal will cause all your files to be overwritten by an
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="170"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="169"/>
|
||||
<source>Fetching folder list from server...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="841"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="832"/>
|
||||
<source>Checking for changes in '%1'</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="876"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="867"/>
|
||||
<source>, '%1'</source>
|
||||
<extracomment>Build a list of file names</extracomment>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="879"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="870"/>
|
||||
<source>'%1'</source>
|
||||
<extracomment>Argument is a file name</extracomment>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="904"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="895"/>
|
||||
<source>Syncing %1</source>
|
||||
<extracomment>Example text: "Syncing 'foo.txt', 'bar.txt'"</extracomment>
|
||||
<translation>Sincronizando %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="906"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="916"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="897"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="907"/>
|
||||
<source>, </source>
|
||||
<translation>, </translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="910"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="901"/>
|
||||
<source>download %1/s</source>
|
||||
<extracomment>Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated))</extracomment>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="912"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="903"/>
|
||||
<source>u2193 %1/s</source>
|
||||
<translation>u2193 %1/s</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="910"/>
|
||||
<source>upload %1/s</source>
|
||||
<extracomment>Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated))</extracomment>
|
||||
<translation>Cargado %1/s</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="921"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="912"/>
|
||||
<source>u2191 %1/s</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="926"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="917"/>
|
||||
<source>%1 %2 (%3 of %4)</source>
|
||||
<extracomment>Example text: "uploading foobar.png (2MB of 2MB)"</extracomment>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="930"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="921"/>
|
||||
<source>%1 %2</source>
|
||||
<extracomment>Example text: "uploading foobar.png"</extracomment>
|
||||
<translation>%1 %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="947"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="938"/>
|
||||
<source>%5 left, %1 of %2, file %3 of %4</source>
|
||||
<extracomment>Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7"</extracomment>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="953"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="944"/>
|
||||
<source>file %1 of %2</source>
|
||||
<translation>Archivo %1 de %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="993"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="984"/>
|
||||
<source>Waiting...</source>
|
||||
<translation>Esperando...</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="995"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="986"/>
|
||||
<source>Waiting for %n other folder(s)...</source>
|
||||
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="1001"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="992"/>
|
||||
<source>Preparing to sync...</source>
|
||||
<translation>Preparando para sincronizar...</translation>
|
||||
</message>
|
||||
@@ -1905,7 +1905,7 @@ It is not advisable to use it.</source>
|
||||
<context>
|
||||
<name>OCC::PropagateDirectory</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="718"/>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="712"/>
|
||||
<source>Error writing metadata to the database</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
@@ -1943,17 +1943,17 @@ It is not advisable to use it.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="711"/>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="693"/>
|
||||
<source>File %1 cannot be saved because of a local file name clash!</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="759"/>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="741"/>
|
||||
<source>File has changed since discovery</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="809"/>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="791"/>
|
||||
<source>Error writing metadata to the database</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
@@ -2439,18 +2439,18 @@ It is not advisable to use it.</source>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="366"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="413"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="412"/>
|
||||
<source>Public sh&aring requires a password</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="435"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="434"/>
|
||||
<source>Please Set Password</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="500"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="501"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="498"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="499"/>
|
||||
<source>&Share link</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
@@ -2858,12 +2858,12 @@ It is not advisable to use it.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1139"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1134"/>
|
||||
<source>Not allowed because you don't have permission to add parent folder</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1146"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1141"/>
|
||||
<source>Not allowed because you don't have permission to add files in that folder</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
@@ -2968,64 +2968,64 @@ It is not advisable to use it.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="791"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="787"/>
|
||||
<source>Unable to read from the sync journal.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="837"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="833"/>
|
||||
<source>Cannot open the sync journal</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="894"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="889"/>
|
||||
<source>File name contains at least one invalid character</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1098"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1105"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1093"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1100"/>
|
||||
<source>Ignored because of the "choose what to sync" blacklist</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1124"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1119"/>
|
||||
<source>Not allowed because you don't have permission to add subfolders to that folder</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1166"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1161"/>
|
||||
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1183"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1203"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1178"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1198"/>
|
||||
<source>Not allowed to remove, restoring</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1216"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1211"/>
|
||||
<source>Local files and share folder removed.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1272"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1267"/>
|
||||
<source>Move not allowed, item restored</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1283"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1278"/>
|
||||
<source>Move not allowed because %1 is read-only</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1284"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1279"/>
|
||||
<source>the destination</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1284"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1279"/>
|
||||
<source>the source</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
@@ -3055,7 +3055,7 @@ It is not advisable to use it.</source>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/theme.cpp" line="289"/>
|
||||
<source><p>Copyright ownCloud GmbH</p></source>
|
||||
<source><p>Copyright ownCloud, Incorporated</p></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
@@ -3280,7 +3280,7 @@ It is not advisable to use it.</source>
|
||||
<name>OCC::ownCloudTheme</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/owncloudtheme.cpp" line="47"/>
|
||||
<source><p>Version %2. For more information visit <a href="%3">%4</a></p><p><small>By Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz and others.</small></p><p>Copyright ownCloud GmbH</p><p>Licensed under the GNU General Public License (GPL) Version 2.0<br/>ownCloud and the ownCloud Logo are registered trademarks of ownCloud, Inc. in the United States, other countries, or both.</p></source>
|
||||
<source><p>Version %2. For more information visit <a href="%3">%4</a></p><p><small>By Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz and others.</small></p><p>Copyright ownCloud, Inc.</p><p>Licensed under the GNU General Public License (GPL) Version 2.0<br/>ownCloud and the ownCloud Logo are registered trademarks of ownCloud, Inc. in the United States, other countries, or both.</p></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
|
||||
+46
-46
@@ -522,7 +522,7 @@
|
||||
<context>
|
||||
<name>OCC::CleanupPollsJob</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="779"/>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="772"/>
|
||||
<source>Error writing metadata to the database</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
@@ -889,7 +889,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="205"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="204"/>
|
||||
<source>Signed out</source>
|
||||
<translation>Välja logitud</translation>
|
||||
</message>
|
||||
@@ -899,96 +899,96 @@ Continuing the sync as normal will cause all your files to be overwritten by an
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="170"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="169"/>
|
||||
<source>Fetching folder list from server...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="841"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="832"/>
|
||||
<source>Checking for changes in '%1'</source>
|
||||
<translation>Kontrollitakse muudatusi kaustas '%1'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="876"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="867"/>
|
||||
<source>, '%1'</source>
|
||||
<extracomment>Build a list of file names</extracomment>
|
||||
<translation>, '%1'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="879"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="870"/>
|
||||
<source>'%1'</source>
|
||||
<extracomment>Argument is a file name</extracomment>
|
||||
<translation>'%1'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="904"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="895"/>
|
||||
<source>Syncing %1</source>
|
||||
<extracomment>Example text: "Syncing 'foo.txt', 'bar.txt'"</extracomment>
|
||||
<translation>Sünkroniseerimine %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="906"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="916"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="897"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="907"/>
|
||||
<source>, </source>
|
||||
<translation>, </translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="910"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="901"/>
|
||||
<source>download %1/s</source>
|
||||
<extracomment>Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated))</extracomment>
|
||||
<translation>allalaadimine %1/s</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="912"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="903"/>
|
||||
<source>u2193 %1/s</source>
|
||||
<translation>u2193 %1/s</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="910"/>
|
||||
<source>upload %1/s</source>
|
||||
<extracomment>Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated))</extracomment>
|
||||
<translation>üleslaadimine %1/s</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="921"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="912"/>
|
||||
<source>u2191 %1/s</source>
|
||||
<translation>u2191 %1/s</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="926"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="917"/>
|
||||
<source>%1 %2 (%3 of %4)</source>
|
||||
<extracomment>Example text: "uploading foobar.png (2MB of 2MB)"</extracomment>
|
||||
<translation>%1 %2 (%3 / %4)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="930"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="921"/>
|
||||
<source>%1 %2</source>
|
||||
<extracomment>Example text: "uploading foobar.png"</extracomment>
|
||||
<translation>%1 %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="947"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="938"/>
|
||||
<source>%5 left, %1 of %2, file %3 of %4</source>
|
||||
<extracomment>Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7"</extracomment>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="953"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="944"/>
|
||||
<source>file %1 of %2</source>
|
||||
<translation>fail %1 / %2-st</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="993"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="984"/>
|
||||
<source>Waiting...</source>
|
||||
<translation>Ootamine...</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="995"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="986"/>
|
||||
<source>Waiting for %n other folder(s)...</source>
|
||||
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="1001"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="992"/>
|
||||
<source>Preparing to sync...</source>
|
||||
<translation>Sünkroniseerimiseks valmistumine...</translation>
|
||||
</message>
|
||||
@@ -1906,7 +1906,7 @@ Selle kasutamine pole soovitatav.</translation>
|
||||
<context>
|
||||
<name>OCC::PropagateDirectory</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="718"/>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="712"/>
|
||||
<source>Error writing metadata to the database</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
@@ -1944,17 +1944,17 @@ Selle kasutamine pole soovitatav.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="711"/>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="693"/>
|
||||
<source>File %1 cannot be saved because of a local file name clash!</source>
|
||||
<translation>Faili %1 ei saa salvestada kuna on nime konflikt kohaliku failiga!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="759"/>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="741"/>
|
||||
<source>File has changed since discovery</source>
|
||||
<translation>Faili on pärast avastamist muudetud</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="809"/>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="791"/>
|
||||
<source>Error writing metadata to the database</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
@@ -2440,18 +2440,18 @@ Selle kasutamine pole soovitatav.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="366"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="413"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="412"/>
|
||||
<source>Public sh&aring requires a password</source>
|
||||
<translation>Avalik j&agamine nõuab parooli</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="435"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="434"/>
|
||||
<source>Please Set Password</source>
|
||||
<translation>Palun määra parool</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="500"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="501"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="498"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="499"/>
|
||||
<source>&Share link</source>
|
||||
<translation>&Jaga linki</translation>
|
||||
</message>
|
||||
@@ -2861,12 +2861,12 @@ Selle kasutamine pole soovitatav.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1139"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1134"/>
|
||||
<source>Not allowed because you don't have permission to add parent folder</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1146"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1141"/>
|
||||
<source>Not allowed because you don't have permission to add files in that folder</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
@@ -2971,64 +2971,64 @@ Selle kasutamine pole soovitatav.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="791"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="787"/>
|
||||
<source>Unable to read from the sync journal.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="837"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="833"/>
|
||||
<source>Cannot open the sync journal</source>
|
||||
<translation>Ei suuda avada sünkroniseeringu zurnaali</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="894"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="889"/>
|
||||
<source>File name contains at least one invalid character</source>
|
||||
<translation>Faili nimesonvähemalt üks keelatud märk</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1098"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1105"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1093"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1100"/>
|
||||
<source>Ignored because of the "choose what to sync" blacklist</source>
|
||||
<translation>"Vali, mida sünkroniseerida" musta nimekirja tõttu vahele jäetud</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1124"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1119"/>
|
||||
<source>Not allowed because you don't have permission to add subfolders to that folder</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1166"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1161"/>
|
||||
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
|
||||
<translation>Pole lubatud üles laadida, kuna tegemist on ainult-loetava serveriga, taastan</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1183"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1203"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1178"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1198"/>
|
||||
<source>Not allowed to remove, restoring</source>
|
||||
<translation>Eemaldamine pole lubatud, taastan</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1216"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1211"/>
|
||||
<source>Local files and share folder removed.</source>
|
||||
<translation>Kohalikud failid ja jagatud kaustad eemaldatud.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1272"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1267"/>
|
||||
<source>Move not allowed, item restored</source>
|
||||
<translation>Liigutamine pole lubatud, üksus taastatud</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1283"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1278"/>
|
||||
<source>Move not allowed because %1 is read-only</source>
|
||||
<translation>Liigutamien pole võimalik kuna %1 on ainult lugemiseks</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1284"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1279"/>
|
||||
<source>the destination</source>
|
||||
<translation>sihtkoht</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1284"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1279"/>
|
||||
<source>the source</source>
|
||||
<translation>allikas</translation>
|
||||
</message>
|
||||
@@ -3058,7 +3058,7 @@ Selle kasutamine pole soovitatav.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/theme.cpp" line="289"/>
|
||||
<source><p>Copyright ownCloud GmbH</p></source>
|
||||
<source><p>Copyright ownCloud, Incorporated</p></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
@@ -3283,7 +3283,7 @@ Selle kasutamine pole soovitatav.</translation>
|
||||
<name>OCC::ownCloudTheme</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/owncloudtheme.cpp" line="47"/>
|
||||
<source><p>Version %2. For more information visit <a href="%3">%4</a></p><p><small>By Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz and others.</small></p><p>Copyright ownCloud GmbH</p><p>Licensed under the GNU General Public License (GPL) Version 2.0<br/>ownCloud and the ownCloud Logo are registered trademarks of ownCloud, Inc. in the United States, other countries, or both.</p></source>
|
||||
<source><p>Version %2. For more information visit <a href="%3">%4</a></p><p><small>By Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz and others.</small></p><p>Copyright ownCloud, Inc.</p><p>Licensed under the GNU General Public License (GPL) Version 2.0<br/>ownCloud and the ownCloud Logo are registered trademarks of ownCloud, Inc. in the United States, other countries, or both.</p></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
|
||||
+47
-47
@@ -522,7 +522,7 @@
|
||||
<context>
|
||||
<name>OCC::CleanupPollsJob</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="779"/>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="772"/>
|
||||
<source>Error writing metadata to the database</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
@@ -889,7 +889,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
|
||||
<translation>Errorea zerbitzaritik karpeten zerrenda eskuratzean.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="205"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="204"/>
|
||||
<source>Signed out</source>
|
||||
<translation>Saioa bukatuta</translation>
|
||||
</message>
|
||||
@@ -899,96 +899,96 @@ Continuing the sync as normal will cause all your files to be overwritten by an
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="170"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="169"/>
|
||||
<source>Fetching folder list from server...</source>
|
||||
<translation>Zerbitzaritik karpeta zerrenda eskuratzen...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="841"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="832"/>
|
||||
<source>Checking for changes in '%1'</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="876"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="867"/>
|
||||
<source>, '%1'</source>
|
||||
<extracomment>Build a list of file names</extracomment>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="879"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="870"/>
|
||||
<source>'%1'</source>
|
||||
<extracomment>Argument is a file name</extracomment>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="904"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="895"/>
|
||||
<source>Syncing %1</source>
|
||||
<extracomment>Example text: "Syncing 'foo.txt', 'bar.txt'"</extracomment>
|
||||
<translation>%1 Sinkronizatzen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="906"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="916"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="897"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="907"/>
|
||||
<source>, </source>
|
||||
<translation>, </translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="910"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="901"/>
|
||||
<source>download %1/s</source>
|
||||
<extracomment>Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated))</extracomment>
|
||||
<translation>Deskargatu %1/s</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="912"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="903"/>
|
||||
<source>u2193 %1/s</source>
|
||||
<translation>u2193 %1/s</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="910"/>
|
||||
<source>upload %1/s</source>
|
||||
<extracomment>Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated))</extracomment>
|
||||
<translation>igo %1/s</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="921"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="912"/>
|
||||
<source>u2191 %1/s</source>
|
||||
<translation>u2191 %1/s</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="926"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="917"/>
|
||||
<source>%1 %2 (%3 of %4)</source>
|
||||
<extracomment>Example text: "uploading foobar.png (2MB of 2MB)"</extracomment>
|
||||
<translation>%1 %2 (%4 - %3tik)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="930"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="921"/>
|
||||
<source>%1 %2</source>
|
||||
<extracomment>Example text: "uploading foobar.png"</extracomment>
|
||||
<translation>%1 %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="947"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="938"/>
|
||||
<source>%5 left, %1 of %2, file %3 of %4</source>
|
||||
<extracomment>Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7"</extracomment>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="953"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="944"/>
|
||||
<source>file %1 of %2</source>
|
||||
<translation>%1. fitxategia %2tik</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="993"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="984"/>
|
||||
<source>Waiting...</source>
|
||||
<translation>Itxoiten...</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="995"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="986"/>
|
||||
<source>Waiting for %n other folder(s)...</source>
|
||||
<translation><numerusform>Itxoiten beste karpeta %n...</numerusform><numerusform>Itxoiten beste %n karpeta...</numerusform></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="1001"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="992"/>
|
||||
<source>Preparing to sync...</source>
|
||||
<translation>Sinkronizatzeko prestatzen...</translation>
|
||||
</message>
|
||||
@@ -1912,7 +1912,7 @@ Ez da gomendagarria erabltzea.</translation>
|
||||
<context>
|
||||
<name>OCC::PropagateDirectory</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="718"/>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="712"/>
|
||||
<source>Error writing metadata to the database</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
@@ -1950,17 +1950,17 @@ Ez da gomendagarria erabltzea.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="711"/>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="693"/>
|
||||
<source>File %1 cannot be saved because of a local file name clash!</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="759"/>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="741"/>
|
||||
<source>File has changed since discovery</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="809"/>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="791"/>
|
||||
<source>Error writing metadata to the database</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
@@ -2446,18 +2446,18 @@ Ez da gomendagarria erabltzea.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="366"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="413"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="412"/>
|
||||
<source>Public sh&aring requires a password</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="435"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="434"/>
|
||||
<source>Please Set Password</source>
|
||||
<translation>Mesedez Ezarri Pasahitza</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="500"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="501"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="498"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="499"/>
|
||||
<source>&Share link</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
@@ -2865,12 +2865,12 @@ Ez da gomendagarria erabltzea.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1139"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1134"/>
|
||||
<source>Not allowed because you don't have permission to add parent folder</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1146"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1141"/>
|
||||
<source>Not allowed because you don't have permission to add files in that folder</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
@@ -2975,64 +2975,64 @@ Ez da gomendagarria erabltzea.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="791"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="787"/>
|
||||
<source>Unable to read from the sync journal.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="837"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="833"/>
|
||||
<source>Cannot open the sync journal</source>
|
||||
<translation>Ezin da sinkronizazio egunerokoa ireki</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="894"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="889"/>
|
||||
<source>File name contains at least one invalid character</source>
|
||||
<translation>Fitxategi izenak behintzat baliogabeko karaktere bat du</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1098"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1105"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1093"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1100"/>
|
||||
<source>Ignored because of the "choose what to sync" blacklist</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1124"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1119"/>
|
||||
<source>Not allowed because you don't have permission to add subfolders to that folder</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1166"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1161"/>
|
||||
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1183"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1203"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1178"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1198"/>
|
||||
<source>Not allowed to remove, restoring</source>
|
||||
<translation>Ezabatzeko baimenik gabe, berrezartzen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1216"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1211"/>
|
||||
<source>Local files and share folder removed.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1272"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1267"/>
|
||||
<source>Move not allowed, item restored</source>
|
||||
<translation>Mugitzea ez dago baimenduta, elementua berrezarri da</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1283"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1278"/>
|
||||
<source>Move not allowed because %1 is read-only</source>
|
||||
<translation>Mugitzea ez dago baimenduta %1 irakurtzeko bakarrik delako</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1284"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1279"/>
|
||||
<source>the destination</source>
|
||||
<translation>helburua</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1284"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1279"/>
|
||||
<source>the source</source>
|
||||
<translation>jatorria</translation>
|
||||
</message>
|
||||
@@ -3062,7 +3062,7 @@ Ez da gomendagarria erabltzea.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/theme.cpp" line="289"/>
|
||||
<source><p>Copyright ownCloud GmbH</p></source>
|
||||
<source><p>Copyright ownCloud, Incorporated</p></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
@@ -3287,8 +3287,8 @@ Ez da gomendagarria erabltzea.</translation>
|
||||
<name>OCC::ownCloudTheme</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/owncloudtheme.cpp" line="47"/>
|
||||
<source><p>Version %2. For more information visit <a href="%3">%4</a></p><p><small>By Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz and others.</small></p><p>Copyright ownCloud GmbH</p><p>Licensed under the GNU General Public License (GPL) Version 2.0<br/>ownCloud and the ownCloud Logo are registered trademarks of ownCloud, Inc. in the United States, other countries, or both.</p></source>
|
||||
<translation type="unfinished"/>
|
||||
<source><p>Version %2. For more information visit <a href="%3">%4</a></p><p><small>By Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz and others.</small></p><p>Copyright ownCloud, Inc.</p><p>Licensed under the GNU General Public License (GPL) Version 2.0<br/>ownCloud and the ownCloud Logo are registered trademarks of ownCloud, Inc. in the United States, other countries, or both.</p></source>
|
||||
<translation><p>%2 Bertsioa. Informazio gehiago eskuratzeko ikusi <a href="%3">%4</a></p><p><small>Egileak: Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz eta bestea batzuk.</small></p><p>Copyright ownCloud, Inc.</p><p>GNU General Public License (GPL) 2.0 bertsioaren lizentziapean banatuta.<br/>ownCloud eta ownCloud-en Logoa ownCloud, Inc. enpresaren marka erregistratuak dira Estatu Batuetan, beste herrialdeetan edo bietan.</p></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
||||
+46
-46
@@ -522,7 +522,7 @@
|
||||
<context>
|
||||
<name>OCC::CleanupPollsJob</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="779"/>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="772"/>
|
||||
<source>Error writing metadata to the database</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
@@ -889,7 +889,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="205"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="204"/>
|
||||
<source>Signed out</source>
|
||||
<translation>خارج شد</translation>
|
||||
</message>
|
||||
@@ -899,96 +899,96 @@ Continuing the sync as normal will cause all your files to be overwritten by an
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="170"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="169"/>
|
||||
<source>Fetching folder list from server...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="841"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="832"/>
|
||||
<source>Checking for changes in '%1'</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="876"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="867"/>
|
||||
<source>, '%1'</source>
|
||||
<extracomment>Build a list of file names</extracomment>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="879"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="870"/>
|
||||
<source>'%1'</source>
|
||||
<extracomment>Argument is a file name</extracomment>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="904"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="895"/>
|
||||
<source>Syncing %1</source>
|
||||
<extracomment>Example text: "Syncing 'foo.txt', 'bar.txt'"</extracomment>
|
||||
<translation>همگامسازی %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="906"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="916"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="897"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="907"/>
|
||||
<source>, </source>
|
||||
<translation>رشته های ترجمه نشده</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="910"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="901"/>
|
||||
<source>download %1/s</source>
|
||||
<extracomment>Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated))</extracomment>
|
||||
<translation>دانلود %1/s</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="912"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="903"/>
|
||||
<source>u2193 %1/s</source>
|
||||
<translation>u2193 %1/s</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="910"/>
|
||||
<source>upload %1/s</source>
|
||||
<extracomment>Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated))</extracomment>
|
||||
<translation>آپلود %1/s</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="921"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="912"/>
|
||||
<source>u2191 %1/s</source>
|
||||
<translation>u2191 %1/s</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="926"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="917"/>
|
||||
<source>%1 %2 (%3 of %4)</source>
|
||||
<extracomment>Example text: "uploading foobar.png (2MB of 2MB)"</extracomment>
|
||||
<translation>%1 %2 (%3 از %4)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="930"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="921"/>
|
||||
<source>%1 %2</source>
|
||||
<extracomment>Example text: "uploading foobar.png"</extracomment>
|
||||
<translation>%1 %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="947"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="938"/>
|
||||
<source>%5 left, %1 of %2, file %3 of %4</source>
|
||||
<extracomment>Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7"</extracomment>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="953"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="944"/>
|
||||
<source>file %1 of %2</source>
|
||||
<translation>فایل %1 از %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="993"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="984"/>
|
||||
<source>Waiting...</source>
|
||||
<translation>درحال انتظار...</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="995"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="986"/>
|
||||
<source>Waiting for %n other folder(s)...</source>
|
||||
<translation><numerusform>در انتظار برای %n پوشهی دیگر ...</numerusform></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="1001"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="992"/>
|
||||
<source>Preparing to sync...</source>
|
||||
<translation>آمادهسازی همگامسازی ...</translation>
|
||||
</message>
|
||||
@@ -1905,7 +1905,7 @@ It is not advisable to use it.</source>
|
||||
<context>
|
||||
<name>OCC::PropagateDirectory</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="718"/>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="712"/>
|
||||
<source>Error writing metadata to the database</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
@@ -1943,17 +1943,17 @@ It is not advisable to use it.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="711"/>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="693"/>
|
||||
<source>File %1 cannot be saved because of a local file name clash!</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="759"/>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="741"/>
|
||||
<source>File has changed since discovery</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="809"/>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="791"/>
|
||||
<source>Error writing metadata to the database</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
@@ -2439,18 +2439,18 @@ It is not advisable to use it.</source>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="366"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="413"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="412"/>
|
||||
<source>Public sh&aring requires a password</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="435"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="434"/>
|
||||
<source>Please Set Password</source>
|
||||
<translation>لطفا رمزعبور را تعیین کنید</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="500"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="501"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="498"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="499"/>
|
||||
<source>&Share link</source>
|
||||
<translation>&اشتراکگذاری لینک</translation>
|
||||
</message>
|
||||
@@ -2858,12 +2858,12 @@ It is not advisable to use it.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1139"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1134"/>
|
||||
<source>Not allowed because you don't have permission to add parent folder</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1146"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1141"/>
|
||||
<source>Not allowed because you don't have permission to add files in that folder</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
@@ -2968,64 +2968,64 @@ It is not advisable to use it.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="791"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="787"/>
|
||||
<source>Unable to read from the sync journal.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="837"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="833"/>
|
||||
<source>Cannot open the sync journal</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="894"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="889"/>
|
||||
<source>File name contains at least one invalid character</source>
|
||||
<translation>نام فایل دارای حداقل یک کاراکتر نامعتبر است</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1098"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1105"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1093"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1100"/>
|
||||
<source>Ignored because of the "choose what to sync" blacklist</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1124"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1119"/>
|
||||
<source>Not allowed because you don't have permission to add subfolders to that folder</source>
|
||||
<translation>با توجه به عدم اجازهی شما به ایجاد زیرپوشه به پوشه مجاز نیست</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1166"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1161"/>
|
||||
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
|
||||
<translation>آپلود این فایل با توجه به فقط-خواندنی بودن آن در سرور مجاز نیست، در حال بازگرداندن</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1183"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1203"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1178"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1198"/>
|
||||
<source>Not allowed to remove, restoring</source>
|
||||
<translation>حذف مجاز نیست، در حال بازگردادن</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1216"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1211"/>
|
||||
<source>Local files and share folder removed.</source>
|
||||
<translation>فایلهای محلی و پوشهی اشتراک حذف شد.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1272"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1267"/>
|
||||
<source>Move not allowed, item restored</source>
|
||||
<translation>انتقال مجاز نیست، مورد بازگردانده شد</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1283"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1278"/>
|
||||
<source>Move not allowed because %1 is read-only</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1284"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1279"/>
|
||||
<source>the destination</source>
|
||||
<translation>مقصد</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1284"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1279"/>
|
||||
<source>the source</source>
|
||||
<translation>مبدا</translation>
|
||||
</message>
|
||||
@@ -3055,7 +3055,7 @@ It is not advisable to use it.</source>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/theme.cpp" line="289"/>
|
||||
<source><p>Copyright ownCloud GmbH</p></source>
|
||||
<source><p>Copyright ownCloud, Incorporated</p></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
@@ -3280,7 +3280,7 @@ It is not advisable to use it.</source>
|
||||
<name>OCC::ownCloudTheme</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/owncloudtheme.cpp" line="47"/>
|
||||
<source><p>Version %2. For more information visit <a href="%3">%4</a></p><p><small>By Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz and others.</small></p><p>Copyright ownCloud GmbH</p><p>Licensed under the GNU General Public License (GPL) Version 2.0<br/>ownCloud and the ownCloud Logo are registered trademarks of ownCloud, Inc. in the United States, other countries, or both.</p></source>
|
||||
<source><p>Version %2. For more information visit <a href="%3">%4</a></p><p><small>By Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz and others.</small></p><p>Copyright ownCloud, Inc.</p><p>Licensed under the GNU General Public License (GPL) Version 2.0<br/>ownCloud and the ownCloud Logo are registered trademarks of ownCloud, Inc. in the United States, other countries, or both.</p></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
|
||||
+48
-48
@@ -522,7 +522,7 @@
|
||||
<context>
|
||||
<name>OCC::CleanupPollsJob</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="779"/>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="772"/>
|
||||
<source>Error writing metadata to the database</source>
|
||||
<translation>Virhe kirjoittaessa metadataa tietokantaan</translation>
|
||||
</message>
|
||||
@@ -890,7 +890,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
|
||||
<translation>Virhe ladatessa kansiolistausta palvelimelta.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="205"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="204"/>
|
||||
<source>Signed out</source>
|
||||
<translation>Kirjauduttu ulos</translation>
|
||||
</message>
|
||||
@@ -900,96 +900,96 @@ Continuing the sync as normal will cause all your files to be overwritten by an
|
||||
<translation>Kansion lisääminen on poistettu käytöstä, koska synkronoit jo kaikki tiedostot. Jos haluat synkronoida useita kansioita, poista nykyisen juurikansion synkronointiyhteys.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="170"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="169"/>
|
||||
<source>Fetching folder list from server...</source>
|
||||
<translation>Haetaan kansioluetteloa palvelimelta...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="841"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="832"/>
|
||||
<source>Checking for changes in '%1'</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="876"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="867"/>
|
||||
<source>, '%1'</source>
|
||||
<extracomment>Build a list of file names</extracomment>
|
||||
<translation>, '%1'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="879"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="870"/>
|
||||
<source>'%1'</source>
|
||||
<extracomment>Argument is a file name</extracomment>
|
||||
<translation>'%1'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="904"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="895"/>
|
||||
<source>Syncing %1</source>
|
||||
<extracomment>Example text: "Syncing 'foo.txt', 'bar.txt'"</extracomment>
|
||||
<translation>Synkronoidaan %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="906"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="916"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="897"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="907"/>
|
||||
<source>, </source>
|
||||
<translation>, </translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="910"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="901"/>
|
||||
<source>download %1/s</source>
|
||||
<extracomment>Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated))</extracomment>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="912"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="903"/>
|
||||
<source>u2193 %1/s</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="910"/>
|
||||
<source>upload %1/s</source>
|
||||
<extracomment>Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated))</extracomment>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="921"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="912"/>
|
||||
<source>u2191 %1/s</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="926"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="917"/>
|
||||
<source>%1 %2 (%3 of %4)</source>
|
||||
<extracomment>Example text: "uploading foobar.png (2MB of 2MB)"</extracomment>
|
||||
<translation>%1 %2 (%3/%4)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="930"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="921"/>
|
||||
<source>%1 %2</source>
|
||||
<extracomment>Example text: "uploading foobar.png"</extracomment>
|
||||
<translation>%1 %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="947"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="938"/>
|
||||
<source>%5 left, %1 of %2, file %3 of %4</source>
|
||||
<extracomment>Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7"</extracomment>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="953"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="944"/>
|
||||
<source>file %1 of %2</source>
|
||||
<translation>tiedosto %1/%2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="993"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="984"/>
|
||||
<source>Waiting...</source>
|
||||
<translation>Odotetaan...</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="995"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="986"/>
|
||||
<source>Waiting for %n other folder(s)...</source>
|
||||
<translation><numerusform>Odotetaan %n muuta kansiota...</numerusform><numerusform>Odotetaan %n muuta kansiota...</numerusform></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="1001"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="992"/>
|
||||
<source>Preparing to sync...</source>
|
||||
<translation>Valmistaudutaan synkronointiin...</translation>
|
||||
</message>
|
||||
@@ -1913,7 +1913,7 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
|
||||
<context>
|
||||
<name>OCC::PropagateDirectory</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="718"/>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="712"/>
|
||||
<source>Error writing metadata to the database</source>
|
||||
<translation>Virhe kirjoittaessa metadataa tietokantaan</translation>
|
||||
</message>
|
||||
@@ -1951,17 +1951,17 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="711"/>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="693"/>
|
||||
<source>File %1 cannot be saved because of a local file name clash!</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="759"/>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="741"/>
|
||||
<source>File has changed since discovery</source>
|
||||
<translation>Tiedosto on muuttunut löytymisen jälkeen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="809"/>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="791"/>
|
||||
<source>Error writing metadata to the database</source>
|
||||
<translation>Virhe kirjoittaessa metadataa tietokantaan</translation>
|
||||
</message>
|
||||
@@ -2447,18 +2447,18 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="366"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="413"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="412"/>
|
||||
<source>Public sh&aring requires a password</source>
|
||||
<translation>&Julkinen jakaminen vaatii salasanan</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="435"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="434"/>
|
||||
<source>Please Set Password</source>
|
||||
<translation>Aseta salasana</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="500"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="501"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="498"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="499"/>
|
||||
<source>&Share link</source>
|
||||
<translation>&Jaa linkki</translation>
|
||||
</message>
|
||||
@@ -2868,12 +2868,12 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
|
||||
<translation>Vain %1 on käytettävissä, käynnistymiseen tarvitaan %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1139"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1134"/>
|
||||
<source>Not allowed because you don't have permission to add parent folder</source>
|
||||
<translation>Ei sallittu, koska käyttöoikeutesi eivät riitä ylätason kansion lisäämiseen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1146"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1141"/>
|
||||
<source>Not allowed because you don't have permission to add files in that folder</source>
|
||||
<translation>Ei sallittu, koska käyttöoikeutesi eivät riitä tiedostojen lisäämiseen kyseiseen kansioon</translation>
|
||||
</message>
|
||||
@@ -2978,64 +2978,64 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="791"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="787"/>
|
||||
<source>Unable to read from the sync journal.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="837"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="833"/>
|
||||
<source>Cannot open the sync journal</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="894"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="889"/>
|
||||
<source>File name contains at least one invalid character</source>
|
||||
<translation>Tiedoston nimi sisältää ainakin yhden virheellisen merkin</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1098"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1105"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1093"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1100"/>
|
||||
<source>Ignored because of the "choose what to sync" blacklist</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1124"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1119"/>
|
||||
<source>Not allowed because you don't have permission to add subfolders to that folder</source>
|
||||
<translation>Ei sallittu, koska oikeutesi eivät riitä alikansioiden lisäämiseen kyseiseen kansioon</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1166"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1161"/>
|
||||
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1183"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1203"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1178"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1198"/>
|
||||
<source>Not allowed to remove, restoring</source>
|
||||
<translation>Poistaminen ei ole sallittua, palautetaan</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1216"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1211"/>
|
||||
<source>Local files and share folder removed.</source>
|
||||
<translation>Paikalliset tiedostot ja jakokansio poistettu.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1272"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1267"/>
|
||||
<source>Move not allowed, item restored</source>
|
||||
<translation>Siirtäminen ei ole sallittua, kohde palautettu</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1283"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1278"/>
|
||||
<source>Move not allowed because %1 is read-only</source>
|
||||
<translation>Siirto ei ole sallittu, koska %1 on "vain luku"-tilassa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1284"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1279"/>
|
||||
<source>the destination</source>
|
||||
<translation>kohde</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1284"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1279"/>
|
||||
<source>the source</source>
|
||||
<translation>lähde</translation>
|
||||
</message>
|
||||
@@ -3065,8 +3065,8 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/theme.cpp" line="289"/>
|
||||
<source><p>Copyright ownCloud GmbH</p></source>
|
||||
<translation type="unfinished"/>
|
||||
<source><p>Copyright ownCloud, Incorporated</p></source>
|
||||
<translation><p>Tekijänoikeus ownCloud, Incorporated</p></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/theme.cpp" line="290"/>
|
||||
@@ -3290,8 +3290,8 @@ Osoitteen käyttäminen ei ole suositeltavaa.</translation>
|
||||
<name>OCC::ownCloudTheme</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/owncloudtheme.cpp" line="47"/>
|
||||
<source><p>Version %2. For more information visit <a href="%3">%4</a></p><p><small>By Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz and others.</small></p><p>Copyright ownCloud GmbH</p><p>Licensed under the GNU General Public License (GPL) Version 2.0<br/>ownCloud and the ownCloud Logo are registered trademarks of ownCloud, Inc. in the United States, other countries, or both.</p></source>
|
||||
<translation type="unfinished"/>
|
||||
<source><p>Version %2. For more information visit <a href="%3">%4</a></p><p><small>By Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz and others.</small></p><p>Copyright ownCloud, Inc.</p><p>Licensed under the GNU General Public License (GPL) Version 2.0<br/>ownCloud and the ownCloud Logo are registered trademarks of ownCloud, Inc. in the United States, other countries, or both.</p></source>
|
||||
<translation><p>Versio %2. Lisätietoja osoitteessa <a href="%3">%4</a></p><p><small>Tehnyt Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz ja muut.</small></p><p>Tekijänoikeus ownCloud, Inc.</p><p>Lisensoitu GNU General Public License (GPL), versio 2.0 -lisenssillä<br/>ownCloud ja ownCloudin logo ovat ownCloud, Incin rekisteröimiä tavaramerkkejä Yhdysvalloissa ja muissa maissa.</p></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
||||
+48
-48
@@ -522,7 +522,7 @@
|
||||
<context>
|
||||
<name>OCC::CleanupPollsJob</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="779"/>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="772"/>
|
||||
<source>Error writing metadata to the database</source>
|
||||
<translation>Erreur à l'écriture des métadonnées dans la base de données</translation>
|
||||
</message>
|
||||
@@ -894,7 +894,7 @@ Continuer la synchronisation comme d'habitude fera en sorte que tous les fi
|
||||
<translation>Une erreur est survenue lors du chargement de la liste des dossiers depuis le serveur.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="205"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="204"/>
|
||||
<source>Signed out</source>
|
||||
<translation>Session fermée</translation>
|
||||
</message>
|
||||
@@ -904,96 +904,96 @@ Continuer la synchronisation comme d'habitude fera en sorte que tous les fi
|
||||
<translation>L'ajout de dossier est désactivé car vous synchronisez déjà tous vos fichiers. Si vous voulez synchroniser plusieurs dossiers, supprimez d'abord le dossier racine configuré actuellement.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="170"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="169"/>
|
||||
<source>Fetching folder list from server...</source>
|
||||
<translation>Récupération de la liste des dossiers depuis le serveur...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="841"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="832"/>
|
||||
<source>Checking for changes in '%1'</source>
|
||||
<translation>Recherche de modifications dans '%1'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="876"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="867"/>
|
||||
<source>, '%1'</source>
|
||||
<extracomment>Build a list of file names</extracomment>
|
||||
<translation>, '%1'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="879"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="870"/>
|
||||
<source>'%1'</source>
|
||||
<extracomment>Argument is a file name</extracomment>
|
||||
<translation>'%1'</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="904"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="895"/>
|
||||
<source>Syncing %1</source>
|
||||
<extracomment>Example text: "Syncing 'foo.txt', 'bar.txt'"</extracomment>
|
||||
<translation>Synchronisation de %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="906"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="916"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="897"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="907"/>
|
||||
<source>, </source>
|
||||
<translation>, </translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="910"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="901"/>
|
||||
<source>download %1/s</source>
|
||||
<extracomment>Example text: "download 24Kb/s" (%1 is replaced by 24Kb (translated))</extracomment>
|
||||
<translation>réception %1/s</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="912"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="903"/>
|
||||
<source>u2193 %1/s</source>
|
||||
<translation>u2193 %1/s</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="910"/>
|
||||
<source>upload %1/s</source>
|
||||
<extracomment>Example text: "upload 24Kb/s" (%1 is replaced by 24Kb (translated))</extracomment>
|
||||
<translation>envoi %1/s</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="921"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="912"/>
|
||||
<source>u2191 %1/s</source>
|
||||
<translation>u2191 %1/s</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="926"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="917"/>
|
||||
<source>%1 %2 (%3 of %4)</source>
|
||||
<extracomment>Example text: "uploading foobar.png (2MB of 2MB)"</extracomment>
|
||||
<translation>%1 %2 (%3 de %4)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="930"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="921"/>
|
||||
<source>%1 %2</source>
|
||||
<extracomment>Example text: "uploading foobar.png"</extracomment>
|
||||
<translation>%1 %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="947"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="938"/>
|
||||
<source>%5 left, %1 of %2, file %3 of %4</source>
|
||||
<extracomment>Example text: "5 minutes left, 12 MB of 345 MB, file 6 of 7"</extracomment>
|
||||
<translation>%5 restant, %1 sur %2, fichier %3 sur %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="953"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="944"/>
|
||||
<source>file %1 of %2</source>
|
||||
<translation>fichier %1 de %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="993"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="984"/>
|
||||
<source>Waiting...</source>
|
||||
<translation>En attente ...</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="995"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="986"/>
|
||||
<source>Waiting for %n other folder(s)...</source>
|
||||
<translation><numerusform>En attente de %n autre(s) dossier(s)</numerusform><numerusform>En attente de %n autre(s) dossier(s)</numerusform></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="1001"/>
|
||||
<location filename="../src/gui/folderstatusmodel.cpp" line="992"/>
|
||||
<source>Preparing to sync...</source>
|
||||
<translation>Préparation à la synchronisation</translation>
|
||||
</message>
|
||||
@@ -1918,7 +1918,7 @@ Il est déconseillé de l'utiliser.</translation>
|
||||
<context>
|
||||
<name>OCC::PropagateDirectory</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="718"/>
|
||||
<location filename="../src/libsync/owncloudpropagator.cpp" line="712"/>
|
||||
<source>Error writing metadata to the database</source>
|
||||
<translation>Erreur à l'écriture des métadonnées dans la base de données</translation>
|
||||
</message>
|
||||
@@ -1956,17 +1956,17 @@ Il est déconseillé de l'utiliser.</translation>
|
||||
<translation>Le fichier téléchargé est vide malgré que le serveur a annoncé qu'il aurait dû être %1.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="711"/>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="693"/>
|
||||
<source>File %1 cannot be saved because of a local file name clash!</source>
|
||||
<translation>Le fichier %1 n'a pas pu être sauvegardé en raison d'un conflit sur le nom du fichier local !</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="759"/>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="741"/>
|
||||
<source>File has changed since discovery</source>
|
||||
<translation>Le fichier a changé depuis sa découverte</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="809"/>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="791"/>
|
||||
<source>Error writing metadata to the database</source>
|
||||
<translation>Erreur à l'écriture des métadonnées dans la base de données</translation>
|
||||
</message>
|
||||
@@ -2452,18 +2452,18 @@ Il est déconseillé de l'utiliser.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="366"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="413"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="412"/>
|
||||
<source>Public sh&aring requires a password</source>
|
||||
<translation>Le p&artage public nécessite un mot de passe</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="435"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="434"/>
|
||||
<source>Please Set Password</source>
|
||||
<translation>Veuillez choisir un mot de passe</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="500"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="501"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="498"/>
|
||||
<location filename="../src/gui/sharelinkwidget.cpp" line="499"/>
|
||||
<source>&Share link</source>
|
||||
<translation>Partager par &lien public</translation>
|
||||
</message>
|
||||
@@ -2873,12 +2873,12 @@ Il est déconseillé de l'utiliser.</translation>
|
||||
<translation>Seulement %1 disponibles, il faut au moins %2 pour démarrer</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1139"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1134"/>
|
||||
<source>Not allowed because you don't have permission to add parent folder</source>
|
||||
<translation>Non autorisé car vous n'avez pas la permission d'ajouter un dossier parent</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1146"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1141"/>
|
||||
<source>Not allowed because you don't have permission to add files in that folder</source>
|
||||
<translation>Non autorisé car vous n'avez pas la permission d'ajouter des fichiers dans ce dossier</translation>
|
||||
</message>
|
||||
@@ -2983,64 +2983,64 @@ Il est déconseillé de l'utiliser.</translation>
|
||||
<translation>Impossible de lire la liste noire de la base de données locale</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="791"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="787"/>
|
||||
<source>Unable to read from the sync journal.</source>
|
||||
<translation>Impossible de lire le journal de synchronisation.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="837"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="833"/>
|
||||
<source>Cannot open the sync journal</source>
|
||||
<translation>Impossible d'ouvrir le journal de synchronisation</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="894"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="889"/>
|
||||
<source>File name contains at least one invalid character</source>
|
||||
<translation>Le nom de fichier contient au moins un caractère non valable</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1098"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1105"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1093"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1100"/>
|
||||
<source>Ignored because of the "choose what to sync" blacklist</source>
|
||||
<translation>Ignoré à cause de la liste noire "Choisir le contenu à synchroniser".</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1124"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1119"/>
|
||||
<source>Not allowed because you don't have permission to add subfolders to that folder</source>
|
||||
<translation>Non autorisé car vous n'avez pas la permission d'ajouter des sous-dossiers dans ce dossier</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1166"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1161"/>
|
||||
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
|
||||
<translation>Non autorisé à envoyer ce fichier car il est en lecture seule sur le serveur. Restauration</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1183"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1203"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1178"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1198"/>
|
||||
<source>Not allowed to remove, restoring</source>
|
||||
<translation>Non autorisé à supprimer. Restauration</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1216"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1211"/>
|
||||
<source>Local files and share folder removed.</source>
|
||||
<translation>Fichiers locaux et répertoire de partage supprimés.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1272"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1267"/>
|
||||
<source>Move not allowed, item restored</source>
|
||||
<translation>Déplacement non autorisé, élément restauré</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1283"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1278"/>
|
||||
<source>Move not allowed because %1 is read-only</source>
|
||||
<translation>Déplacement non autorisé car %1 est en mode lecture seule</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1284"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1279"/>
|
||||
<source>the destination</source>
|
||||
<translation>la destination</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1284"/>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1279"/>
|
||||
<source>the source</source>
|
||||
<translation>la source</translation>
|
||||
</message>
|
||||
@@ -3070,8 +3070,8 @@ Il est déconseillé de l'utiliser.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/theme.cpp" line="289"/>
|
||||
<source><p>Copyright ownCloud GmbH</p></source>
|
||||
<translation><p>Copyright ownCloud, Inc.</p></translation>
|
||||
<source><p>Copyright ownCloud, Incorporated</p></source>
|
||||
<translation><p>Copyright ownCloud, Incorporated</p></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/theme.cpp" line="290"/>
|
||||
@@ -3295,8 +3295,8 @@ Il est déconseillé de l'utiliser.</translation>
|
||||
<name>OCC::ownCloudTheme</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/owncloudtheme.cpp" line="47"/>
|
||||
<source><p>Version %2. For more information visit <a href="%3">%4</a></p><p><small>By Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz and others.</small></p><p>Copyright ownCloud GmbH</p><p>Licensed under the GNU General Public License (GPL) Version 2.0<br/>ownCloud and the ownCloud Logo are registered trademarks of ownCloud, Inc. in the United States, other countries, or both.</p></source>
|
||||
<translation><p>Version %2. Pour plus d'informations, consultez <a href="%3">%4</a></p><p><small>Par Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz et autres.</small></p><p>Copyright ownCloud GmbH</p><p>Sous licence GNU General Public License (GPL) Version 2.0<br/>ownCloud et le logo ownCloud sont des marques déposées de ownCloud, Inc. aux Etats-Unis, dans d'autres pays, ou dans les deux.</p></translation>
|
||||
<source><p>Version %2. For more information visit <a href="%3">%4</a></p><p><small>By Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz and others.</small></p><p>Copyright ownCloud, Inc.</p><p>Licensed under the GNU General Public License (GPL) Version 2.0<br/>ownCloud and the ownCloud Logo are registered trademarks of ownCloud, Inc. in the United States, other countries, or both.</p></source>
|
||||
<translation><p>Version %2. Pour plus d'informations, consultez <a href="%3">%4</a></p><p><small>By Klaas Freitag, Daniel Molkentin, Jan-Christoph Borchardt, Olivier Goffart, Markus Götz and others.</small></p><p>Copyright ownCloud, Inc.</p><p>Licensed under the GNU General Public License (GPL) Version 2.0<br/>ownCloud and the ownCloud Logo are registered trademarks of ownCloud, Inc. in the United States, other countries, or both.</p></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
||||
Alguns arquivos não foram exibidos porque demasiados arquivos foram alterados neste diff Mostrar Mais
Referência em uma Nova Issue
Bloquear um usuário