mirror of
https://github.com/chylex/Nextcloud-Desktop.git
synced 2026-04-12 23:57:41 +02:00
Compare commits
253 Commits
techprevie
...
v2.5.0-rc1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
58302e9fc0 | ||
|
|
8acc5573ff | ||
|
|
6224f6a1fa | ||
|
|
44bc637237 | ||
|
|
99d4f81892 | ||
|
|
98bedf1031 | ||
|
|
eb31e9205c | ||
|
|
c8204f1725 | ||
|
|
174f99728f | ||
|
|
dcdf6d966d | ||
|
|
3e79ebed60 | ||
|
|
5237a2c3e2 | ||
|
|
6e0d636989 | ||
|
|
d246c1e8b9 | ||
|
|
96541d8ab8 | ||
|
|
091c4fd9b0 | ||
|
|
8098566140 | ||
|
|
21dc97b809 | ||
|
|
0f9b8daa57 | ||
|
|
cddb9aa8ba | ||
|
|
24606c0105 | ||
|
|
3384f7e28b | ||
|
|
6b7328bb87 | ||
|
|
f3529e3dd7 | ||
|
|
305952e32e | ||
|
|
c37186cc56 | ||
|
|
4e866123c5 | ||
|
|
35c0c9c0b1 | ||
|
|
d3bc9fbdf3 | ||
|
|
0cf2970134 | ||
|
|
206f081505 | ||
|
|
1c8307f264 | ||
|
|
2d65091f27 | ||
|
|
a492ab8294 | ||
|
|
3da6f45ba9 | ||
|
|
856d40fd99 | ||
|
|
846075704e | ||
|
|
156308c72e | ||
|
|
c99a35a8a5 | ||
|
|
f937fdd624 | ||
|
|
1f8c3074a6 | ||
|
|
11673005db | ||
|
|
df24a25829 | ||
|
|
2dc7ff7332 | ||
|
|
7ace48d5de | ||
|
|
56ccff4ee8 | ||
|
|
9d9f96a685 | ||
|
|
052c37acda | ||
|
|
fd2e88e13b | ||
|
|
28b399ec2b | ||
|
|
4bb936f876 | ||
|
|
6805d91033 | ||
|
|
8da2b9dbf8 | ||
|
|
45ff3385c7 | ||
|
|
53cc6a1611 | ||
|
|
bfc8154e68 | ||
|
|
74d8f32f37 | ||
|
|
a5e329a1c5 | ||
|
|
3fe44f0d25 | ||
|
|
e207c91228 | ||
|
|
cdf922f51d | ||
|
|
45ffc0ae09 | ||
|
|
e214234001 | ||
|
|
54e58b51ab | ||
|
|
debe37308f | ||
|
|
7c096d08aa | ||
|
|
ac631d008c | ||
|
|
f1cad3443b | ||
|
|
cacde7a3aa | ||
|
|
b533c3582e | ||
|
|
69f18f6b7d | ||
|
|
de80f7d6ca | ||
|
|
38ec3b8972 | ||
|
|
52d40235b6 | ||
|
|
0ee662bb0e | ||
|
|
5733e90b09 | ||
|
|
95d2c64c1b | ||
|
|
b71c753a94 | ||
|
|
bd88ddfa07 | ||
|
|
373c6cd631 | ||
|
|
a464ad2c71 | ||
|
|
f3dd97f29c | ||
|
|
6587955668 | ||
|
|
9013036685 | ||
|
|
ebd632f582 | ||
|
|
ce22007b16 | ||
|
|
6a1043cef0 | ||
|
|
82f3b4c91f | ||
|
|
d0b6a611f2 | ||
|
|
714a4090a7 | ||
|
|
63d7e54ef3 | ||
|
|
a2f4917daf | ||
|
|
a09f1d14ba | ||
|
|
96c37b1fac | ||
|
|
f4dfdf5889 | ||
|
|
08e4ba3363 | ||
|
|
4f83bba829 | ||
|
|
90d3917481 | ||
|
|
d9cc362258 | ||
|
|
0a5f890bf9 | ||
|
|
b873311bc5 | ||
|
|
eaa4e77626 | ||
|
|
7a7799407d | ||
|
|
a4e23e7655 | ||
|
|
56ea525499 | ||
|
|
e84bdd59c7 | ||
|
|
b5f484aaf5 | ||
|
|
264b77c634 | ||
|
|
23d64dd3ac | ||
|
|
67f793a49e | ||
|
|
d202942a2c | ||
|
|
d338c130af | ||
|
|
283c4b13a1 | ||
|
|
40007537ea | ||
|
|
6122a47241 | ||
|
|
ce3339a00f | ||
|
|
14df7a3273 | ||
|
|
9330d2b178 | ||
|
|
87dd198b52 | ||
|
|
a68c95522d | ||
|
|
cba0627a9c | ||
|
|
cb69944b5c | ||
|
|
f80517d719 | ||
|
|
13cfd80093 | ||
|
|
17ac41377e | ||
|
|
0b8459ca14 | ||
|
|
537fac70bf | ||
|
|
cf150caa2b | ||
|
|
23d276021e | ||
|
|
599f6f0228 | ||
|
|
bddc573c54 | ||
|
|
1a73d3323a | ||
|
|
2bfb99f174 | ||
|
|
f4a704164f | ||
|
|
e730f95a71 | ||
|
|
9f1f99f4db | ||
|
|
d236c3c011 | ||
|
|
73ccccb8a7 | ||
|
|
7ab2a9bfcb | ||
|
|
b19abe9c86 | ||
|
|
44026763b8 | ||
|
|
617cd6dfdb | ||
|
|
3a489b73f9 | ||
|
|
07013783ea | ||
|
|
7c77864396 | ||
|
|
3b8dde601d | ||
|
|
d9f79215a7 | ||
|
|
309b0b6382 | ||
|
|
9d021d004d | ||
|
|
452f64221e | ||
|
|
72419a1149 | ||
|
|
ab5c4749c1 | ||
|
|
5cdf8a2997 | ||
|
|
bfd8897f22 | ||
|
|
8c19be7213 | ||
|
|
4a47d1c8ef | ||
|
|
e3d7c9f1ea | ||
|
|
fbd8438072 | ||
|
|
efc2f0eded | ||
|
|
3e839b2e44 | ||
|
|
678e2c873e | ||
|
|
121c0d8433 | ||
|
|
881c7f804f | ||
|
|
2e55702258 | ||
|
|
964470fc11 | ||
|
|
c4d01b6aea | ||
|
|
0f80ecbb39 | ||
|
|
bf35821bc0 | ||
|
|
d896edeee8 | ||
|
|
328f82297a | ||
|
|
cafdcf77cb | ||
|
|
ed705ba98c | ||
|
|
2844c925eb | ||
|
|
ea8676ad2c | ||
|
|
028da61824 | ||
|
|
16337bf656 | ||
|
|
d8bf20310b | ||
|
|
cdd84dce6e | ||
|
|
647df7bcee | ||
|
|
64e21d5083 | ||
|
|
ea0bdddb2a | ||
|
|
e9b4453814 | ||
|
|
1991d71136 | ||
|
|
6a7a08bd01 | ||
|
|
d5a0ec7d8b | ||
|
|
eecbdb00de | ||
|
|
085de2825a | ||
|
|
cf3ee4b3a4 | ||
|
|
8f7bc8cff9 | ||
|
|
ff9177edc3 | ||
|
|
c8d5d9a622 | ||
|
|
fa4328a596 | ||
|
|
985c2ed1ca | ||
|
|
034d5b60aa | ||
|
|
a2f7355d4a | ||
|
|
17d4aeeb78 | ||
|
|
a214ecf788 | ||
|
|
0d9de74726 | ||
|
|
8b996772a4 | ||
|
|
fa5143a66d | ||
|
|
8cbc757a56 | ||
|
|
e9ae10ba6c | ||
|
|
5bcc4ece77 | ||
|
|
135bcaea3e | ||
|
|
29c11618b3 | ||
|
|
a15a470ea2 | ||
|
|
1d4fc91d79 | ||
|
|
ef9c302b5e | ||
|
|
c1c5e5da5f | ||
|
|
14615855d0 | ||
|
|
f0ef2c27a3 | ||
|
|
b50db09b01 | ||
|
|
86991b9996 | ||
|
|
c27943b46d | ||
|
|
ef71e6b0f7 | ||
|
|
8e8a619ee1 | ||
|
|
27076c0f28 | ||
|
|
fc6e6149e5 | ||
|
|
13e2bb099b | ||
|
|
8fd0ca4587 | ||
|
|
2aa942e4b8 | ||
|
|
92aaa09643 | ||
|
|
0e2cd30ea1 | ||
|
|
bc44c62471 | ||
|
|
2434523f33 | ||
|
|
534a92b709 | ||
|
|
233e10ecb1 | ||
|
|
cefc6b531c | ||
|
|
5c7c92157f | ||
|
|
176a2e6f84 | ||
|
|
647d16c792 | ||
|
|
3ad33a368a | ||
|
|
951096f569 | ||
|
|
489c0529c4 | ||
|
|
3576fbb2a5 | ||
|
|
8dedb9084e | ||
|
|
f6ef11a5c9 | ||
|
|
1d868eb809 | ||
|
|
c3aafa722a | ||
|
|
b85bad0566 | ||
|
|
a4507db31a | ||
|
|
e551b89ba7 | ||
|
|
7cbca28eb7 | ||
|
|
a1967d551d | ||
|
|
2b825a1748 | ||
|
|
5110f9618a | ||
|
|
d30f8b9094 | ||
|
|
758c2ad9ac | ||
|
|
c919b7e069 | ||
|
|
be3640dc51 | ||
|
|
343402740f | ||
|
|
1364755141 | ||
|
|
09f83f4fa9 |
@@ -6,7 +6,7 @@ clone:
|
|||||||
|
|
||||||
pipeline:
|
pipeline:
|
||||||
qt-5.7:
|
qt-5.7:
|
||||||
image: nextcloudci/client-5.7:client-5.7-3
|
image: nextcloudci/client-5.7:client-5.7-4
|
||||||
commands:
|
commands:
|
||||||
# Install QtKeyChain
|
# Install QtKeyChain
|
||||||
- /bin/bash -c "
|
- /bin/bash -c "
|
||||||
@@ -34,7 +34,7 @@ pipeline:
|
|||||||
matrix:
|
matrix:
|
||||||
TESTS: qt-5.7
|
TESTS: qt-5.7
|
||||||
qt-5.8:
|
qt-5.8:
|
||||||
image: nextcloudci/client-5.8:client-5.8-3
|
image: nextcloudci/client-5.8:client-5.8-4
|
||||||
commands:
|
commands:
|
||||||
# Install QtKeyChain
|
# Install QtKeyChain
|
||||||
- /bin/bash -c "
|
- /bin/bash -c "
|
||||||
@@ -62,7 +62,7 @@ pipeline:
|
|||||||
matrix:
|
matrix:
|
||||||
TESTS: qt-5.8
|
TESTS: qt-5.8
|
||||||
qt-5.9:
|
qt-5.9:
|
||||||
image: nextcloudci/client-5.9:client-5.9-4
|
image: nextcloudci/client-5.9:client-5.9-5
|
||||||
commands:
|
commands:
|
||||||
# Install QtKeyChain
|
# Install QtKeyChain
|
||||||
- /bin/bash -c "
|
- /bin/bash -c "
|
||||||
|
|||||||
64
.github/issue_template.md
vendored
Normal file
64
.github/issue_template.md
vendored
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
<!---
|
||||||
|
Please try to only report a bug if it happens with the latest version
|
||||||
|
The latest version can be seen by checking https://download.nextcloud.com/desktop/
|
||||||
|
For support try our forums: https://help.nextcloud.com
|
||||||
|
--->
|
||||||
|
|
||||||
|
|
||||||
|
### Expected behaviour
|
||||||
|
Tell us what should happen
|
||||||
|
|
||||||
|
### Actual behaviour
|
||||||
|
Tell us what happens instead
|
||||||
|
|
||||||
|
### Steps to reproduce
|
||||||
|
1.
|
||||||
|
2.
|
||||||
|
3.
|
||||||
|
|
||||||
|
### Client configuration
|
||||||
|
Client version:
|
||||||
|
|
||||||
|
Operating system:
|
||||||
|
|
||||||
|
OS language:
|
||||||
|
|
||||||
|
Qt version used by client package (Linux only, see also Settings dialog):
|
||||||
|
|
||||||
|
Client package (From Nextcloud or distro) (Linux only):
|
||||||
|
|
||||||
|
Installation path of client:
|
||||||
|
|
||||||
|
|
||||||
|
### Server configuration
|
||||||
|
<!---
|
||||||
|
Optional section. It depends on the issue.
|
||||||
|
--->
|
||||||
|
|
||||||
|
Operating system:
|
||||||
|
|
||||||
|
Web server:
|
||||||
|
|
||||||
|
Database:
|
||||||
|
|
||||||
|
PHP version:
|
||||||
|
|
||||||
|
Nextcloud version:
|
||||||
|
|
||||||
|
Storage backend (external storage):
|
||||||
|
|
||||||
|
### Logs
|
||||||
|
|
||||||
|
Please use Gist (https://gist.github.com/) or a similar code paster for longer
|
||||||
|
logs.
|
||||||
|
|
||||||
|
```Template for output < 10 lines```
|
||||||
|
|
||||||
|
1. Client logfile: Output of `nextcloud --logwindow` or `nextcloud --logfile log.txt`
|
||||||
|
(On Windows using `cmd.exe`, you might need to first `cd` into the Nextcloud directory)
|
||||||
|
(See also https://docs.nextcloud.com/desktop/2.3/troubleshooting.html#log-files)
|
||||||
|
|
||||||
|
2. Web server error log:
|
||||||
|
|
||||||
|
3. Server logfile: nextcloud log (data/nextcloud.log):
|
||||||
|
|
||||||
7
.gitignore
vendored
7
.gitignore
vendored
@@ -164,3 +164,10 @@ UpgradeLog*.htm
|
|||||||
# Microsoft Fakes
|
# Microsoft Fakes
|
||||||
FakesAssemblies/
|
FakesAssemblies/
|
||||||
|
|
||||||
|
#cmake temporary stuff
|
||||||
|
CMakeCache.txt
|
||||||
|
CMakeFiles/
|
||||||
|
CPackConfig.cmake
|
||||||
|
CPackOptions.cmake
|
||||||
|
CPackSourceConfig.cmake
|
||||||
|
|
||||||
|
|||||||
2
.gitmodules
vendored
2
.gitmodules
vendored
@@ -1,6 +1,6 @@
|
|||||||
[submodule "src/3rdparty/qtmacgoodies"]
|
[submodule "src/3rdparty/qtmacgoodies"]
|
||||||
path = src/3rdparty/qtmacgoodies
|
path = src/3rdparty/qtmacgoodies
|
||||||
url = https://github.com/guruz/qtmacgoodies.git
|
url = https://github.com/camilasan/qtmacgoodies.git
|
||||||
[submodule "binary"]
|
[submodule "binary"]
|
||||||
path = binary
|
path = binary
|
||||||
url = git://github.com/owncloud/owncloud-client-binary.git
|
url = git://github.com/owncloud/owncloud-client-binary.git
|
||||||
|
|||||||
204
.tx/nextcloud.client-desktop/ca_translation
Normal file
204
.tx/nextcloud.client-desktop/ca_translation
Normal file
@@ -0,0 +1,204 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Categories=Utility;X-SuSE-SyncUtility;
|
||||||
|
Type=Application
|
||||||
|
Exec=@APPLICATION_EXECUTABLE@
|
||||||
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
|
GenericName=Folder Sync
|
||||||
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
Comment[ca]=@APPLICATION_NAME@ client de sincronització d'escriptori
|
||||||
|
Icon[ca]=@APPLICATION_ICON_NAME@
|
||||||
|
Name[ca]=@APPLICATION_NAME@ client de sincro d'escriptori
|
||||||
|
GenericName[ca]=Directori de sincronització
|
||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -198,7 +198,7 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[cs_CZ]=@APPLICATION_NAME@ desktopový synchronizační klient
|
Comment[cs_CZ]=@APPLICATION_NAME@ synchronizační klient pro desktop
|
||||||
Icon[cs_CZ]=@APPLICATION_EXECUTABLE@
|
Icon[cs_CZ]=@NAZEV_IKONY_APLIKACE@
|
||||||
Name[cs_CZ]=@APPLICATION_NAME@ desktopový synchronizační klient
|
Name[cs_CZ]=@APPLICATION_NAME@ synchronizační klient pro desktop
|
||||||
GenericName[cs_CZ]=Synchronizace složek
|
GenericName[cs_CZ]=Synchronizace složek
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -198,7 +198,7 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[de_DE]=@APPLICATION_NAME@ Client zur Desktop-Synchronisation
|
Comment[de]=@APPLICATION_NAME@ Client zur Desktop-Synchronisation
|
||||||
Icon[de_DE]=@APPLICATION_EXECUTABLE@
|
Icon[de]=@APPLICATION_ICON_NAME@
|
||||||
Name[de_DE]=@APPLICATION_NAME@ Client zur Desktop-Synchronisation
|
Name[de]=@APPLICATION_NAME@ Client zur Desktop-Synchronisation
|
||||||
GenericName[de_DE]=Synchronisationsordner
|
GenericName[de]=Synchronisationsordner
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[en_GB]=@APPLICATION_NAME@ desktop synchronisation client
|
Comment[en_GB]=@APPLICATION_NAME@ desktop synchronisation client
|
||||||
Icon[en_GB]=@APPLICATION_EXECUTABLE@
|
|
||||||
Name[en_GB]=@APPLICATION_NAME@ desktop sync client
|
Name[en_GB]=@APPLICATION_NAME@ desktop sync client
|
||||||
GenericName[en_GB]=Folder Sync
|
GenericName[en_GB]=Folder Sync
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[es_CL]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
Comment[es_CL]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||||
Icon[es_CL]=@APPLICATION_EXECUTABLE@
|
|
||||||
Name[es_CL]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
Name[es_CL]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||||
GenericName[es_CL]=Sincronización de carpeta
|
GenericName[es_CL]=Sincronización de carpeta
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[es_CO]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
Comment[es_CO]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||||
Icon[es_CO]=@APPLICATION_EXECUTABLE@
|
|
||||||
Name[es_CO]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
Name[es_CO]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||||
GenericName[es_CO]=Sincronización de carpeta
|
GenericName[es_CO]=Sincronización de carpeta
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[es_CR]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
Comment[es_CR]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||||
Icon[es_CR]=@APPLICATION_EXECUTABLE@
|
|
||||||
Name[es_CR]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
Name[es_CR]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||||
GenericName[es_CR]=Sincronización de carpeta
|
GenericName[es_CR]=Sincronización de carpeta
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[es_DO]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
Comment[es_DO]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||||
Icon[es_DO]=@APPLICATION_EXECUTABLE@
|
|
||||||
Name[es_DO]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
Name[es_DO]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||||
GenericName[es_DO]=Sincronización de carpeta
|
GenericName[es_DO]=Sincronización de carpeta
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[es_EC]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
Comment[es_EC]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||||
Icon[es_EC]=@APPLICATION_EXECUTABLE@
|
|
||||||
Name[es_EC]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
Name[es_EC]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||||
GenericName[es_EC]=Sincronización de carpeta
|
GenericName[es_EC]=Sincronización de carpeta
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[es_GT]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
Comment[es_GT]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||||
Icon[es_GT]=@APPLICATION_EXECUTABLE@
|
|
||||||
Name[es_GT]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
Name[es_GT]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||||
GenericName[es_GT]=Sincronización de carpeta
|
GenericName[es_GT]=Sincronización de carpeta
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[es_MX]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
Comment[es_MX]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||||
Icon[es_MX]=@APPLICATION_EXECUTABLE@
|
|
||||||
Name[es_MX]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
Name[es_MX]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||||
GenericName[es_MX]=Sincronización de carpeta
|
GenericName[es_MX]=Sincronización de carpeta
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[es_SV]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
Comment[es_SV]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||||
Icon[es_SV]=@APPLICATION_EXECUTABLE@
|
|
||||||
Name[es_SV]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
Name[es_SV]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||||
GenericName[es_SV]=Sincronización de carpeta
|
GenericName[es_SV]=Sincronización de carpeta
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -199,6 +199,6 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[es]=Cliente de sincronización de escritorio @APPLICATION_NAME@
|
Comment[es]=Cliente de sincronización de escritorio @APPLICATION_NAME@
|
||||||
Icon[es]=@APPLICATION_EXECUTABLE@
|
Icon[es]=@APPLICATION_ICON_NAME@
|
||||||
Name[es]=Cliente de sincronización de escritorio @APPLICATION_NAME@
|
Name[es]=Cliente de sincronización de escritorio @APPLICATION_NAME@
|
||||||
GenericName[es]=Sincronización de carpetas
|
GenericName[es]=Sincronización de carpetas
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -198,7 +198,7 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[fr]=Client desktop de synchronisation @APPLICATION_NAME@
|
Comment[fr]=Client de synchronisation @APPLICATION_NAME@ desktop
|
||||||
Icon[fr]=@APPLICATION_EXECUTABLE@
|
Icon[fr]=@APPLICATION_ICON_NAME@
|
||||||
Name[fr]=Client desktop de synchronisation @APPLICATION_NAME@
|
Name[fr]=Client desktop de synchronisation @APPLICATION_NAME@
|
||||||
GenericName[fr]=Synchronisation du dossier
|
GenericName[fr]=Synchronisation du dossier
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[he]=@APPLICATION_NAME@ לקוח סנכרון לשולחן העבודה
|
Comment[he]=@APPLICATION_NAME@ לקוח סנכרון לשולחן העבודה
|
||||||
Icon[he]=@APPLICATION_EXECUTABLE@
|
|
||||||
Name[he]=@APPLICATION_NAME@ לקוח סנכרון לשולחן העבודה
|
Name[he]=@APPLICATION_NAME@ לקוח סנכרון לשולחן העבודה
|
||||||
GenericName[he]=סנכרון תיקיות
|
GenericName[he]=סנכרון תיקיות
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -199,6 +199,6 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[is]=@APPLICATION_NAME@ forrit til samstillingar við tölvu
|
Comment[is]=@APPLICATION_NAME@ forrit til samstillingar við tölvu
|
||||||
Icon[is]=@APPLICATION_EXECUTABLE@
|
Icon[is]=@APPLICATION_ICON_NAME@
|
||||||
Name[is]=@APPLICATION_NAME@ forrit til samstillingar við tölvu
|
Name[is]=@APPLICATION_NAME@ forrit til samstillingar við tölvu
|
||||||
GenericName[is]=Samstilling á möppum
|
GenericName[is]=Samstilling á möppum
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -199,6 +199,6 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[it]=Client di sincronizzazione desktop di @APPLICATION_NAME@
|
Comment[it]=Client di sincronizzazione desktop di @APPLICATION_NAME@
|
||||||
Icon[it]=@APPLICATION_EXECUTABLE@
|
Icon[it]=@APPLICATION_ICON_NAME@
|
||||||
Name[it]=Client di sincronizzazione desktop di @APPLICATION_NAME@
|
Name[it]=Client di sincronizzazione desktop di @APPLICATION_NAME@
|
||||||
GenericName[it]=Sincronizzazione cartelle
|
GenericName[it]=Sincronizzazione cartelle
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[ja_JP]=@APPLICATION_NAME@ デスクトップ同期クライアント
|
Comment[ja_JP]=@APPLICATION_NAME@ デスクトップ同期クライアント
|
||||||
Icon[ja_JP]=@APPLICATION_EXECUTABLE@
|
|
||||||
Name[ja_JP]=@APPLICATION_NAME@ デスクトップ同期クライアント
|
Name[ja_JP]=@APPLICATION_NAME@ デスクトップ同期クライアント
|
||||||
GenericName[ja_JP]=フォルダーを同期する
|
GenericName[ja_JP]=フォルダーを同期する
|
||||||
|
|||||||
204
.tx/nextcloud.client-desktop/lt_LT_translation
Normal file
204
.tx/nextcloud.client-desktop/lt_LT_translation
Normal file
@@ -0,0 +1,204 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Categories=Utility;X-SuSE-SyncUtility;
|
||||||
|
Type=Application
|
||||||
|
Exec=@APPLICATION_EXECUTABLE@
|
||||||
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
|
GenericName=Folder Sync
|
||||||
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
Comment[lt_LT]=@APPLICATION_NAME@ darbalaukio sinchronizavimo kliento programa
|
||||||
|
Icon[lt_LT]=@APPLICATION_ICON_NAME@
|
||||||
|
Name[lt_LT]=@APPLICATION_NAME@ darbalaukio sinchronizavimo kliento programa
|
||||||
|
GenericName[lt_LT]=Aplankų sinchronizavimas
|
||||||
204
.tx/nextcloud.client-desktop/lv_translation
Normal file
204
.tx/nextcloud.client-desktop/lv_translation
Normal file
@@ -0,0 +1,204 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Categories=Utility;X-SuSE-SyncUtility;
|
||||||
|
Type=Application
|
||||||
|
Exec=@APPLICATION_EXECUTABLE@
|
||||||
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
|
GenericName=Folder Sync
|
||||||
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
Comment[lv]=@APPLICATION_NAME@ darbavirsmas sinhronizešanas klients
|
||||||
|
Icon[lv]=@APPLICATION_ICON_NAME@
|
||||||
|
Name[lv]=@APPLICATION_NAME@ darbavirsmas sinhronizešanas klients
|
||||||
|
GenericName[lv]=Mapju Sinhronizēšana
|
||||||
203
.tx/nextcloud.client-desktop/nb_translation
Normal file
203
.tx/nextcloud.client-desktop/nb_translation
Normal file
@@ -0,0 +1,203 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Categories=Utility;X-SuSE-SyncUtility;
|
||||||
|
Type=Application
|
||||||
|
Exec=@APPLICATION_EXECUTABLE@
|
||||||
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
|
GenericName=Folder Sync
|
||||||
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
Comment[nb_NO]=@APPLICATION_NAME@ klient for synkroinisering
|
||||||
|
Name[nb_NO]=@APPLICATION_NAME@ klient for synkroinisering
|
||||||
|
GenericName[nb_NO]=Mappe synkroinisering
|
||||||
204
.tx/nextcloud.client-desktop/nl_translation
Normal file
204
.tx/nextcloud.client-desktop/nl_translation
Normal file
@@ -0,0 +1,204 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Categories=Utility;X-SuSE-SyncUtility;
|
||||||
|
Type=Application
|
||||||
|
Exec=@APPLICATION_EXECUTABLE@
|
||||||
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
|
GenericName=Folder Sync
|
||||||
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
Comment[nl]=@APPLICATION_NAME@ desktopsynchronisatieclient
|
||||||
|
Icon[nl]=@APPLICATION_ICON_NAME@
|
||||||
|
Name[nl]=@APPLICATION_NAME@ desktop sync client
|
||||||
|
GenericName[nl]=Map synchronisatie
|
||||||
204
.tx/nextcloud.client-desktop/pl_translation
Normal file
204
.tx/nextcloud.client-desktop/pl_translation
Normal file
@@ -0,0 +1,204 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Categories=Utility;X-SuSE-SyncUtility;
|
||||||
|
Type=Application
|
||||||
|
Exec=@APPLICATION_EXECUTABLE@
|
||||||
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
|
GenericName=Folder Sync
|
||||||
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
Comment[pl]=@APPLICATION_NAME@ desktopowy klient synchronizacji
|
||||||
|
Icon[pl]=@APPLICATION_ICON_NAME@
|
||||||
|
Name[pl]=@APPLICATION_NAME@ desktopowy klient synchronizacji
|
||||||
|
GenericName[pl]=Katalog synchronizacji
|
||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -199,6 +199,6 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[pt_BR]=@APPLICATION_NAME@ cliente de sincronização desktop
|
Comment[pt_BR]=@APPLICATION_NAME@ cliente de sincronização desktop
|
||||||
Icon[pt_BR]=@APPLICATION_EXECUTABLE@
|
Icon[pt_BR]=@APPLICATION_ICON_NAME@
|
||||||
Name[pt_BR]=@APPLICATION_NAME@ cliente de sincronização desktop
|
Name[pt_BR]=@APPLICATION_NAME@ cliente de sincronização desktop
|
||||||
GenericName[pt_BR]=Sincronizar Pasta
|
GenericName[pt_BR]=Sincronizar Pasta
|
||||||
|
|||||||
203
.tx/nextcloud.client-desktop/pt_translation
Normal file
203
.tx/nextcloud.client-desktop/pt_translation
Normal file
@@ -0,0 +1,203 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Categories=Utility;X-SuSE-SyncUtility;
|
||||||
|
Type=Application
|
||||||
|
Exec=@APPLICATION_EXECUTABLE@
|
||||||
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
|
GenericName=Folder Sync
|
||||||
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
Comment[pt_PT]=@APPLICATION_NAME@ - Cliente de Sincronização da Área de Trabalho
|
||||||
|
Name[pt_PT]=@APPLICATION_NAME@ - Cliente de Sincronização da Área de Trabalho
|
||||||
|
GenericName[pt_PT]=Sincronização de Pasta
|
||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -199,6 +199,6 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[ru]=Клиент синхронизации @APPLICATION_NAME@ для ПК
|
Comment[ru]=Клиент синхронизации @APPLICATION_NAME@ для ПК
|
||||||
Icon[ru]=@APPLICATION_EXECUTABLE@
|
Icon[ru]=@APPLICATION_ICON_NAME@
|
||||||
Name[ru]=@APPLICATION_NAME@ клиент для ПК
|
Name[ru]=@APPLICATION_NAME@ клиент для ПК
|
||||||
GenericName[ru]=Синхронизация папок
|
GenericName[ru]=Синхронизация папок
|
||||||
|
|||||||
204
.tx/nextcloud.client-desktop/sk_translation
Normal file
204
.tx/nextcloud.client-desktop/sk_translation
Normal file
@@ -0,0 +1,204 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Categories=Utility;X-SuSE-SyncUtility;
|
||||||
|
Type=Application
|
||||||
|
Exec=@APPLICATION_EXECUTABLE@
|
||||||
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
|
GenericName=Folder Sync
|
||||||
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
Comment[sk_SK]=@APPLICATION_NAME@ Synchronizačný klient pre PC
|
||||||
|
Icon[sk_SK]=@APPLICATION_ICON_NAME@
|
||||||
|
Name[sk_SK]=@APPLICATION_NAME@ Synchronizačný klient pre PC
|
||||||
|
GenericName[sk_SK]=Synchnonizácia priečinka
|
||||||
204
.tx/nextcloud.client-desktop/sl_translation
Normal file
204
.tx/nextcloud.client-desktop/sl_translation
Normal file
@@ -0,0 +1,204 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Categories=Utility;X-SuSE-SyncUtility;
|
||||||
|
Type=Application
|
||||||
|
Exec=@APPLICATION_EXECUTABLE@
|
||||||
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
|
GenericName=Folder Sync
|
||||||
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
Comment[sl]=@APPLICATION_NAME@ odjemalec za usklajevanje
|
||||||
|
Icon[sl]=@APPLICATION_ICON_NAME@
|
||||||
|
Name[sl]=@APPLICATION_NAME@ odjemalec za usklajevanje
|
||||||
|
GenericName[sl]=Usklajevanje map
|
||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -199,6 +199,6 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[sr]=@APPLICATION_NAME@ десктоп клијент за синхронизацију
|
Comment[sr]=@APPLICATION_NAME@ десктоп клијент за синхронизацију
|
||||||
Icon[sr]=@APPLICATION_EXECUTABLE@
|
Icon[sr]=@APPLICATION_ICON_NAME@
|
||||||
Name[sr]=@APPLICATION_NAME@ десктоп клијент за синхронизацију
|
Name[sr]=@APPLICATION_NAME@ десктоп клијент за синхронизацију
|
||||||
GenericName[sr]=Синхронизација фасцикли
|
GenericName[sr]=Синхронизација фасцикли
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -199,6 +199,6 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[tr]=@APPLICATION_NAME@ masaüstü eşitleme istemcisi
|
Comment[tr]=@APPLICATION_NAME@ masaüstü eşitleme istemcisi
|
||||||
Icon[tr]=@APPLICATION_EXECUTABLE@
|
Icon[tr]=@APPLICATION_ICON_NAME@
|
||||||
Name[tr]=@APPLICATION_NAME@ masaüstü eşiteme istemcisi
|
Name[tr]=@APPLICATION_NAME@ masaüstü eşiteme istemcisi
|
||||||
GenericName[tr]=Klasör Eşitleme
|
GenericName[tr]=Klasör Eşitleme
|
||||||
|
|||||||
204
.tx/nextcloud.client-desktop/zh_CN_translation
Normal file
204
.tx/nextcloud.client-desktop/zh_CN_translation
Normal file
@@ -0,0 +1,204 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Categories=Utility;X-SuSE-SyncUtility;
|
||||||
|
Type=Application
|
||||||
|
Exec=@APPLICATION_EXECUTABLE@
|
||||||
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
|
GenericName=Folder Sync
|
||||||
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
Comment[zh_CN]=@APPLICATION_NAME@ 桌面同步客户端
|
||||||
|
Icon[zh_CN]=@APPLICATION_ICON_NAME@
|
||||||
|
Name[zh_CN]=@APPLICATION_NAME@ 桌面同步客户端
|
||||||
|
GenericName[zh_CN]=文件夹同步
|
||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[zh_TW]=@APPLICATION_NAME@ 桌面同步客戶端
|
Comment[zh_TW]=@APPLICATION_NAME@ 桌面同步客戶端
|
||||||
Icon[zh_TW]=@APPLICATION_EXECUTABLE@
|
|
||||||
Name[zh_TW]=@APPLICATION_NAME@ 桌面同步客戶端
|
Name[zh_TW]=@APPLICATION_NAME@ 桌面同步客戶端
|
||||||
GenericName[zh_TW]=資料夾同步
|
GenericName[zh_TW]=資料夾同步
|
||||||
|
|||||||
@@ -183,7 +183,7 @@ if(BUILD_CLIENT)
|
|||||||
endif()
|
endif()
|
||||||
find_package(Sphinx)
|
find_package(Sphinx)
|
||||||
find_package(PdfLatex)
|
find_package(PdfLatex)
|
||||||
find_package(OpenSSL REQUIRED VERSION 1.1)
|
find_package(OpenSSL 1.1 REQUIRED )
|
||||||
|
|
||||||
find_package(ZLIB REQUIRED)
|
find_package(ZLIB REQUIRED)
|
||||||
find_package(GLib2)
|
find_package(GLib2)
|
||||||
|
|||||||
@@ -21,4 +21,4 @@ option( WITH_CRASHREPORTER "Build crashreporter" OFF )
|
|||||||
#set( CRASHREPORTER_SUBMIT_URL "https://crash-reports.owncloud.com/submit" CACHE string "URL for crash reporter" )
|
#set( CRASHREPORTER_SUBMIT_URL "https://crash-reports.owncloud.com/submit" CACHE string "URL for crash reporter" )
|
||||||
#set( CRASHREPORTER_ICON ":/owncloud-icon.png" )
|
#set( CRASHREPORTER_ICON ":/owncloud-icon.png" )
|
||||||
|
|
||||||
option( WITH_PROVIDERS "Build with providers list" OFF )
|
option( WITH_PROVIDERS "Build with providers list" ON )
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ if(APPLE)
|
|||||||
set( CPACK_GENERATOR "DragNDrop" )
|
set( CPACK_GENERATOR "DragNDrop" )
|
||||||
set( CPACK_SOURCE_GENERATOR "")
|
set( CPACK_SOURCE_GENERATOR "")
|
||||||
set( CPACK_PACKAGE_FILE_NAME ${APPLICATION_SHORTNAME}-${CPACK_PACKAGE_VERSION} )
|
set( CPACK_PACKAGE_FILE_NAME ${APPLICATION_SHORTNAME}-${CPACK_PACKAGE_VERSION} )
|
||||||
set( CPACK_PACKAGE_ICON ${CMAKE_BINARY_DIR}/src/gui/ownCloud.icns)
|
set( CPACK_PACKAGE_ICON ${CMAKE_BINARY_DIR}/src/gui/${APPLICATION_ICON_NAME}.icns)
|
||||||
|
|
||||||
set( CPACK_DMG_DS_STORE "${CMAKE_SOURCE_DIR}/admin/osx/DS_Store.in")
|
set( CPACK_DMG_DS_STORE "${CMAKE_SOURCE_DIR}/admin/osx/DS_Store.in")
|
||||||
# set( CPACK_DMG_BACKGROUND_IMAGE "${CMAKE_SOURCE_DIR}/admin/osx/DMGBackground.png" )
|
# set( CPACK_DMG_BACKGROUND_IMAGE "${CMAKE_SOURCE_DIR}/admin/osx/DMGBackground.png" )
|
||||||
|
|||||||
18
README.md
18
README.md
@@ -17,30 +17,36 @@ with your computer.
|
|||||||
|
|
||||||
##### Clone the repo and create build directory
|
##### Clone the repo and create build directory
|
||||||
```
|
```
|
||||||
$ git clone git@github.com:nextcloud/desktop.git
|
$ git clone https://github.com/nextcloud/desktop.git
|
||||||
$ cd desktop
|
$ cd desktop
|
||||||
$ mkdir build
|
$ mkdir build
|
||||||
|
$ cd build
|
||||||
```
|
```
|
||||||
##### Compile and install
|
##### Compile and install
|
||||||
|
|
||||||
|
For development reasons it is better to install the client on user space
|
||||||
|
instead on the global system. For example you could use in the next
|
||||||
|
instructions `path-to-install-folder/` as `~/.local/` in a linux system. If
|
||||||
|
you want to install system wide you could use `/usr/local` or `/opt/nextcloud/`.
|
||||||
|
|
||||||
##### Linux
|
##### Linux
|
||||||
|
|
||||||
```
|
```
|
||||||
$ cmake .. -DCMAKE_INSTALL_PREFIX=path-to-install-folder/ -DCMAKE_BUILD_TYPE=Debug -DNO_SHIBBOLETH=1
|
$ cmake .. -DCMAKE_INSTALL_PREFIX=path-to-install-folder/ -DCMAKE_BUILD_TYPE=Debug -DNO_SHIBBOLETH=1 -DQTKEYCHAIN_LIBRARY=/path-to-qt5keychain-folder/lib64/libqt5keychain.so -DQTKEYCHAIN_INCLUDE_DIR=/path-to-qt5keychain-folder/include/qt5keychain/ -DOPENSSL_ROOT_DIR=/path-to-openssl-folder/ -DOPENSSL_INCLUDE_DIR=path-to-openssl-folder/include -DOPENSSL_LIBRARIES=path-to-openssl-folder/lib
|
||||||
$ make install
|
$ make install
|
||||||
```
|
```
|
||||||
|
|
||||||
##### Windows
|
##### Windows
|
||||||
|
|
||||||
```
|
```
|
||||||
$ cmake -G "Visual Studio 15 2017 Win64" .. -DCMAKE_INSTALL_PREFIX=path-to-install-folder/ -DCMAKE_BUILD_TYPE=Debug -DNO_SHIBBOLETH=1
|
$ cmake -G "Visual Studio 15 2017 Win64" .. -DCMAKE_INSTALL_PREFIX=path-to-install-folder/ -DCMAKE_BUILD_TYPE=Debug -DNO_SHIBBOLETH=1 -DPng2Ico_EXECUTABLE=/path-to-install-png2ico/png2ico.exe -DQTKEYCHAIN_LIBRARY=/path-to-qt5keychain-folder/lib/qt5keychain.lib -DQTKEYCHAIN_INCLUDE_DIR=/path-to-qt5keychain-folder/include/qt5keychain/ -DOPENSSL_ROOT_DIR=/path-to-openssl-folder/ -DOPENSSL_INCLUDE_DIR=path-to-openssl-folder/include -DOPENSSL_LIBRARIES=path-to-openssl-folder/lib
|
||||||
$ cmake --build . --config Debug --target install
|
$ cmake --build . --config Debug --target install
|
||||||
```
|
```
|
||||||
|
|
||||||
##### Mac OS
|
##### Mac OS
|
||||||
|
|
||||||
```
|
```
|
||||||
$ cmake .. -DCMAKE_INSTALL_PREFIX=path-to-install-folder/ -DCMAKE_BUILD_TYPE=Debug -DNO_SHIBBOLETH=1
|
$ cmake .. -DCMAKE_INSTALL_PREFIX=path-to-install-folder/ -DCMAKE_BUILD_TYPE=Debug -DNO_SHIBBOLETH=1 -DQTKEYCHAIN_LIBRARY=/path-to-qt5keychain-folder/lib/libqt5keychain.dylib -DQTKEYCHAIN_INCLUDE_DIR=/path-to-qt5keychain-folder/include/qt5keychain/ -DOPENSSL_ROOT_DIR=/path-to-openssl-folder/ -DOPENSSL_INCLUDE_DIR=path-to-openssl-folder/include -DOPENSSL_LIBRARIES=path-to-openssl-folder/lib
|
||||||
$ make install
|
$ make install
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -69,6 +75,8 @@ of your report being lost. :boom:
|
|||||||
|
|
||||||
- If you created a patch :heart_eyes:, please submit a [Pull
|
- If you created a patch :heart_eyes:, please submit a [Pull
|
||||||
Request](https://github.com/nextcloud/client/pulls).
|
Request](https://github.com/nextcloud/client/pulls).
|
||||||
|
- How to create a pull request? This guide will help you get started: [Opening a pull request](https://opensource.guide/how-to-contribute/#opening-a-pull-request) :heart:
|
||||||
|
|
||||||
|
|
||||||
## :satellite: Contact us
|
## :satellite: Contact us
|
||||||
|
|
||||||
@@ -99,5 +107,3 @@ https://github.com/nextcloud/desktop.
|
|||||||
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
for more details.
|
for more details.
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,88 +0,0 @@
|
|||||||
Source: nextcloud-client
|
|
||||||
Section: contrib/devel
|
|
||||||
Priority: optional
|
|
||||||
Maintainer: István Váradi <ivaradi@varadiistvan.hu>
|
|
||||||
Build-Depends: cmake,
|
|
||||||
debhelper,
|
|
||||||
cdbs,
|
|
||||||
dh-python,
|
|
||||||
extra-cmake-modules (>= 5.16),
|
|
||||||
kdelibs5-dev,
|
|
||||||
kio-dev,
|
|
||||||
libcmocka-dev,
|
|
||||||
libhttp-dav-perl,
|
|
||||||
libinotify-dev [kfreebsd-any],
|
|
||||||
libqt5webkit5-dev,
|
|
||||||
libsqlite3-dev,
|
|
||||||
libssl-dev (>> 1.0.0),
|
|
||||||
zlib1g-dev,
|
|
||||||
optipng,
|
|
||||||
pkg-kde-tools,
|
|
||||||
python-sphinx | python3-sphinx,
|
|
||||||
python3-all,
|
|
||||||
qt5keychain-dev,
|
|
||||||
qtwebengine5-dev,
|
|
||||||
qtdeclarative5-dev,
|
|
||||||
qttools5-dev,
|
|
||||||
qttools5-dev-tools,
|
|
||||||
xvfb
|
|
||||||
Standards-Version: 3.9.8
|
|
||||||
Homepage: https://github.com/nextcloud/client_theming
|
|
||||||
#Vcs-Git: git://anonscm.debian.org/collab-maint/nextcloud-client.git
|
|
||||||
#Vcs-Browser: https://anonscm.debian.org/cgit/collab-maint/nextcloud-client.git
|
|
||||||
|
|
||||||
Package: nextcloud-client
|
|
||||||
Architecture: any
|
|
||||||
Depends: libnextcloudsync0 (=${binary:Version}), ${shlibs:Depends}, ${misc:Depends}, libgnome-keyring0, nextcloud-client-l10n
|
|
||||||
Description: Nextcloud desktop sync client
|
|
||||||
Use the desktop client to keep your files synchronized
|
|
||||||
between your Nextcloud server and your desktop. Select
|
|
||||||
one or more directories on your local machine and always
|
|
||||||
have access to your latest files wherever you are.
|
|
||||||
|
|
||||||
Package: libnextcloudsync0
|
|
||||||
Architecture: any
|
|
||||||
Depends: ${shlibs:Depends}, ${misc:Depends}
|
|
||||||
Description: Nextcloud sync library
|
|
||||||
Used by the Nextcloud desktop client as the synchronization engine.
|
|
||||||
|
|
||||||
Package: libnextcloudsync-dev
|
|
||||||
Architecture: any
|
|
||||||
Section: contrib/libdevel
|
|
||||||
Depends: libnextcloudsync0 (=${binary:Version}), ${misc:Depends}
|
|
||||||
Description: Nextcloud sync library development files
|
|
||||||
The headers and development library for the Nextcloud sync library.
|
|
||||||
|
|
||||||
Package: nextcloud-client-l10n
|
|
||||||
Architecture: all
|
|
||||||
Depends: ${misc:Depends}
|
|
||||||
Description: Nextcloud client internatialization files
|
|
||||||
The translation files.
|
|
||||||
|
|
||||||
Package: nextcloud-client-nautilus
|
|
||||||
Architecture: all
|
|
||||||
Depends: nextcloud-client (>=${binary:Version}), libnextcloudsync0, python-nautilus, nautilus, ${misc:Depends}
|
|
||||||
Description: Nautilus plugin for Nextcloud
|
|
||||||
This package contains a Nautilus plugin to display
|
|
||||||
synchronization status icons for Nextcloud files.
|
|
||||||
|
|
||||||
Package: nextcloud-client-nemo
|
|
||||||
Architecture: all
|
|
||||||
Depends: nextcloud-client (>=${binary:Version}), libnextcloudsync0, python-nemo | nemo-python, nemo, ${misc:Depends}
|
|
||||||
Description: Nemo plugin for Nextcloud
|
|
||||||
This package contains a Nemo plugin to display
|
|
||||||
synchronization status icons for Nextcloud files.
|
|
||||||
|
|
||||||
Package: nextcloud-client-caja
|
|
||||||
Architecture: all
|
|
||||||
Depends: nextcloud-client (>=${binary:Version}), libnextcloudsync0, python-caja, caja, ${misc:Depends}
|
|
||||||
Description: Caja plugin for Nextcloud
|
|
||||||
This package contains a Caja plugin to display
|
|
||||||
synchronization status icons for Nextcloud files.
|
|
||||||
|
|
||||||
Package: nextcloud-client-dolphin
|
|
||||||
Architecture: any
|
|
||||||
Depends: dolphin (>= 4:15.12.1), libnextcloudsync0 (= ${binary:Version}), nextcloud-client, ${misc:Depends}, ${shlibs:Depends}
|
|
||||||
Description: Dolphin plugin for Nextcloud
|
|
||||||
This package contains a Dolphin plugin to display
|
|
||||||
synchronization status icons for Nextcloud files.
|
|
||||||
@@ -13,8 +13,9 @@ Build-Depends: cmake,
|
|||||||
libhttp-dav-perl,
|
libhttp-dav-perl,
|
||||||
libinotify-dev [kfreebsd-any],
|
libinotify-dev [kfreebsd-any],
|
||||||
libqt5webkit5-dev,
|
libqt5webkit5-dev,
|
||||||
|
libqt5svg5-dev,
|
||||||
libsqlite3-dev,
|
libsqlite3-dev,
|
||||||
libssl-dev (>> 1.0.0),
|
libssl-dev (>= 1.1.0),
|
||||||
zlib1g-dev,
|
zlib1g-dev,
|
||||||
optipng,
|
optipng,
|
||||||
pkg-kde-tools,
|
pkg-kde-tools,
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ Build-Depends: cmake,
|
|||||||
libhttp-dav-perl,
|
libhttp-dav-perl,
|
||||||
libinotify-dev [kfreebsd-any],
|
libinotify-dev [kfreebsd-any],
|
||||||
libqt5webkit5-dev,
|
libqt5webkit5-dev,
|
||||||
|
libqt5svg5-dev,
|
||||||
libsqlite3-dev,
|
libsqlite3-dev,
|
||||||
libssl-dev (>> 1.0.0),
|
libssl-dev (>> 1.0.0),
|
||||||
zlib1g-dev,
|
zlib1g-dev,
|
||||||
@@ -33,7 +34,8 @@ Homepage: https://github.com/nextcloud/client_theming
|
|||||||
|
|
||||||
Package: nextcloud-client
|
Package: nextcloud-client
|
||||||
Architecture: any
|
Architecture: any
|
||||||
Depends: libnextcloudsync0 (=${binary:Version}), ${shlibs:Depends}, ${misc:Depends}, libgnome-keyring0, nextcloud-client-l10n
|
Depends: libnextcloudsync0 (=${binary:Version}), ${shlibs:Depends}, ${misc:Depends}, nextcloud-client-l10n
|
||||||
|
Recommends: libgnome-keyring0
|
||||||
Description: Nextcloud desktop sync client
|
Description: Nextcloud desktop sync client
|
||||||
Use the desktop client to keep your files synchronized
|
Use the desktop client to keep your files synchronized
|
||||||
between your Nextcloud server and your desktop. Select
|
between your Nextcloud server and your desktop. Select
|
||||||
11
admin/linux/debian/debian.xenial/post-patches/libssl.patch
Normal file
11
admin/linux/debian/debian.xenial/post-patches/libssl.patch
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
--- nextcloud-client-2.5.0.orig/CMakeLists.txt 2018-08-13 16:19:57.191634632 +0200
|
||||||
|
+++ nextcloud-client-2.5.0/CMakeLists.txt 2018-08-13 16:20:05.167612238 +0200
|
||||||
|
@@ -183,7 +183,7 @@
|
||||||
|
endif()
|
||||||
|
find_package(Sphinx)
|
||||||
|
find_package(PdfLatex)
|
||||||
|
- find_package(OpenSSL 1.1 REQUIRED )
|
||||||
|
+ find_package(OpenSSL 1.0 REQUIRED )
|
||||||
|
|
||||||
|
find_package(ZLIB REQUIRED)
|
||||||
|
find_package(GLib2)
|
||||||
@@ -8,13 +8,14 @@ Build-Depends: cmake,
|
|||||||
dh-python,
|
dh-python,
|
||||||
extra-cmake-modules (>= 5.16),
|
extra-cmake-modules (>= 5.16),
|
||||||
kdelibs5-dev,
|
kdelibs5-dev,
|
||||||
kio-dev,
|
libkf5kio-dev,
|
||||||
libcmocka-dev,
|
libcmocka-dev,
|
||||||
libhttp-dav-perl,
|
libhttp-dav-perl,
|
||||||
libinotify-dev [kfreebsd-any],
|
libinotify-dev [kfreebsd-any],
|
||||||
|
libqt5svg5-dev,
|
||||||
libqt5webkit5-dev,
|
libqt5webkit5-dev,
|
||||||
libsqlite3-dev,
|
libsqlite3-dev,
|
||||||
libssl-dev (>> 1.0.0),
|
libssl-dev (>= 1.1.0),
|
||||||
zlib1g-dev,
|
zlib1g-dev,
|
||||||
optipng,
|
optipng,
|
||||||
pkg-kde-tools,
|
pkg-kde-tools,
|
||||||
@@ -33,8 +34,7 @@ Homepage: https://github.com/nextcloud/client_theming
|
|||||||
|
|
||||||
Package: nextcloud-client
|
Package: nextcloud-client
|
||||||
Architecture: any
|
Architecture: any
|
||||||
Depends: libnextcloudsync0 (=${binary:Version}), ${shlibs:Depends}, ${misc:Depends}, nextcloud-client-l10n
|
Depends: libnextcloudsync0 (=${binary:Version}), ${shlibs:Depends}, ${misc:Depends}, libgnome-keyring0, nextcloud-client-l10n
|
||||||
Recommends: libgnome-keyring0
|
|
||||||
Description: Nextcloud desktop sync client
|
Description: Nextcloud desktop sync client
|
||||||
Use the desktop client to keep your files synchronized
|
Use the desktop client to keep your files synchronized
|
||||||
between your Nextcloud server and your desktop. Select
|
between your Nextcloud server and your desktop. Select
|
||||||
|
|||||||
@@ -36,6 +36,7 @@
|
|||||||
<file>resources/public.svg</file>
|
<file>resources/public.svg</file>
|
||||||
<file>resources/confirm.svg</file>
|
<file>resources/confirm.svg</file>
|
||||||
<file>resources/copy.svg</file>
|
<file>resources/copy.svg</file>
|
||||||
|
<file>resources/state-sync.svg</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
<qresource prefix="/"/>
|
<qresource prefix="/"/>
|
||||||
</RCC>
|
</RCC>
|
||||||
|
|||||||
@@ -45,6 +45,9 @@ macro (KDE4_ADD_APP_ICON appsources pattern)
|
|||||||
if (fn MATCHES ".*128.*" )
|
if (fn MATCHES ".*128.*" )
|
||||||
list (APPEND _icons ${it})
|
list (APPEND _icons ${it})
|
||||||
endif (fn MATCHES ".*128.*")
|
endif (fn MATCHES ".*128.*")
|
||||||
|
if (fn MATCHES ".*256.*" )
|
||||||
|
list (APPEND _icons ${it})
|
||||||
|
endif (fn MATCHES ".*256.*")
|
||||||
endforeach (it)
|
endforeach (it)
|
||||||
if (_icons)
|
if (_icons)
|
||||||
add_custom_command(OUTPUT ${_outfilename}.ico ${_outfilename}.rc
|
add_custom_command(OUTPUT ${_outfilename}.ico ${_outfilename}.rc
|
||||||
|
|||||||
@@ -168,7 +168,8 @@ function(ecm_add_app_icon appsources)
|
|||||||
${icons_at_32px}
|
${icons_at_32px}
|
||||||
${icons_at_48px}
|
${icons_at_48px}
|
||||||
${icons_at_64px}
|
${icons_at_64px}
|
||||||
${icons_at_128px})
|
${icons_at_128px}
|
||||||
|
${icons_at_256px})
|
||||||
if (NOT windows_icons)
|
if (NOT windows_icons)
|
||||||
message(AUTHOR_WARNING "No icons suitable for use on Windows provided")
|
message(AUTHOR_WARNING "No icons suitable for use on Windows provided")
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
<key>CFBundleExecutable</key>
|
<key>CFBundleExecutable</key>
|
||||||
<string>@APPLICATION_EXECUTABLE@</string>
|
<string>@APPLICATION_EXECUTABLE@</string>
|
||||||
<key>CFBundleIconFile</key>
|
<key>CFBundleIconFile</key>
|
||||||
<string>ownCloud.icns</string>
|
<string>@APPLICATION_ICON_NAME@.icns</string>
|
||||||
<key>CFBundleIdentifier</key>
|
<key>CFBundleIdentifier</key>
|
||||||
<string>@APPLICATION_REV_DOMAIN@</string>
|
<string>@APPLICATION_REV_DOMAIN@</string>
|
||||||
<key>CFBundleInfoDictionaryVersion</key>
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
|
|||||||
19
doc/faq.rst
19
doc/faq.rst
@@ -21,6 +21,25 @@ When a deeply nested directory is excluded from synchronization it will be
|
|||||||
listed with other ignored files and directories in the "Not synced" tab of
|
listed with other ignored files and directories in the "Not synced" tab of
|
||||||
the "Activity" pane.
|
the "Activity" pane.
|
||||||
|
|
||||||
|
There Was A Warning About Changes In Synchronized Folders Not Being Tracked Reliably.
|
||||||
|
-------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
On linux when the synchronized folder contains very many subfolders the
|
||||||
|
operating system may not allow for enough inotify watches to monitor the
|
||||||
|
changes in all of them.
|
||||||
|
|
||||||
|
In this case the client will not be able to immediately start the
|
||||||
|
synchronization process when a file in one of the unmonitored folders changes.
|
||||||
|
Instead, the client will show the warning and manually scan folders for changes
|
||||||
|
in a regular interval (two hours by default).
|
||||||
|
|
||||||
|
This problem can be solved by setting the fs.inotify.max_user_watches
|
||||||
|
sysctl to a higher value. This can usually be done either temporarily::
|
||||||
|
|
||||||
|
echo 524288 > /proc/sys/fs/inotify/max_user_watches
|
||||||
|
|
||||||
|
or permanently by adjusting ``/etc/sysctl.conf``.
|
||||||
|
|
||||||
I Want To Move My Local Sync Folder
|
I Want To Move My Local Sync Folder
|
||||||
-----------------------------------
|
-----------------------------------
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,9 @@ The other options are:
|
|||||||
``--logflush``
|
``--logflush``
|
||||||
Clears (flushes) the log file after each write action.
|
Clears (flushes) the log file after each write action.
|
||||||
|
|
||||||
|
``--logdebug``
|
||||||
|
Also output debug-level messages in the log (equivalent to setting the env var QT_LOGGING_RULES="qt.*=true;*.debug=true").
|
||||||
|
)
|
||||||
|
|
||||||
``--confdir`` `<dirname>`
|
``--confdir`` `<dirname>`
|
||||||
Uses the specified configuration directory.
|
Uses the specified configuration directory.
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -198,185 +198,185 @@ X-GNOME-Autostart-Delay=3
|
|||||||
Comment[oc]=@APPLICATION_NAME@ sincronizacion del client
|
Comment[oc]=@APPLICATION_NAME@ sincronizacion del client
|
||||||
GenericName[oc]=Dorsièr de Sincronizacion
|
GenericName[oc]=Dorsièr de Sincronizacion
|
||||||
Name[oc]=@APPLICATION_NAME@ sincronizacion del client
|
Name[oc]=@APPLICATION_NAME@ sincronizacion del client
|
||||||
Icon[oc]=@APPLICATION_EXECUTABLE@
|
Icon[oc]=@APPLICATION_ICON_NAME@
|
||||||
Comment[ar]=@APPLICATION_NAME@ زبون مزامنة مكتبي
|
Comment[ar]=@APPLICATION_NAME@ زبون مزامنة مكتبي
|
||||||
GenericName[ar]=مزامنة المجلد
|
GenericName[ar]=مزامنة المجلد
|
||||||
Name[ar]=@APPLICATION_NAME@ زبون مزامنة مكتبي
|
Name[ar]=@APPLICATION_NAME@ زبون مزامنة مكتبي
|
||||||
Icon[ar]=@APPLICATION_EXECUTABLE@
|
Icon[ar]=@APPLICATION_ICON_NAME@
|
||||||
Comment[bg_BG]=@APPLICATION_NAME@ клиент за десктоп синхронизация
|
Comment[bg_BG]=@APPLICATION_NAME@ клиент за десктоп синхронизация
|
||||||
GenericName[bg_BG]=Синхронизиране на папката
|
GenericName[bg_BG]=Синхронизиране на папката
|
||||||
Name[bg_BG]=@APPLICATION_NAME@ клиент десктоп синхронизация
|
Name[bg_BG]=@APPLICATION_NAME@ клиент десктоп синхронизация
|
||||||
Icon[bg_BG]=@APPLICATION_EXECUTABLE@
|
Icon[bg_BG]=@APPLICATION_ICON_NAME@
|
||||||
Comment[ca]=Client de sincronització d'escriptori @APPLICATION_NAME@
|
Comment[ca]=Client de sincronització d'escriptori @APPLICATION_NAME@
|
||||||
GenericName[ca]=Sincronització de carpetes
|
GenericName[ca]=Sincronització de carpetes
|
||||||
Name[ca]=Client de sincronització d'escriptori @APPLICATION_NAME@
|
Name[ca]=Client de sincronització d'escriptori @APPLICATION_NAME@
|
||||||
Icon[ca]=@APPLICATION_EXECUTABLE@
|
Icon[ca]=@APPLICATION_ICON_NAME@
|
||||||
Comment[da]=@APPLICATION_NAME@ skrivebordsklient til synkronisering
|
Comment[da]=@APPLICATION_NAME@ skrivebordsklient til synkronisering
|
||||||
GenericName[da]=Mappesynkronisering
|
GenericName[da]=Mappesynkronisering
|
||||||
Name[da]=@APPLICATION_NAME@ skrivebordsklient til synk
|
Name[da]=@APPLICATION_NAME@ skrivebordsklient til synk
|
||||||
Icon[da]=@APPLICATION_EXECUTABLE@
|
Icon[da]=@APPLICATION_ICON_NAME@
|
||||||
Comment[de]=@APPLICATION_NAME@ Desktop-Synchronisationsclient
|
Comment[de]=@APPLICATION_NAME@ Desktop-Synchronisationsclient
|
||||||
GenericName[de]=Ordner-Synchronisation
|
GenericName[de]=Ordner-Synchronisation
|
||||||
Name[de]=@APPLICATION_NAME@ Desktop-Synchronisationsclient
|
Name[de]=@APPLICATION_NAME@ Desktop-Synchronisationsclient
|
||||||
Icon[de]=@APPLICATION_EXECUTABLE@
|
Icon[de]=@APPLICATION_ICON_NAME@
|
||||||
Comment[ja_JP]=@APPLICATION_NAME@ デスクトップ同期クライアント
|
Comment[ja_JP]=@APPLICATION_NAME@ デスクトップ同期クライアント
|
||||||
GenericName[ja_JP]=フォルダー同期
|
GenericName[ja_JP]=フォルダー同期
|
||||||
Name[ja_JP]=@APPLICATION_NAME@ デスクトップ同期クライアント
|
Name[ja_JP]=@APPLICATION_NAME@ デスクトップ同期クライアント
|
||||||
Icon[ja_JP]=@APPLICATION_EXECUTABLE@
|
Icon[ja_JP]=@APPLICATION_ICON_NAME@
|
||||||
Comment[el]=@ΟΝΟΜΑ_ΕΦΑΡΜΟΓΗΣ@ συγχρονισμός επιφάνειας εργασίας πελάτη
|
Comment[el]=@ΟΝΟΜΑ_ΕΦΑΡΜΟΓΗΣ@ συγχρονισμός επιφάνειας εργασίας πελάτη
|
||||||
GenericName[el]=Συγχρονισμός φακέλου
|
GenericName[el]=Συγχρονισμός φακέλου
|
||||||
Name[el]=@ΟΝΟΜΑ_ΕΦΑΡΜΟΓΗΣ@ συγχρονισμός επιφάνειας εργασίας πελάτη
|
Name[el]=@ΟΝΟΜΑ_ΕΦΑΡΜΟΓΗΣ@ συγχρονισμός επιφάνειας εργασίας πελάτη
|
||||||
Icon[el]=@APPLICATION_EXECUTABLE@
|
Icon[el]=@APPLICATION_ICON_NAME@
|
||||||
Comment[en_GB]=@APPLICATION_NAME@ desktop synchronisation client
|
Comment[en_GB]=@APPLICATION_NAME@ desktop synchronisation client
|
||||||
GenericName[en_GB]=Folder Sync
|
GenericName[en_GB]=Folder Sync
|
||||||
Name[en_GB]=@APPLICATION_NAME@ desktop sync client
|
Name[en_GB]=@APPLICATION_NAME@ desktop sync client
|
||||||
Icon[en_GB]=@APPLICATION_EXECUTABLE@
|
Icon[en_GB]=@APPLICATION_ICON_NAME@
|
||||||
Comment[es]=@APPLICATION_NAME@ cliente de sincronización de escritorio
|
Comment[es]=@APPLICATION_NAME@ cliente de sincronización de escritorio
|
||||||
GenericName[es]=Sincronización de carpeta
|
GenericName[es]=Sincronización de carpeta
|
||||||
Name[es]=@APPLICATION_NAME@ cliente de sincronización de escritorio
|
Name[es]=@APPLICATION_NAME@ cliente de sincronización de escritorio
|
||||||
Icon[es]=@APPLICATION_EXECUTABLE@
|
Icon[es]=@APPLICATION_ICON_NAME@
|
||||||
Comment[de_DE]=@APPLICATION_NAME@ Desktop-Synchronisationsclient
|
Comment[de_DE]=@APPLICATION_NAME@ Desktop-Synchronisationsclient
|
||||||
GenericName[de_DE]=Ordner-Synchronisation
|
GenericName[de_DE]=Ordner-Synchronisation
|
||||||
Name[de_DE]=@APPLICATION_NAME@ Desktop-Synchronisationsclient
|
Name[de_DE]=@APPLICATION_NAME@ Desktop-Synchronisationsclient
|
||||||
Icon[de_DE]=@APPLICATION_EXECUTABLE@
|
Icon[de_DE]=@APPLICATION_ICON_NAME@
|
||||||
Comment[eu]=@APPLICATION_NAME@ mahaigaineko sinkronizazio bezeroa
|
Comment[eu]=@APPLICATION_NAME@ mahaigaineko sinkronizazio bezeroa
|
||||||
GenericName[eu]=Karpetaren sinkronizazioa
|
GenericName[eu]=Karpetaren sinkronizazioa
|
||||||
Name[eu]=@APPLICATION_NAME@ mahaigaineko sinkronizazio bezeroa
|
Name[eu]=@APPLICATION_NAME@ mahaigaineko sinkronizazio bezeroa
|
||||||
Icon[eu]=@APPLICATION_EXECUTABLE@
|
Icon[eu]=@APPLICATION_ICON_NAME@
|
||||||
GenericName[fa]=همسان سازی پوشهها
|
GenericName[fa]=همسان سازی پوشهها
|
||||||
Name[fa]=@APPLICATION_EXECUTABLE@ نسخهی همسان سازی مشتری
|
Name[fa]=@APPLICATION_EXECUTABLE@ نسخهی همسان سازی مشتری
|
||||||
Icon[fa]=@APPLICATION_EXECUTABLE@
|
Icon[fa]=@APPLICATION_ICON_NAME@
|
||||||
Comment[fr]=Synchronisez vos dossiers avec un serveur @APPLICATION_NAME@
|
Comment[fr]=Synchronisez vos dossiers avec un serveur @APPLICATION_NAME@
|
||||||
GenericName[fr]=Synchronisation de dossier
|
GenericName[fr]=Synchronisation de dossier
|
||||||
Name[fr]=Client de synchronisation @APPLICATION_NAME@
|
Name[fr]=Client de synchronisation @APPLICATION_NAME@
|
||||||
Icon[fr]=@APPLICATION_EXECUTABLE@
|
Icon[fr]=@APPLICATION_ICON_NAME@
|
||||||
Comment[gl]=@APPLICATION_NAME@ cliente de sincronización para escritorio
|
Comment[gl]=@APPLICATION_NAME@ cliente de sincronización para escritorio
|
||||||
GenericName[gl]=Sincronizar Cartafol
|
GenericName[gl]=Sincronizar Cartafol
|
||||||
Name[gl]=@APPLICATION_NAME@ cliente de sincronización para escritorio
|
Name[gl]=@APPLICATION_NAME@ cliente de sincronización para escritorio
|
||||||
Icon[gl]=@APPLICATION_EXECUTABLE@
|
Icon[gl]=@APPLICATION_ICON_NAME@
|
||||||
Comment[he]=@APPLICATION_NAME@ לקוח סנכון שולחן עבודה
|
Comment[he]=@APPLICATION_NAME@ לקוח סנכון שולחן עבודה
|
||||||
GenericName[he]=סנכון תיקייה
|
GenericName[he]=סנכון תיקייה
|
||||||
Name[he]=@APPLICATION_NAME@ לקוח סנכרון שולחן עבודה
|
Name[he]=@APPLICATION_NAME@ לקוח סנכרון שולחן עבודה
|
||||||
Icon[he]=@APPLICATION_EXECUTABLE@
|
Icon[he]=@APPLICATION_ICON_NAME@
|
||||||
Comment[ia]=@APPLICATION_NAME@ cliente de synchronisation pro scriptorio
|
Comment[ia]=@APPLICATION_NAME@ cliente de synchronisation pro scriptorio
|
||||||
GenericName[ia]=Synchronisar Dossier
|
GenericName[ia]=Synchronisar Dossier
|
||||||
Name[ia]=@APPLICATION_NAME@ cliente de synchronisation pro scriptorio
|
Name[ia]=@APPLICATION_NAME@ cliente de synchronisation pro scriptorio
|
||||||
Icon[ia]=@APPLICATION_EXECUTABLE@
|
Icon[ia]=@APPLICATION_ICON_NAME@
|
||||||
Comment[id]=Klien sinkronisasi desktop @APPLICATION_NAME@
|
Comment[id]=Klien sinkronisasi desktop @APPLICATION_NAME@
|
||||||
GenericName[id]=Folder Sync
|
GenericName[id]=Folder Sync
|
||||||
Name[id]=Klien sync desktop @APPLICATION_NAME@
|
Name[id]=Klien sync desktop @APPLICATION_NAME@
|
||||||
Icon[id]=@APPLICATION_EXECUTABLE@
|
Icon[id]=@APPLICATION_ICON_NAME@
|
||||||
Comment[is]=@APPLICATION_NAME@ skjáborðsforrit samstillingar
|
Comment[is]=@APPLICATION_NAME@ skjáborðsforrit samstillingar
|
||||||
GenericName[is]=Samstilling möppu
|
GenericName[is]=Samstilling möppu
|
||||||
Name[is]=@APPLICATION_NAME@ skjáborðsforrit samstillingar
|
Name[is]=@APPLICATION_NAME@ skjáborðsforrit samstillingar
|
||||||
Icon[is]=@APPLICATION_EXECUTABLE@
|
Icon[is]=@APPLICATION_ICON_NAME@
|
||||||
Comment[it]=Client di sincronizzazione del desktop di @APPLICATION_NAME@
|
Comment[it]=Client di sincronizzazione del desktop di @APPLICATION_NAME@
|
||||||
GenericName[it]=Sincronizzazione cartella
|
GenericName[it]=Sincronizzazione cartella
|
||||||
Name[it]=Client di sincronizzazione del desktop di @APPLICATION_NAME@
|
Name[it]=Client di sincronizzazione del desktop di @APPLICATION_NAME@
|
||||||
Icon[it]=@APPLICATION_EXECUTABLE@
|
Icon[it]=@APPLICATION_ICON_NAME@
|
||||||
Comment[ko]=@APPLICATION_NAME@ 데스크톱 동기화 클라이언트
|
Comment[ko]=@APPLICATION_NAME@ 데스크톱 동기화 클라이언트
|
||||||
GenericName[ko]=폴더 동기화
|
GenericName[ko]=폴더 동기화
|
||||||
Name[ko]=@APPLICATION_NAME@ 데스크톱 동기화 클라이언트
|
Name[ko]=@APPLICATION_NAME@ 데스크톱 동기화 클라이언트
|
||||||
Icon[ko]=@APPLICATION_EXECUTABLE@
|
Icon[ko]=@APPLICATION_ICON_NAME@
|
||||||
Comment[hu_HU]=@APPLICATION_NAME@ asztali szinkronizációs kliens
|
Comment[hu_HU]=@APPLICATION_NAME@ asztali szinkronizációs kliens
|
||||||
GenericName[hu_HU]=Könyvtár szinkronizálás
|
GenericName[hu_HU]=Könyvtár szinkronizálás
|
||||||
Name[hu_HU]=@APPLICATION_NAME@ asztali szinkr. kliens
|
Name[hu_HU]=@APPLICATION_NAME@ asztali szinkr. kliens
|
||||||
Icon[hu_HU]=@APPLICATION_EXECUTABLE@
|
Icon[hu_HU]=@APPLICATION_ICON_NAME@
|
||||||
Comment[af_ZA]=@APPLICATION_NAME@ werkskermsinchroniseerkliënt
|
Comment[af_ZA]=@APPLICATION_NAME@ werkskermsinchroniseerkliënt
|
||||||
GenericName[af_ZA]=Vouersinchronisering
|
GenericName[af_ZA]=Vouersinchronisering
|
||||||
Name[af_ZA]=@APPLICATION_NAME@ werkskermsinchroniseerkliënt
|
Name[af_ZA]=@APPLICATION_NAME@ werkskermsinchroniseerkliënt
|
||||||
Icon[af_ZA]=@APPLICATION_EXECUTABLE@
|
Icon[af_ZA]=@APPLICATION_ICON_NAME@
|
||||||
Comment[nl]=@APPLICATION_NAME@ desktop synchronisatie client
|
Comment[nl]=@APPLICATION_NAME@ desktop synchronisatie client
|
||||||
GenericName[nl]=Mappen sync
|
GenericName[nl]=Mappen sync
|
||||||
Name[nl]=@APPLICATION_NAME@ desktop sync client
|
Name[nl]=@APPLICATION_NAME@ desktop sync client
|
||||||
Icon[nl]=@APPLICATION_EXECUTABLE@
|
Icon[nl]=@APPLICATION_ICON_NAME@
|
||||||
Comment[et_EE]=@APPLICATION_NAME@ sünkroonimise klient töölauale
|
Comment[et_EE]=@APPLICATION_NAME@ sünkroonimise klient töölauale
|
||||||
GenericName[et_EE]=Kaustade sünkroonimine
|
GenericName[et_EE]=Kaustade sünkroonimine
|
||||||
Name[et_EE]=@APPLICATION_NAME@ sünkroonimise klient töölauale
|
Name[et_EE]=@APPLICATION_NAME@ sünkroonimise klient töölauale
|
||||||
Icon[et_EE]=@APPLICATION_EXECUTABLE@
|
Icon[et_EE]=@APPLICATION_ICON_NAME@
|
||||||
Comment[pl]=@APPLICATION_NAME@ klient synchronizacji dla komputerów stacjonarnych
|
Comment[pl]=@APPLICATION_NAME@ klient synchronizacji dla komputerów stacjonarnych
|
||||||
GenericName[pl]=Folder Synchronizacji
|
GenericName[pl]=Folder Synchronizacji
|
||||||
Name[pl]=@APPLICATION_NAME@ klient synchronizacji dla komputerów stacjonarnych
|
Name[pl]=@APPLICATION_NAME@ klient synchronizacji dla komputerów stacjonarnych
|
||||||
Icon[pl]=@APPLICATION_EXECUTABLE@
|
Icon[pl]=@APPLICATION_ICON_NAME@
|
||||||
Comment[pt_BR]=@APPLICATION_NAME@ cliente de sincronização do computador
|
Comment[pt_BR]=@APPLICATION_NAME@ cliente de sincronização do computador
|
||||||
GenericName[pt_BR]=Sincronização de Pasta
|
GenericName[pt_BR]=Sincronização de Pasta
|
||||||
Name[pt_BR]=@APPLICATION_NAME@ cliente de sincronização de desktop
|
Name[pt_BR]=@APPLICATION_NAME@ cliente de sincronização de desktop
|
||||||
Icon[pt_BR]=@APPLICATION_EXECUTABLE@
|
Icon[pt_BR]=@APPLICATION_ICON_NAME@
|
||||||
Comment[cs_CZ]=@APPLICATION_NAME@ počítačový synchronizační klient
|
Comment[cs_CZ]=@APPLICATION_NAME@ počítačový synchronizační klient
|
||||||
GenericName[cs_CZ]=Synchronizace adresáře
|
GenericName[cs_CZ]=Synchronizace adresáře
|
||||||
Name[cs_CZ]=@APPLICATION_NAME@ počítačový synchronizační klient
|
Name[cs_CZ]=@APPLICATION_NAME@ počítačový synchronizační klient
|
||||||
Icon[cs_CZ]=@APPLICATION_EXECUTABLE@
|
Icon[cs_CZ]=@APPLICATION_ICON_NAME@
|
||||||
Comment[ru]=Настольный клиент синхронизации @APPLICATION_NAME@
|
Comment[ru]=Настольный клиент синхронизации @APPLICATION_NAME@
|
||||||
GenericName[ru]=Синхронизация каталогов
|
GenericName[ru]=Синхронизация каталогов
|
||||||
Name[ru]=Настольный клиент синхронизации @APPLICATION_NAME@
|
Name[ru]=Настольный клиент синхронизации @APPLICATION_NAME@
|
||||||
Icon[ru]=@APPLICATION_EXECUTABLE@
|
Icon[ru]=@APPLICATION_ICON_NAME@
|
||||||
Comment[sl]=@APPLICATION_NAME@ ‒ Program za usklajevanje datotek z namizjem
|
Comment[sl]=@APPLICATION_NAME@ ‒ Program za usklajevanje datotek z namizjem
|
||||||
GenericName[sl]=Usklajevanje map
|
GenericName[sl]=Usklajevanje map
|
||||||
Name[sl]=@APPLICATION_NAME@ ‒ Program za usklajevanje datotek z namizjem
|
Name[sl]=@APPLICATION_NAME@ ‒ Program za usklajevanje datotek z namizjem
|
||||||
Icon[sl]=@APPLICATION_EXECUTABLE@
|
Icon[sl]=@APPLICATION_ICON_NAME@
|
||||||
Comment[sq]=Klient njëkohësimesh @APPLICATION_NAME@ për desktop
|
Comment[sq]=Klient njëkohësimesh @APPLICATION_NAME@ për desktop
|
||||||
GenericName[sq]=Njëkohësim Dosjesh
|
GenericName[sq]=Njëkohësim Dosjesh
|
||||||
Name[sq]=Klient njëkohësimesh @APPLICATION_NAME@ për desktop
|
Name[sq]=Klient njëkohësimesh @APPLICATION_NAME@ për desktop
|
||||||
Icon[sq]=@APPLICATION_EXECUTABLE@
|
Icon[sq]=@APPLICATION_ICON_NAME@
|
||||||
Comment[fi_FI]=@APPLICATION_NAME@ työpöytäsynkronointisovellus
|
Comment[fi_FI]=@APPLICATION_NAME@ työpöytäsynkronointisovellus
|
||||||
GenericName[fi_FI]=Kansion synkronointi
|
GenericName[fi_FI]=Kansion synkronointi
|
||||||
Name[fi_FI]=@APPLICATION_NAME@ työpöytäsynkronointisovellus
|
Name[fi_FI]=@APPLICATION_NAME@ työpöytäsynkronointisovellus
|
||||||
Icon[fi_FI]=@APPLICATION_EXECUTABLE@
|
Icon[fi_FI]=@APPLICATION_ICON_NAME@
|
||||||
Comment[sv]=@APPLICATION_NAME@ desktop synkroniseringsklient
|
Comment[sv]=@APPLICATION_NAME@ desktop synkroniseringsklient
|
||||||
GenericName[sv]=Mappsynk
|
GenericName[sv]=Mappsynk
|
||||||
Name[sv]=@APPLICATION_NAME@ desktop synk-klient
|
Name[sv]=@APPLICATION_NAME@ desktop synk-klient
|
||||||
Icon[sv]=@APPLICATION_EXECUTABLE@
|
Icon[sv]=@APPLICATION_ICON_NAME@
|
||||||
Comment[tr]=@APPLICATION_NAME@ masaüstü eşitleme istemcisi
|
Comment[tr]=@APPLICATION_NAME@ masaüstü eşitleme istemcisi
|
||||||
GenericName[tr]=Dosya Eşitleme
|
GenericName[tr]=Dosya Eşitleme
|
||||||
Name[tr]=@APPLICATION_NAME@ masaüstü eşitleme istemcisi
|
Name[tr]=@APPLICATION_NAME@ masaüstü eşitleme istemcisi
|
||||||
Icon[tr]=@APPLICATION_EXECUTABLE@
|
Icon[tr]=@APPLICATION_ICON_NAME@
|
||||||
Comment[uk]=Настільний клієнт синхронізації @APPLICATION_NAME@
|
Comment[uk]=Настільний клієнт синхронізації @APPLICATION_NAME@
|
||||||
GenericName[uk]=Синхронізація теки
|
GenericName[uk]=Синхронізація теки
|
||||||
Name[uk]=Настільний клієнт синхронізації @APPLICATION_NAME@
|
Name[uk]=Настільний клієнт синхронізації @APPLICATION_NAME@
|
||||||
Icon[uk]=@APPLICATION_EXECUTABLE@
|
Icon[uk]=@APPLICATION_ICON_NAME@
|
||||||
Comment[ro]=@APPLICATION_NAME@ client de sincronizare pe desktop
|
Comment[ro]=@APPLICATION_NAME@ client de sincronizare pe desktop
|
||||||
GenericName[ro]=Sincronizare director
|
GenericName[ro]=Sincronizare director
|
||||||
Name[ro]=@APPLICATION_NAME@ client de sincronizare pe desktop
|
Name[ro]=@APPLICATION_NAME@ client de sincronizare pe desktop
|
||||||
Icon[ro]=@APPLICATION_EXECUTABLE@
|
Icon[ro]=@APPLICATION_ICON_NAME@
|
||||||
Comment[zh_CN]=@APPLICATION_NAME@ 桌面同步客户端
|
Comment[zh_CN]=@APPLICATION_NAME@ 桌面同步客户端
|
||||||
GenericName[zh_CN]=文件夹同步
|
GenericName[zh_CN]=文件夹同步
|
||||||
Name[zh_CN]=@APPLICATION_NAME@ 桌面同步客户端
|
Name[zh_CN]=@APPLICATION_NAME@ 桌面同步客户端
|
||||||
Icon[zh_CN]=@APPLICATION_EXECUTABLE@
|
Icon[zh_CN]=@APPLICATION_ICON_NAME@
|
||||||
Comment[zh_HK]=桌面版同步客户端
|
Comment[zh_HK]=桌面版同步客户端
|
||||||
Comment[zh_TW]=@APPLICATION_NAME@ 桌面同步客戶端
|
Comment[zh_TW]=@APPLICATION_NAME@ 桌面同步客戶端
|
||||||
GenericName[zh_TW]=資料夾同步
|
GenericName[zh_TW]=資料夾同步
|
||||||
Name[zh_TW]=@APPLICATION_NAME@ 桌面同步客戶端
|
Name[zh_TW]=@APPLICATION_NAME@ 桌面同步客戶端
|
||||||
Icon[zh_TW]=@APPLICATION_EXECUTABLE@
|
Icon[zh_TW]=@APPLICATION_ICON_NAME@
|
||||||
Comment[es_AR]=Cliente de sincronización para escritorio @APPLICATION_NAME@
|
Comment[es_AR]=Cliente de sincronización para escritorio @APPLICATION_NAME@
|
||||||
GenericName[es_AR]=Sincronización de directorio
|
GenericName[es_AR]=Sincronización de directorio
|
||||||
Name[es_AR]=Cliente de sincronización para escritorio @APPLICATION_NAME@
|
Name[es_AR]=Cliente de sincronización para escritorio @APPLICATION_NAME@
|
||||||
Icon[es_AR]=@APPLICATION_EXECUTABLE@
|
Icon[es_AR]=@APPLICATION_ICON_NAME@
|
||||||
Comment[lt_LT]=@APPLICATION_NAME@ darbalaukio sinchronizavimo programa
|
Comment[lt_LT]=@APPLICATION_NAME@ darbalaukio sinchronizavimo programa
|
||||||
GenericName[lt_LT]=Katalogo sinchnorizacija
|
GenericName[lt_LT]=Katalogo sinchnorizacija
|
||||||
Name[lt_LT]=@APPLICATION_NAME@ darbalaukio programa
|
Name[lt_LT]=@APPLICATION_NAME@ darbalaukio programa
|
||||||
Icon[lt_LT]=@APPLICATION_EXECUTABLE@
|
Icon[lt_LT]=@APPLICATION_ICON_NAME@
|
||||||
Comment[th_TH]=@APPLICATION_NAME@ ไคลเอนต์ประสานข้อมูลเดสก์ท็อป
|
Comment[th_TH]=@APPLICATION_NAME@ ไคลเอนต์ประสานข้อมูลเดสก์ท็อป
|
||||||
GenericName[th_TH]=ประสานข้อมูลโฟลเดอร์
|
GenericName[th_TH]=ประสานข้อมูลโฟลเดอร์
|
||||||
Name[th_TH]= @APPLICATION_NAME@ ไคลเอนต์ประสานข้อมูลเดสก์ท็อป
|
Name[th_TH]= @APPLICATION_NAME@ ไคลเอนต์ประสานข้อมูลเดสก์ท็อป
|
||||||
Icon[th_TH]=@APPLICATION_EXECUTABLE@
|
Icon[th_TH]=@APPLICATION_ICON_NAME@
|
||||||
Comment[es_MX]=Cliente de escritorio para sincronziación de @APPLICATION_NAME@
|
Comment[es_MX]=Cliente de escritorio para sincronziación de @APPLICATION_NAME@
|
||||||
GenericName[es_MX]=Sincronización de Carpetas
|
GenericName[es_MX]=Sincronización de Carpetas
|
||||||
Name[es_MX]=Cliente de escritorio para sincronziación de @APPLICATION_NAME@
|
Name[es_MX]=Cliente de escritorio para sincronziación de @APPLICATION_NAME@
|
||||||
Icon[es_MX]=@APPLICATION_EXECUTABLE@
|
Icon[es_MX]=@APPLICATION_ICON_NAME@
|
||||||
Comment[nb_NO]=@APPLICATION_NAME@ skrivebordssynkroniseringsklient
|
Comment[nb_NO]=@APPLICATION_NAME@ skrivebordssynkroniseringsklient
|
||||||
GenericName[nb_NO]=Mappesynkronisering
|
GenericName[nb_NO]=Mappesynkronisering
|
||||||
Name[nb_NO]=@APPLICATION_NAME@ skrivebordssynkroniseringsklient
|
Name[nb_NO]=@APPLICATION_NAME@ skrivebordssynkroniseringsklient
|
||||||
Icon[nb_NO]=@APPLICATION_EXECUTABLE@
|
Icon[nb_NO]=@APPLICATION_ICON_NAME@
|
||||||
Comment[nn_NO]=@APPLICATION_NAME@ klient for å synkronisera frå skrivebord
|
Comment[nn_NO]=@APPLICATION_NAME@ klient for å synkronisera frå skrivebord
|
||||||
GenericName[nn_NO]=Mappe synkronisering
|
GenericName[nn_NO]=Mappe synkronisering
|
||||||
Name[nn_NO]=@APPLICATION_NAME@ klient for å synkronisera frå skrivebord
|
Name[nn_NO]=@APPLICATION_NAME@ klient for å synkronisera frå skrivebord
|
||||||
Icon[nn_NO]=@APPLICATION_EXECUTABLE@
|
Icon[nn_NO]=@APPLICATION_ICON_NAME@
|
||||||
Comment[pt_PT]=@APPLICATION_NAME@ - Cliente de Sincronização para PC
|
Comment[pt_PT]=@APPLICATION_NAME@ - Cliente de Sincronização para PC
|
||||||
GenericName[pt_PT]=Sincronizar Pasta
|
GenericName[pt_PT]=Sincronizar Pasta
|
||||||
Name[pt_PT]=@APPLICATION_NAME@ - Cliente de Sincronização para PC
|
Name[pt_PT]=@APPLICATION_NAME@ - Cliente de Sincronização para PC
|
||||||
Icon[pt_PT]=@APPLICATION_EXECUTABLE@
|
Icon[pt_PT]=@APPLICATION_ICON_NAME@
|
||||||
Icon[km]=@APPLICATION_EXECUTABLE@
|
Icon[km]=@APPLICATION_ICON_NAME@
|
||||||
Comment[lb]=@APPLICATION_NAME@ Desktop Synchronisatioun Client
|
Comment[lb]=@APPLICATION_NAME@ Desktop Synchronisatioun Client
|
||||||
GenericName[lb]=Dossier Dync
|
GenericName[lb]=Dossier Dync
|
||||||
Name[lb]=@APPLICATION_NAME@ Desktop Sync Client
|
Name[lb]=@APPLICATION_NAME@ Desktop Sync Client
|
||||||
Icon[lb]=@APPLICATION_EXECUTABLE@
|
Icon[lb]=@APPLICATION_ICON_NAME@
|
||||||
|
|||||||
1
resources/state-sync.svg
Normal file
1
resources/state-sync.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg width="16" height="16" version="1.1" viewBox="0 0 4.2333 4.2333" xmlns="http://www.w3.org/2000/svg"><g transform="matrix(.87498 0 0 .87498 .26458 -255.9)"><circle cx="2.1167" cy="294.88" r="2.1167" fill="#2268ab" stroke-width=".25066"/><g fill="none" stroke-linecap="round" stroke-linejoin="round"><path d="m3.0714 295.43a1.1024 1.1024 0 0 1-0.95473 0.55121 1.1024 1.1024 0 0 1-0.95473-0.55121" stroke="#fff" stroke-width=".44097"/><path transform="scale(-1)" d="m-1.1619-294.33a1.1024 1.1024 0 0 1-0.95473 0.55122 1.1024 1.1024 0 0 1-0.95473-0.55122" stroke="#fff" stroke-width=".44097"/><path d="m1.4349 295.15-0.52538-4e-5 1.138e-4 0.52563" stroke="#faffff" stroke-width=".52916"/><path d="m2.815 294.62 0.52538 4e-5 -1.138e-4 -0.52563" stroke="#faffff" stroke-width=".52916"/></g></g></svg>
|
||||||
|
After Width: | Height: | Size: 800 B |
@@ -63,7 +63,7 @@ class SocketConnect(GObject.GObject):
|
|||||||
self._watch_id = 0
|
self._watch_id = 0
|
||||||
self._sock = None
|
self._sock = None
|
||||||
self._listeners = [self._update_registered_paths, self._get_version]
|
self._listeners = [self._update_registered_paths, self._get_version]
|
||||||
self._remainder = ''.encode()
|
self._remainder = ''.encode() if python3 else ''
|
||||||
self.protocolVersion = '1.0'
|
self.protocolVersion = '1.0'
|
||||||
self.nautilusVFSFile_table = {} # not needed in this object actually but shared
|
self.nautilusVFSFile_table = {} # not needed in this object actually but shared
|
||||||
# all over the other objects.
|
# all over the other objects.
|
||||||
@@ -82,7 +82,7 @@ class SocketConnect(GObject.GObject):
|
|||||||
# print("Server command: " + cmd)
|
# print("Server command: " + cmd)
|
||||||
if self.connected:
|
if self.connected:
|
||||||
try:
|
try:
|
||||||
self._sock.send(cmd.encode())
|
self._sock.send(cmd.encode() if python3 else cmd)
|
||||||
except:
|
except:
|
||||||
print("Sending failed.")
|
print("Sending failed.")
|
||||||
self.reconnect()
|
self.reconnect()
|
||||||
@@ -134,7 +134,8 @@ class SocketConnect(GObject.GObject):
|
|||||||
return []
|
return []
|
||||||
data = self._remainder[:end]
|
data = self._remainder[:end]
|
||||||
self._remainder = self._remainder[end+1:]
|
self._remainder = self._remainder[end+1:]
|
||||||
return data.decode().split('\n')
|
data = data.decode() if python3 else data
|
||||||
|
return data.split('\n')
|
||||||
|
|
||||||
# Notify is the raw answer from the socket
|
# Notify is the raw answer from the socket
|
||||||
def _handle_notify(self, source, condition):
|
def _handle_notify(self, source, condition):
|
||||||
@@ -233,7 +234,7 @@ class MenuExtension(GObject.GObject, Nautilus.MenuProvider):
|
|||||||
def ask_for_menu_items(self, files):
|
def ask_for_menu_items(self, files):
|
||||||
record_separator = '\x1e'
|
record_separator = '\x1e'
|
||||||
filesstring = record_separator.join(files)
|
filesstring = record_separator.join(files)
|
||||||
socketConnect.sendCommand('GET_MENU_ITEMS:{}\n'.format(filesstring))
|
socketConnect.sendCommand(u'GET_MENU_ITEMS:{}\n'.format(filesstring))
|
||||||
|
|
||||||
done = False
|
done = False
|
||||||
start = time.time()
|
start = time.time()
|
||||||
|
|||||||
13003
src/3rdparty/nlohmann/json.hpp
vendored
13003
src/3rdparty/nlohmann/json.hpp
vendored
File diff suppressed because it is too large
Load Diff
2
src/3rdparty/qtmacgoodies
vendored
2
src/3rdparty/qtmacgoodies
vendored
Submodule src/3rdparty/qtmacgoodies updated: 4ffbff5d5f...ebc7ec6f68
8853
src/3rdparty/sqlite3/sqlite3.c
vendored
8853
src/3rdparty/sqlite3/sqlite3.c
vendored
File diff suppressed because it is too large
Load Diff
275
src/3rdparty/sqlite3/sqlite3.h
vendored
275
src/3rdparty/sqlite3/sqlite3.h
vendored
@@ -123,9 +123,9 @@ extern "C" {
|
|||||||
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
|
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
|
||||||
** [sqlite_version()] and [sqlite_source_id()].
|
** [sqlite_version()] and [sqlite_source_id()].
|
||||||
*/
|
*/
|
||||||
#define SQLITE_VERSION "3.23.1"
|
#define SQLITE_VERSION "3.24.0"
|
||||||
#define SQLITE_VERSION_NUMBER 3023001
|
#define SQLITE_VERSION_NUMBER 3024000
|
||||||
#define SQLITE_SOURCE_ID "2018-04-10 17:39:29 4bb2294022060e61de7da5c227a69ccd846ba330e31626ebcd59a94efd148b3b"
|
#define SQLITE_SOURCE_ID "2018-06-04 19:24:41 c7ee0833225bfd8c5ec2f9bf62b97c4e04d03bd9566366d5221ac8fb199a87ca"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** CAPI3REF: Run-Time Library Version Numbers
|
** CAPI3REF: Run-Time Library Version Numbers
|
||||||
@@ -504,6 +504,7 @@ SQLITE_API int sqlite3_exec(
|
|||||||
#define SQLITE_IOERR_COMMIT_ATOMIC (SQLITE_IOERR | (30<<8))
|
#define SQLITE_IOERR_COMMIT_ATOMIC (SQLITE_IOERR | (30<<8))
|
||||||
#define SQLITE_IOERR_ROLLBACK_ATOMIC (SQLITE_IOERR | (31<<8))
|
#define SQLITE_IOERR_ROLLBACK_ATOMIC (SQLITE_IOERR | (31<<8))
|
||||||
#define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8))
|
#define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8))
|
||||||
|
#define SQLITE_LOCKED_VTAB (SQLITE_LOCKED | (2<<8))
|
||||||
#define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8))
|
#define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8))
|
||||||
#define SQLITE_BUSY_SNAPSHOT (SQLITE_BUSY | (2<<8))
|
#define SQLITE_BUSY_SNAPSHOT (SQLITE_BUSY | (2<<8))
|
||||||
#define SQLITE_CANTOPEN_NOTEMPDIR (SQLITE_CANTOPEN | (1<<8))
|
#define SQLITE_CANTOPEN_NOTEMPDIR (SQLITE_CANTOPEN | (1<<8))
|
||||||
@@ -511,6 +512,7 @@ SQLITE_API int sqlite3_exec(
|
|||||||
#define SQLITE_CANTOPEN_FULLPATH (SQLITE_CANTOPEN | (3<<8))
|
#define SQLITE_CANTOPEN_FULLPATH (SQLITE_CANTOPEN | (3<<8))
|
||||||
#define SQLITE_CANTOPEN_CONVPATH (SQLITE_CANTOPEN | (4<<8))
|
#define SQLITE_CANTOPEN_CONVPATH (SQLITE_CANTOPEN | (4<<8))
|
||||||
#define SQLITE_CORRUPT_VTAB (SQLITE_CORRUPT | (1<<8))
|
#define SQLITE_CORRUPT_VTAB (SQLITE_CORRUPT | (1<<8))
|
||||||
|
#define SQLITE_CORRUPT_SEQUENCE (SQLITE_CORRUPT | (2<<8))
|
||||||
#define SQLITE_READONLY_RECOVERY (SQLITE_READONLY | (1<<8))
|
#define SQLITE_READONLY_RECOVERY (SQLITE_READONLY | (1<<8))
|
||||||
#define SQLITE_READONLY_CANTLOCK (SQLITE_READONLY | (2<<8))
|
#define SQLITE_READONLY_CANTLOCK (SQLITE_READONLY | (2<<8))
|
||||||
#define SQLITE_READONLY_ROLLBACK (SQLITE_READONLY | (3<<8))
|
#define SQLITE_READONLY_ROLLBACK (SQLITE_READONLY | (3<<8))
|
||||||
@@ -1930,6 +1932,22 @@ struct sqlite3_mem_methods {
|
|||||||
** I/O required to support statement rollback.
|
** I/O required to support statement rollback.
|
||||||
** The default value for this setting is controlled by the
|
** The default value for this setting is controlled by the
|
||||||
** [SQLITE_STMTJRNL_SPILL] compile-time option.
|
** [SQLITE_STMTJRNL_SPILL] compile-time option.
|
||||||
|
**
|
||||||
|
** [[SQLITE_CONFIG_SORTERREF_SIZE]]
|
||||||
|
** <dt>SQLITE_CONFIG_SORTERREF_SIZE
|
||||||
|
** <dd>The SQLITE_CONFIG_SORTERREF_SIZE option accepts a single parameter
|
||||||
|
** of type (int) - the new value of the sorter-reference size threshold.
|
||||||
|
** Usually, when SQLite uses an external sort to order records according
|
||||||
|
** to an ORDER BY clause, all fields required by the caller are present in the
|
||||||
|
** sorted records. However, if SQLite determines based on the declared type
|
||||||
|
** of a table column that its values are likely to be very large - larger
|
||||||
|
** than the configured sorter-reference size threshold - then a reference
|
||||||
|
** is stored in each sorted record and the required column values loaded
|
||||||
|
** from the database as records are returned in sorted order. The default
|
||||||
|
** value for this option is to never use this optimization. Specifying a
|
||||||
|
** negative value for this option restores the default behaviour.
|
||||||
|
** This option is only available if SQLite is compiled with the
|
||||||
|
** [SQLITE_ENABLE_SORTER_REFERENCES] compile-time option.
|
||||||
** </dl>
|
** </dl>
|
||||||
*/
|
*/
|
||||||
#define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */
|
#define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */
|
||||||
@@ -1959,6 +1977,7 @@ struct sqlite3_mem_methods {
|
|||||||
#define SQLITE_CONFIG_PMASZ 25 /* unsigned int szPma */
|
#define SQLITE_CONFIG_PMASZ 25 /* unsigned int szPma */
|
||||||
#define SQLITE_CONFIG_STMTJRNL_SPILL 26 /* int nByte */
|
#define SQLITE_CONFIG_STMTJRNL_SPILL 26 /* int nByte */
|
||||||
#define SQLITE_CONFIG_SMALL_MALLOC 27 /* boolean */
|
#define SQLITE_CONFIG_SMALL_MALLOC 27 /* boolean */
|
||||||
|
#define SQLITE_CONFIG_SORTERREF_SIZE 28 /* int nByte */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** CAPI3REF: Database Connection Configuration Options
|
** CAPI3REF: Database Connection Configuration Options
|
||||||
@@ -2095,6 +2114,21 @@ struct sqlite3_mem_methods {
|
|||||||
** 0 or 1 to indicate whether output-for-triggers has been disabled - 0 if
|
** 0 or 1 to indicate whether output-for-triggers has been disabled - 0 if
|
||||||
** it is not disabled, 1 if it is.
|
** it is not disabled, 1 if it is.
|
||||||
** </dd>
|
** </dd>
|
||||||
|
**
|
||||||
|
** <dt>SQLITE_DBCONFIG_RESET_DATABASE</dt>
|
||||||
|
** <dd> Set the SQLITE_DBCONFIG_RESET_DATABASE flag and then run
|
||||||
|
** [VACUUM] in order to reset a database back to an empty database
|
||||||
|
** with no schema and no content. The following process works even for
|
||||||
|
** a badly corrupted database file:
|
||||||
|
** <ol>
|
||||||
|
** <li> sqlite3_db_config(db, SQLITE_DBCONFIG_RESET_DATABASE, 1, 0);
|
||||||
|
** <li> [sqlite3_exec](db, "[VACUUM]", 0, 0, 0);
|
||||||
|
** <li> sqlite3_db_config(db, SQLITE_DBCONFIG_RESET_DATABASE, 0, 0);
|
||||||
|
** </ol>
|
||||||
|
** Because resetting a database is destructive and irreversible, the
|
||||||
|
** process requires the use of this obscure API and multiple steps to help
|
||||||
|
** ensure that it does not happen by accident.
|
||||||
|
** </dd>
|
||||||
** </dl>
|
** </dl>
|
||||||
*/
|
*/
|
||||||
#define SQLITE_DBCONFIG_MAINDBNAME 1000 /* const char* */
|
#define SQLITE_DBCONFIG_MAINDBNAME 1000 /* const char* */
|
||||||
@@ -2106,7 +2140,8 @@ struct sqlite3_mem_methods {
|
|||||||
#define SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE 1006 /* int int* */
|
#define SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE 1006 /* int int* */
|
||||||
#define SQLITE_DBCONFIG_ENABLE_QPSG 1007 /* int int* */
|
#define SQLITE_DBCONFIG_ENABLE_QPSG 1007 /* int int* */
|
||||||
#define SQLITE_DBCONFIG_TRIGGER_EQP 1008 /* int int* */
|
#define SQLITE_DBCONFIG_TRIGGER_EQP 1008 /* int int* */
|
||||||
#define SQLITE_DBCONFIG_MAX 1008 /* Largest DBCONFIG */
|
#define SQLITE_DBCONFIG_RESET_DATABASE 1009 /* int int* */
|
||||||
|
#define SQLITE_DBCONFIG_MAX 1009 /* Largest DBCONFIG */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** CAPI3REF: Enable Or Disable Extended Result Codes
|
** CAPI3REF: Enable Or Disable Extended Result Codes
|
||||||
@@ -5492,6 +5527,41 @@ SQLITE_API SQLITE_EXTERN char *sqlite3_temp_directory;
|
|||||||
*/
|
*/
|
||||||
SQLITE_API SQLITE_EXTERN char *sqlite3_data_directory;
|
SQLITE_API SQLITE_EXTERN char *sqlite3_data_directory;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** CAPI3REF: Win32 Specific Interface
|
||||||
|
**
|
||||||
|
** These interfaces are available only on Windows. The
|
||||||
|
** [sqlite3_win32_set_directory] interface is used to set the value associated
|
||||||
|
** with the [sqlite3_temp_directory] or [sqlite3_data_directory] variable, to
|
||||||
|
** zValue, depending on the value of the type parameter. The zValue parameter
|
||||||
|
** should be NULL to cause the previous value to be freed via [sqlite3_free];
|
||||||
|
** a non-NULL value will be copied into memory obtained from [sqlite3_malloc]
|
||||||
|
** prior to being used. The [sqlite3_win32_set_directory] interface returns
|
||||||
|
** [SQLITE_OK] to indicate success, [SQLITE_ERROR] if the type is unsupported,
|
||||||
|
** or [SQLITE_NOMEM] if memory could not be allocated. The value of the
|
||||||
|
** [sqlite3_data_directory] variable is intended to act as a replacement for
|
||||||
|
** the current directory on the sub-platforms of Win32 where that concept is
|
||||||
|
** not present, e.g. WinRT and UWP. The [sqlite3_win32_set_directory8] and
|
||||||
|
** [sqlite3_win32_set_directory16] interfaces behave exactly the same as the
|
||||||
|
** sqlite3_win32_set_directory interface except the string parameter must be
|
||||||
|
** UTF-8 or UTF-16, respectively.
|
||||||
|
*/
|
||||||
|
SQLITE_API int sqlite3_win32_set_directory(
|
||||||
|
unsigned long type, /* Identifier for directory being set or reset */
|
||||||
|
void *zValue /* New value for directory being set or reset */
|
||||||
|
);
|
||||||
|
SQLITE_API int sqlite3_win32_set_directory8(unsigned long type, const char *zValue);
|
||||||
|
SQLITE_API int sqlite3_win32_set_directory16(unsigned long type, const void *zValue);
|
||||||
|
|
||||||
|
/*
|
||||||
|
** CAPI3REF: Win32 Directory Types
|
||||||
|
**
|
||||||
|
** These macros are only available on Windows. They define the allowed values
|
||||||
|
** for the type argument to the [sqlite3_win32_set_directory] interface.
|
||||||
|
*/
|
||||||
|
#define SQLITE_WIN32_DATA_DIRECTORY_TYPE 1
|
||||||
|
#define SQLITE_WIN32_TEMP_DIRECTORY_TYPE 2
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** CAPI3REF: Test For Auto-Commit Mode
|
** CAPI3REF: Test For Auto-Commit Mode
|
||||||
** KEYWORDS: {autocommit mode}
|
** KEYWORDS: {autocommit mode}
|
||||||
@@ -6224,6 +6294,10 @@ struct sqlite3_index_info {
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
** CAPI3REF: Virtual Table Scan Flags
|
** CAPI3REF: Virtual Table Scan Flags
|
||||||
|
**
|
||||||
|
** Virtual table implementations are allowed to set the
|
||||||
|
** [sqlite3_index_info].idxFlags field to some combination of
|
||||||
|
** these bits.
|
||||||
*/
|
*/
|
||||||
#define SQLITE_INDEX_SCAN_UNIQUE 1 /* Scan visits at most 1 row */
|
#define SQLITE_INDEX_SCAN_UNIQUE 1 /* Scan visits at most 1 row */
|
||||||
|
|
||||||
@@ -6999,7 +7073,7 @@ SQLITE_API int sqlite3_test_control(int op, ...);
|
|||||||
#define SQLITE_TESTCTRL_ALWAYS 13
|
#define SQLITE_TESTCTRL_ALWAYS 13
|
||||||
#define SQLITE_TESTCTRL_RESERVE 14
|
#define SQLITE_TESTCTRL_RESERVE 14
|
||||||
#define SQLITE_TESTCTRL_OPTIMIZATIONS 15
|
#define SQLITE_TESTCTRL_OPTIMIZATIONS 15
|
||||||
#define SQLITE_TESTCTRL_ISKEYWORD 16
|
#define SQLITE_TESTCTRL_ISKEYWORD 16 /* NOT USED */
|
||||||
#define SQLITE_TESTCTRL_SCRATCHMALLOC 17 /* NOT USED */
|
#define SQLITE_TESTCTRL_SCRATCHMALLOC 17 /* NOT USED */
|
||||||
#define SQLITE_TESTCTRL_LOCALTIME_FAULT 18
|
#define SQLITE_TESTCTRL_LOCALTIME_FAULT 18
|
||||||
#define SQLITE_TESTCTRL_EXPLAIN_STMT 19 /* NOT USED */
|
#define SQLITE_TESTCTRL_EXPLAIN_STMT 19 /* NOT USED */
|
||||||
@@ -7013,6 +7087,189 @@ SQLITE_API int sqlite3_test_control(int op, ...);
|
|||||||
#define SQLITE_TESTCTRL_PARSER_COVERAGE 26
|
#define SQLITE_TESTCTRL_PARSER_COVERAGE 26
|
||||||
#define SQLITE_TESTCTRL_LAST 26 /* Largest TESTCTRL */
|
#define SQLITE_TESTCTRL_LAST 26 /* Largest TESTCTRL */
|
||||||
|
|
||||||
|
/*
|
||||||
|
** CAPI3REF: SQL Keyword Checking
|
||||||
|
**
|
||||||
|
** These routines provide access to the set of SQL language keywords
|
||||||
|
** recognized by SQLite. Applications can uses these routines to determine
|
||||||
|
** whether or not a specific identifier needs to be escaped (for example,
|
||||||
|
** by enclosing in double-quotes) so as not to confuse the parser.
|
||||||
|
**
|
||||||
|
** The sqlite3_keyword_count() interface returns the number of distinct
|
||||||
|
** keywords understood by SQLite.
|
||||||
|
**
|
||||||
|
** The sqlite3_keyword_name(N,Z,L) interface finds the N-th keyword and
|
||||||
|
** makes *Z point to that keyword expressed as UTF8 and writes the number
|
||||||
|
** of bytes in the keyword into *L. The string that *Z points to is not
|
||||||
|
** zero-terminated. The sqlite3_keyword_name(N,Z,L) routine returns
|
||||||
|
** SQLITE_OK if N is within bounds and SQLITE_ERROR if not. If either Z
|
||||||
|
** or L are NULL or invalid pointers then calls to
|
||||||
|
** sqlite3_keyword_name(N,Z,L) result in undefined behavior.
|
||||||
|
**
|
||||||
|
** The sqlite3_keyword_check(Z,L) interface checks to see whether or not
|
||||||
|
** the L-byte UTF8 identifier that Z points to is a keyword, returning non-zero
|
||||||
|
** if it is and zero if not.
|
||||||
|
**
|
||||||
|
** The parser used by SQLite is forgiving. It is often possible to use
|
||||||
|
** a keyword as an identifier as long as such use does not result in a
|
||||||
|
** parsing ambiguity. For example, the statement
|
||||||
|
** "CREATE TABLE BEGIN(REPLACE,PRAGMA,END);" is accepted by SQLite, and
|
||||||
|
** creates a new table named "BEGIN" with three columns named
|
||||||
|
** "REPLACE", "PRAGMA", and "END". Nevertheless, best practice is to avoid
|
||||||
|
** using keywords as identifiers. Common techniques used to avoid keyword
|
||||||
|
** name collisions include:
|
||||||
|
** <ul>
|
||||||
|
** <li> Put all identifier names inside double-quotes. This is the official
|
||||||
|
** SQL way to escape identifier names.
|
||||||
|
** <li> Put identifier names inside [...]. This is not standard SQL,
|
||||||
|
** but it is what SQL Server does and so lots of programmers use this
|
||||||
|
** technique.
|
||||||
|
** <li> Begin every identifier with the letter "Z" as no SQL keywords start
|
||||||
|
** with "Z".
|
||||||
|
** <li> Include a digit somewhere in every identifier name.
|
||||||
|
** </ul>
|
||||||
|
**
|
||||||
|
** Note that the number of keywords understood by SQLite can depend on
|
||||||
|
** compile-time options. For example, "VACUUM" is not a keyword if
|
||||||
|
** SQLite is compiled with the [-DSQLITE_OMIT_VACUUM] option. Also,
|
||||||
|
** new keywords may be added to future releases of SQLite.
|
||||||
|
*/
|
||||||
|
SQLITE_API int sqlite3_keyword_count(void);
|
||||||
|
SQLITE_API int sqlite3_keyword_name(int,const char**,int*);
|
||||||
|
SQLITE_API int sqlite3_keyword_check(const char*,int);
|
||||||
|
|
||||||
|
/*
|
||||||
|
** CAPI3REF: Dynamic String Object
|
||||||
|
** KEYWORDS: {dynamic string}
|
||||||
|
**
|
||||||
|
** An instance of the sqlite3_str object contains a dynamically-sized
|
||||||
|
** string under construction.
|
||||||
|
**
|
||||||
|
** The lifecycle of an sqlite3_str object is as follows:
|
||||||
|
** <ol>
|
||||||
|
** <li> ^The sqlite3_str object is created using [sqlite3_str_new()].
|
||||||
|
** <li> ^Text is appended to the sqlite3_str object using various
|
||||||
|
** methods, such as [sqlite3_str_appendf()].
|
||||||
|
** <li> ^The sqlite3_str object is destroyed and the string it created
|
||||||
|
** is returned using the [sqlite3_str_finish()] interface.
|
||||||
|
** </ol>
|
||||||
|
*/
|
||||||
|
typedef struct sqlite3_str sqlite3_str;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** CAPI3REF: Create A New Dynamic String Object
|
||||||
|
** CONSTRUCTOR: sqlite3_str
|
||||||
|
**
|
||||||
|
** ^The [sqlite3_str_new(D)] interface allocates and initializes
|
||||||
|
** a new [sqlite3_str] object. To avoid memory leaks, the object returned by
|
||||||
|
** [sqlite3_str_new()] must be freed by a subsequent call to
|
||||||
|
** [sqlite3_str_finish(X)].
|
||||||
|
**
|
||||||
|
** ^The [sqlite3_str_new(D)] interface always returns a pointer to a
|
||||||
|
** valid [sqlite3_str] object, though in the event of an out-of-memory
|
||||||
|
** error the returned object might be a special singleton that will
|
||||||
|
** silently reject new text, always return SQLITE_NOMEM from
|
||||||
|
** [sqlite3_str_errcode()], always return 0 for
|
||||||
|
** [sqlite3_str_length()], and always return NULL from
|
||||||
|
** [sqlite3_str_finish(X)]. It is always safe to use the value
|
||||||
|
** returned by [sqlite3_str_new(D)] as the sqlite3_str parameter
|
||||||
|
** to any of the other [sqlite3_str] methods.
|
||||||
|
**
|
||||||
|
** The D parameter to [sqlite3_str_new(D)] may be NULL. If the
|
||||||
|
** D parameter in [sqlite3_str_new(D)] is not NULL, then the maximum
|
||||||
|
** length of the string contained in the [sqlite3_str] object will be
|
||||||
|
** the value set for [sqlite3_limit](D,[SQLITE_LIMIT_LENGTH]) instead
|
||||||
|
** of [SQLITE_MAX_LENGTH].
|
||||||
|
*/
|
||||||
|
SQLITE_API sqlite3_str *sqlite3_str_new(sqlite3*);
|
||||||
|
|
||||||
|
/*
|
||||||
|
** CAPI3REF: Finalize A Dynamic String
|
||||||
|
** DESTRUCTOR: sqlite3_str
|
||||||
|
**
|
||||||
|
** ^The [sqlite3_str_finish(X)] interface destroys the sqlite3_str object X
|
||||||
|
** and returns a pointer to a memory buffer obtained from [sqlite3_malloc64()]
|
||||||
|
** that contains the constructed string. The calling application should
|
||||||
|
** pass the returned value to [sqlite3_free()] to avoid a memory leak.
|
||||||
|
** ^The [sqlite3_str_finish(X)] interface may return a NULL pointer if any
|
||||||
|
** errors were encountered during construction of the string. ^The
|
||||||
|
** [sqlite3_str_finish(X)] interface will also return a NULL pointer if the
|
||||||
|
** string in [sqlite3_str] object X is zero bytes long.
|
||||||
|
*/
|
||||||
|
SQLITE_API char *sqlite3_str_finish(sqlite3_str*);
|
||||||
|
|
||||||
|
/*
|
||||||
|
** CAPI3REF: Add Content To A Dynamic String
|
||||||
|
** METHOD: sqlite3_str
|
||||||
|
**
|
||||||
|
** These interfaces add content to an sqlite3_str object previously obtained
|
||||||
|
** from [sqlite3_str_new()].
|
||||||
|
**
|
||||||
|
** ^The [sqlite3_str_appendf(X,F,...)] and
|
||||||
|
** [sqlite3_str_vappendf(X,F,V)] interfaces uses the [built-in printf]
|
||||||
|
** functionality of SQLite to append formatted text onto the end of
|
||||||
|
** [sqlite3_str] object X.
|
||||||
|
**
|
||||||
|
** ^The [sqlite3_str_append(X,S,N)] method appends exactly N bytes from string S
|
||||||
|
** onto the end of the [sqlite3_str] object X. N must be non-negative.
|
||||||
|
** S must contain at least N non-zero bytes of content. To append a
|
||||||
|
** zero-terminated string in its entirety, use the [sqlite3_str_appendall()]
|
||||||
|
** method instead.
|
||||||
|
**
|
||||||
|
** ^The [sqlite3_str_appendall(X,S)] method appends the complete content of
|
||||||
|
** zero-terminated string S onto the end of [sqlite3_str] object X.
|
||||||
|
**
|
||||||
|
** ^The [sqlite3_str_appendchar(X,N,C)] method appends N copies of the
|
||||||
|
** single-byte character C onto the end of [sqlite3_str] object X.
|
||||||
|
** ^This method can be used, for example, to add whitespace indentation.
|
||||||
|
**
|
||||||
|
** ^The [sqlite3_str_reset(X)] method resets the string under construction
|
||||||
|
** inside [sqlite3_str] object X back to zero bytes in length.
|
||||||
|
**
|
||||||
|
** These methods do not return a result code. ^If an error occurs, that fact
|
||||||
|
** is recorded in the [sqlite3_str] object and can be recovered by a
|
||||||
|
** subsequent call to [sqlite3_str_errcode(X)].
|
||||||
|
*/
|
||||||
|
SQLITE_API void sqlite3_str_appendf(sqlite3_str*, const char *zFormat, ...);
|
||||||
|
SQLITE_API void sqlite3_str_vappendf(sqlite3_str*, const char *zFormat, va_list);
|
||||||
|
SQLITE_API void sqlite3_str_append(sqlite3_str*, const char *zIn, int N);
|
||||||
|
SQLITE_API void sqlite3_str_appendall(sqlite3_str*, const char *zIn);
|
||||||
|
SQLITE_API void sqlite3_str_appendchar(sqlite3_str*, int N, char C);
|
||||||
|
SQLITE_API void sqlite3_str_reset(sqlite3_str*);
|
||||||
|
|
||||||
|
/*
|
||||||
|
** CAPI3REF: Status Of A Dynamic String
|
||||||
|
** METHOD: sqlite3_str
|
||||||
|
**
|
||||||
|
** These interfaces return the current status of an [sqlite3_str] object.
|
||||||
|
**
|
||||||
|
** ^If any prior errors have occurred while constructing the dynamic string
|
||||||
|
** in sqlite3_str X, then the [sqlite3_str_errcode(X)] method will return
|
||||||
|
** an appropriate error code. ^The [sqlite3_str_errcode(X)] method returns
|
||||||
|
** [SQLITE_NOMEM] following any out-of-memory error, or
|
||||||
|
** [SQLITE_TOOBIG] if the size of the dynamic string exceeds
|
||||||
|
** [SQLITE_MAX_LENGTH], or [SQLITE_OK] if there have been no errors.
|
||||||
|
**
|
||||||
|
** ^The [sqlite3_str_length(X)] method returns the current length, in bytes,
|
||||||
|
** of the dynamic string under construction in [sqlite3_str] object X.
|
||||||
|
** ^The length returned by [sqlite3_str_length(X)] does not include the
|
||||||
|
** zero-termination byte.
|
||||||
|
**
|
||||||
|
** ^The [sqlite3_str_value(X)] method returns a pointer to the current
|
||||||
|
** content of the dynamic string under construction in X. The value
|
||||||
|
** returned by [sqlite3_str_value(X)] is managed by the sqlite3_str object X
|
||||||
|
** and might be freed or altered by any subsequent method on the same
|
||||||
|
** [sqlite3_str] object. Applications must not used the pointer returned
|
||||||
|
** [sqlite3_str_value(X)] after any subsequent method call on the same
|
||||||
|
** object. ^Applications may change the content of the string returned
|
||||||
|
** by [sqlite3_str_value(X)] as long as they do not write into any bytes
|
||||||
|
** outside the range of 0 to [sqlite3_str_length(X)] and do not read or
|
||||||
|
** write any byte after any subsequent sqlite3_str method call.
|
||||||
|
*/
|
||||||
|
SQLITE_API int sqlite3_str_errcode(sqlite3_str*);
|
||||||
|
SQLITE_API int sqlite3_str_length(sqlite3_str*);
|
||||||
|
SQLITE_API char *sqlite3_str_value(sqlite3_str*);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** CAPI3REF: SQLite Runtime Status
|
** CAPI3REF: SQLite Runtime Status
|
||||||
**
|
**
|
||||||
@@ -8282,11 +8539,11 @@ SQLITE_API int sqlite3_vtab_on_conflict(sqlite3 *);
|
|||||||
** method of a [virtual table], then it returns true if and only if the
|
** method of a [virtual table], then it returns true if and only if the
|
||||||
** column is being fetched as part of an UPDATE operation during which the
|
** column is being fetched as part of an UPDATE operation during which the
|
||||||
** column value will not change. Applications might use this to substitute
|
** column value will not change. Applications might use this to substitute
|
||||||
** a lighter-weight value to return that the corresponding [xUpdate] method
|
** a return value that is less expensive to compute and that the corresponding
|
||||||
** understands as a "no-change" value.
|
** [xUpdate] method understands as a "no-change" value.
|
||||||
**
|
**
|
||||||
** If the [xColumn] method calls sqlite3_vtab_nochange() and finds that
|
** If the [xColumn] method calls sqlite3_vtab_nochange() and finds that
|
||||||
** the column is not changed by the UPDATE statement, they the xColumn
|
** the column is not changed by the UPDATE statement, then the xColumn
|
||||||
** method can optionally return without setting a result, without calling
|
** method can optionally return without setting a result, without calling
|
||||||
** any of the [sqlite3_result_int|sqlite3_result_xxxxx() interfaces].
|
** any of the [sqlite3_result_int|sqlite3_result_xxxxx() interfaces].
|
||||||
** In that case, [sqlite3_value_nochange(X)] will return true for the
|
** In that case, [sqlite3_value_nochange(X)] will return true for the
|
||||||
@@ -8781,7 +9038,7 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_recover(sqlite3 *db, const c
|
|||||||
** been a prior call to [sqlite3_deserialize(D,S,...)] with the same
|
** been a prior call to [sqlite3_deserialize(D,S,...)] with the same
|
||||||
** values of D and S.
|
** values of D and S.
|
||||||
** The size of the database is written into *P even if the
|
** The size of the database is written into *P even if the
|
||||||
** SQLITE_SERIALIZE_NOCOPY bit is set but no contigious copy
|
** SQLITE_SERIALIZE_NOCOPY bit is set but no contiguous copy
|
||||||
** of the database exists.
|
** of the database exists.
|
||||||
**
|
**
|
||||||
** A call to sqlite3_serialize(D,S,P,F) might return NULL even if the
|
** A call to sqlite3_serialize(D,S,P,F) might return NULL even if the
|
||||||
|
|||||||
@@ -319,7 +319,7 @@ int main(int argc, char **argv)
|
|||||||
options.trustSSL = false;
|
options.trustSSL = false;
|
||||||
options.useNetrc = false;
|
options.useNetrc = false;
|
||||||
options.interactive = true;
|
options.interactive = true;
|
||||||
options.ignoreHiddenFiles = true;
|
options.ignoreHiddenFiles = false; // Default is to sync hidden files
|
||||||
options.nonShib = false;
|
options.nonShib = false;
|
||||||
options.restartTimes = 3;
|
options.restartTimes = 3;
|
||||||
options.uplimit = 0;
|
options.uplimit = 0;
|
||||||
|
|||||||
@@ -602,7 +602,7 @@ void SyncJournalDb::close()
|
|||||||
commitTransaction();
|
commitTransaction();
|
||||||
|
|
||||||
_db.close();
|
_db.close();
|
||||||
_avoidReadFromDbOnNextSyncFilter.clear();
|
clearEtagStorageFilter();
|
||||||
_metadataTableIsEmpty = false;
|
_metadataTableIsEmpty = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -824,10 +824,10 @@ bool SyncJournalDb::setFileRecord(const SyncJournalFileRecord &_record)
|
|||||||
SyncJournalFileRecord record = _record;
|
SyncJournalFileRecord record = _record;
|
||||||
QMutexLocker locker(&_mutex);
|
QMutexLocker locker(&_mutex);
|
||||||
|
|
||||||
if (!_avoidReadFromDbOnNextSyncFilter.isEmpty()) {
|
if (!_etagStorageFilter.isEmpty()) {
|
||||||
// If we are a directory that should not be read from db next time, don't write the etag
|
// If we are a directory that should not be read from db next time, don't write the etag
|
||||||
QByteArray prefix = record._path + "/";
|
QByteArray prefix = record._path + "/";
|
||||||
foreach (const QByteArray &it, _avoidReadFromDbOnNextSyncFilter) {
|
foreach (const QByteArray &it, _etagStorageFilter) {
|
||||||
if (it.startsWith(prefix)) {
|
if (it.startsWith(prefix)) {
|
||||||
qCInfo(lcDb) << "Filtered writing the etag of" << prefix << "because it is a prefix of" << it;
|
qCInfo(lcDb) << "Filtered writing the etag of" << prefix << "because it is a prefix of" << it;
|
||||||
record._etag = "_invalid_";
|
record._etag = "_invalid_";
|
||||||
@@ -1816,7 +1816,12 @@ void SyncJournalDb::avoidReadFromDbOnNextSync(const QByteArray &fileName)
|
|||||||
// Prevent future overwrite of the etags of this folder and all
|
// Prevent future overwrite of the etags of this folder and all
|
||||||
// parent folders for this sync
|
// parent folders for this sync
|
||||||
argument.append('/');
|
argument.append('/');
|
||||||
_avoidReadFromDbOnNextSyncFilter.append(argument);
|
_etagStorageFilter.append(argument);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SyncJournalDb::clearEtagStorageFilter()
|
||||||
|
{
|
||||||
|
_etagStorageFilter.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SyncJournalDb::forceRemoteDiscoveryNextSync()
|
void SyncJournalDb::forceRemoteDiscoveryNextSync()
|
||||||
|
|||||||
@@ -178,10 +178,18 @@ public:
|
|||||||
* Since folders in the selective sync list will not be rediscovered (csync_ftw,
|
* Since folders in the selective sync list will not be rediscovered (csync_ftw,
|
||||||
* _csync_detect_update skip them), the _invalid_ marker will stay. And any
|
* _csync_detect_update skip them), the _invalid_ marker will stay. And any
|
||||||
* child items in the db will be ignored when reading a remote tree from the database.
|
* child items in the db will be ignored when reading a remote tree from the database.
|
||||||
|
*
|
||||||
|
* Any setFileRecord() call to affected directories before the next sync run will be
|
||||||
|
* adjusted to retain the invalid etag via _etagStorageFilter.
|
||||||
*/
|
*/
|
||||||
void avoidReadFromDbOnNextSync(const QString &fileName) { avoidReadFromDbOnNextSync(fileName.toUtf8()); }
|
void avoidReadFromDbOnNextSync(const QString &fileName) { avoidReadFromDbOnNextSync(fileName.toUtf8()); }
|
||||||
void avoidReadFromDbOnNextSync(const QByteArray &fileName);
|
void avoidReadFromDbOnNextSync(const QByteArray &fileName);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wipe _etagStorageFilter. Also done implicitly on close().
|
||||||
|
*/
|
||||||
|
void clearEtagStorageFilter();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ensures full remote discovery happens on the next sync.
|
* Ensures full remote discovery happens on the next sync.
|
||||||
*
|
*
|
||||||
@@ -295,13 +303,20 @@ private:
|
|||||||
SqlQuery _setConflictRecordQuery;
|
SqlQuery _setConflictRecordQuery;
|
||||||
SqlQuery _deleteConflictRecordQuery;
|
SqlQuery _deleteConflictRecordQuery;
|
||||||
|
|
||||||
/* This is the list of paths we called avoidReadFromDbOnNextSync on.
|
/* Storing etags to these folders, or their parent folders, is filtered out.
|
||||||
* It means that they should not be written to the DB in any case since doing
|
*
|
||||||
* that would write the etag and would void the purpose of avoidReadFromDbOnNextSync
|
* When avoidReadFromDbOnNextSync() is called some etags to _invalid_ in the
|
||||||
|
* database. If this is done during a sync run, a later propagation job might
|
||||||
|
* undo that by writing the correct etag to the database instead. This filter
|
||||||
|
* will prevent this write and instead guarantee the _invalid_ etag stays in
|
||||||
|
* place.
|
||||||
|
*
|
||||||
|
* The list is cleared on close() (end of sync run) and explicitly with
|
||||||
|
* clearEtagStorageFilter() (start of sync run).
|
||||||
*
|
*
|
||||||
* The contained paths have a trailing /.
|
* The contained paths have a trailing /.
|
||||||
*/
|
*/
|
||||||
QList<QByteArray> _avoidReadFromDbOnNextSyncFilter;
|
QList<QByteArray> _etagStorageFilter;
|
||||||
|
|
||||||
/** The journal mode to use for the db.
|
/** The journal mode to use for the db.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -166,7 +166,7 @@ static void _csync_merge_algorithm_visitor(csync_file_stat_t *cur, CSYNC * ctx)
|
|||||||
/* First, check that the file is NOT in our tree (another file with the same name was added) */
|
/* First, check that the file is NOT in our tree (another file with the same name was added) */
|
||||||
if (our_tree->findFile(basePath)) {
|
if (our_tree->findFile(basePath)) {
|
||||||
other = nullptr;
|
other = nullptr;
|
||||||
qCDebug(lcReconcile, "Origin found in our tree : %s", basePath.constData());
|
qCInfo(lcReconcile, "Origin found in our tree : %s", basePath.constData());
|
||||||
} else {
|
} else {
|
||||||
/* Find the potential rename source file in the other tree.
|
/* Find the potential rename source file in the other tree.
|
||||||
* If the renamed file could not be found in the opposite tree, that is because it
|
* If the renamed file could not be found in the opposite tree, that is because it
|
||||||
@@ -174,7 +174,7 @@ static void _csync_merge_algorithm_visitor(csync_file_stat_t *cur, CSYNC * ctx)
|
|||||||
* The journal is cleaned up later after propagation.
|
* The journal is cleaned up later after propagation.
|
||||||
*/
|
*/
|
||||||
other = other_tree->findFile(basePath);
|
other = other_tree->findFile(basePath);
|
||||||
qCDebug(lcReconcile, "Rename origin in other tree (%s) %s",
|
qCInfo(lcReconcile, "Rename origin in other tree (%s) %s",
|
||||||
basePath.constData(), other ? "found" : "not found");
|
basePath.constData(), other ? "found" : "not found");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -185,7 +185,7 @@ static void _csync_merge_algorithm_visitor(csync_file_stat_t *cur, CSYNC * ctx)
|
|||||||
// Some other EVAL_RENAME already claimed other.
|
// Some other EVAL_RENAME already claimed other.
|
||||||
// We do nothing: maybe a different candidate for
|
// We do nothing: maybe a different candidate for
|
||||||
// other is found as well?
|
// other is found as well?
|
||||||
qCDebug(lcReconcile, "Other has already been renamed to %s",
|
qCInfo(lcReconcile, "Other has already been renamed to %s",
|
||||||
other->rename_path.constData());
|
other->rename_path.constData());
|
||||||
} else if (cur->type == ItemTypeDirectory
|
} else if (cur->type == ItemTypeDirectory
|
||||||
// The local replica is reconciled first, so the remote tree would
|
// The local replica is reconciled first, so the remote tree would
|
||||||
@@ -197,13 +197,17 @@ static void _csync_merge_algorithm_visitor(csync_file_stat_t *cur, CSYNC * ctx)
|
|||||||
|| other->instruction == CSYNC_INSTRUCTION_NONE
|
|| other->instruction == CSYNC_INSTRUCTION_NONE
|
||||||
|| other->instruction == CSYNC_INSTRUCTION_UPDATE_METADATA
|
|| other->instruction == CSYNC_INSTRUCTION_UPDATE_METADATA
|
||||||
|| other->instruction == CSYNC_INSTRUCTION_REMOVE) {
|
|| other->instruction == CSYNC_INSTRUCTION_REMOVE) {
|
||||||
qCDebug(lcReconcile, "Switching %s to RENAME to %s",
|
qCInfo(lcReconcile, "Switching %s to RENAME to %s",
|
||||||
other->path.constData(), cur->path.constData());
|
other->path.constData(), cur->path.constData());
|
||||||
other->instruction = CSYNC_INSTRUCTION_RENAME;
|
other->instruction = CSYNC_INSTRUCTION_RENAME;
|
||||||
other->rename_path = cur->path;
|
other->rename_path = cur->path;
|
||||||
if( !cur->file_id.isEmpty() ) {
|
if( !cur->file_id.isEmpty() ) {
|
||||||
other->file_id = cur->file_id;
|
other->file_id = cur->file_id;
|
||||||
}
|
}
|
||||||
|
if (ctx->current == LOCAL_REPLICA) {
|
||||||
|
// Keep the local mtime.
|
||||||
|
other->modtime = cur->modtime;
|
||||||
|
}
|
||||||
other->inode = cur->inode;
|
other->inode = cur->inode;
|
||||||
cur->instruction = CSYNC_INSTRUCTION_NONE;
|
cur->instruction = CSYNC_INSTRUCTION_NONE;
|
||||||
// We have consumed 'other': exit this loop to not consume another one.
|
// We have consumed 'other': exit this loop to not consume another one.
|
||||||
@@ -217,7 +221,7 @@ static void _csync_merge_algorithm_visitor(csync_file_stat_t *cur, CSYNC * ctx)
|
|||||||
// Local: The remote reconcile will be able to deal with this.
|
// Local: The remote reconcile will be able to deal with this.
|
||||||
// Remote: The local replica has already dealt with this.
|
// Remote: The local replica has already dealt with this.
|
||||||
// See the EVAL_RENAME case when other was found directly.
|
// See the EVAL_RENAME case when other was found directly.
|
||||||
qCDebug(lcReconcile, "File in a renamed directory, other side's instruction: %d",
|
qCInfo(lcReconcile, "File in a renamed directory, other side's instruction: %d",
|
||||||
other->instruction);
|
other->instruction);
|
||||||
cur->instruction = CSYNC_INSTRUCTION_NONE;
|
cur->instruction = CSYNC_INSTRUCTION_NONE;
|
||||||
} else {
|
} else {
|
||||||
@@ -225,7 +229,7 @@ static void _csync_merge_algorithm_visitor(csync_file_stat_t *cur, CSYNC * ctx)
|
|||||||
// and the instruction in the local tree is NEW while cur has EVAL_RENAME
|
// and the instruction in the local tree is NEW while cur has EVAL_RENAME
|
||||||
// due to a remote move of the same file. In these scenarios we just
|
// due to a remote move of the same file. In these scenarios we just
|
||||||
// want the instruction to stay NEW.
|
// want the instruction to stay NEW.
|
||||||
qCDebug(lcReconcile, "Other already has instruction %d",
|
qCInfo(lcReconcile, "Other already has instruction %d",
|
||||||
other->instruction);
|
other->instruction);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -233,7 +237,7 @@ static void _csync_merge_algorithm_visitor(csync_file_stat_t *cur, CSYNC * ctx)
|
|||||||
if (ctx->current == LOCAL_REPLICA) {
|
if (ctx->current == LOCAL_REPLICA) {
|
||||||
/* use the old name to find the "other" node */
|
/* use the old name to find the "other" node */
|
||||||
OCC::SyncJournalFileRecord base;
|
OCC::SyncJournalFileRecord base;
|
||||||
qCDebug(lcReconcile, "Finding rename origin through inode %" PRIu64 "",
|
qCInfo(lcReconcile, "Finding rename origin through inode %" PRIu64 "",
|
||||||
cur->inode);
|
cur->inode);
|
||||||
ctx->statedb->getFileRecordByInode(cur->inode, &base);
|
ctx->statedb->getFileRecordByInode(cur->inode, &base);
|
||||||
renameCandidateProcessing(base._path);
|
renameCandidateProcessing(base._path);
|
||||||
@@ -246,7 +250,7 @@ static void _csync_merge_algorithm_visitor(csync_file_stat_t *cur, CSYNC * ctx)
|
|||||||
// line.
|
// line.
|
||||||
auto basePath = csync_rename_adjust_full_path_source(ctx, cur->path);
|
auto basePath = csync_rename_adjust_full_path_source(ctx, cur->path);
|
||||||
if (basePath != cur->path) {
|
if (basePath != cur->path) {
|
||||||
qCDebug(lcReconcile, "Trying rename origin by csync_rename mapping %s",
|
qCInfo(lcReconcile, "Trying rename origin by csync_rename mapping %s",
|
||||||
basePath.constData());
|
basePath.constData());
|
||||||
// We go through getFileRecordsByFileId to ensure the basePath
|
// We go through getFileRecordsByFileId to ensure the basePath
|
||||||
// computed in this way also has the expected fileid.
|
// computed in this way also has the expected fileid.
|
||||||
@@ -259,7 +263,7 @@ static void _csync_merge_algorithm_visitor(csync_file_stat_t *cur, CSYNC * ctx)
|
|||||||
|
|
||||||
// Also feed all the other files with the same fileid if necessary
|
// Also feed all the other files with the same fileid if necessary
|
||||||
if (!processedRename) {
|
if (!processedRename) {
|
||||||
qCDebug(lcReconcile, "Finding rename origin through file ID %s",
|
qCInfo(lcReconcile, "Finding rename origin through file ID %s",
|
||||||
cur->file_id.constData());
|
cur->file_id.constData());
|
||||||
ctx->statedb->getFileRecordsByFileId(cur->file_id,
|
ctx->statedb->getFileRecordsByFileId(cur->file_id,
|
||||||
[&](const OCC::SyncJournalFileRecord &base) { renameCandidateProcessing(base._path); });
|
[&](const OCC::SyncJournalFileRecord &base) { renameCandidateProcessing(base._path); });
|
||||||
|
|||||||
@@ -125,12 +125,12 @@ static int _csync_detect_update(CSYNC *ctx, std::unique_ptr<csync_file_stat_t> f
|
|||||||
* This code should probably be in csync_exclude, but it does not have the fs parameter.
|
* This code should probably be in csync_exclude, but it does not have the fs parameter.
|
||||||
* Keep it here for now */
|
* Keep it here for now */
|
||||||
if (ctx->ignore_hidden_files && (fs->is_hidden)) {
|
if (ctx->ignore_hidden_files && (fs->is_hidden)) {
|
||||||
qCDebug(lcUpdate, "file excluded because it is a hidden file: %s", fs->path.constData());
|
qCInfo(lcUpdate, "file excluded because it is a hidden file: %s", fs->path.constData());
|
||||||
excluded = CSYNC_FILE_EXCLUDE_HIDDEN;
|
excluded = CSYNC_FILE_EXCLUDE_HIDDEN;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* File is ignored because it's matched by a user- or system exclude pattern. */
|
/* File is ignored because it's matched by a user- or system exclude pattern. */
|
||||||
qCDebug(lcUpdate, "%s excluded (%d)", fs->path.constData(), excluded);
|
qCInfo(lcUpdate, "%s excluded (%d)", fs->path.constData(), excluded);
|
||||||
if (excluded == CSYNC_FILE_EXCLUDE_AND_REMOVE) {
|
if (excluded == CSYNC_FILE_EXCLUDE_AND_REMOVE) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -155,7 +155,7 @@ static int _csync_detect_update(CSYNC *ctx, std::unique_ptr<csync_file_stat_t> f
|
|||||||
*/
|
*/
|
||||||
QTextEncoder encoder(localCodec, QTextCodec::ConvertInvalidToNull);
|
QTextEncoder encoder(localCodec, QTextCodec::ConvertInvalidToNull);
|
||||||
if (encoder.fromUnicode(QString::fromUtf8(fs->path)).contains('\0')) {
|
if (encoder.fromUnicode(QString::fromUtf8(fs->path)).contains('\0')) {
|
||||||
qCDebug(lcUpdate, "cannot encode %s to local encoding %d",
|
qCInfo(lcUpdate, "cannot encode %s to local encoding %d",
|
||||||
fs->path.constData(), localCodec->mibEnum());
|
fs->path.constData(), localCodec->mibEnum());
|
||||||
excluded = CSYNC_FILE_EXCLUDE_CANNOT_ENCODE;
|
excluded = CSYNC_FILE_EXCLUDE_CANNOT_ENCODE;
|
||||||
}
|
}
|
||||||
@@ -163,7 +163,7 @@ static int _csync_detect_update(CSYNC *ctx, std::unique_ptr<csync_file_stat_t> f
|
|||||||
|
|
||||||
if (fs->type == ItemTypeFile ) {
|
if (fs->type == ItemTypeFile ) {
|
||||||
if (fs->modtime == 0) {
|
if (fs->modtime == 0) {
|
||||||
qCDebug(lcUpdate, "file: %s - mtime is zero!", fs->path.constData());
|
qCInfo(lcUpdate, "file: %s - mtime is zero!", fs->path.constData());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -245,7 +245,7 @@ static int _csync_detect_update(CSYNC *ctx, std::unique_ptr<csync_file_stat_t> f
|
|||||||
checksumIdentical = fs->checksumHeader == base._checksumHeader;
|
checksumIdentical = fs->checksumHeader == base._checksumHeader;
|
||||||
}
|
}
|
||||||
if (checksumIdentical) {
|
if (checksumIdentical) {
|
||||||
qCDebug(lcUpdate, "NOTE: Checksums are identical, file did not actually change: %s", fs->path.constData());
|
qCInfo(lcUpdate, "NOTE: Checksums are identical, file did not actually change: %s", fs->path.constData());
|
||||||
fs->instruction = CSYNC_INSTRUCTION_UPDATE_METADATA;
|
fs->instruction = CSYNC_INSTRUCTION_UPDATE_METADATA;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@@ -269,7 +269,7 @@ static int _csync_detect_update(CSYNC *ctx, std::unique_ptr<csync_file_stat_t> f
|
|||||||
* The metadata comparison ensure that we fetch all the file id or permission when
|
* The metadata comparison ensure that we fetch all the file id or permission when
|
||||||
* upgrading owncloud
|
* upgrading owncloud
|
||||||
*/
|
*/
|
||||||
qCDebug(lcUpdate, "Reading from database: %s", fs->path.constData());
|
qCInfo(lcUpdate, "Reading from database: %s", fs->path.constData());
|
||||||
ctx->remote.read_from_db = true;
|
ctx->remote.read_from_db = true;
|
||||||
}
|
}
|
||||||
/* If it was remembered in the db that the remote dir has ignored files, store
|
/* If it was remembered in the db that the remote dir has ignored files, store
|
||||||
@@ -280,7 +280,7 @@ static int _csync_detect_update(CSYNC *ctx, std::unique_ptr<csync_file_stat_t> f
|
|||||||
}
|
}
|
||||||
if (metadata_differ) {
|
if (metadata_differ) {
|
||||||
/* file id or permissions has changed. Which means we need to update them in the DB. */
|
/* file id or permissions has changed. Which means we need to update them in the DB. */
|
||||||
qCDebug(lcUpdate, "Need to update metadata for: %s", fs->path.constData());
|
qCInfo(lcUpdate, "Need to update metadata for: %s", fs->path.constData());
|
||||||
fs->instruction = CSYNC_INSTRUCTION_UPDATE_METADATA;
|
fs->instruction = CSYNC_INSTRUCTION_UPDATE_METADATA;
|
||||||
} else {
|
} else {
|
||||||
fs->instruction = CSYNC_INSTRUCTION_NONE;
|
fs->instruction = CSYNC_INSTRUCTION_NONE;
|
||||||
@@ -288,7 +288,7 @@ static int _csync_detect_update(CSYNC *ctx, std::unique_ptr<csync_file_stat_t> f
|
|||||||
} else {
|
} else {
|
||||||
/* check if it's a file and has been renamed */
|
/* check if it's a file and has been renamed */
|
||||||
if (ctx->current == LOCAL_REPLICA) {
|
if (ctx->current == LOCAL_REPLICA) {
|
||||||
qCDebug(lcUpdate, "Checking for rename based on inode # %" PRId64 "", (uint64_t) fs->inode);
|
qCInfo(lcUpdate, "Checking for rename based on inode # %" PRId64 "", (uint64_t) fs->inode);
|
||||||
|
|
||||||
OCC::SyncJournalFileRecord base;
|
OCC::SyncJournalFileRecord base;
|
||||||
if(!ctx->statedb->getFileRecordByInode(fs->inode, &base)) {
|
if(!ctx->statedb->getFileRecordByInode(fs->inode, &base)) {
|
||||||
@@ -315,13 +315,13 @@ static int _csync_detect_update(CSYNC *ctx, std::unique_ptr<csync_file_stat_t> f
|
|||||||
_rel_to_abs(ctx, fs->path), base._checksumHeader,
|
_rel_to_abs(ctx, fs->path), base._checksumHeader,
|
||||||
ctx->callbacks.checksum_userdata);
|
ctx->callbacks.checksum_userdata);
|
||||||
if (!fs->checksumHeader.isEmpty()) {
|
if (!fs->checksumHeader.isEmpty()) {
|
||||||
qCDebug(lcUpdate, "checking checksum of potential rename %s %s <-> %s", fs->path.constData(), fs->checksumHeader.constData(), base._checksumHeader.constData());
|
qCInfo(lcUpdate, "checking checksum of potential rename %s %s <-> %s", fs->path.constData(), fs->checksumHeader.constData(), base._checksumHeader.constData());
|
||||||
isRename = fs->checksumHeader == base._checksumHeader;
|
isRename = fs->checksumHeader == base._checksumHeader;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isRename) {
|
if (isRename) {
|
||||||
qCDebug(lcUpdate, "pot rename detected based on inode # %" PRId64 "", (uint64_t) fs->inode);
|
qCInfo(lcUpdate, "pot rename detected based on inode # %" PRId64 "", (uint64_t) fs->inode);
|
||||||
/* inode found so the file has been renamed */
|
/* inode found so the file has been renamed */
|
||||||
fs->instruction = CSYNC_INSTRUCTION_EVAL_RENAME;
|
fs->instruction = CSYNC_INSTRUCTION_EVAL_RENAME;
|
||||||
if (fs->type == ItemTypeDirectory) {
|
if (fs->type == ItemTypeDirectory) {
|
||||||
@@ -331,6 +331,8 @@ static int _csync_detect_update(CSYNC *ctx, std::unique_ptr<csync_file_stat_t> f
|
|||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
qCInfo(lcUpdate, "Checking for rename based on fileid %s", fs->file_id.constData());
|
||||||
|
|
||||||
/* Remote Replica Rename check */
|
/* Remote Replica Rename check */
|
||||||
fs->instruction = CSYNC_INSTRUCTION_NEW;
|
fs->instruction = CSYNC_INSTRUCTION_NEW;
|
||||||
|
|
||||||
@@ -376,7 +378,8 @@ static int _csync_detect_update(CSYNC *ctx, std::unique_ptr<csync_file_stat_t> f
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
qCDebug(lcUpdate, "remote rename detected based on fileid %s --> %s", qPrintable(base._path), qPrintable(fs->path.constData()));
|
qCInfo(lcUpdate, "remote rename detected based on fileid %s --> %s", base._path.constData(), fs->path.constData());
|
||||||
|
|
||||||
fs->instruction = CSYNC_INSTRUCTION_EVAL_RENAME;
|
fs->instruction = CSYNC_INSTRUCTION_EVAL_RENAME;
|
||||||
done = true;
|
done = true;
|
||||||
};
|
};
|
||||||
@@ -484,11 +487,11 @@ int csync_walker(CSYNC *ctx, std::unique_ptr<csync_file_stat_t> fs) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ItemTypeSoftLink:
|
case ItemTypeSoftLink:
|
||||||
qCDebug(lcUpdate, "symlink: %s - not supported", fs->path.constData());
|
qCInfo(lcUpdate, "symlink: %s - not supported", fs->path.constData());
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
qCInfo(lcUpdate, "item: %s - item type %d not iterated", fs->path.constData(), fs->type);
|
||||||
return 0;
|
return 0;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = _csync_detect_update(ctx, std::move(fs));
|
rc = _csync_detect_update(ctx, std::move(fs));
|
||||||
@@ -511,7 +514,7 @@ static bool fill_tree_from_db(CSYNC *ctx, const char *uri)
|
|||||||
* their correct etags again and we don't run into this case.
|
* their correct etags again and we don't run into this case.
|
||||||
*/
|
*/
|
||||||
if (rec._etag == "_invalid_") {
|
if (rec._etag == "_invalid_") {
|
||||||
qCDebug(lcUpdate, "%s selective sync excluded", rec._path.constData());
|
qCInfo(lcUpdate, "%s selective sync excluded", rec._path.constData());
|
||||||
skipbase = rec._path;
|
skipbase = rec._path;
|
||||||
skipbase += '/';
|
skipbase += '/';
|
||||||
return;
|
return;
|
||||||
@@ -757,7 +760,7 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn,
|
|||||||
}
|
}
|
||||||
|
|
||||||
csync_vio_closedir(ctx, dh);
|
csync_vio_closedir(ctx, dh);
|
||||||
qCDebug(lcUpdate, " <= Closing walk for %s with read_from_db %d", uri, read_from_db);
|
qCInfo(lcUpdate, " <= Closing walk for %s with read_from_db %d", uri, read_from_db);
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
|
|||||||
@@ -181,7 +181,7 @@ std::unique_ptr<csync_file_stat_t> csync_vio_local_readdir(csync_vio_handle_t *d
|
|||||||
}
|
}
|
||||||
} else if (handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_DEVICE
|
} else if (handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_DEVICE
|
||||||
|| handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_OFFLINE
|
|| handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_OFFLINE
|
||||||
|| handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_TEMPORARY) {
|
) {
|
||||||
file_stat->type = ItemTypeSkip;
|
file_stat->type = ItemTypeSkip;
|
||||||
} else if (handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
|
} else if (handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
|
||||||
file_stat->type = ItemTypeDirectory;
|
file_stat->type = ItemTypeDirectory;
|
||||||
|
|||||||
@@ -33,7 +33,6 @@ set(client_UI_SRCS
|
|||||||
sslerrordialog.ui
|
sslerrordialog.ui
|
||||||
addcertificatedialog.ui
|
addcertificatedialog.ui
|
||||||
proxyauthdialog.ui
|
proxyauthdialog.ui
|
||||||
notificationwidget.ui
|
|
||||||
mnemonicdialog.ui
|
mnemonicdialog.ui
|
||||||
wizard/owncloudadvancedsetuppage.ui
|
wizard/owncloudadvancedsetuppage.ui
|
||||||
wizard/owncloudconnectionmethoddialog.ui
|
wizard/owncloudconnectionmethoddialog.ui
|
||||||
@@ -95,7 +94,6 @@ set(client_SRCS
|
|||||||
proxyauthdialog.cpp
|
proxyauthdialog.cpp
|
||||||
synclogdialog.cpp
|
synclogdialog.cpp
|
||||||
tooltipupdater.cpp
|
tooltipupdater.cpp
|
||||||
notificationwidget.cpp
|
|
||||||
notificationconfirmjob.cpp
|
notificationconfirmjob.cpp
|
||||||
servernotificationhandler.cpp
|
servernotificationhandler.cpp
|
||||||
guiutility.cpp
|
guiutility.cpp
|
||||||
@@ -274,7 +272,7 @@ if(NOT BUILD_OWNCLOUD_OSX_BUNDLE)
|
|||||||
add_executable( ${APPLICATION_EXECUTABLE} WIN32 main.cpp ${final_src})
|
add_executable( ${APPLICATION_EXECUTABLE} WIN32 main.cpp ${final_src})
|
||||||
else()
|
else()
|
||||||
# set(CMAKE_INSTALL_PREFIX ".") # Examples use /Applications. hurmpf.
|
# set(CMAKE_INSTALL_PREFIX ".") # Examples use /Applications. hurmpf.
|
||||||
set(MACOSX_BUNDLE_ICON_FILE "ownCloud.icns")
|
set(MACOSX_BUNDLE_ICON_FILE "${APPLICATION_ICON_NAME}.icns")
|
||||||
|
|
||||||
# we must add MACOSX_BUNDLE only if building a bundle
|
# we must add MACOSX_BUNDLE only if building a bundle
|
||||||
add_executable( ${APPLICATION_EXECUTABLE} WIN32 MACOSX_BUNDLE main.cpp ${final_src})
|
add_executable( ${APPLICATION_EXECUTABLE} WIN32 MACOSX_BUNDLE main.cpp ${final_src})
|
||||||
|
|||||||
@@ -680,7 +680,7 @@ void AccountSettings::slotFolderWizardAccepted()
|
|||||||
|
|
||||||
/* take the value from the definition of already existing folders. All folders have
|
/* take the value from the definition of already existing folders. All folders have
|
||||||
* the same setting so far.
|
* the same setting so far.
|
||||||
* The default is to not sync hidden files
|
* The default is to sync hidden files
|
||||||
*/
|
*/
|
||||||
definition.ignoreHiddenFiles = folderMan->ignoreHiddenFiles();
|
definition.ignoreHiddenFiles = folderMan->ignoreHiddenFiles();
|
||||||
|
|
||||||
|
|||||||
@@ -335,10 +335,10 @@ void AccountState::slotInvalidCredentials()
|
|||||||
|
|
||||||
if (account()->credentials()->ready()) {
|
if (account()->credentials()->ready()) {
|
||||||
account()->credentials()->invalidateToken();
|
account()->credentials()->invalidateToken();
|
||||||
if (auto creds = qobject_cast<HttpCredentials *>(account()->credentials())) {
|
}
|
||||||
if (creds->refreshAccessToken())
|
if (auto creds = qobject_cast<HttpCredentials *>(account()->credentials())) {
|
||||||
return;
|
if (creds->refreshAccessToken())
|
||||||
}
|
return;
|
||||||
}
|
}
|
||||||
account()->credentials()->askFromUser();
|
account()->credentials()->askFromUser();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -60,6 +60,10 @@ int ActivityItemDelegate::rowHeight()
|
|||||||
QFontMetrics fm(f);
|
QFontMetrics fm(f);
|
||||||
|
|
||||||
_margin = fm.height() / 2;
|
_margin = fm.height() / 2;
|
||||||
|
|
||||||
|
#if defined(Q_OS_WIN)
|
||||||
|
_margin += 5;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
return iconHeight() + 5 * _margin;
|
return iconHeight() + 5 * _margin;
|
||||||
}
|
}
|
||||||
@@ -228,16 +232,11 @@ void ActivityItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &
|
|||||||
painter->setPen(p.color(QPalette::Disabled, QPalette::Text));
|
painter->setPen(p.color(QPalette::Disabled, QPalette::Text));
|
||||||
|
|
||||||
// change pen color if the line is selected
|
// change pen color if the line is selected
|
||||||
QPalette::ColorGroup cg = option.state & QStyle::State_Enabled
|
QPalette::ColorGroup cg = option.state & (QStyle::State_Enabled | QStyle::State_Active)
|
||||||
? QPalette::Normal
|
? QPalette::Normal
|
||||||
: QPalette::Disabled;
|
: QPalette::Inactive;
|
||||||
if (cg == QPalette::Normal && !(option.state & QStyle::State_Active))
|
|
||||||
cg = QPalette::Inactive;
|
|
||||||
|
|
||||||
if (option.state & QStyle::State_Selected)
|
painter->setPen(option.palette.color(cg, QPalette::Text));
|
||||||
painter->setPen(option.palette.color(cg, QPalette::HighlightedText));
|
|
||||||
else
|
|
||||||
painter->setPen(option.palette.color(cg, QPalette::Text));
|
|
||||||
|
|
||||||
// calculate space for text - use the max possible before using the elipses
|
// calculate space for text - use the max possible before using the elipses
|
||||||
int spaceLeftForText = option.rect.width() - (actionIconRect.width() + margin + rightMargin + leftMargin) -
|
int spaceLeftForText = option.rect.width() - (actionIconRect.width() + margin + rightMargin + leftMargin) -
|
||||||
@@ -258,12 +257,6 @@ void ActivityItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &
|
|||||||
// draw the message
|
// draw the message
|
||||||
// change pen color for the message
|
// change pen color for the message
|
||||||
if(!messageText.isEmpty()){
|
if(!messageText.isEmpty()){
|
||||||
painter->setPen(p.color(QPalette::Inactive, QPalette::Text));
|
|
||||||
|
|
||||||
// check if line is selected
|
|
||||||
if (option.state & QStyle::State_Selected)
|
|
||||||
painter->setPen(option.palette.color(cg, QPalette::HighlightedText));
|
|
||||||
|
|
||||||
const QString elidedMessage = fm.elidedText(messageText, Qt::ElideRight, spaceLeftForText);
|
const QString elidedMessage = fm.elidedText(messageText, Qt::ElideRight, spaceLeftForText);
|
||||||
painter->drawText(messageTextBox, elidedMessage);
|
painter->drawText(messageTextBox, elidedMessage);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -108,9 +108,9 @@ QVariant ActivityListModel::data(const QModelIndex &index, int role) const
|
|||||||
|| a._status == SyncFileItem::Restoration){
|
|| a._status == SyncFileItem::Restoration){
|
||||||
return QIcon(QLatin1String(":/client/resources/state-warning.svg"));
|
return QIcon(QLatin1String(":/client/resources/state-warning.svg"));
|
||||||
}
|
}
|
||||||
return QIcon(QLatin1String(":/client/resources/activity.png"));
|
return QIcon(QLatin1String(":/client/resources/state-sync.svg"));
|
||||||
} else return QIcon(QLatin1String(":/client/resources/activity.png"));
|
}
|
||||||
return QVariant();
|
return QIcon(QLatin1String(":/client/resources/activity.png"));
|
||||||
break;
|
break;
|
||||||
case ActivityItemDelegate::ObjectTypeRole:
|
case ActivityItemDelegate::ObjectTypeRole:
|
||||||
return a._objectType;
|
return a._objectType;
|
||||||
@@ -121,7 +121,6 @@ QVariant ActivityListModel::data(const QModelIndex &index, int role) const
|
|||||||
return type;
|
return type;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case Qt::ToolTipRole:
|
|
||||||
case ActivityItemDelegate::ActionTextRole:
|
case ActivityItemDelegate::ActionTextRole:
|
||||||
return a._subject;
|
return a._subject;
|
||||||
break;
|
break;
|
||||||
@@ -237,6 +236,12 @@ void ActivityListModel::removeActivityFromActivityList(int row) {
|
|||||||
removeActivityFromActivityList(activity);
|
removeActivityFromActivityList(activity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ActivityListModel::addSyncFileItemToActivityList(Activity activity) {
|
||||||
|
qCInfo(lcActivity) << "Successfully added to the activity list: " << activity._subject;
|
||||||
|
_syncFileItemLists.prepend(activity);
|
||||||
|
combineActivityLists();
|
||||||
|
}
|
||||||
|
|
||||||
void ActivityListModel::removeActivityFromActivityList(Activity activity) {
|
void ActivityListModel::removeActivityFromActivityList(Activity activity) {
|
||||||
qCInfo(lcActivity) << "Activity/Notification/Error successfully dismissed: " << activity._subject;
|
qCInfo(lcActivity) << "Activity/Notification/Error successfully dismissed: " << activity._subject;
|
||||||
qCInfo(lcActivity) << "Trying to remove Activity/Notification/Error from view... ";
|
qCInfo(lcActivity) << "Trying to remove Activity/Notification/Error from view... ";
|
||||||
@@ -271,6 +276,9 @@ void ActivityListModel::combineActivityLists()
|
|||||||
std::sort(_notificationLists.begin(), _notificationLists.end());
|
std::sort(_notificationLists.begin(), _notificationLists.end());
|
||||||
resultList.append(_notificationLists);
|
resultList.append(_notificationLists);
|
||||||
|
|
||||||
|
std::sort(_syncFileItemLists.begin(), _syncFileItemLists.end());
|
||||||
|
resultList.append(_syncFileItemLists);
|
||||||
|
|
||||||
std::sort(_activityLists.begin(), _activityLists.end());
|
std::sort(_activityLists.begin(), _activityLists.end());
|
||||||
resultList.append(_activityLists);
|
resultList.append(_activityLists);
|
||||||
|
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ public:
|
|||||||
ActivityList errorsList() { return _notificationErrorsLists; }
|
ActivityList errorsList() { return _notificationErrorsLists; }
|
||||||
void addNotificationToActivityList(Activity activity);
|
void addNotificationToActivityList(Activity activity);
|
||||||
void addErrorToActivityList(Activity activity);
|
void addErrorToActivityList(Activity activity);
|
||||||
|
void addSyncFileItemToActivityList(Activity activity);
|
||||||
void removeActivityFromActivityList(int row);
|
void removeActivityFromActivityList(int row);
|
||||||
void removeActivityFromActivityList(Activity activity);
|
void removeActivityFromActivityList(Activity activity);
|
||||||
|
|
||||||
@@ -68,6 +69,7 @@ private:
|
|||||||
void combineActivityLists();
|
void combineActivityLists();
|
||||||
|
|
||||||
ActivityList _activityLists;
|
ActivityList _activityLists;
|
||||||
|
ActivityList _syncFileItemLists;
|
||||||
ActivityList _notificationLists;
|
ActivityList _notificationLists;
|
||||||
ActivityList _notificationErrorsLists;
|
ActivityList _notificationErrorsLists;
|
||||||
ActivityList _finalList;
|
ActivityList _finalList;
|
||||||
|
|||||||
@@ -30,7 +30,6 @@
|
|||||||
#include "accountmanager.h"
|
#include "accountmanager.h"
|
||||||
#include "activityitemdelegate.h"
|
#include "activityitemdelegate.h"
|
||||||
#include "QProgressIndicator.h"
|
#include "QProgressIndicator.h"
|
||||||
#include "notificationwidget.h"
|
|
||||||
#include "notificationconfirmjob.h"
|
#include "notificationconfirmjob.h"
|
||||||
#include "servernotificationhandler.h"
|
#include "servernotificationhandler.h"
|
||||||
#include "theme.h"
|
#include "theme.h"
|
||||||
@@ -68,7 +67,6 @@ ActivityWidget::ActivityWidget(AccountState *accountState, QWidget *parent)
|
|||||||
ActivityItemDelegate *delegate = new ActivityItemDelegate;
|
ActivityItemDelegate *delegate = new ActivityItemDelegate;
|
||||||
delegate->setParent(this);
|
delegate->setParent(this);
|
||||||
_ui->_activityList->setItemDelegate(delegate);
|
_ui->_activityList->setItemDelegate(delegate);
|
||||||
_ui->_activityList->setBackgroundRole(QPalette::Background);
|
|
||||||
_ui->_activityList->setAlternatingRowColors(true);
|
_ui->_activityList->setAlternatingRowColors(true);
|
||||||
_ui->_activityList->setModel(_model);
|
_ui->_activityList->setModel(_model);
|
||||||
|
|
||||||
@@ -77,15 +75,11 @@ ActivityWidget::ActivityWidget(AccountState *accountState, QWidget *parent)
|
|||||||
connect(_model, &ActivityListModel::activityJobStatusCode,
|
connect(_model, &ActivityListModel::activityJobStatusCode,
|
||||||
this, &ActivityWidget::slotAccountActivityStatus);
|
this, &ActivityWidget::slotAccountActivityStatus);
|
||||||
|
|
||||||
_ui->_copyButton->setToolTip(tr("Copy the activity list to the clipboard."));
|
|
||||||
connect(_ui->_copyButton, &QPushButton::click, this, &ActivityWidget::copyToClipboard);
|
|
||||||
|
|
||||||
connect(_model, &QAbstractItemModel::rowsInserted, this, &ActivityWidget::rowsInserted);
|
connect(_model, &QAbstractItemModel::rowsInserted, this, &ActivityWidget::rowsInserted);
|
||||||
|
|
||||||
connect(delegate, &ActivityItemDelegate::primaryButtonClickedOnItemView, this, &ActivityWidget::slotPrimaryButtonClickedOnListView);
|
connect(delegate, &ActivityItemDelegate::primaryButtonClickedOnItemView, this, &ActivityWidget::slotPrimaryButtonClickedOnListView);
|
||||||
connect(delegate, &ActivityItemDelegate::secondaryButtonClickedOnItemView, this, &ActivityWidget::slotSecondaryButtonClickedOnListView);
|
connect(delegate, &ActivityItemDelegate::secondaryButtonClickedOnItemView, this, &ActivityWidget::slotSecondaryButtonClickedOnListView);
|
||||||
connect(_ui->_activityList, &QListView::activated, this, &ActivityWidget::slotOpenFile);
|
connect(_ui->_activityList, &QListView::activated, this, &ActivityWidget::slotOpenFile);
|
||||||
connect(&_removeTimer, &QTimer::timeout, this, &ActivityWidget::slotCheckToCleanWidgets);
|
|
||||||
|
|
||||||
connect(ProgressDispatcher::instance(), &ProgressDispatcher::progressInfo,
|
connect(ProgressDispatcher::instance(), &ProgressDispatcher::progressInfo,
|
||||||
this, &ActivityWidget::slotProgressInfo);
|
this, &ActivityWidget::slotProgressInfo);
|
||||||
@@ -104,52 +98,49 @@ ActivityWidget::~ActivityWidget()
|
|||||||
|
|
||||||
void ActivityWidget::slotProgressInfo(const QString &folder, const ProgressInfo &progress)
|
void ActivityWidget::slotProgressInfo(const QString &folder, const ProgressInfo &progress)
|
||||||
{
|
{
|
||||||
|
if (progress.status() == ProgressInfo::Reconcile) {
|
||||||
|
// Wipe all non-persistent entries - as well as the persistent ones
|
||||||
|
// in cases where a local discovery was done.
|
||||||
|
auto f = FolderMan::instance()->folder(folder);
|
||||||
|
if (!f)
|
||||||
|
return;
|
||||||
|
const auto &engine = f->syncEngine();
|
||||||
|
const auto style = engine.lastLocalDiscoveryStyle();
|
||||||
|
foreach (Activity activity, _model->errorsList()) {
|
||||||
|
if (activity._folder != folder){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: this is really not working
|
if (style == LocalDiscoveryStyle::FilesystemOnly){
|
||||||
// if (progress.status() == ProgressInfo::Done
|
_model->removeActivityFromActivityList(activity);
|
||||||
// || progress.status() == ProgressInfo::Reconcile) {
|
continue;
|
||||||
// // Wipe all non-persistent entries - as well as the persistent ones
|
}
|
||||||
// // in cases where a local discovery was done.
|
|
||||||
// auto f = FolderMan::instance()->folder(folder);
|
|
||||||
// if (!f)
|
|
||||||
// return;
|
|
||||||
// const auto &engine = f->syncEngine();
|
|
||||||
// const auto style = engine.lastLocalDiscoveryStyle();
|
|
||||||
// foreach (Activity activity, _model->errorsList()) {
|
|
||||||
// if (activity._folder != folder){
|
|
||||||
// continue;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// if (style == LocalDiscoveryStyle::FilesystemOnly){
|
if(activity._status == SyncFileItem::Conflict && !QFileInfo(f->path() + activity._file).exists()){
|
||||||
// _model->removeActivityFromActivityList(activity);
|
_model->removeActivityFromActivityList(activity);
|
||||||
// continue;
|
continue;
|
||||||
// }
|
}
|
||||||
|
|
||||||
// if(activity._status == SyncFileItem::Conflict && !QFileInfo(f->path() + activity._file).exists()){
|
|
||||||
// _model->removeActivityFromActivityList(activity);
|
|
||||||
// continue;
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
// if(activity._status == SyncFileItem::FileIgnored && !QFileInfo(f->path() + activity._file).exists()){
|
if(activity._status == SyncFileItem::FileIgnored && !QFileInfo(f->path() + activity._file).exists()){
|
||||||
// _model->removeActivityFromActivityList(activity);
|
_model->removeActivityFromActivityList(activity);
|
||||||
// continue;
|
continue;
|
||||||
// }
|
}
|
||||||
|
|
||||||
// if(!QFileInfo(f->path() + activity._file).exists()){
|
if(!QFileInfo(f->path() + activity._file).exists()){
|
||||||
// _model->removeActivityFromActivityList(activity);
|
_model->removeActivityFromActivityList(activity);
|
||||||
// continue;
|
continue;
|
||||||
// }
|
}
|
||||||
|
|
||||||
// auto path = QFileInfo(activity._file).dir().path().toUtf8();
|
auto path = QFileInfo(activity._file).dir().path().toUtf8();
|
||||||
// if (path == ".")
|
if (path == ".")
|
||||||
// path.clear();
|
path.clear();
|
||||||
|
|
||||||
// if(engine.shouldDiscoverLocally(path))
|
if(engine.shouldDiscoverLocally(path))
|
||||||
// _model->removeActivityFromActivityList(activity);
|
_model->removeActivityFromActivityList(activity);
|
||||||
// }
|
}
|
||||||
|
|
||||||
// }
|
}
|
||||||
|
|
||||||
if (progress.status() == ProgressInfo::Done) {
|
if (progress.status() == ProgressInfo::Done) {
|
||||||
// We keep track very well of pending conflicts.
|
// We keep track very well of pending conflicts.
|
||||||
@@ -177,18 +168,26 @@ void ActivityWidget::slotItemCompleted(const QString &folder, const SyncFileItem
|
|||||||
qCWarning(lcActivity) << "Item " << item->_file << " retrieved resulted in " << item->_errorString;
|
qCWarning(lcActivity) << "Item " << item->_file << " retrieved resulted in " << item->_errorString;
|
||||||
|
|
||||||
Activity activity;
|
Activity activity;
|
||||||
activity._type = Activity::SyncFileItemType;
|
activity._type = Activity::SyncFileItemType; //client activity
|
||||||
activity._status = item->_status;
|
activity._status = item->_status;
|
||||||
activity._dateTime = QDateTime::fromString(QDateTime::currentDateTime().toString(), Qt::ISODate);
|
activity._dateTime = QDateTime::fromString(QDateTime::currentDateTime().toString(), Qt::ISODate);
|
||||||
activity._subject = item->_errorString;
|
|
||||||
activity._message = item->_originalFile;
|
activity._message = item->_originalFile;
|
||||||
activity._link = folderInstance->accountState()->account()->url();
|
activity._link = folderInstance->accountState()->account()->url();
|
||||||
activity._accName = folderInstance->accountState()->account()->displayName();
|
activity._accName = folderInstance->accountState()->account()->displayName();
|
||||||
activity._file = item->_file;
|
activity._file = item->_file;
|
||||||
activity._folder = folder;
|
activity._folder = folder;
|
||||||
|
|
||||||
// add 'protocol error' to activity list
|
if(item->_status == SyncFileItem::NoStatus || item->_status == SyncFileItem::Success){
|
||||||
_model->addErrorToActivityList(activity);
|
qCWarning(lcActivity) << "Item " << item->_file << " retrieved successfully.";
|
||||||
|
activity._message.prepend(tr("Synced "));
|
||||||
|
_model->addSyncFileItemToActivityList(activity);
|
||||||
|
} else {
|
||||||
|
qCWarning(lcActivity) << "Item " << item->_file << " retrieved resulted in error " << item->_errorString;
|
||||||
|
activity._subject = item->_errorString;
|
||||||
|
|
||||||
|
// add 'protocol error' to activity list
|
||||||
|
_model->addErrorToActivityList(activity);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -326,14 +325,17 @@ void ActivityWidget::slotRemoveAccount()
|
|||||||
|
|
||||||
void ActivityWidget::showLabels()
|
void ActivityWidget::showLabels()
|
||||||
{
|
{
|
||||||
QString t = tr("Server Activities");
|
_ui->_bottomLabel->hide(); // hide whatever was there before
|
||||||
t.clear();
|
QString t("");
|
||||||
QSetIterator<QString> i(_accountsWithoutActivities);
|
QSetIterator<QString> i(_accountsWithoutActivities);
|
||||||
while (i.hasNext()) {
|
while (i.hasNext()) {
|
||||||
t.append(tr("<br/>Account %1 does not have activities enabled.").arg(i.next()));
|
t.append(tr("<br/>Account %1 does not have activities enabled.").arg(i.next()));
|
||||||
}
|
}
|
||||||
_ui->_bottomLabel->setTextFormat(Qt::RichText);
|
if(!t.isEmpty()){
|
||||||
_ui->_bottomLabel->setText(t);
|
_ui->_bottomLabel->setTextFormat(Qt::RichText);
|
||||||
|
_ui->_bottomLabel->setText(t);
|
||||||
|
_ui->_bottomLabel->show();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ActivityWidget::slotAccountActivityStatus(int statusCode)
|
void ActivityWidget::slotAccountActivityStatus(int statusCode)
|
||||||
@@ -347,7 +349,7 @@ void ActivityWidget::slotAccountActivityStatus(int statusCode)
|
|||||||
_accountsWithoutActivities.remove(_accountState->account()->displayName());
|
_accountsWithoutActivities.remove(_accountState->account()->displayName());
|
||||||
}
|
}
|
||||||
|
|
||||||
checkActivityTabVisibility();
|
checkActivityWidgetVisibility();
|
||||||
showLabels();
|
showLabels();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -398,16 +400,15 @@ void ActivityWidget::storeActivityList(QTextStream &ts)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ActivityWidget::checkActivityTabVisibility()
|
void ActivityWidget::checkActivityWidgetVisibility()
|
||||||
{
|
{
|
||||||
int accountCount = AccountManager::instance()->accounts().count();
|
int accountCount = AccountManager::instance()->accounts().count();
|
||||||
bool hasAccountsWithActivity =
|
bool hasAccountsWithActivity =
|
||||||
_accountsWithoutActivities.count() != accountCount;
|
_accountsWithoutActivities.count() != accountCount;
|
||||||
bool hasNotifications = !_widgetForNotifId.isEmpty();
|
|
||||||
|
|
||||||
_ui->_activityList->setVisible(hasAccountsWithActivity);
|
_ui->_activityList->setVisible(hasAccountsWithActivity);
|
||||||
|
|
||||||
emit hideActivityTab(!hasAccountsWithActivity && !hasNotifications);
|
emit hideActivityTab(!hasAccountsWithActivity);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ActivityWidget::slotOpenFile(QModelIndex indx)
|
void ActivityWidget::slotOpenFile(QModelIndex indx)
|
||||||
@@ -508,7 +509,7 @@ void ActivityWidget::slotSendNotificationRequest(const QString &accountName, con
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ActivityWidget::endNotificationRequest(NotificationWidget *widget, int replyCode)
|
void ActivityWidget::endNotificationRequest(int replyCode)
|
||||||
{
|
{
|
||||||
_notificationRequestsRunning--;
|
_notificationRequestsRunning--;
|
||||||
slotNotificationRequestFinished(replyCode);
|
slotNotificationRequestFinished(replyCode);
|
||||||
@@ -523,7 +524,7 @@ void ActivityWidget::slotNotifyNetworkError(QNetworkReply *reply)
|
|||||||
|
|
||||||
int resultCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
|
int resultCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
|
||||||
|
|
||||||
endNotificationRequest(job->widget(), resultCode);
|
endNotificationRequest(resultCode);
|
||||||
qCWarning(lcActivity) << "Server notify job failed with code " << resultCode;
|
qCWarning(lcActivity) << "Server notify job failed with code " << resultCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -534,72 +535,10 @@ void ActivityWidget::slotNotifyServerFinished(const QString &reply, int replyCod
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
endNotificationRequest(job->widget(), replyCode);
|
endNotificationRequest(replyCode);
|
||||||
qCInfo(lcActivity) << "Server Notification reply code" << replyCode << reply;
|
qCInfo(lcActivity) << "Server Notification reply code" << replyCode << reply;
|
||||||
|
|
||||||
// if the notification was successful start a timer that triggers
|
|
||||||
// removal of the done widgets in a few seconds
|
|
||||||
// Add 200 millisecs to the predefined value to make sure that the timer in
|
|
||||||
// widget's method readyToClose() has elapsed.
|
|
||||||
if (replyCode == OCS_SUCCESS_STATUS_CODE || replyCode == OCS_SUCCESS_STATUS_CODE_V2) {
|
|
||||||
//scheduleWidgetToRemove(job->widget());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// blacklist the activity coming in here.
|
|
||||||
void ActivityWidget::slotRequestCleanupAndBlacklist(const Activity &blacklistActivity)
|
|
||||||
{
|
|
||||||
if (!_blacklistedNotifications.contains(blacklistActivity)) {
|
|
||||||
_blacklistedNotifications.append(blacklistActivity);
|
|
||||||
}
|
|
||||||
|
|
||||||
NotificationWidget *widget = _widgetForNotifId[blacklistActivity.ident()];
|
|
||||||
scheduleWidgetToRemove(widget);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ActivityWidget::scheduleWidgetToRemove(NotificationWidget *widget, int milliseconds)
|
|
||||||
{
|
|
||||||
if (!widget) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// in five seconds from now, remove the widget.
|
|
||||||
QDateTime removeTime = QDateTime::currentDateTimeUtc().addMSecs(milliseconds);
|
|
||||||
QDateTime &it = _widgetsToRemove[widget];
|
|
||||||
if (!it.isValid() || it > removeTime) {
|
|
||||||
it = removeTime;
|
|
||||||
}
|
|
||||||
if (!_removeTimer.isActive()) {
|
|
||||||
_removeTimer.start();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Called every second to see if widgets need to be removed.
|
|
||||||
void ActivityWidget::slotCheckToCleanWidgets()
|
|
||||||
{
|
|
||||||
auto currentTime = QDateTime::currentDateTimeUtc();
|
|
||||||
auto it = _widgetsToRemove.begin();
|
|
||||||
while (it != _widgetsToRemove.end()) {
|
|
||||||
// loop over all widgets in the to-remove queue
|
|
||||||
QDateTime t = it.value();
|
|
||||||
NotificationWidget *widget = it.key();
|
|
||||||
|
|
||||||
if (currentTime > t) {
|
|
||||||
// found one to remove!
|
|
||||||
Activity::Identifier id = widget->activity().ident();
|
|
||||||
_widgetForNotifId.remove(id);
|
|
||||||
widget->deleteLater();
|
|
||||||
it = _widgetsToRemove.erase(it);
|
|
||||||
} else {
|
|
||||||
++it;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_widgetsToRemove.isEmpty()) {
|
|
||||||
_removeTimer.stop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* ==================================================================== */
|
/* ==================================================================== */
|
||||||
|
|
||||||
ActivitySettings::ActivitySettings(AccountState *accountState, QWidget *parent)
|
ActivitySettings::ActivitySettings(AccountState *accountState, QWidget *parent)
|
||||||
@@ -611,14 +550,7 @@ ActivitySettings::ActivitySettings(AccountState *accountState, QWidget *parent)
|
|||||||
|
|
||||||
_activityWidget = new ActivityWidget(_accountState, this);
|
_activityWidget = new ActivityWidget(_accountState, this);
|
||||||
|
|
||||||
// set background white
|
|
||||||
QPalette palette;
|
|
||||||
palette.setColor(QPalette::Background, Qt::white);
|
|
||||||
_activityWidget->setAutoFillBackground(true);
|
|
||||||
_activityWidget->setPalette(palette);
|
|
||||||
|
|
||||||
_vbox->insertWidget(1, _activityWidget);
|
_vbox->insertWidget(1, _activityWidget);
|
||||||
connect(_activityWidget, &ActivityWidget::copyToClipboard, this, &ActivitySettings::slotCopyToClipboard);
|
|
||||||
connect(_activityWidget, &ActivityWidget::guiLog, this, &ActivitySettings::guiLog);
|
connect(_activityWidget, &ActivityWidget::guiLog, this, &ActivitySettings::guiLog);
|
||||||
connect(&_notificationCheckTimer, &QTimer::timeout,
|
connect(&_notificationCheckTimer, &QTimer::timeout,
|
||||||
this, &ActivitySettings::slotRegularNotificationCheck);
|
this, &ActivitySettings::slotRegularNotificationCheck);
|
||||||
@@ -641,21 +573,6 @@ void ActivitySettings::setNotificationRefreshInterval(std::chrono::milliseconds
|
|||||||
_notificationCheckTimer.start(interval.count());
|
_notificationCheckTimer.start(interval.count());
|
||||||
}
|
}
|
||||||
|
|
||||||
void ActivitySettings::slotCopyToClipboard()
|
|
||||||
{
|
|
||||||
QString text;
|
|
||||||
QTextStream ts(&text);
|
|
||||||
|
|
||||||
QString message;
|
|
||||||
|
|
||||||
_activityWidget->storeActivityList(ts);
|
|
||||||
message = tr("The server activity and notifications list has been copied to the clipboard.");
|
|
||||||
|
|
||||||
QApplication::clipboard()->setText(text);
|
|
||||||
|
|
||||||
emit guiLog(tr("Copied to clipboard"), message);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ActivitySettings::slotRemoveAccount()
|
void ActivitySettings::slotRemoveAccount()
|
||||||
{
|
{
|
||||||
_activityWidget->slotRemoveAccount();
|
_activityWidget->slotRemoveAccount();
|
||||||
|
|||||||
@@ -37,7 +37,6 @@ namespace OCC {
|
|||||||
class Account;
|
class Account;
|
||||||
class AccountStatusPtr;
|
class AccountStatusPtr;
|
||||||
class JsonApiJob;
|
class JsonApiJob;
|
||||||
class NotificationWidget;
|
|
||||||
class ActivityListModel;
|
class ActivityListModel;
|
||||||
|
|
||||||
namespace Ui {
|
namespace Ui {
|
||||||
@@ -68,7 +67,7 @@ public:
|
|||||||
* Based on whether activities are enabled and whether notifications are
|
* Based on whether activities are enabled and whether notifications are
|
||||||
* available.
|
* available.
|
||||||
*/
|
*/
|
||||||
void checkActivityTabVisibility();
|
void checkActivityWidgetVisibility();
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void slotOpenFile(QModelIndex indx);
|
void slotOpenFile(QModelIndex indx);
|
||||||
@@ -76,14 +75,12 @@ public slots:
|
|||||||
void slotRefreshNotifications();
|
void slotRefreshNotifications();
|
||||||
void slotRemoveAccount();
|
void slotRemoveAccount();
|
||||||
void slotAccountActivityStatus(int statusCode);
|
void slotAccountActivityStatus(int statusCode);
|
||||||
void slotRequestCleanupAndBlacklist(const Activity &blacklistActivity);
|
|
||||||
void addError(const QString &folderAlias, const QString &message, ErrorCategory category);
|
void addError(const QString &folderAlias, const QString &message, ErrorCategory category);
|
||||||
void slotProgressInfo(const QString &folder, const ProgressInfo &progress);
|
void slotProgressInfo(const QString &folder, const ProgressInfo &progress);
|
||||||
void slotItemCompleted(const QString &folder, const SyncFileItemPtr &item);
|
void slotItemCompleted(const QString &folder, const SyncFileItemPtr &item);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void guiLog(const QString &, const QString &);
|
void guiLog(const QString &, const QString &);
|
||||||
void copyToClipboard();
|
|
||||||
void rowsInserted();
|
void rowsInserted();
|
||||||
void hideActivityTab(bool);
|
void hideActivityTab(bool);
|
||||||
void sendNotificationRequest(const QString &accountName, const QString &link, const QByteArray &verb, int row);
|
void sendNotificationRequest(const QString &accountName, const QString &link, const QByteArray &verb, int row);
|
||||||
@@ -93,9 +90,7 @@ private slots:
|
|||||||
void slotSendNotificationRequest(const QString &accountName, const QString &link, const QByteArray &verb, int row);
|
void slotSendNotificationRequest(const QString &accountName, const QString &link, const QByteArray &verb, int row);
|
||||||
void slotNotifyNetworkError(QNetworkReply *);
|
void slotNotifyNetworkError(QNetworkReply *);
|
||||||
void slotNotifyServerFinished(const QString &reply, int replyCode);
|
void slotNotifyServerFinished(const QString &reply, int replyCode);
|
||||||
void endNotificationRequest(NotificationWidget *widget, int replyCode);
|
void endNotificationRequest(int replyCode);
|
||||||
void scheduleWidgetToRemove(NotificationWidget *widget, int milliseconds = 100);
|
|
||||||
void slotCheckToCleanWidgets();
|
|
||||||
void slotNotificationRequestFinished(int statusCode);
|
void slotNotificationRequestFinished(int statusCode);
|
||||||
void slotPrimaryButtonClickedOnListView(const QModelIndex &index);
|
void slotPrimaryButtonClickedOnListView(const QModelIndex &index);
|
||||||
void slotSecondaryButtonClickedOnListView(const QModelIndex &index);
|
void slotSecondaryButtonClickedOnListView(const QModelIndex &index);
|
||||||
@@ -105,12 +100,10 @@ private:
|
|||||||
QString timeString(QDateTime dt, QLocale::FormatType format) const;
|
QString timeString(QDateTime dt, QLocale::FormatType format) const;
|
||||||
Ui::ActivityWidget *_ui;
|
Ui::ActivityWidget *_ui;
|
||||||
QSet<QString> _accountsWithoutActivities;
|
QSet<QString> _accountsWithoutActivities;
|
||||||
QMap<Activity::Identifier, NotificationWidget *> _widgetForNotifId;
|
|
||||||
QElapsedTimer _guiLogTimer;
|
QElapsedTimer _guiLogTimer;
|
||||||
QSet<int> _guiLoggedNotifications;
|
QSet<int> _guiLoggedNotifications;
|
||||||
ActivityList _blacklistedNotifications;
|
ActivityList _blacklistedNotifications;
|
||||||
|
|
||||||
QHash<NotificationWidget *, QDateTime> _widgetsToRemove;
|
|
||||||
QTimer _removeTimer;
|
QTimer _removeTimer;
|
||||||
|
|
||||||
// number of currently running notification requests. If non zero,
|
// number of currently running notification requests. If non zero,
|
||||||
@@ -146,7 +139,6 @@ public slots:
|
|||||||
void setNotificationRefreshInterval(std::chrono::milliseconds interval);
|
void setNotificationRefreshInterval(std::chrono::milliseconds interval);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void slotCopyToClipboard();
|
|
||||||
void slotRegularNotificationCheck();
|
void slotRegularNotificationCheck();
|
||||||
void slotDisplayActivities();
|
void slotDisplayActivities();
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>693</width>
|
<width>652</width>
|
||||||
<height>556</height>
|
<height>556</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
@@ -77,8 +77,11 @@
|
|||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
<string>Form</string>
|
<string>Form</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout" name="gridLayout">
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
<item row="0" column="0">
|
<property name="sizeConstraint">
|
||||||
|
<enum>QLayout::SetDefaultConstraint</enum>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
<widget class="QListView" name="_activityList">
|
<widget class="QListView" name="_activityList">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||||
@@ -92,18 +95,18 @@
|
|||||||
<colorrole role="Base">
|
<colorrole role="Base">
|
||||||
<brush brushstyle="SolidPattern">
|
<brush brushstyle="SolidPattern">
|
||||||
<color alpha="255">
|
<color alpha="255">
|
||||||
<red>255</red>
|
<red>252</red>
|
||||||
<green>255</green>
|
<green>252</green>
|
||||||
<blue>255</blue>
|
<blue>252</blue>
|
||||||
</color>
|
</color>
|
||||||
</brush>
|
</brush>
|
||||||
</colorrole>
|
</colorrole>
|
||||||
<colorrole role="Window">
|
<colorrole role="Window">
|
||||||
<brush brushstyle="SolidPattern">
|
<brush brushstyle="SolidPattern">
|
||||||
<color alpha="255">
|
<color alpha="255">
|
||||||
<red>255</red>
|
<red>252</red>
|
||||||
<green>255</green>
|
<green>252</green>
|
||||||
<blue>255</blue>
|
<blue>252</blue>
|
||||||
</color>
|
</color>
|
||||||
</brush>
|
</brush>
|
||||||
</colorrole>
|
</colorrole>
|
||||||
@@ -112,18 +115,18 @@
|
|||||||
<colorrole role="Base">
|
<colorrole role="Base">
|
||||||
<brush brushstyle="SolidPattern">
|
<brush brushstyle="SolidPattern">
|
||||||
<color alpha="255">
|
<color alpha="255">
|
||||||
<red>255</red>
|
<red>252</red>
|
||||||
<green>255</green>
|
<green>252</green>
|
||||||
<blue>255</blue>
|
<blue>252</blue>
|
||||||
</color>
|
</color>
|
||||||
</brush>
|
</brush>
|
||||||
</colorrole>
|
</colorrole>
|
||||||
<colorrole role="Window">
|
<colorrole role="Window">
|
||||||
<brush brushstyle="SolidPattern">
|
<brush brushstyle="SolidPattern">
|
||||||
<color alpha="255">
|
<color alpha="255">
|
||||||
<red>255</red>
|
<red>252</red>
|
||||||
<green>255</green>
|
<green>252</green>
|
||||||
<blue>255</blue>
|
<blue>252</blue>
|
||||||
</color>
|
</color>
|
||||||
</brush>
|
</brush>
|
||||||
</colorrole>
|
</colorrole>
|
||||||
@@ -132,18 +135,18 @@
|
|||||||
<colorrole role="Base">
|
<colorrole role="Base">
|
||||||
<brush brushstyle="SolidPattern">
|
<brush brushstyle="SolidPattern">
|
||||||
<color alpha="255">
|
<color alpha="255">
|
||||||
<red>255</red>
|
<red>252</red>
|
||||||
<green>255</green>
|
<green>252</green>
|
||||||
<blue>255</blue>
|
<blue>252</blue>
|
||||||
</color>
|
</color>
|
||||||
</brush>
|
</brush>
|
||||||
</colorrole>
|
</colorrole>
|
||||||
<colorrole role="Window">
|
<colorrole role="Window">
|
||||||
<brush brushstyle="SolidPattern">
|
<brush brushstyle="SolidPattern">
|
||||||
<color alpha="255">
|
<color alpha="255">
|
||||||
<red>255</red>
|
<red>252</red>
|
||||||
<green>255</green>
|
<green>252</green>
|
||||||
<blue>255</blue>
|
<blue>252</blue>
|
||||||
</color>
|
</color>
|
||||||
</brush>
|
</brush>
|
||||||
</colorrole>
|
</colorrole>
|
||||||
@@ -151,13 +154,13 @@
|
|||||||
</palette>
|
</palette>
|
||||||
</property>
|
</property>
|
||||||
<property name="frameShape">
|
<property name="frameShape">
|
||||||
<enum>QFrame::NoFrame</enum>
|
<enum>QFrame::StyledPanel</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="frameShadow">
|
<property name="frameShadow">
|
||||||
<enum>QFrame::Plain</enum>
|
<enum>QFrame::Sunken</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="lineWidth">
|
<property name="lineWidth">
|
||||||
<number>0</number>
|
<number>1</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizeAdjustPolicy">
|
<property name="sizeAdjustPolicy">
|
||||||
<enum>QAbstractScrollArea::AdjustToContents</enum>
|
<enum>QAbstractScrollArea::AdjustToContents</enum>
|
||||||
@@ -185,7 +188,7 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="0">
|
<item>
|
||||||
<widget class="QLabel" name="_bottomLabel">
|
<widget class="QLabel" name="_bottomLabel">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
|
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
|
||||||
@@ -201,28 +204,6 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="0">
|
|
||||||
<widget class="QPushButton" name="_copyButton">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="minimumSize">
|
|
||||||
<size>
|
|
||||||
<width>120</width>
|
|
||||||
<height>30</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="styleSheet">
|
|
||||||
<string notr="true">margin-left:40px;</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Copy</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<tabstops>
|
<tabstops>
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ namespace {
|
|||||||
" --logexpire <hours> : removes logs older than <hours> hours.\n"
|
" --logexpire <hours> : removes logs older than <hours> hours.\n"
|
||||||
" (to be used with --logdir)\n"
|
" (to be used with --logdir)\n"
|
||||||
" --logflush : flush the log file after every write.\n"
|
" --logflush : flush the log file after every write.\n"
|
||||||
" --logdebug : also output debug-level messages in the log (equivalent to setting the env var QT_LOGGING_RULES=\"qt.*=true;*.debug=true\").\n"
|
" --logdebug : also output debug-level messages in the log.\n"
|
||||||
" --confdir <dirname> : Use the given configuration folder.\n";
|
" --confdir <dirname> : Use the given configuration folder.\n";
|
||||||
|
|
||||||
QString applicationTrPath()
|
QString applicationTrPath()
|
||||||
@@ -202,9 +202,8 @@ Application::Application(int &argc, char **argv)
|
|||||||
_theme->setSystrayUseMonoIcons(cfg.monoIcons());
|
_theme->setSystrayUseMonoIcons(cfg.monoIcons());
|
||||||
connect(_theme, &Theme::systrayUseMonoIconsChanged, this, &Application::slotUseMonoIconsChanged);
|
connect(_theme, &Theme::systrayUseMonoIconsChanged, this, &Application::slotUseMonoIconsChanged);
|
||||||
|
|
||||||
FolderMan::instance()->setupFolders();
|
// Setting up the gui class will allow tray notifications for the
|
||||||
_proxy.setupQtProxyFromConfig(); // folders have to be defined first, than we set up the Qt proxy.
|
// setup that follows, like folder setup
|
||||||
|
|
||||||
_gui = new ownCloudGui(this);
|
_gui = new ownCloudGui(this);
|
||||||
if (_showLogWindow) {
|
if (_showLogWindow) {
|
||||||
_gui->slotToggleLogBrowser(); // _showLogWindow is set in parseOptions.
|
_gui->slotToggleLogBrowser(); // _showLogWindow is set in parseOptions.
|
||||||
@@ -213,6 +212,9 @@ Application::Application(int &argc, char **argv)
|
|||||||
_gui->setupCloudProviders();
|
_gui->setupCloudProviders();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
FolderMan::instance()->setupFolders();
|
||||||
|
_proxy.setupQtProxyFromConfig(); // folders have to be defined first, than we set up the Qt proxy.
|
||||||
|
|
||||||
// Enable word wrapping of QInputDialog (#4197)
|
// Enable word wrapping of QInputDialog (#4197)
|
||||||
setStyleSheet("QInputDialog QLabel { qproperty-wordWrap:1; }");
|
setStyleSheet("QInputDialog QLabel { qproperty-wordWrap:1; }");
|
||||||
|
|
||||||
|
|||||||
@@ -150,7 +150,6 @@ void OAuth::start()
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
QTimer::singleShot(5 * 60 * 1000, this, [this] { result(Error); });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QUrl OAuth::authorisationLink() const
|
QUrl OAuth::authorisationLink() const
|
||||||
|
|||||||
@@ -24,6 +24,35 @@ namespace OCC {
|
|||||||
|
|
||||||
Q_LOGGING_CATEGORY(lcWebFlowCredentials, "sync.credentials.webflow", QtInfoMsg)
|
Q_LOGGING_CATEGORY(lcWebFlowCredentials, "sync.credentials.webflow", QtInfoMsg)
|
||||||
|
|
||||||
|
class WebFlowCredentialsAccessManager : public AccessManager
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
WebFlowCredentialsAccessManager(const WebFlowCredentials *cred, QObject *parent = nullptr)
|
||||||
|
: AccessManager(parent)
|
||||||
|
, _cred(cred)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
QNetworkReply *createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData) Q_DECL_OVERRIDE
|
||||||
|
{
|
||||||
|
QNetworkRequest req(request);
|
||||||
|
if (!req.attribute(HttpCredentials::DontAddCredentialsAttribute).toBool()) {
|
||||||
|
if (_cred && !_cred->password().isEmpty()) {
|
||||||
|
QByteArray credHash = QByteArray(_cred->user().toUtf8() + ":" + _cred->password().toUtf8()).toBase64();
|
||||||
|
req.setRawHeader("Authorization", "Basic " + credHash);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return AccessManager::createRequest(op, req, outgoingData);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
// The credentials object dies along with the account, while the QNAM might
|
||||||
|
// outlive both.
|
||||||
|
QPointer<const WebFlowCredentials> _cred;
|
||||||
|
};
|
||||||
|
|
||||||
WebFlowCredentials::WebFlowCredentials()
|
WebFlowCredentials::WebFlowCredentials()
|
||||||
: _ready(false),
|
: _ready(false),
|
||||||
_credentialsValid(false)
|
_credentialsValid(false)
|
||||||
@@ -56,7 +85,7 @@ QString WebFlowCredentials::password() const {
|
|||||||
|
|
||||||
QNetworkAccessManager *WebFlowCredentials::createQNAM() const {
|
QNetworkAccessManager *WebFlowCredentials::createQNAM() const {
|
||||||
qCInfo(lcWebFlowCredentials()) << "Get QNAM";
|
qCInfo(lcWebFlowCredentials()) << "Get QNAM";
|
||||||
AccessManager *qnam = new AccessManager();
|
AccessManager *qnam = new WebFlowCredentialsAccessManager(this);
|
||||||
|
|
||||||
connect(qnam, &AccessManager::authenticationRequired, this, &WebFlowCredentials::slotAuthentication);
|
connect(qnam, &AccessManager::authenticationRequired, this, &WebFlowCredentials::slotAuthentication);
|
||||||
connect(qnam, &AccessManager::finished, this, &WebFlowCredentials::slotFinished);
|
connect(qnam, &AccessManager::finished, this, &WebFlowCredentials::slotFinished);
|
||||||
|
|||||||
@@ -1015,6 +1015,20 @@ void Folder::warnOnNewExcludedItem(const SyncJournalFileRecord &record, const QS
|
|||||||
Logger::instance()->postOptionalGuiLog(Theme::instance()->appNameGUI(), message);
|
Logger::instance()->postOptionalGuiLog(Theme::instance()->appNameGUI(), message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Folder::slotWatcherUnreliable(const QString &message)
|
||||||
|
{
|
||||||
|
qCWarning(lcFolder) << "Folder watcher for" << path() << "became unreliable:" << message;
|
||||||
|
auto fullMessage =
|
||||||
|
tr("Changes in synchronized folders could not be tracked reliably.\n"
|
||||||
|
"\n"
|
||||||
|
"This means that the synchronization client might not upload local changes "
|
||||||
|
"immediately and will instead only scan for local changes and upload them "
|
||||||
|
"occasionally (every two hours by default).\n"
|
||||||
|
"\n"
|
||||||
|
"%1").arg(message);
|
||||||
|
Logger::instance()->postGuiLog(Theme::instance()->appNameGUI(), fullMessage);
|
||||||
|
}
|
||||||
|
|
||||||
void Folder::scheduleThisFolderSoon()
|
void Folder::scheduleThisFolderSoon()
|
||||||
{
|
{
|
||||||
if (!_scheduleSelfTimer.isActive()) {
|
if (!_scheduleSelfTimer.isActive()) {
|
||||||
@@ -1034,11 +1048,14 @@ void Folder::registerFolderWatcher()
|
|||||||
if (!QDir(path()).exists())
|
if (!QDir(path()).exists())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
_folderWatcher.reset(new FolderWatcher(path(), this));
|
_folderWatcher.reset(new FolderWatcher(this));
|
||||||
connect(_folderWatcher.data(), &FolderWatcher::pathChanged,
|
connect(_folderWatcher.data(), &FolderWatcher::pathChanged,
|
||||||
this, &Folder::slotWatchedPathChanged);
|
this, &Folder::slotWatchedPathChanged);
|
||||||
connect(_folderWatcher.data(), &FolderWatcher::lostChanges,
|
connect(_folderWatcher.data(), &FolderWatcher::lostChanges,
|
||||||
this, &Folder::slotNextSyncFullLocalDiscovery);
|
this, &Folder::slotNextSyncFullLocalDiscovery);
|
||||||
|
connect(_folderWatcher.data(), &FolderWatcher::becameUnreliable,
|
||||||
|
this, &Folder::slotWatcherUnreliable);
|
||||||
|
_folderWatcher->init(path());
|
||||||
}
|
}
|
||||||
|
|
||||||
void Folder::slotAboutToRemoveAllFiles(SyncFileItem::Direction dir, bool *cancel)
|
void Folder::slotAboutToRemoveAllFiles(SyncFileItem::Direction dir, bool *cancel)
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ class FolderDefinition
|
|||||||
public:
|
public:
|
||||||
FolderDefinition()
|
FolderDefinition()
|
||||||
: paused(false)
|
: paused(false)
|
||||||
, ignoreHiddenFiles(true)
|
, ignoreHiddenFiles(false)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -325,6 +325,9 @@ private slots:
|
|||||||
/** Warn users if they create a file or folder that is selective-sync excluded */
|
/** Warn users if they create a file or folder that is selective-sync excluded */
|
||||||
void warnOnNewExcludedItem(const SyncJournalFileRecord &record, const QStringRef &path);
|
void warnOnNewExcludedItem(const SyncJournalFileRecord &record, const QStringRef &path);
|
||||||
|
|
||||||
|
/** Warn users about an unreliable folder watcher */
|
||||||
|
void slotWatcherUnreliable(const QString &message);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool reloadExcludes();
|
bool reloadExcludes();
|
||||||
|
|
||||||
|
|||||||
@@ -1372,8 +1372,10 @@ QString FolderMan::findGoodPathForNewSyncFolder(const QString &basePath, const Q
|
|||||||
bool FolderMan::ignoreHiddenFiles() const
|
bool FolderMan::ignoreHiddenFiles() const
|
||||||
{
|
{
|
||||||
if (_folderMap.empty()) {
|
if (_folderMap.empty()) {
|
||||||
return true;
|
// Currently no folders in the manager -> return default
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
// Since the hiddenFiles settings is the same for all folders, just return the settings of the first folder
|
||||||
return _folderMap.begin().value()->ignoreHiddenFiles();
|
return _folderMap.begin().value()->ignoreHiddenFiles();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -38,19 +38,22 @@ namespace OCC {
|
|||||||
|
|
||||||
Q_LOGGING_CATEGORY(lcFolderWatcher, "nextcloud.gui.folderwatcher", QtInfoMsg)
|
Q_LOGGING_CATEGORY(lcFolderWatcher, "nextcloud.gui.folderwatcher", QtInfoMsg)
|
||||||
|
|
||||||
FolderWatcher::FolderWatcher(const QString &root, Folder *folder)
|
FolderWatcher::FolderWatcher(Folder *folder)
|
||||||
: QObject(folder)
|
: QObject(folder)
|
||||||
, _folder(folder)
|
, _folder(folder)
|
||||||
{
|
{
|
||||||
_d.reset(new FolderWatcherPrivate(this, root));
|
|
||||||
|
|
||||||
_timer.start();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FolderWatcher::~FolderWatcher()
|
FolderWatcher::~FolderWatcher()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FolderWatcher::init(const QString &root)
|
||||||
|
{
|
||||||
|
_d.reset(new FolderWatcherPrivate(this, root));
|
||||||
|
_timer.start();
|
||||||
|
}
|
||||||
|
|
||||||
bool FolderWatcher::pathIsIgnored(const QString &path)
|
bool FolderWatcher::pathIsIgnored(const QString &path)
|
||||||
{
|
{
|
||||||
if (path.isEmpty())
|
if (path.isEmpty())
|
||||||
|
|||||||
@@ -55,11 +55,14 @@ class FolderWatcher : public QObject
|
|||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
|
// Construct, connect signals, call init()
|
||||||
|
explicit FolderWatcher(Folder *folder = 0L);
|
||||||
|
virtual ~FolderWatcher();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param root Path of the root of the folder
|
* @param root Path of the root of the folder
|
||||||
*/
|
*/
|
||||||
FolderWatcher(const QString &root, Folder *folder = 0L);
|
void init(const QString &root);
|
||||||
virtual ~FolderWatcher();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Not all backends are recursive by default.
|
* Not all backends are recursive by default.
|
||||||
@@ -96,6 +99,12 @@ signals:
|
|||||||
*/
|
*/
|
||||||
void lostChanges();
|
void lostChanges();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Signals when the watcher became unreliable. The string is a translated
|
||||||
|
* message that can be shown to users.
|
||||||
|
*/
|
||||||
|
void becameUnreliable(const QString &message);
|
||||||
|
|
||||||
protected slots:
|
protected slots:
|
||||||
// called from the implementations to indicate a change in path
|
// called from the implementations to indicate a change in path
|
||||||
void changeDetected(const QString &path);
|
void changeDetected(const QString &path);
|
||||||
|
|||||||
@@ -81,8 +81,11 @@ void FolderWatcherPrivate::inotifyRegisterPath(const QString &path)
|
|||||||
} else {
|
} else {
|
||||||
// If we're running out of memory or inotify watches, become
|
// If we're running out of memory or inotify watches, become
|
||||||
// unreliable.
|
// unreliable.
|
||||||
if (errno == ENOMEM || errno == ENOSPC) {
|
if (_parent->_isReliable && (errno == ENOMEM || errno == ENOSPC)) {
|
||||||
_parent->_isReliable = false;
|
_parent->_isReliable = false;
|
||||||
|
emit _parent->becameUnreliable(
|
||||||
|
tr("This problem usually happens when the inotify watches are exhausted. "
|
||||||
|
"Check the FAQ for details."));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,11 +20,10 @@
|
|||||||
|
|
||||||
namespace OCC {
|
namespace OCC {
|
||||||
|
|
||||||
Q_DECLARE_LOGGING_CATEGORY(lcNotifications)
|
Q_LOGGING_CATEGORY(lcNotificationsJob, "nextcloud.gui.notifications", QtInfoMsg)
|
||||||
|
|
||||||
NotificationConfirmJob::NotificationConfirmJob(AccountPtr account)
|
NotificationConfirmJob::NotificationConfirmJob(AccountPtr account)
|
||||||
: AbstractNetworkJob(account, "")
|
: AbstractNetworkJob(account, "")
|
||||||
, _widget(0)
|
|
||||||
{
|
{
|
||||||
setIgnoreCredentialFailure(true);
|
setIgnoreCredentialFailure(true);
|
||||||
}
|
}
|
||||||
@@ -35,20 +34,10 @@ void NotificationConfirmJob::setLinkAndVerb(const QUrl &link, const QByteArray &
|
|||||||
_verb = verb;
|
_verb = verb;
|
||||||
}
|
}
|
||||||
|
|
||||||
void NotificationConfirmJob::setWidget(NotificationWidget *widget)
|
|
||||||
{
|
|
||||||
_widget = widget;
|
|
||||||
}
|
|
||||||
|
|
||||||
NotificationWidget *NotificationConfirmJob::widget()
|
|
||||||
{
|
|
||||||
return _widget;
|
|
||||||
}
|
|
||||||
|
|
||||||
void NotificationConfirmJob::start()
|
void NotificationConfirmJob::start()
|
||||||
{
|
{
|
||||||
if (!_link.isValid()) {
|
if (!_link.isValid()) {
|
||||||
qCWarning(lcNotifications) << "Attempt to trigger invalid URL: " << _link.toString();
|
qCWarning(lcNotificationsJob) << "Attempt to trigger invalid URL: " << _link.toString();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
QNetworkRequest req;
|
QNetworkRequest req;
|
||||||
|
|||||||
@@ -25,8 +25,6 @@
|
|||||||
|
|
||||||
namespace OCC {
|
namespace OCC {
|
||||||
|
|
||||||
class NotificationWidget;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief The NotificationConfirmJob class
|
* @brief The NotificationConfirmJob class
|
||||||
* @ingroup gui
|
* @ingroup gui
|
||||||
@@ -54,20 +52,6 @@ public:
|
|||||||
*/
|
*/
|
||||||
void start() Q_DECL_OVERRIDE;
|
void start() Q_DECL_OVERRIDE;
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief setWidget stores the associated widget to be able to use
|
|
||||||
* it when the job has finished
|
|
||||||
* @param widget pointer to the notification widget to store
|
|
||||||
*/
|
|
||||||
void setWidget(NotificationWidget *widget);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief widget - get the associated notification widget as stored
|
|
||||||
* with setWidget method.
|
|
||||||
* @return widget pointer to the notification widget
|
|
||||||
*/
|
|
||||||
NotificationWidget *widget();
|
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -83,7 +67,6 @@ private slots:
|
|||||||
private:
|
private:
|
||||||
QByteArray _verb;
|
QByteArray _verb;
|
||||||
QUrl _link;
|
QUrl _link;
|
||||||
NotificationWidget *_widget;
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,169 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) by Klaas Freitag <freitag@owncloud.com>
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
||||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
* for more details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "notificationwidget.h"
|
|
||||||
#include "QProgressIndicator.h"
|
|
||||||
#include "common/utility.h"
|
|
||||||
#include "common/asserts.h"
|
|
||||||
#include "guiutility.h"
|
|
||||||
|
|
||||||
#include <QPushButton>
|
|
||||||
|
|
||||||
#include "ocsjob.h"
|
|
||||||
|
|
||||||
namespace OCC {
|
|
||||||
|
|
||||||
Q_LOGGING_CATEGORY(lcNotifications, "nextcloud.gui.notifications", QtInfoMsg)
|
|
||||||
|
|
||||||
NotificationWidget::NotificationWidget(QWidget *parent)
|
|
||||||
: QWidget(parent)
|
|
||||||
{
|
|
||||||
_ui.setupUi(this);
|
|
||||||
_progressIndi = new QProgressIndicator(this);
|
|
||||||
_ui.horizontalLayout->addWidget(_progressIndi);
|
|
||||||
}
|
|
||||||
|
|
||||||
void NotificationWidget::setActivity(const Activity &activity)
|
|
||||||
{
|
|
||||||
_myActivity = activity;
|
|
||||||
|
|
||||||
_accountName = activity._accName;
|
|
||||||
ASSERT(!_accountName.isEmpty());
|
|
||||||
|
|
||||||
_ui._subjectLabel->setVisible(!activity._subject.isEmpty());
|
|
||||||
_ui._messageLabel->setVisible(!activity._message.isEmpty());
|
|
||||||
|
|
||||||
_ui._subjectLabel->setText(activity._subject);
|
|
||||||
_ui._messageLabel->setText(activity._message);
|
|
||||||
|
|
||||||
_ui._notifIcon->setPixmap(QPixmap(":/client/resources/bell.svg"));
|
|
||||||
_ui._notifIcon->setMinimumWidth(22);
|
|
||||||
_ui._notifIcon->setMinimumHeight(22);
|
|
||||||
_ui._notifIcon->show();
|
|
||||||
|
|
||||||
QString tText = tr("%1").arg(Utility::timeAgoInWords(activity._dateTime));
|
|
||||||
_ui._timeLabel->setText(tText);
|
|
||||||
|
|
||||||
// always remove the buttons
|
|
||||||
foreach (auto button, _ui._buttonBox->buttons()) {
|
|
||||||
_ui._buttonBox->removeButton(button);
|
|
||||||
}
|
|
||||||
_buttons.clear();
|
|
||||||
|
|
||||||
// open the notification in the browser if there is a link
|
|
||||||
if(!_myActivity._link.isEmpty()){
|
|
||||||
QString buttonText(tr("More information"));
|
|
||||||
QPushButton *openBrowser = _ui._buttonBox->addButton(buttonText, QDialogButtonBox::AcceptRole);
|
|
||||||
openBrowser->setDefault(true);
|
|
||||||
connect(openBrowser, &QAbstractButton::clicked, this, &NotificationWidget::slotOpenBrowserButtonClicked);
|
|
||||||
_buttons.prepend(openBrowser);
|
|
||||||
}
|
|
||||||
|
|
||||||
// display buttons for the links
|
|
||||||
if (activity._links.isEmpty()) {
|
|
||||||
// is there any case where this code is executed?
|
|
||||||
// in case there is no action defined, do a close button.
|
|
||||||
QPushButton *b = _ui._buttonBox->addButton(QDialogButtonBox::Close);
|
|
||||||
b->setDefault(true);
|
|
||||||
connect(b, &QAbstractButton::clicked, this, &NotificationWidget::slotButtonClicked);
|
|
||||||
_buttons.append(b);
|
|
||||||
} else {
|
|
||||||
foreach (auto link, activity._links) {
|
|
||||||
QPushButton *b = _ui._buttonBox->addButton(link._label, QDialogButtonBox::AcceptRole);
|
|
||||||
b->setDefault(link._isPrimary);
|
|
||||||
connect(b, &QAbstractButton::clicked, this, &NotificationWidget::slotButtonClicked);
|
|
||||||
_buttons.append(b);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Activity NotificationWidget::activity() const
|
|
||||||
{
|
|
||||||
return _myActivity;
|
|
||||||
}
|
|
||||||
|
|
||||||
void NotificationWidget::slotOpenBrowserButtonClicked(){
|
|
||||||
QUrl url(_myActivity._link);
|
|
||||||
Utility::openBrowser(url, this);
|
|
||||||
}
|
|
||||||
|
|
||||||
void NotificationWidget::slotButtonClicked()
|
|
||||||
{
|
|
||||||
QObject *buttonWidget = QObject::sender();
|
|
||||||
int index = -1;
|
|
||||||
if (buttonWidget) {
|
|
||||||
// find the button that was clicked, it has to be in the list
|
|
||||||
// of buttons that were added to the button box before.
|
|
||||||
for (int i = 0; i < _buttons.count(); i++) {
|
|
||||||
if (_buttons.at(i) == buttonWidget) {
|
|
||||||
index = i;
|
|
||||||
}
|
|
||||||
_buttons.at(i)->setEnabled(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
// there is an extra button: 'Open'
|
|
||||||
if(!_myActivity._link.isEmpty())
|
|
||||||
index--;
|
|
||||||
|
|
||||||
// if the button was found, the link must be called
|
|
||||||
if (index > -1 && _myActivity._links.count() == 0) {
|
|
||||||
// no links, that means it was the close button
|
|
||||||
// empty link. Just close and remove the widget.
|
|
||||||
QString doneText = tr("Closing in a few seconds...");
|
|
||||||
_ui._timeLabel->setText(doneText);
|
|
||||||
emit requestCleanupAndBlacklist(_myActivity);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (index > -1 && index < _myActivity._links.count()) {
|
|
||||||
ActivityLink triggeredLink = _myActivity._links.at(index);
|
|
||||||
_actionLabel = triggeredLink._label;
|
|
||||||
|
|
||||||
if (!triggeredLink._link.isEmpty()) {
|
|
||||||
qCInfo(lcNotifications) << "Notification Link: " << triggeredLink._verb << triggeredLink._link;
|
|
||||||
_progressIndi->startAnimation();
|
|
||||||
emit sendNotificationRequest(_accountName, triggeredLink._link, triggeredLink._verb);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void NotificationWidget::slotNotificationRequestFinished(int statusCode)
|
|
||||||
{
|
|
||||||
int i = 0;
|
|
||||||
QString doneText;
|
|
||||||
QLocale locale;
|
|
||||||
|
|
||||||
QString timeStr = locale.toString(QTime::currentTime());
|
|
||||||
|
|
||||||
// the ocs API returns stat code 100 or 200 inside the xml if it succeeded.
|
|
||||||
if (statusCode != OCS_SUCCESS_STATUS_CODE && statusCode != OCS_SUCCESS_STATUS_CODE_V2) {
|
|
||||||
qCWarning(lcNotifications) << "Notification Request to Server failed, leave button visible.";
|
|
||||||
for (i = 0; i < _buttons.count(); i++) {
|
|
||||||
_buttons.at(i)->setEnabled(true);
|
|
||||||
}
|
|
||||||
//: The second parameter is a time, such as 'failed at 09:58pm'
|
|
||||||
doneText = tr("%1 request failed at %2").arg(_actionLabel, timeStr);
|
|
||||||
} else {
|
|
||||||
// the call to the ocs API succeeded.
|
|
||||||
_ui._buttonBox->hide();
|
|
||||||
|
|
||||||
//: The second parameter is a time, such as 'selected at 09:58pm'
|
|
||||||
doneText = tr("'%1' selected at %2").arg(_actionLabel, timeStr);
|
|
||||||
}
|
|
||||||
_ui._timeLabel->setText(doneText);
|
|
||||||
|
|
||||||
_progressIndi->stopAnimation();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) by Klaas Freitag <freitag@owncloud.com>
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
||||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
* for more details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef NOTIFICATIONWIDGET_H
|
|
||||||
#define NOTIFICATIONWIDGET_H
|
|
||||||
|
|
||||||
#include <QWidget>
|
|
||||||
|
|
||||||
#include "activitydata.h"
|
|
||||||
|
|
||||||
#include "ui_notificationwidget.h"
|
|
||||||
|
|
||||||
#define NOTIFICATION_WIDGET_CLOSE_AFTER_MILLISECS 4800
|
|
||||||
|
|
||||||
class QProgressIndicator;
|
|
||||||
|
|
||||||
namespace OCC {
|
|
||||||
|
|
||||||
class NotificationWidget : public QWidget
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
explicit NotificationWidget(QWidget *parent = 0);
|
|
||||||
|
|
||||||
bool readyToClose();
|
|
||||||
Activity activity() const;
|
|
||||||
|
|
||||||
signals:
|
|
||||||
void sendNotificationRequest(const QString &, const QString &link, const QByteArray &verb);
|
|
||||||
void requestCleanupAndBlacklist(const Activity &activity);
|
|
||||||
|
|
||||||
public slots:
|
|
||||||
void setActivity(const Activity &activity);
|
|
||||||
void slotNotificationRequestFinished(int statusCode);
|
|
||||||
|
|
||||||
private slots:
|
|
||||||
void slotButtonClicked();
|
|
||||||
void slotOpenBrowserButtonClicked();
|
|
||||||
|
|
||||||
private:
|
|
||||||
Ui_NotificationWidget _ui;
|
|
||||||
Activity _myActivity;
|
|
||||||
QList<QPushButton *> _buttons;
|
|
||||||
QString _accountName;
|
|
||||||
QProgressIndicator *_progressIndi;
|
|
||||||
QString _actionLabel;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // NOTIFICATIONWIDGET_H
|
|
||||||
@@ -1,185 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<ui version="4.0">
|
|
||||||
<class>NotificationWidget</class>
|
|
||||||
<widget class="QWidget" name="NotificationWidget">
|
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>0</x>
|
|
||||||
<y>0</y>
|
|
||||||
<width>725</width>
|
|
||||||
<height>129</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="windowTitle">
|
|
||||||
<string>Form</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QGridLayout" name="gridLayout">
|
|
||||||
<property name="sizeConstraint">
|
|
||||||
<enum>QLayout::SetMaximumSize</enum>
|
|
||||||
</property>
|
|
||||||
<property name="leftMargin">
|
|
||||||
<number>24</number>
|
|
||||||
</property>
|
|
||||||
<property name="topMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="rightMargin">
|
|
||||||
<number>26</number>
|
|
||||||
</property>
|
|
||||||
<property name="bottomMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="horizontalSpacing">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="verticalSpacing">
|
|
||||||
<number>2</number>
|
|
||||||
</property>
|
|
||||||
<item row="0" column="1">
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout">
|
|
||||||
<property name="spacing">
|
|
||||||
<number>6</number>
|
|
||||||
</property>
|
|
||||||
<property name="topMargin">
|
|
||||||
<number>5</number>
|
|
||||||
</property>
|
|
||||||
<property name="bottomMargin">
|
|
||||||
<number>5</number>
|
|
||||||
</property>
|
|
||||||
<item>
|
|
||||||
<layout class="QHBoxLayout" name="labelsHorizontalLayout" stretch="1,1">
|
|
||||||
<property name="spacing">
|
|
||||||
<number>6</number>
|
|
||||||
</property>
|
|
||||||
<property name="topMargin">
|
|
||||||
<number>6</number>
|
|
||||||
</property>
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="_notifIcon">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="lineWidth">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
<property name="pixmap">
|
|
||||||
<pixmap>../../resources/bell.svg</pixmap>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft</set>
|
|
||||||
</property>
|
|
||||||
<property name="margin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="_subjectLabel">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Lorem ipsum dolor sit amet</string>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="_messageLabel">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod temporm </string>
|
|
||||||
</property>
|
|
||||||
<property name="scaledContents">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
|
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="margin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="indent">
|
|
||||||
<number>28</number>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
|
||||||
<property name="spacing">
|
|
||||||
<number>6</number>
|
|
||||||
</property>
|
|
||||||
<item>
|
|
||||||
<spacer name="horizontalSpacer">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeType">
|
|
||||||
<enum>QSizePolicy::Preferred</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>28</width>
|
|
||||||
<height>20</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="_timeLabel">
|
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<pointsize>8</pointsize>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>TextLabel</string>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QDialogButtonBox" name="_buttonBox">
|
|
||||||
<property name="standardButtons">
|
|
||||||
<set>QDialogButtonBox::Ok</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
<resources/>
|
|
||||||
<connections/>
|
|
||||||
</ui>
|
|
||||||
@@ -58,26 +58,20 @@
|
|||||||
namespace OCC {
|
namespace OCC {
|
||||||
|
|
||||||
const char propertyAccountC[] = "oc_account";
|
const char propertyAccountC[] = "oc_account";
|
||||||
const char propertyMenuC[] = "oc_account_menu";
|
|
||||||
|
|
||||||
ownCloudGui::ownCloudGui(Application *parent)
|
ownCloudGui::ownCloudGui(Application *parent)
|
||||||
: QObject(parent)
|
: QObject(parent)
|
||||||
, _tray(0)
|
, _tray(0)
|
||||||
,
|
|
||||||
#if defined(Q_OS_MAC)
|
#if defined(Q_OS_MAC)
|
||||||
_settingsDialog(new SettingsDialogMac(this))
|
, _settingsDialog(new SettingsDialogMac(this))
|
||||||
,
|
|
||||||
#else
|
#else
|
||||||
_settingsDialog(new SettingsDialog(this))
|
, _settingsDialog(new SettingsDialog(this))
|
||||||
,
|
|
||||||
#endif
|
#endif
|
||||||
_logBrowser(0)
|
, _logBrowser(0)
|
||||||
, _contextMenuVisibleOsx(false)
|
|
||||||
#ifdef WITH_LIBCLOUDPROVIDERS
|
#ifdef WITH_LIBCLOUDPROVIDERS
|
||||||
, _bus(QDBusConnection::sessionBus())
|
, _bus(QDBusConnection::sessionBus())
|
||||||
#endif
|
#endif
|
||||||
, _recentActionsMenu(0)
|
, _recentActionsMenu(0)
|
||||||
, _qdbusmenuWorkaround(false)
|
|
||||||
, _app(parent)
|
, _app(parent)
|
||||||
{
|
{
|
||||||
_tray = new Systray();
|
_tray = new Systray();
|
||||||
@@ -155,7 +149,7 @@ void ownCloudGui::slotOpenSettingsDialog()
|
|||||||
|
|
||||||
void ownCloudGui::slotTrayClicked(QSystemTrayIcon::ActivationReason reason)
|
void ownCloudGui::slotTrayClicked(QSystemTrayIcon::ActivationReason reason)
|
||||||
{
|
{
|
||||||
if (_qdbusmenuWorkaround) {
|
if (_workaroundFakeDoubleClick) {
|
||||||
static QElapsedTimer last_click;
|
static QElapsedTimer last_click;
|
||||||
if (last_click.isValid() && last_click.elapsed() < 200) {
|
if (last_click.isValid() && last_click.elapsed() < 200) {
|
||||||
return;
|
return;
|
||||||
@@ -416,7 +410,7 @@ void ownCloudGui::addAccountContextMenu(AccountStatePtr accountState, QMenu *men
|
|||||||
menu->addSeparator();
|
menu->addSeparator();
|
||||||
if (separateMenu) {
|
if (separateMenu) {
|
||||||
if (onePaused) {
|
if (onePaused) {
|
||||||
QAction *enable = menu->addAction(tr("Unpause all folders"));
|
QAction *enable = menu->addAction(tr("Resume all folders"));
|
||||||
enable->setProperty(propertyAccountC, QVariant::fromValue(accountState));
|
enable->setProperty(propertyAccountC, QVariant::fromValue(accountState));
|
||||||
connect(enable, &QAction::triggered, this, &ownCloudGui::slotUnpauseAllFolders);
|
connect(enable, &QAction::triggered, this, &ownCloudGui::slotUnpauseAllFolders);
|
||||||
}
|
}
|
||||||
@@ -440,17 +434,19 @@ void ownCloudGui::addAccountContextMenu(AccountStatePtr accountState, QMenu *men
|
|||||||
|
|
||||||
void ownCloudGui::slotContextMenuAboutToShow()
|
void ownCloudGui::slotContextMenuAboutToShow()
|
||||||
{
|
{
|
||||||
// For some reason on OS X _contextMenu->isVisible returns always false
|
_contextMenuVisibleManual = true;
|
||||||
_contextMenuVisibleOsx = true;
|
|
||||||
|
|
||||||
// Update icon in sys tray, as it might change depending on the context menu state
|
// Update icon in sys tray, as it might change depending on the context menu state
|
||||||
slotComputeOverallSyncStatus();
|
slotComputeOverallSyncStatus();
|
||||||
|
|
||||||
|
if (!_workaroundNoAboutToShowUpdate) {
|
||||||
|
updateContextMenu();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ownCloudGui::slotContextMenuAboutToHide()
|
void ownCloudGui::slotContextMenuAboutToHide()
|
||||||
{
|
{
|
||||||
// For some reason on OS X _contextMenu->isVisible returns always false
|
_contextMenuVisibleManual = false;
|
||||||
_contextMenuVisibleOsx = false;
|
|
||||||
|
|
||||||
// Update icon in sys tray, as it might change depending on the context menu state
|
// Update icon in sys tray, as it might change depending on the context menu state
|
||||||
slotComputeOverallSyncStatus();
|
slotComputeOverallSyncStatus();
|
||||||
@@ -458,11 +454,11 @@ void ownCloudGui::slotContextMenuAboutToHide()
|
|||||||
|
|
||||||
bool ownCloudGui::contextMenuVisible() const
|
bool ownCloudGui::contextMenuVisible() const
|
||||||
{
|
{
|
||||||
#ifdef Q_OS_MAC
|
// On some platforms isVisible doesn't work and always returns false,
|
||||||
return _contextMenuVisibleOsx;
|
// elsewhere aboutToHide is unreliable.
|
||||||
#else
|
if (_workaroundManualVisibility)
|
||||||
|
return _contextMenuVisibleManual;
|
||||||
return _contextMenu->isVisible();
|
return _contextMenu->isVisible();
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool minimalTrayMenu()
|
static bool minimalTrayMenu()
|
||||||
@@ -485,12 +481,36 @@ static bool updateWhileVisible()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static QByteArray forceQDBusTrayWorkaround()
|
static QByteArray envForceQDBusTrayWorkaround()
|
||||||
{
|
{
|
||||||
static QByteArray var = qgetenv("OWNCLOUD_FORCE_QDBUS_TRAY_WORKAROUND");
|
static QByteArray var = qgetenv("OWNCLOUD_FORCE_QDBUS_TRAY_WORKAROUND");
|
||||||
return var;
|
return var;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static QByteArray envForceWorkaroundShowAndHideTray()
|
||||||
|
{
|
||||||
|
static QByteArray var = qgetenv("OWNCLOUD_FORCE_TRAY_SHOW_HIDE");
|
||||||
|
return var;
|
||||||
|
}
|
||||||
|
|
||||||
|
static QByteArray envForceWorkaroundNoAboutToShowUpdate()
|
||||||
|
{
|
||||||
|
static QByteArray var = qgetenv("OWNCLOUD_FORCE_TRAY_NO_ABOUT_TO_SHOW");
|
||||||
|
return var;
|
||||||
|
}
|
||||||
|
|
||||||
|
static QByteArray envForceWorkaroundFakeDoubleClick()
|
||||||
|
{
|
||||||
|
static QByteArray var = qgetenv("OWNCLOUD_FORCE_TRAY_FAKE_DOUBLE_CLICK");
|
||||||
|
return var;
|
||||||
|
}
|
||||||
|
|
||||||
|
static QByteArray envForceWorkaroundManualVisibility()
|
||||||
|
{
|
||||||
|
static QByteArray var = qgetenv("OWNCLOUD_FORCE_TRAY_MANUAL_VISIBILITY");
|
||||||
|
return var;
|
||||||
|
}
|
||||||
|
|
||||||
void ownCloudGui::setupContextMenu()
|
void ownCloudGui::setupContextMenu()
|
||||||
{
|
{
|
||||||
if (_contextMenu) {
|
if (_contextMenu) {
|
||||||
@@ -513,51 +533,65 @@ void ownCloudGui::setupContextMenu()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Enables workarounds for bugs introduced in Qt 5.5.0
|
auto applyEnvVariable = [](bool *sw, const QByteArray &value) {
|
||||||
// In particular QTBUG-47863 #3672 (tray menu fails to update and
|
if (value == "1")
|
||||||
// becomes unresponsive) and QTBUG-48068 #3722 (click signal is
|
*sw = true;
|
||||||
// emitted several times)
|
if (value == "0")
|
||||||
// The Qt version check intentionally uses 5.0.0 (where platformMenu()
|
*sw = false;
|
||||||
// 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;
|
|
||||||
qCWarning(lcApplication) << "Enabled QDBusPlatformMenu workaround";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (forceQDBusTrayWorkaround() == "1") {
|
// This is an old compound flag that people might still depend on
|
||||||
_qdbusmenuWorkaround = true;
|
bool qdbusmenuWorkarounds = false;
|
||||||
} else if (forceQDBusTrayWorkaround() == "0") {
|
applyEnvVariable(&qdbusmenuWorkarounds, envForceQDBusTrayWorkaround());
|
||||||
_qdbusmenuWorkaround = false;
|
if (qdbusmenuWorkarounds) {
|
||||||
|
_workaroundFakeDoubleClick = true;
|
||||||
|
_workaroundNoAboutToShowUpdate = true;
|
||||||
|
_workaroundShowAndHideTray = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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, &QTimer::timeout, this, &ownCloudGui::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
|
#ifdef Q_OS_MAC
|
||||||
// https://bugreports.qt.io/browse/QTBUG-54633
|
// https://bugreports.qt.io/browse/QTBUG-54633
|
||||||
connect(_contextMenu.data(), SIGNAL(aboutToShow()), SLOT(slotContextMenuAboutToShow()));
|
_workaroundNoAboutToShowUpdate = true;
|
||||||
connect(_contextMenu.data(), SIGNAL(aboutToHide()), SLOT(slotContextMenuAboutToHide()));
|
_workaroundManualVisibility = true;
|
||||||
#else
|
|
||||||
connect(_contextMenu.data(), &QMenu::aboutToShow, this, &ownCloudGui::updateContextMenu);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef Q_OS_LINUX
|
||||||
|
// For KDE sessions if the platform plugin is missing,
|
||||||
|
// neither aboutToShow() updates nor the isVisible() call
|
||||||
|
// work. At least aboutToHide is reliable.
|
||||||
|
// https://github.com/owncloud/client/issues/6545
|
||||||
|
static QByteArray xdgCurrentDesktop = qgetenv("XDG_CURRENT_DESKTOP");
|
||||||
|
static QByteArray desktopSession = qgetenv("DESKTOP_SESSION");
|
||||||
|
bool isKde =
|
||||||
|
xdgCurrentDesktop.contains("KDE")
|
||||||
|
|| desktopSession.contains("plasma")
|
||||||
|
|| desktopSession.contains("kde");
|
||||||
|
QObject *platformMenu = reinterpret_cast<QObject *>(_tray->contextMenu()->platformMenu());
|
||||||
|
if (isKde && platformMenu && platformMenu->metaObject()->className() == QLatin1String("QDBusPlatformMenu")) {
|
||||||
|
_workaroundManualVisibility = true;
|
||||||
|
_workaroundNoAboutToShowUpdate = true;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
applyEnvVariable(&_workaroundNoAboutToShowUpdate, envForceWorkaroundNoAboutToShowUpdate());
|
||||||
|
applyEnvVariable(&_workaroundFakeDoubleClick, envForceWorkaroundFakeDoubleClick());
|
||||||
|
applyEnvVariable(&_workaroundShowAndHideTray, envForceWorkaroundShowAndHideTray());
|
||||||
|
applyEnvVariable(&_workaroundManualVisibility, envForceWorkaroundManualVisibility());
|
||||||
|
|
||||||
|
qCInfo(lcApplication) << "Tray menu workarounds:"
|
||||||
|
<< "noabouttoshow:" << _workaroundNoAboutToShowUpdate
|
||||||
|
<< "fakedoubleclick:" << _workaroundFakeDoubleClick
|
||||||
|
<< "showhide:" << _workaroundShowAndHideTray
|
||||||
|
<< "manualvisibility:" << _workaroundManualVisibility;
|
||||||
|
|
||||||
|
|
||||||
|
connect(&_delayedTrayUpdateTimer, &QTimer::timeout, this, &ownCloudGui::updateContextMenu);
|
||||||
|
_delayedTrayUpdateTimer.setInterval(2 * 1000);
|
||||||
|
_delayedTrayUpdateTimer.setSingleShot(true);
|
||||||
|
|
||||||
|
connect(_contextMenu.data(), SIGNAL(aboutToShow()), SLOT(slotContextMenuAboutToShow()));
|
||||||
|
// unfortunately aboutToHide is unreliable, it seems to work on OSX though
|
||||||
|
connect(_contextMenu.data(), SIGNAL(aboutToHide()), SLOT(slotContextMenuAboutToHide()));
|
||||||
|
|
||||||
// Populate the context menu now.
|
// Populate the context menu now.
|
||||||
updateContextMenu();
|
updateContextMenu();
|
||||||
@@ -569,13 +603,21 @@ void ownCloudGui::updateContextMenu()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_qdbusmenuWorkaround) {
|
// If it's visible, we can't update live, and it won't be updated lazily: reschedule
|
||||||
|
if (contextMenuVisible() && !updateWhileVisible() && _workaroundNoAboutToShowUpdate) {
|
||||||
|
if (!_delayedTrayUpdateTimer.isActive()) {
|
||||||
|
_delayedTrayUpdateTimer.start();
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_workaroundShowAndHideTray) {
|
||||||
// To make tray menu updates work with these bugs (see setupContextMenu)
|
// 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
|
// we need to hide and show the tray icon. We don't want to do that
|
||||||
// while it's visible!
|
// while it's visible!
|
||||||
if (contextMenuVisible()) {
|
if (contextMenuVisible()) {
|
||||||
if (!_workaroundBatchTrayUpdate.isActive()) {
|
if (!_delayedTrayUpdateTimer.isActive()) {
|
||||||
_workaroundBatchTrayUpdate.start();
|
_delayedTrayUpdateTimer.start();
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -617,11 +659,11 @@ void ownCloudGui::updateContextMenu()
|
|||||||
_contextMenu->addMenu(accountMenu);
|
_contextMenu->addMenu(accountMenu);
|
||||||
|
|
||||||
addAccountContextMenu(account, accountMenu, true);
|
addAccountContextMenu(account, accountMenu, true);
|
||||||
fetchNavigationApps(account, accountMenu);
|
fetchNavigationApps(account);
|
||||||
}
|
}
|
||||||
} else if (accountList.count() == 1) {
|
} else if (accountList.count() == 1) {
|
||||||
addAccountContextMenu(accountList.first(), _contextMenu.data(), false);
|
addAccountContextMenu(accountList.first(), _contextMenu.data(), false);
|
||||||
fetchNavigationApps(accountList.first(), _contextMenu.data());
|
fetchNavigationApps(accountList.first());
|
||||||
}
|
}
|
||||||
|
|
||||||
_contextMenu->addSeparator();
|
_contextMenu->addSeparator();
|
||||||
@@ -649,9 +691,9 @@ void ownCloudGui::updateContextMenu()
|
|||||||
if (atLeastOnePaused) {
|
if (atLeastOnePaused) {
|
||||||
QString text;
|
QString text;
|
||||||
if (accountList.count() > 1) {
|
if (accountList.count() > 1) {
|
||||||
text = tr("Unpause all synchronization");
|
text = tr("Resume all synchronization");
|
||||||
} else {
|
} else {
|
||||||
text = tr("Unpause synchronization");
|
text = tr("Resume synchronization");
|
||||||
}
|
}
|
||||||
QAction *action = _contextMenu->addAction(text);
|
QAction *action = _contextMenu->addAction(text);
|
||||||
connect(action, &QAction::triggered, this, &ownCloudGui::slotUnpauseAllFolders);
|
connect(action, &QAction::triggered, this, &ownCloudGui::slotUnpauseAllFolders);
|
||||||
@@ -668,35 +710,30 @@ void ownCloudGui::updateContextMenu()
|
|||||||
}
|
}
|
||||||
_contextMenu->addAction(_actionQuit);
|
_contextMenu->addAction(_actionQuit);
|
||||||
|
|
||||||
if (_qdbusmenuWorkaround) {
|
if (_workaroundShowAndHideTray) {
|
||||||
_tray->show();
|
_tray->show();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ownCloudGui::updateContextMenuNeeded()
|
void ownCloudGui::updateContextMenuNeeded()
|
||||||
{
|
{
|
||||||
// For the workaround case updating while visible is impossible. Instead
|
// if it's visible and we can update live: update now
|
||||||
// occasionally update the menu when it's invisible.
|
if (contextMenuVisible() && updateWhileVisible()) {
|
||||||
if (_qdbusmenuWorkaround) {
|
// Note: don't update while visible on OSX
|
||||||
if (!_workaroundBatchTrayUpdate.isActive()) {
|
// https://bugreports.qt.io/browse/QTBUG-54845
|
||||||
_workaroundBatchTrayUpdate.start();
|
updateContextMenu();
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef Q_OS_MAC
|
// if we can't lazily update: update later
|
||||||
// https://bugreports.qt.io/browse/QTBUG-54845
|
if (_workaroundNoAboutToShowUpdate) {
|
||||||
// We cannot update on demand or while visible -> update when invisible.
|
// Note: don't update immediately even in the invisible case
|
||||||
if (!contextMenuVisible()) {
|
// as that can lead to extremely frequent menu updates
|
||||||
updateContextMenu();
|
if (!_delayedTrayUpdateTimer.isActive()) {
|
||||||
|
_delayedTrayUpdateTimer.start();
|
||||||
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
if (updateWhileVisible() && contextMenuVisible())
|
|
||||||
updateContextMenu();
|
|
||||||
#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)
|
void ownCloudGui::slotShowTrayMessage(const QString &title, const QString &msg)
|
||||||
@@ -769,10 +806,9 @@ void ownCloudGui::slotEtagResponseHeaderReceived(const QByteArray &value, int st
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ownCloudGui::fetchNavigationApps(AccountStatePtr account, QMenu *accountMenu){
|
void ownCloudGui::fetchNavigationApps(AccountStatePtr account){
|
||||||
OcsNavigationAppsJob *job = new OcsNavigationAppsJob(account->account());
|
OcsNavigationAppsJob *job = new OcsNavigationAppsJob(account->account());
|
||||||
job->setProperty(propertyAccountC, QVariant::fromValue(account));
|
job->setProperty(propertyAccountC, QVariant::fromValue(account));
|
||||||
job->setProperty(propertyMenuC, QVariant::fromValue(accountMenu));
|
|
||||||
job->addRawHeader("If-None-Match", account->navigationAppsEtagResponseHeader());
|
job->addRawHeader("If-None-Match", account->navigationAppsEtagResponseHeader());
|
||||||
connect(job, &OcsNavigationAppsJob::appsJobFinished, this, &ownCloudGui::slotNavigationAppsFetched);
|
connect(job, &OcsNavigationAppsJob::appsJobFinished, this, &ownCloudGui::slotNavigationAppsFetched);
|
||||||
connect(job, &OcsNavigationAppsJob::etagResponseHeaderReceived, this, &ownCloudGui::slotEtagResponseHeaderReceived);
|
connect(job, &OcsNavigationAppsJob::etagResponseHeaderReceived, this, &ownCloudGui::slotEtagResponseHeaderReceived);
|
||||||
@@ -829,9 +865,18 @@ void ownCloudGui::slotNavigationAppsFetched(const QJsonDocument &reply, int stat
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(QObject *accountMenuObj = qvariant_cast<QObject*>(sender()->property(propertyMenuC))){
|
// TODO see pull #523
|
||||||
if(QMenu *accountMenu = dynamic_cast<QMenu*>(accountMenuObj))
|
auto accountList = AccountManager::instance()->accounts();
|
||||||
buildNavigationAppsMenu(account, accountMenu);
|
if(accountList.size() > 1){
|
||||||
|
// the list of apps will be displayed under the account that it belongs to
|
||||||
|
foreach (QMenu *accountMenu, _accountMenus) {
|
||||||
|
if(accountMenu->title() == account->account()->displayName()){
|
||||||
|
buildNavigationAppsMenu(account, accountMenu);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if(accountList.size() == 1){
|
||||||
|
buildNavigationAppsMenu(account, _contextMenu.data());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -127,7 +127,7 @@ private:
|
|||||||
void setPauseOnAllFoldersHelper(bool pause);
|
void setPauseOnAllFoldersHelper(bool pause);
|
||||||
void setupActions();
|
void setupActions();
|
||||||
void addAccountContextMenu(AccountStatePtr accountState, QMenu *menu, bool separateMenu);
|
void addAccountContextMenu(AccountStatePtr accountState, QMenu *menu, bool separateMenu);
|
||||||
void fetchNavigationApps(AccountStatePtr account, QMenu *accountMenu);
|
void fetchNavigationApps(AccountStatePtr account);
|
||||||
void buildNavigationAppsMenu(AccountStatePtr account, QMenu *accountMenu);
|
void buildNavigationAppsMenu(AccountStatePtr account, QMenu *accountMenu);
|
||||||
|
|
||||||
QPointer<Systray> _tray;
|
QPointer<Systray> _tray;
|
||||||
@@ -140,9 +140,11 @@ private:
|
|||||||
// tray's menu
|
// tray's menu
|
||||||
QScopedPointer<QMenu> _contextMenu;
|
QScopedPointer<QMenu> _contextMenu;
|
||||||
|
|
||||||
// Manually tracking whether the context menu is visible, but only works
|
// Manually tracking whether the context menu is visible via aboutToShow
|
||||||
// on OSX because aboutToHide is not reliable everywhere.
|
// and aboutToHide. Unfortunately aboutToHide isn't reliable everywhere
|
||||||
bool _contextMenuVisibleOsx;
|
// so this only gets used with _workaroundManualVisibility (when the tray's
|
||||||
|
// isVisible() is unreliable)
|
||||||
|
bool _contextMenuVisibleManual = false;
|
||||||
|
|
||||||
#ifdef WITH_LIBCLOUDPROVIDERS
|
#ifdef WITH_LIBCLOUDPROVIDERS
|
||||||
QDBusConnection _bus;
|
QDBusConnection _bus;
|
||||||
@@ -150,8 +152,11 @@ private:
|
|||||||
|
|
||||||
QMenu *_recentActionsMenu;
|
QMenu *_recentActionsMenu;
|
||||||
QVector<QMenu *> _accountMenus;
|
QVector<QMenu *> _accountMenus;
|
||||||
bool _qdbusmenuWorkaround;
|
bool _workaroundShowAndHideTray = false;
|
||||||
QTimer _workaroundBatchTrayUpdate;
|
bool _workaroundNoAboutToShowUpdate = false;
|
||||||
|
bool _workaroundFakeDoubleClick = false;
|
||||||
|
bool _workaroundManualVisibility = false;
|
||||||
|
QTimer _delayedTrayUpdateTimer;
|
||||||
QMap<QString, QPointer<ShareDialog>> _shareDialogs;
|
QMap<QString, QPointer<ShareDialog>> _shareDialogs;
|
||||||
|
|
||||||
QAction *_actionNewAccountWizard;
|
QAction *_actionNewAccountWizard;
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ SettingsDialog::SettingsDialog(ownCloudGui *gui, QWidget *parent)
|
|||||||
accountAdded(ai.data());
|
accountAdded(ai.data());
|
||||||
}
|
}
|
||||||
|
|
||||||
_actionBefore = new QAction;
|
_actionBefore = new QAction(this);
|
||||||
_toolBar->addAction(_actionBefore);
|
_toolBar->addAction(_actionBefore);
|
||||||
|
|
||||||
// Adds space between users + activities and general + network actions
|
// Adds space between users + activities and general + network actions
|
||||||
@@ -244,6 +244,7 @@ void SettingsDialog::accountAdded(AccountState *s)
|
|||||||
_actionGroup->addAction(accountAction);
|
_actionGroup->addAction(accountAction);
|
||||||
_actionGroupWidgets.insert(accountAction, accountSettings);
|
_actionGroupWidgets.insert(accountAction, accountSettings);
|
||||||
_actionForAccount.insert(s->account().data(), accountAction);
|
_actionForAccount.insert(s->account().data(), accountAction);
|
||||||
|
accountAction->trigger();
|
||||||
|
|
||||||
connect(accountSettings, &AccountSettings::folderChanged, _gui, &ownCloudGui::slotFoldersChanged);
|
connect(accountSettings, &AccountSettings::folderChanged, _gui, &ownCloudGui::slotFoldersChanged);
|
||||||
connect(accountSettings, &AccountSettings::openFolderAlias,
|
connect(accountSettings, &AccountSettings::openFolderAlias,
|
||||||
|
|||||||
@@ -44,7 +44,7 @@
|
|||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Horizontal</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="standardButtons">
|
<property name="standardButtons">
|
||||||
<set>QDialogButtonBox::Close</set>
|
<set>QDialogButtonBox::NoButton</set>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
|||||||
@@ -167,6 +167,7 @@ void SettingsDialogMac::accountAdded(AccountState *s)
|
|||||||
_activitySettings[s]->setNotificationRefreshInterval(cfg.notificationRefreshInterval());
|
_activitySettings[s]->setNotificationRefreshInterval(cfg.notificationRefreshInterval());
|
||||||
|
|
||||||
slotRefreshActivity(s);
|
slotRefreshActivity(s);
|
||||||
|
setCurrentPanelIndex(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SettingsDialogMac::accountRemoved(AccountState *s)
|
void SettingsDialogMac::accountRemoved(AccountState *s)
|
||||||
|
|||||||
@@ -58,6 +58,7 @@ ShareLinkWidget::ShareLinkWidget(AccountPtr account,
|
|||||||
, _unshareLinkAction(nullptr)
|
, _unshareLinkAction(nullptr)
|
||||||
{
|
{
|
||||||
_ui->setupUi(this);
|
_ui->setupUi(this);
|
||||||
|
_ui->shareLinkToolButton->hide();
|
||||||
|
|
||||||
//Is this a file or folder?
|
//Is this a file or folder?
|
||||||
QFileInfo fi(localPath);
|
QFileInfo fi(localPath);
|
||||||
@@ -65,20 +66,14 @@ ShareLinkWidget::ShareLinkWidget(AccountPtr account,
|
|||||||
|
|
||||||
// the following progress indicator widgets are added to layouts which makes them
|
// the following progress indicator widgets are added to layouts which makes them
|
||||||
// automatically deleted once the dialog dies.
|
// automatically deleted once the dialog dies.
|
||||||
_pi_create = new QProgressIndicator();
|
_pi_indicator = new QProgressIndicator();
|
||||||
_pi_password = new QProgressIndicator();
|
_ui->horizontalLayout->insertWidget(1, _pi_indicator, Qt::AlignCenter);
|
||||||
_pi_date = new QProgressIndicator();
|
_ui->indicatorWidget->hide();
|
||||||
_pi_editing = new QProgressIndicator();
|
|
||||||
|
|
||||||
// TODO: where to loading should show up?
|
connect(_ui->enableShareLink, &QCheckBox::toggled, this, &ShareLinkWidget::slotCreateOrDeleteShareLink);
|
||||||
// _ui->verticalLayout->addWidget(_pi_create, Qt::AlignCenter);
|
|
||||||
// _ui->verticalLayout->addWidget(_pi_password, Qt::AlignCenter);
|
|
||||||
// _ui->verticalLayout->addWidget(_pi_editing, Qt::AlignCenter);
|
|
||||||
|
|
||||||
connect(_ui->enableShareLink, &QCheckBox::toggled, this, &ShareLinkWidget::slotCreateorDeleteShareLink);
|
|
||||||
connect(_ui->lineEdit_password, &QLineEdit::returnPressed, this, &ShareLinkWidget::slotCreatePassword);
|
connect(_ui->lineEdit_password, &QLineEdit::returnPressed, this, &ShareLinkWidget::slotCreatePassword);
|
||||||
connect(_ui->confirmPassword, &QAbstractButton::clicked, this, &ShareLinkWidget::slotCreatePassword);
|
connect(_ui->confirmPassword, &QAbstractButton::clicked, this, &ShareLinkWidget::slotCreatePassword);
|
||||||
connect(_ui->confirmExpirationDate, &QAbstractButton::clicked, this, &ShareLinkWidget::slotCreatePassword);
|
connect(_ui->confirmExpirationDate, &QAbstractButton::clicked, this, &ShareLinkWidget::slotSetExpireDate);
|
||||||
connect(_ui->calendar, &QDateTimeEdit::dateChanged, this, &ShareLinkWidget::slotExpireDateChanged);
|
connect(_ui->calendar, &QDateTimeEdit::dateChanged, this, &ShareLinkWidget::slotExpireDateChanged);
|
||||||
|
|
||||||
_ui->errorLabel->hide();
|
_ui->errorLabel->hide();
|
||||||
@@ -143,9 +138,19 @@ ShareLinkWidget::~ShareLinkWidget()
|
|||||||
delete _ui;
|
delete _ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ShareLinkWidget::toggleAnimation(bool start){
|
||||||
|
if(start && !_pi_indicator->isAnimated())
|
||||||
|
_pi_indicator->startAnimation();
|
||||||
|
else
|
||||||
|
_pi_indicator->stopAnimation();
|
||||||
|
|
||||||
|
_ui->indicatorWidget->setVisible(start);
|
||||||
|
}
|
||||||
|
|
||||||
void ShareLinkWidget::getShares()
|
void ShareLinkWidget::getShares()
|
||||||
{
|
{
|
||||||
if (_manager) {
|
if (_manager) {
|
||||||
|
toggleAnimation(true);
|
||||||
_manager->fetchShares(_sharePath);
|
_manager->fetchShares(_sharePath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -164,7 +169,7 @@ void ShareLinkWidget::slotSharesFetched(const QList<QSharedPointer<Share>> &shar
|
|||||||
// Connect all shares signals to gui slots
|
// Connect all shares signals to gui slots
|
||||||
connect(share.data(), &Share::serverError, this, &ShareLinkWidget::slotServerError);
|
connect(share.data(), &Share::serverError, this, &ShareLinkWidget::slotServerError);
|
||||||
connect(share.data(), &Share::shareDeleted, this, &ShareLinkWidget::slotDeleteShareFetched);
|
connect(share.data(), &Share::shareDeleted, this, &ShareLinkWidget::slotDeleteShareFetched);
|
||||||
//TODO connect(_linkShare.data(), &LinkShare::expireDateSet, this, &ShareLinkWidget::slotExpireSet);
|
connect(_linkShare.data(), &LinkShare::expireDateSet, this, &ShareLinkWidget::slotExpireDateSet);
|
||||||
connect(_linkShare.data(), &LinkShare::passwordSet, this, &ShareLinkWidget::slotPasswordSet);
|
connect(_linkShare.data(), &LinkShare::passwordSet, this, &ShareLinkWidget::slotPasswordSet);
|
||||||
connect(_linkShare.data(), &LinkShare::passwordSetError, this, &ShareLinkWidget::slotPasswordSetError);
|
connect(_linkShare.data(), &LinkShare::passwordSetError, this, &ShareLinkWidget::slotPasswordSetError);
|
||||||
|
|
||||||
@@ -173,12 +178,15 @@ void ShareLinkWidget::slotSharesFetched(const QList<QSharedPointer<Share>> &shar
|
|||||||
SharePermissions perm = _linkShare->getPermissions();
|
SharePermissions perm = _linkShare->getPermissions();
|
||||||
QActionGroup *permissionsGroup = new QActionGroup(this);
|
QActionGroup *permissionsGroup = new QActionGroup(this);
|
||||||
|
|
||||||
|
// Prepare sharing menu
|
||||||
|
_linkContextMenu = new QMenu(this);
|
||||||
|
|
||||||
// radio button style
|
// radio button style
|
||||||
permissionsGroup->setExclusive(true);
|
permissionsGroup->setExclusive(true);
|
||||||
|
|
||||||
if(_isFile){
|
if(_isFile){
|
||||||
checked = perm & (SharePermissionRead & SharePermissionUpdate);
|
checked = perm & (SharePermissionRead & SharePermissionUpdate);
|
||||||
_allowEditingLinkAction = permissionsGroup->addAction(tr("Allow Editing"));
|
_allowEditingLinkAction = _linkContextMenu->addAction(tr("Allow Editing"));
|
||||||
_allowEditingLinkAction->setCheckable(true);
|
_allowEditingLinkAction->setCheckable(true);
|
||||||
_allowEditingLinkAction->setChecked(checked);
|
_allowEditingLinkAction->setChecked(checked);
|
||||||
|
|
||||||
@@ -202,9 +210,6 @@ void ShareLinkWidget::slotSharesFetched(const QList<QSharedPointer<Share>> &shar
|
|||||||
_allowUploadLinkAction->setChecked(checked);
|
_allowUploadLinkAction->setChecked(checked);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Prepare sharing menu
|
|
||||||
_linkContextMenu = new QMenu(this);
|
|
||||||
|
|
||||||
// Add copy action (icon only)
|
// Add copy action (icon only)
|
||||||
_copyLinkAction = _linkContextMenu->addAction(QIcon(":/client/resources/copy.svg"),
|
_copyLinkAction = _linkContextMenu->addAction(QIcon(":/client/resources/copy.svg"),
|
||||||
tr("Copy link"));
|
tr("Copy link"));
|
||||||
@@ -240,6 +245,7 @@ void ShareLinkWidget::slotSharesFetched(const QList<QSharedPointer<Share>> &shar
|
|||||||
_expirationDateLinkAction = _linkContextMenu->addAction(tr("Expiration Date"));
|
_expirationDateLinkAction = _linkContextMenu->addAction(tr("Expiration Date"));
|
||||||
_expirationDateLinkAction->setCheckable(true);
|
_expirationDateLinkAction->setCheckable(true);
|
||||||
if(_linkShare->getExpireDate().isValid()){
|
if(_linkShare->getExpireDate().isValid()){
|
||||||
|
_ui->calendar->setDate(_linkShare->getExpireDate());
|
||||||
_expirationDateLinkAction->setChecked(true);
|
_expirationDateLinkAction->setChecked(true);
|
||||||
_ui->expirationShareProperty->show();
|
_ui->expirationShareProperty->show();
|
||||||
}
|
}
|
||||||
@@ -265,81 +271,46 @@ void ShareLinkWidget::slotSharesFetched(const QList<QSharedPointer<Share>> &shar
|
|||||||
_ui->shareLinkToolButton->setEnabled(true);
|
_ui->shareLinkToolButton->setEnabled(true);
|
||||||
_ui->enableShareLink->setEnabled(true);
|
_ui->enableShareLink->setEnabled(true);
|
||||||
_ui->enableShareLink->setChecked(true);
|
_ui->enableShareLink->setChecked(true);
|
||||||
|
|
||||||
|
// show sharing options
|
||||||
|
_ui->shareLinkToolButton->show();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
toggleAnimation(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO
|
|
||||||
//void ShareLinkWidget::slotShareSelectionChanged()
|
|
||||||
//{
|
|
||||||
// // Disable running progress indicators
|
|
||||||
// _pi_create->stopAnimation();
|
|
||||||
// _pi_editing->stopAnimation();
|
|
||||||
// _pi_date->stopAnimation();
|
|
||||||
// _pi_password->stopAnimation();
|
|
||||||
|
|
||||||
// _ui->errorLabel->hide();
|
|
||||||
// _ui->passwordShareProperty->show();
|
|
||||||
// _ui->expirationShareProperty->show();
|
|
||||||
|
|
||||||
// if (!_account->capabilities().sharePublicLinkAllowUpload()) {
|
|
||||||
// _allowUploadEditingLinkAction->setEnabled(false);
|
|
||||||
// _allowUploadLinkAction->setEnabled(false);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// // Password state
|
|
||||||
// _ui->lineEdit_password->setEnabled(_linkShare->isPasswordSet());
|
|
||||||
// if(_linkShare->isPasswordSet()) _ui->lineEdit_password->setPlaceholderText("********");
|
|
||||||
// _ui->lineEdit_password->setText(QString());
|
|
||||||
// _ui->lineEdit_password->setEnabled(_linkShare->isPasswordSet());
|
|
||||||
// _ui->confirmPassword->setEnabled(_linkShare->isPasswordSet());
|
|
||||||
|
|
||||||
// // Expiry state
|
|
||||||
// _ui->calendar->setMinimumDate(QDate::currentDate().addDays(1));
|
|
||||||
// if (_linkShare->getExpireDate().isValid()) {
|
|
||||||
// _ui->calendar->setDate(_linkShare->getExpireDate());
|
|
||||||
// _ui->calendar->setEnabled(true);
|
|
||||||
// }
|
|
||||||
// // Public upload state (box is hidden for files)
|
|
||||||
// if (!_isFile) {
|
|
||||||
// if (_linkShare->getPublicUpload()) {
|
|
||||||
// if (_linkShare->getShowFileListing()) {
|
|
||||||
// _allowUploadEditingLinkAction->setChecked(true);
|
|
||||||
// } else {
|
|
||||||
// _allowUploadLinkAction->setChecked(true);
|
|
||||||
// }
|
|
||||||
// } else {
|
|
||||||
// _readOnlyLinkAction->setChecked(true);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
|
|
||||||
void ShareLinkWidget::setExpireDate(const QDate &date)
|
void ShareLinkWidget::setExpireDate(const QDate &date)
|
||||||
{
|
{
|
||||||
if (_linkShare) {
|
if (_linkShare) {
|
||||||
_pi_date->startAnimation();
|
toggleAnimation(true);
|
||||||
_ui->errorLabel->hide();
|
_ui->errorLabel->hide();
|
||||||
_linkShare->setExpireDate(date);
|
_linkShare->setExpireDate(date);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO
|
void ShareLinkWidget::slotExpireDateSet()
|
||||||
//void ShareLinkWidget::slotExpireSet()
|
{
|
||||||
//{
|
toggleAnimation(false);
|
||||||
// if (sender() == _linkShare.data()) {
|
}
|
||||||
// slotShareSelectionChanged();
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
|
|
||||||
void ShareLinkWidget::slotExpireDateChanged(const QDate &date)
|
void ShareLinkWidget::slotExpireDateChanged(const QDate &date)
|
||||||
{
|
{
|
||||||
setExpireDate(date);
|
setExpireDate(date);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ShareLinkWidget::slotSetExpireDate()
|
||||||
|
{
|
||||||
|
slotExpireDateChanged(_ui->calendar->date());
|
||||||
|
}
|
||||||
|
|
||||||
void ShareLinkWidget::slotCreatePassword()
|
void ShareLinkWidget::slotCreatePassword()
|
||||||
{
|
{
|
||||||
if (!_manager) {
|
if (!_manager) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
toggleAnimation(true);
|
||||||
|
|
||||||
if (!_linkShare) {
|
if (!_linkShare) {
|
||||||
// If share creation requires a password, we'll be in this case
|
// If share creation requires a password, we'll be in this case
|
||||||
if (_ui->lineEdit_password->text().isEmpty()) {
|
if (_ui->lineEdit_password->text().isEmpty()) {
|
||||||
@@ -347,21 +318,21 @@ void ShareLinkWidget::slotCreatePassword()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
_pi_create->startAnimation();
|
|
||||||
_manager->createLinkShare(_sharePath, QString(), _ui->lineEdit_password->text());
|
_manager->createLinkShare(_sharePath, QString(), _ui->lineEdit_password->text());
|
||||||
} else {
|
} else {
|
||||||
setPassword(_ui->lineEdit_password->text());
|
setPassword(_ui->lineEdit_password->text());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShareLinkWidget::slotCreateorDeleteShareLink(bool checked)
|
void ShareLinkWidget::slotCreateOrDeleteShareLink(bool checked)
|
||||||
{
|
{
|
||||||
if (!_manager) {
|
if (!_manager) {
|
||||||
qCWarning(lcSharing) << "No share manager set.";
|
qCWarning(lcSharing) << "No share manager set.";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
_pi_create->startAnimation();
|
toggleAnimation(true);
|
||||||
|
|
||||||
if(checked){
|
if(checked){
|
||||||
_manager->createLinkShare(_sharePath, QString(), QString());
|
_manager->createLinkShare(_sharePath, QString(), QString());
|
||||||
} else {
|
} else {
|
||||||
@@ -371,14 +342,13 @@ void ShareLinkWidget::slotCreateorDeleteShareLink(bool checked)
|
|||||||
}
|
}
|
||||||
confirmAndDeleteShare();
|
confirmAndDeleteShare();
|
||||||
}
|
}
|
||||||
|
|
||||||
_ui->shareLinkToolButton->setEnabled(checked);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShareLinkWidget::setPassword(const QString &password)
|
void ShareLinkWidget::setPassword(const QString &password)
|
||||||
{
|
{
|
||||||
if (_linkShare) {
|
if (_linkShare) {
|
||||||
_pi_password->startAnimation();
|
toggleAnimation(true);
|
||||||
|
|
||||||
_ui->errorLabel->hide();
|
_ui->errorLabel->hide();
|
||||||
_linkShare->setPassword(password);
|
_linkShare->setPassword(password);
|
||||||
}
|
}
|
||||||
@@ -389,7 +359,6 @@ void ShareLinkWidget::slotPasswordSet()
|
|||||||
if (!_linkShare)
|
if (!_linkShare)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
_pi_password->stopAnimation();
|
|
||||||
_ui->lineEdit_password->setText(QString());
|
_ui->lineEdit_password->setText(QString());
|
||||||
if (_linkShare->isPasswordSet()) {
|
if (_linkShare->isPasswordSet()) {
|
||||||
_ui->lineEdit_password->setPlaceholderText("********");
|
_ui->lineEdit_password->setPlaceholderText("********");
|
||||||
@@ -398,6 +367,8 @@ void ShareLinkWidget::slotPasswordSet()
|
|||||||
_ui->lineEdit_password->setPlaceholderText(QString());
|
_ui->lineEdit_password->setPlaceholderText(QString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
toggleAnimation(false);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* When setting/deleting a password from a share the old share is
|
* When setting/deleting a password from a share the old share is
|
||||||
* deleted and a new one is created. So we need to refetch the shares
|
* deleted and a new one is created. So we need to refetch the shares
|
||||||
@@ -410,21 +381,26 @@ void ShareLinkWidget::slotPasswordSet()
|
|||||||
|
|
||||||
void ShareLinkWidget::slotDeleteShareFetched()
|
void ShareLinkWidget::slotDeleteShareFetched()
|
||||||
{
|
{
|
||||||
|
toggleAnimation(true);
|
||||||
|
_linkShare.clear();
|
||||||
|
_ui->enableShareLink->setChecked(false);
|
||||||
|
_ui->shareLinkToolButton->setEnabled(false);
|
||||||
|
_ui->shareLinkToolButton->hide();
|
||||||
|
togglePasswordOptions(false);
|
||||||
|
toggleExpireDateOptions(false);
|
||||||
getShares();
|
getShares();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShareLinkWidget::slotCreateShareFetched()
|
void ShareLinkWidget::slotCreateShareFetched()
|
||||||
{
|
{
|
||||||
_pi_create->stopAnimation();
|
toggleAnimation(true);
|
||||||
_pi_password->stopAnimation();
|
|
||||||
getShares();
|
getShares();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShareLinkWidget::slotCreateShareRequiresPassword(const QString &message)
|
void ShareLinkWidget::slotCreateShareRequiresPassword(const QString &message)
|
||||||
{
|
{
|
||||||
// Prepare password entry
|
toggleAnimation(true);
|
||||||
_pi_create->stopAnimation();
|
|
||||||
_pi_password->stopAnimation();
|
|
||||||
_ui->passwordShareProperty->show();
|
_ui->passwordShareProperty->show();
|
||||||
if (!message.isEmpty()) {
|
if (!message.isEmpty()) {
|
||||||
_ui->errorLabel->setText(message);
|
_ui->errorLabel->setText(message);
|
||||||
@@ -439,7 +415,14 @@ void ShareLinkWidget::slotCreateShareRequiresPassword(const QString &message)
|
|||||||
void ShareLinkWidget::togglePasswordOptions(bool enable)
|
void ShareLinkWidget::togglePasswordOptions(bool enable)
|
||||||
{
|
{
|
||||||
_ui->passwordShareProperty->setVisible(enable);
|
_ui->passwordShareProperty->setVisible(enable);
|
||||||
if(enable) _ui->lineEdit_password->setFocus();
|
|
||||||
|
if(enable) {
|
||||||
|
_ui->lineEdit_password->setFocus();
|
||||||
|
} else {
|
||||||
|
// 'deletes' password
|
||||||
|
if(_linkShare)
|
||||||
|
_linkShare->setPassword(QString());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShareLinkWidget::toggleExpireDateOptions(bool enable)
|
void ShareLinkWidget::toggleExpireDateOptions(bool enable)
|
||||||
@@ -447,9 +430,13 @@ void ShareLinkWidget::toggleExpireDateOptions(bool enable)
|
|||||||
_ui->expirationShareProperty->setVisible(enable);
|
_ui->expirationShareProperty->setVisible(enable);
|
||||||
if (enable) {
|
if (enable) {
|
||||||
const QDate date = QDate::currentDate().addDays(1);
|
const QDate date = QDate::currentDate().addDays(1);
|
||||||
setExpireDate(date);
|
|
||||||
_ui->calendar->setDate(date);
|
_ui->calendar->setDate(date);
|
||||||
_ui->calendar->setMinimumDate(date);
|
_ui->calendar->setMinimumDate(date);
|
||||||
|
_ui->calendar->setFocus();
|
||||||
|
} else {
|
||||||
|
// 'deletes' expire date
|
||||||
|
if(_linkShare)
|
||||||
|
_linkShare->setExpireDate(QDate());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -469,12 +456,8 @@ void ShareLinkWidget::confirmAndDeleteShare()
|
|||||||
|
|
||||||
connect(messageBox, &QMessageBox::finished, this,
|
connect(messageBox, &QMessageBox::finished, this,
|
||||||
[messageBox, yesButton, this]() {
|
[messageBox, yesButton, this]() {
|
||||||
if (messageBox->clickedButton() == yesButton){
|
if (messageBox->clickedButton() == yesButton)
|
||||||
// TODO: dlete is not hapenning correctly
|
|
||||||
this->_linkShare->deleteShare();
|
this->_linkShare->deleteShare();
|
||||||
this->_ui->enableShareLink->setChecked(false);
|
|
||||||
this->_ui->shareLinkToolButton->setEnabled(false);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
messageBox->open();
|
messageBox->open();
|
||||||
}
|
}
|
||||||
@@ -525,16 +508,13 @@ void ShareLinkWidget::slotLinkContextMenuActionTriggered(QAction *action)
|
|||||||
toggleExpireDateOptions(state);
|
toggleExpireDateOptions(state);
|
||||||
|
|
||||||
} else if (action == _unshareLinkAction) {
|
} else if (action == _unshareLinkAction) {
|
||||||
confirmAndDeleteShare();
|
slotCreateOrDeleteShareLink(state);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShareLinkWidget::slotServerError(int code, const QString &message)
|
void ShareLinkWidget::slotServerError(int code, const QString &message)
|
||||||
{
|
{
|
||||||
_pi_create->stopAnimation();
|
toggleAnimation(false);
|
||||||
_pi_date->stopAnimation();
|
|
||||||
_pi_password->stopAnimation();
|
|
||||||
_pi_editing->stopAnimation();
|
|
||||||
|
|
||||||
qCWarning(lcSharing) << "Error from server" << code << message;
|
qCWarning(lcSharing) << "Error from server" << code << message;
|
||||||
displayError(message);
|
displayError(message);
|
||||||
|
|||||||
@@ -61,10 +61,11 @@ private slots:
|
|||||||
void slotSharesFetched(const QList<QSharedPointer<Share>> &shares);
|
void slotSharesFetched(const QList<QSharedPointer<Share>> &shares);
|
||||||
//void slotShareSelectionChanged();
|
//void slotShareSelectionChanged();
|
||||||
|
|
||||||
void slotCreateorDeleteShareLink(bool checked);
|
void slotCreateOrDeleteShareLink(bool checked);
|
||||||
void slotCreatePassword();
|
void slotCreatePassword();
|
||||||
|
|
||||||
void slotExpireDateChanged(const QDate &date);
|
void slotExpireDateChanged(const QDate &date);
|
||||||
|
void slotSetExpireDate();
|
||||||
|
|
||||||
void slotContextMenuButtonClicked();
|
void slotContextMenuButtonClicked();
|
||||||
void slotLinkContextMenuActionTriggered(QAction *action);
|
void slotLinkContextMenuActionTriggered(QAction *action);
|
||||||
@@ -72,8 +73,9 @@ private slots:
|
|||||||
void slotDeleteShareFetched();
|
void slotDeleteShareFetched();
|
||||||
void slotCreateShareFetched();
|
void slotCreateShareFetched();
|
||||||
void slotCreateShareRequiresPassword(const QString &message);
|
void slotCreateShareRequiresPassword(const QString &message);
|
||||||
|
|
||||||
void slotPasswordSet();
|
void slotPasswordSet();
|
||||||
//void slotExpireSet();
|
void slotExpireDateSet();
|
||||||
|
|
||||||
void slotServerError(int code, const QString &message);
|
void slotServerError(int code, const QString &message);
|
||||||
void slotPasswordSetError(int code, const QString &message);
|
void slotPasswordSetError(int code, const QString &message);
|
||||||
@@ -95,10 +97,7 @@ private:
|
|||||||
/** Retrieve a share's name, accounting for _namesSupported */
|
/** Retrieve a share's name, accounting for _namesSupported */
|
||||||
QString shareName() const;
|
QString shareName() const;
|
||||||
|
|
||||||
/**
|
void toggleAnimation(bool start);
|
||||||
* Retrieve the selected share, returning 0 if none.
|
|
||||||
*/
|
|
||||||
//QSharedPointer<LinkShare> selectedShare() const;
|
|
||||||
|
|
||||||
Ui::ShareLinkWidget *_ui;
|
Ui::ShareLinkWidget *_ui;
|
||||||
AccountPtr _account;
|
AccountPtr _account;
|
||||||
@@ -106,10 +105,7 @@ private:
|
|||||||
QString _localPath;
|
QString _localPath;
|
||||||
QString _shareUrl;
|
QString _shareUrl;
|
||||||
|
|
||||||
QProgressIndicator *_pi_create;
|
QProgressIndicator *_pi_indicator;
|
||||||
QProgressIndicator *_pi_password;
|
|
||||||
QProgressIndicator *_pi_date;
|
|
||||||
QProgressIndicator *_pi_editing;
|
|
||||||
|
|
||||||
ShareManager *_manager;
|
ShareManager *_manager;
|
||||||
QSharedPointer<LinkShare> _linkShare;
|
QSharedPointer<LinkShare> _linkShare;
|
||||||
|
|||||||
@@ -181,6 +181,27 @@
|
|||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QWidget" name="indicatorWidget" native="true">
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||||
|
<property name="spacing">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<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>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QWidget" name="passwordShareProperty" native="true">
|
<widget class="QWidget" name="passwordShareProperty" native="true">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
@@ -266,7 +287,7 @@
|
|||||||
<enum>QLineEdit::Password</enum>
|
<enum>QLineEdit::Password</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="alignment">
|
<property name="alignment">
|
||||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
|||||||
@@ -87,6 +87,7 @@ ShareUserGroupWidget::ShareUserGroupWidget(AccountPtr account,
|
|||||||
connect(_manager, &ShareManager::shareCreated, this, &ShareUserGroupWidget::getShares);
|
connect(_manager, &ShareManager::shareCreated, this, &ShareUserGroupWidget::getShares);
|
||||||
connect(_manager, &ShareManager::serverError, this, &ShareUserGroupWidget::displayError);
|
connect(_manager, &ShareManager::serverError, this, &ShareUserGroupWidget::displayError);
|
||||||
connect(_ui->shareeLineEdit, &QLineEdit::returnPressed, this, &ShareUserGroupWidget::slotLineEditReturn);
|
connect(_ui->shareeLineEdit, &QLineEdit::returnPressed, this, &ShareUserGroupWidget::slotLineEditReturn);
|
||||||
|
connect(_ui->confirmShare, &QPushButton::clicked, this, &ShareUserGroupWidget::slotLineEditReturn);
|
||||||
//TODO connect(_ui->privateLinkText, &QLabel::linkActivated, this, &ShareUserGroupWidget::slotPrivateLinkShare);
|
//TODO connect(_ui->privateLinkText, &QLabel::linkActivated, this, &ShareUserGroupWidget::slotPrivateLinkShare);
|
||||||
|
|
||||||
// By making the next two QueuedConnections we can override
|
// By making the next two QueuedConnections we can override
|
||||||
@@ -376,14 +377,15 @@ ShareUserLine::ShareUserLine(QSharedPointer<Share> share,
|
|||||||
|
|
||||||
// adds permissions
|
// adds permissions
|
||||||
// can edit permission
|
// can edit permission
|
||||||
bool enabled = maxSharingPermissions & (SharePermissionRead & SharePermissionUpdate);
|
bool enabled = (maxSharingPermissions & SharePermissionUpdate);
|
||||||
if(!_isFile) enabled = enabled & (SharePermissionCreate & SharePermissionDelete);
|
if(!_isFile) enabled = enabled && (maxSharingPermissions & SharePermissionCreate &&
|
||||||
|
maxSharingPermissions & SharePermissionDelete);
|
||||||
_ui->permissionsEdit->setEnabled(enabled);
|
_ui->permissionsEdit->setEnabled(enabled);
|
||||||
connect(_ui->permissionsEdit, &QAbstractButton::clicked, this, &ShareUserLine::slotEditPermissionsChanged);
|
connect(_ui->permissionsEdit, &QAbstractButton::clicked, this, &ShareUserLine::slotEditPermissionsChanged);
|
||||||
|
|
||||||
// create menu with checkable permissions
|
// create menu with checkable permissions
|
||||||
QMenu *menu = new QMenu(this);
|
QMenu *menu = new QMenu(this);
|
||||||
_permissionReshare= new QAction(tr("Can reshare"));
|
_permissionReshare= new QAction(tr("Can reshare"), this);
|
||||||
_permissionReshare->setCheckable(true);
|
_permissionReshare->setCheckable(true);
|
||||||
_permissionReshare->setEnabled(maxSharingPermissions & SharePermissionShare);
|
_permissionReshare->setEnabled(maxSharingPermissions & SharePermissionShare);
|
||||||
menu->addAction(_permissionReshare);
|
menu->addAction(_permissionReshare);
|
||||||
@@ -393,19 +395,19 @@ ShareUserLine::ShareUserLine(QSharedPointer<Share> share,
|
|||||||
* Files can't have create or delete permissions
|
* Files can't have create or delete permissions
|
||||||
*/
|
*/
|
||||||
if (!_isFile) {
|
if (!_isFile) {
|
||||||
_permissionCreate = new QAction(tr("Can create"));
|
_permissionCreate = new QAction(tr("Can create"), this);
|
||||||
_permissionCreate->setCheckable(true);
|
_permissionCreate->setCheckable(true);
|
||||||
_permissionCreate->setEnabled(maxSharingPermissions & SharePermissionCreate);
|
_permissionCreate->setEnabled(maxSharingPermissions & SharePermissionCreate);
|
||||||
menu->addAction(_permissionCreate);
|
menu->addAction(_permissionCreate);
|
||||||
connect(_permissionCreate, &QAction::triggered, this, &ShareUserLine::slotPermissionsChanged);
|
connect(_permissionCreate, &QAction::triggered, this, &ShareUserLine::slotPermissionsChanged);
|
||||||
|
|
||||||
_permissionChange = new QAction(tr("Can change"));
|
_permissionChange = new QAction(tr("Can change"), this);
|
||||||
_permissionChange->setCheckable(true);
|
_permissionChange->setCheckable(true);
|
||||||
_permissionChange->setEnabled(maxSharingPermissions & SharePermissionUpdate);
|
_permissionChange->setEnabled(maxSharingPermissions & SharePermissionUpdate);
|
||||||
menu->addAction(_permissionChange);
|
menu->addAction(_permissionChange);
|
||||||
connect(_permissionChange, &QAction::triggered, this, &ShareUserLine::slotPermissionsChanged);
|
connect(_permissionChange, &QAction::triggered, this, &ShareUserLine::slotPermissionsChanged);
|
||||||
|
|
||||||
_permissionDelete = new QAction(tr("Can delete"));
|
_permissionDelete = new QAction(tr("Can delete"), this);
|
||||||
_permissionDelete->setCheckable(true);
|
_permissionDelete->setCheckable(true);
|
||||||
_permissionDelete->setEnabled(maxSharingPermissions & SharePermissionDelete);
|
_permissionDelete->setEnabled(maxSharingPermissions & SharePermissionDelete);
|
||||||
menu->addAction(_permissionDelete);
|
menu->addAction(_permissionDelete);
|
||||||
@@ -526,25 +528,28 @@ void ShareUserLine::slotEditPermissionsChanged()
|
|||||||
|
|
||||||
Share::Permissions permissions = SharePermissionRead;
|
Share::Permissions permissions = SharePermissionRead;
|
||||||
|
|
||||||
if (_permissionReshare->isChecked()) {
|
// folders edit = CREATE, READ, UPDATE, DELETE
|
||||||
permissions |= SharePermissionShare;
|
// files edit = READ + UPDATE
|
||||||
}
|
|
||||||
|
|
||||||
if (_ui->permissionsEdit->checkState() == Qt::Checked) {
|
if (_ui->permissionsEdit->checkState() == Qt::Checked) {
|
||||||
if (_permissionChange->isEnabled())
|
|
||||||
permissions |= SharePermissionUpdate;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Files can't have create or delete permisisons
|
* Files can't have create or delete permisisons
|
||||||
*/
|
*/
|
||||||
if (!_isFile) {
|
if (!_isFile) {
|
||||||
|
if (_permissionChange->isEnabled())
|
||||||
|
permissions |= SharePermissionUpdate;
|
||||||
if (_permissionCreate->isEnabled())
|
if (_permissionCreate->isEnabled())
|
||||||
permissions |= SharePermissionCreate;
|
permissions |= SharePermissionCreate;
|
||||||
if (_permissionDelete->isEnabled())
|
if (_permissionDelete->isEnabled())
|
||||||
permissions |= SharePermissionDelete;
|
permissions |= SharePermissionDelete;
|
||||||
|
} else {
|
||||||
|
permissions |= SharePermissionUpdate;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(_isFile && _permissionReshare->isEnabled() && _permissionReshare->isChecked())
|
||||||
|
permissions |= SharePermissionShare;
|
||||||
|
|
||||||
_share->setPermissions(permissions);
|
_share->setPermissions(permissions);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -554,23 +559,20 @@ void ShareUserLine::slotPermissionsChanged()
|
|||||||
|
|
||||||
Share::Permissions permissions = SharePermissionRead;
|
Share::Permissions permissions = SharePermissionRead;
|
||||||
|
|
||||||
if (_permissionReshare->isChecked()) {
|
if (_permissionReshare->isChecked())
|
||||||
permissions |= SharePermissionShare;
|
permissions |= SharePermissionShare;
|
||||||
}
|
|
||||||
|
|
||||||
if (!_isFile) {
|
if (!_isFile) {
|
||||||
if (_permissionCreate->isChecked()) {
|
if (_permissionChange->isChecked())
|
||||||
permissions |= SharePermissionCreate;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_permissionChange->isChecked()) {
|
|
||||||
permissions |= SharePermissionUpdate;
|
permissions |= SharePermissionUpdate;
|
||||||
}
|
if (_permissionCreate->isChecked())
|
||||||
|
permissions |= SharePermissionCreate;
|
||||||
if (_permissionDelete->isChecked()) {
|
if (_permissionDelete->isChecked())
|
||||||
permissions |= SharePermissionDelete;
|
permissions |= SharePermissionDelete;
|
||||||
}
|
} else {
|
||||||
}
|
if (_ui->permissionsEdit->isChecked())
|
||||||
|
permissions |= SharePermissionUpdate;
|
||||||
|
}
|
||||||
|
|
||||||
_share->setPermissions(permissions);
|
_share->setPermissions(permissions);
|
||||||
}
|
}
|
||||||
@@ -616,21 +618,20 @@ void ShareUserLine::displayPermissions()
|
|||||||
{
|
{
|
||||||
auto perm = _share->getPermissions();
|
auto perm = _share->getPermissions();
|
||||||
|
|
||||||
if (perm & SharePermissionUpdate
|
// folders edit = CREATE, READ, UPDATE, DELETE
|
||||||
&& (_isFile
|
// files edit = READ + UPDATE
|
||||||
|| (perm & SharePermissionCreate
|
if (perm & SharePermissionUpdate && (_isFile ||
|
||||||
&& perm & SharePermissionDelete))) {
|
(perm & SharePermissionCreate && perm & SharePermissionDelete))) {
|
||||||
_ui->permissionsEdit->setCheckState(Qt::Checked);
|
_ui->permissionsEdit->setCheckState(Qt::Checked);
|
||||||
} else if (perm & (SharePermissionUpdate | SharePermissionCreate | SharePermissionDelete)) {
|
} else if (!_isFile && perm & (SharePermissionUpdate | SharePermissionCreate | SharePermissionDelete)) {
|
||||||
_ui->permissionsEdit->setCheckState(Qt::PartiallyChecked);
|
_ui->permissionsEdit->setCheckState(Qt::PartiallyChecked);
|
||||||
} else {
|
} else if(perm & SharePermissionRead) {
|
||||||
_ui->permissionsEdit->setCheckState(Qt::Unchecked);
|
_ui->permissionsEdit->setCheckState(Qt::Unchecked);
|
||||||
}
|
}
|
||||||
|
|
||||||
_permissionReshare->setChecked(Qt::Unchecked);
|
// edit is independent of reshare
|
||||||
if (perm & SharePermissionShare) {
|
if (perm & SharePermissionShare)
|
||||||
_permissionReshare->setChecked(Qt::Checked);
|
_permissionReshare->setChecked(Qt::Checked);
|
||||||
}
|
|
||||||
|
|
||||||
if(!_isFile){
|
if(!_isFile){
|
||||||
_permissionCreate->setChecked(perm & SharePermissionCreate);
|
_permissionCreate->setChecked(perm & SharePermissionCreate);
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
// This file is generated by kxml_compiler from occinfo.xml.
|
// This file is generated by kxml_compiler from occinfo.xml.
|
||||||
// All changes you do to this file will be lost.
|
|
||||||
|
|
||||||
#include "updateinfo.h"
|
#include "updateinfo.h"
|
||||||
#include "updater.h"
|
#include "updater.h"
|
||||||
@@ -83,24 +82,6 @@ UpdateInfo UpdateInfo::parseElement(const QDomElement &element, bool *ok)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void UpdateInfo::writeElement(QXmlStreamWriter &xml)
|
|
||||||
{
|
|
||||||
xml.writeStartElement(QLatin1String("owncloudclient"));
|
|
||||||
if (!version().isEmpty()) {
|
|
||||||
xml.writeTextElement(QLatin1String("version"), version());
|
|
||||||
}
|
|
||||||
if (!versionString().isEmpty()) {
|
|
||||||
xml.writeTextElement(QLatin1String("versionstring"), versionString());
|
|
||||||
}
|
|
||||||
if (!web().isEmpty()) {
|
|
||||||
xml.writeTextElement(QLatin1String("web"), web());
|
|
||||||
}
|
|
||||||
if (!downloadUrl().isEmpty()) {
|
|
||||||
xml.writeTextElement(QLatin1String("downloadurl"), web());
|
|
||||||
}
|
|
||||||
xml.writeEndElement();
|
|
||||||
}
|
|
||||||
|
|
||||||
UpdateInfo UpdateInfo::parseFile(const QString &filename, bool *ok)
|
UpdateInfo UpdateInfo::parseFile(const QString &filename, bool *ok)
|
||||||
{
|
{
|
||||||
QFile file(filename);
|
QFile file(filename);
|
||||||
@@ -149,23 +130,4 @@ UpdateInfo UpdateInfo::parseString(const QString &xml, bool *ok)
|
|||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool UpdateInfo::writeFile(const QString &filename)
|
|
||||||
{
|
|
||||||
QFile file(filename);
|
|
||||||
if (!file.open(QIODevice::WriteOnly)) {
|
|
||||||
qCCritical(lcUpdater) << "Unable to open file '" << filename << "'";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
QXmlStreamWriter xml(&file);
|
|
||||||
xml.setAutoFormatting(true);
|
|
||||||
xml.setAutoFormattingIndent(2);
|
|
||||||
xml.writeStartDocument(QLatin1String("1.0"));
|
|
||||||
writeElement(xml);
|
|
||||||
xml.writeEndDocument();
|
|
||||||
file.close();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace OCC
|
} // namespace OCC
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user