Compare commits
195 Commits
v3.2.0-rc1
...
v3.2.2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
04afaa1fe6 | ||
|
|
60f3b7781e | ||
|
|
c626033445 | ||
|
|
76687ce8fd | ||
|
|
7c987281cc | ||
|
|
91dd481f1a | ||
|
|
7b725f04e0 | ||
|
|
0b776d2be2 | ||
|
|
7960aca617 | ||
|
|
da4b016b7c | ||
|
|
c82491ebe3 | ||
|
|
025e4a600a | ||
|
|
cb52e36e08 | ||
|
|
f8b7d5bc84 | ||
|
|
0b703ed518 | ||
|
|
19aa80116f | ||
|
|
faa5b2ef54 | ||
|
|
0778b2178f | ||
|
|
4f0a8995c2 | ||
|
|
b5e5985fcb | ||
|
|
705990291b | ||
|
|
364e02bdb0 | ||
|
|
981d94c139 | ||
|
|
14ccfe831a | ||
|
|
0e31d6fe57 | ||
|
|
79128c51b7 | ||
|
|
abf75cc80d | ||
|
|
dd3e6a6ad0 | ||
|
|
aaf4b1d2be | ||
|
|
9c6c6d82f0 | ||
|
|
a559513912 | ||
|
|
741231f3df | ||
|
|
6cb5bdf2d1 | ||
|
|
104941e4bb | ||
|
|
d7fb1ebc51 | ||
|
|
c4fec24b23 | ||
|
|
59595152c7 | ||
|
|
5644fcb332 | ||
|
|
d4322ed003 | ||
|
|
046e19465f | ||
|
|
28ccaff866 | ||
|
|
0a36214189 | ||
|
|
5901a0f983 | ||
|
|
7825cf7f86 | ||
|
|
d65611bcb7 | ||
|
|
c5f17a7f77 | ||
|
|
4637ce7526 | ||
|
|
c3ed9a9d65 | ||
|
|
6da0650c61 | ||
|
|
031f7c48a3 | ||
|
|
abb57d6202 | ||
|
|
1e309b71a6 | ||
|
|
5a159d49d0 | ||
|
|
1cc082cec5 | ||
|
|
149bfa9001 | ||
|
|
f660f923a3 | ||
|
|
f7c4030463 | ||
|
|
55c0cbde36 | ||
|
|
3deb08a7fc | ||
|
|
594b13ed6a | ||
|
|
9cda48e0a6 | ||
|
|
03117c0dcf | ||
|
|
96dab4ff84 | ||
|
|
7dfb6c300f | ||
|
|
9a75fa5db5 | ||
|
|
2272cb6c3a | ||
|
|
e909add969 | ||
|
|
33ea9ba00e | ||
|
|
f86fcc94d8 | ||
|
|
443d8baf3a | ||
|
|
c2e217352f | ||
|
|
555c157cda | ||
|
|
03466431be | ||
|
|
9b8115558d | ||
|
|
8344969549 | ||
|
|
eed7fd73a3 | ||
|
|
4c50ba294e | ||
|
|
ec5be0f29a | ||
|
|
f79f4f6783 | ||
|
|
89919b6b33 | ||
|
|
86e0ad4ec6 | ||
|
|
328877c70b | ||
|
|
14fbf1b106 | ||
|
|
5f6236bd73 | ||
|
|
a3968bcc87 | ||
|
|
5e6c31b262 | ||
|
|
8550bfa8f1 | ||
|
|
f6afb62a53 | ||
|
|
1ca0ea49dd | ||
|
|
29f4a3857b | ||
|
|
050bd49373 | ||
|
|
8986975a17 | ||
|
|
50de12b3c3 | ||
|
|
163015492a | ||
|
|
c8ac99c8cf | ||
|
|
e51dad79a2 | ||
|
|
d2b762aa66 | ||
|
|
98cfc362f7 | ||
|
|
835a61c5ee | ||
|
|
5eb6834167 | ||
|
|
4b58c2b7b7 | ||
|
|
82953d0601 | ||
|
|
de85b79bb8 | ||
|
|
cb8b6ccd9b | ||
|
|
13f4bb541d | ||
|
|
3906ae0922 | ||
|
|
7235c708dc | ||
|
|
d5b6d93978 | ||
|
|
4a7145f1f3 | ||
|
|
d6752c96b1 | ||
|
|
77681ff5b5 | ||
|
|
4c8378030d | ||
|
|
0a33e99053 | ||
|
|
454226b3ea | ||
|
|
e15045977e | ||
|
|
a599cd2c3f | ||
|
|
487f29cf80 | ||
|
|
2268facd9d | ||
|
|
57aeeca172 | ||
|
|
962bbf3043 | ||
|
|
6e147a7a8c | ||
|
|
b2377ff64f | ||
|
|
be6e0f26df | ||
|
|
8741f4386c | ||
|
|
ac6b62e19d | ||
|
|
044b5a33e9 | ||
|
|
dde9eb645e | ||
|
|
354f4c02ee | ||
|
|
58dd076b2b | ||
|
|
7faa80c1e1 | ||
|
|
f7dd4bbf69 | ||
|
|
a7ac7991b8 | ||
|
|
8eb5ed07bf | ||
|
|
4ce2e79e90 | ||
|
|
28771b25e3 | ||
|
|
ab128cc4aa | ||
|
|
cafa475398 | ||
|
|
9d15334813 | ||
|
|
003e56f4e6 | ||
|
|
99309ab33b | ||
|
|
d91e24d77d | ||
|
|
1edc2cfd31 | ||
|
|
e8669ad4b6 | ||
|
|
9219926a74 | ||
|
|
d9a0778e52 | ||
|
|
974e2fb718 | ||
|
|
f4d8699db8 | ||
|
|
c29c011095 | ||
|
|
519dee9104 | ||
|
|
e3a26477a2 | ||
|
|
193e50311b | ||
|
|
6a53491645 | ||
|
|
d78774f29e | ||
|
|
4e420fcb5c | ||
|
|
22a9d18d3b | ||
|
|
c296a93cee | ||
|
|
66ee5087f6 | ||
|
|
4d921c8025 | ||
|
|
b1983d7d19 | ||
|
|
54c1ab8828 | ||
|
|
3652251587 | ||
|
|
9c4c7217a0 | ||
|
|
b3d5b4983e | ||
|
|
278a6fd005 | ||
|
|
9bf5b5c7ba | ||
|
|
6abb0b2184 | ||
|
|
5f0344abb2 | ||
|
|
3fde838bee | ||
|
|
af654fb4ed | ||
|
|
2ab23e3b3c | ||
|
|
f4853da2ab | ||
|
|
262f20a8f4 | ||
|
|
96ded93597 | ||
|
|
c0f09ae12c | ||
|
|
162dff9525 | ||
|
|
ff7932bb54 | ||
|
|
6d6da18f9a | ||
|
|
a92d300b7f | ||
|
|
a6bcd3af46 | ||
|
|
0d3459e85e | ||
|
|
7ad0208800 | ||
|
|
a61d2d2dd0 | ||
|
|
88a7285e5f | ||
|
|
6c194be02d | ||
|
|
aa9821f05f | ||
|
|
cdc2e4c56e | ||
|
|
d028466d1c | ||
|
|
c89d351d97 | ||
|
|
90a06aa57b | ||
|
|
72858da27b | ||
|
|
88426de4dd | ||
|
|
6fac2d1e40 | ||
|
|
e3ac63e9ff | ||
|
|
05d31e2e53 | ||
|
|
0ce965e8da |
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[bg_BG]=@APPLICATION_ICON_NAME@
|
||||
Name[bg_BG]=@APPLICATION_NAME@ десктоп клиент за синхронизиране
|
||||
Comment[bg_BG]=@APPLICATION_NAME@ десктоп клиент за синхронизиране
|
||||
GenericName[bg_BG]=Синхронизиране на папка
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[br]=@APPLICATION_ICON_NAME@
|
||||
Name[br]=@APPLICATION_NAME@ burev kempreet an implijer
|
||||
Comment[br]=@APPLICATION_NAME@ burev kempreet an implijer
|
||||
GenericName[br]=Tuliad kemprenan
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,6 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[ca]=@APPLICATION_ICON_NAME@
|
||||
Name[ca]=Client de sincronització d'escriptori del @APPLICATION_NAME@
|
||||
Name[ca]=@APPLICATION_NAME@ per a escriptori
|
||||
Comment[ca]=Client de sincronització d'escriptori del @APPLICATION_NAME@
|
||||
GenericName[ca]=Sincronització de carpetes
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,6 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[cs_CZ]=@APPLICATION_ICON_NAME@
|
||||
Name[cs_CZ]=@APPLICATION_NAME@ synchronizační klient pro desktop
|
||||
Name[cs_CZ]=@APPLICATION_NAME@ Desktop
|
||||
Comment[cs_CZ]=@APPLICATION_NAME@ synchronizační klient pro desktop
|
||||
GenericName[cs_CZ]=Synchronizace složek
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[cy_GB]=@APPLICATION_ICON_NAME@
|
||||
Name[cy_GB]=@APPLICATION_NAME@ cleient cydweddu bwrdd gwaith
|
||||
Comment[cy_GB]=@APPLICATION_NAME@ cleient cydweddu bwrdd gwaith
|
||||
GenericName[cy_GB]=Cydweddu Ffolder
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[da]=@APPLICATION_ICON_NAME@
|
||||
Name[da]=@APPLICATION_NAME@ Arbejdsstationsssynkroniseringsklient
|
||||
Comment[da]=@APPLICATION_NAME@ Arbejdsstationsssynkroniseringsklient
|
||||
GenericName[da]=Mappesynkronisering
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[el]=@APPLICATION_ICON_NAME@
|
||||
Name[el]=@APPLICATION_NAME@ πρόγραμμα συγχρονισμού
|
||||
Comment[el]=@APPLICATION_NAME@ πρόγραμμα συγχρονισμού
|
||||
GenericName[el]=Συγχρονισμός φακέλου
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[en_GB]=@APPLICATION_ICON_NAME@
|
||||
Name[en_GB]=@APPLICATION_NAME@ desktop sync client
|
||||
Comment[en_GB]=@APPLICATION_NAME@ desktop synchronisation client
|
||||
GenericName[en_GB]=Folder Sync
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[eo]=@APPLICATION_ICON_NAME@
|
||||
Name[eo]=@APPLICATION_NAME@ sinkroniga kliento
|
||||
Comment[eo]=@APPLICATION_NAME@ sinkroniga kliento
|
||||
GenericName[eo]=Dosieruja sinkronigo
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[es_AR]=@APPLICATION_ICON_NAME@
|
||||
Name[es_AR]=@APPLICATION_NAME@ cliente de sincronización de escritorio
|
||||
Comment[es_AR]=@APPLICATION_NAME@ cliente de sincronización de escritorio
|
||||
GenericName[es_AR]=Sincronización de carpetas
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -21,6 +21,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
|
||||
# Translations
|
||||
Name[es_CL]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||
Comment[es_CL]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||
GenericName[es_CL]=Sincronización de carpeta
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -21,6 +21,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
|
||||
# Translations
|
||||
Name[es_CO]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||
Comment[es_CO]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||
GenericName[es_CO]=Sincronización de carpeta
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -21,6 +21,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
|
||||
# Translations
|
||||
Name[es_CR]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||
Comment[es_CR]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||
GenericName[es_CR]=Sincronización de carpeta
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[es_DO]=@APPLICATION_ICON_NAME@
|
||||
Name[es_DO]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||
Comment[es_DO]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||
GenericName[es_DO]=Sincronización de carpeta
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -21,6 +21,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
|
||||
# Translations
|
||||
Name[es_EC]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||
Comment[es_EC]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||
GenericName[es_EC]=Sincronización de carpeta
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -21,6 +21,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
|
||||
# Translations
|
||||
Name[es_GT]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||
Comment[es_GT]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||
GenericName[es_GT]=Sincronización de carpeta
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -21,6 +21,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
|
||||
# Translations
|
||||
Name[es_MX]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||
Comment[es_MX]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||
GenericName[es_MX]=Sincronización de carpeta
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -21,6 +21,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
|
||||
# Translations
|
||||
Name[es_SV]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||
Comment[es_SV]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||
GenericName[es_SV]=Sincronización de carpeta
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,6 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[es]=@APPLICATION_ICON_NAME@
|
||||
Name[es]=Cliente de sincronización de escritorio @APPLICATION_NAME@
|
||||
Comment[es]=Cliente de sincronización de escritorio @APPLICATION_NAME@
|
||||
Name[es]=@APPLICATION_NAME@ Desktop
|
||||
Comment[es]=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName[es]=Sincronización de carpetas
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[et_EE]=@APPLICATION_ICON_NAME@
|
||||
Name[et_EE]=@APPLICATION_NAME@ töölaua sünkimise klient
|
||||
Comment[et_EE]=@APPLICATION_NAME@ töölaua sünkroniseerimise klient
|
||||
GenericName[et_EE]=Kausta Sünkroonimine
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,6 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[eu]=@APPLICATION_ICON_NAME@
|
||||
Name[eu]=@APPLICATION_NAME@ mahaigainerako sinkronizazio bezeroa
|
||||
Name[eu]=@APPLICATION_NAME@ Mahaigaina
|
||||
Comment[eu]=@APPLICATION_NAME@ mahaigainerako sinkronizazio bezeroa
|
||||
GenericName[eu]=Karpeta-sinkronizazioa
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[fi_FI]=@APPLICATION_ICON_NAME@
|
||||
Name[fi_FI]=@APPLICATION_NAME@ työpöydän synkronointipääte
|
||||
Comment[fi_FI]=@APPLICATION_NAME@ työpöydän synkronointipääte
|
||||
GenericName[fi_FI]=Kansio synkronointi
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[fr]=@APPLICATION_ICON_NAME@
|
||||
Name[fr]=Client de synchro @APPLICATION_NAME@
|
||||
Comment[fr]=Client de synchronisation @APPLICATION_NAME@
|
||||
GenericName[fr]=Synchronisation du dossier
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[gl]=@APPLICATION_ICON_NAME@
|
||||
Name[gl]=@APPLICATION_NAME@ cliente de sincronización para escritorio
|
||||
Comment[gl]=@APPLICATION_NAME@ cliente de sincronización para escritorio
|
||||
GenericName[gl]=Sincronización de cartafol
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[he]=@APPLICATION_ICON_NAME@
|
||||
Name[he]=@APPLICATION_NAME@ לקוח סנכרון לשולחן העבודה
|
||||
Comment[he]=@APPLICATION_NAME@ לקוח סנכרון לשולחן העבודה
|
||||
GenericName[he]=סנכרון תיקיות
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[hr]=@APPLICATION_ICON_NAME@
|
||||
Name[hr]=@APPLICATION_NAME@ klijent za sink. računala
|
||||
Comment[hr]=@APPLICATION_NAME@ klijent za sinkronizaciju računala
|
||||
GenericName[hr]=Sinkronizacija mapa
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[hu_HU]=@APPLICATION_ICON_NAME@
|
||||
Name[hu_HU]=@APPLICATION_NAME@ asztali szinkronizálási kliens
|
||||
Comment[hu_HU]=@APPLICATION_NAME@ asztali szinkronizálási kliens
|
||||
GenericName[hu_HU]=Mappaszinkronizálás
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[is]=@APPLICATION_ICON_NAME@
|
||||
Name[is]=@APPLICATION_NAME@ forrit til samstillingar við tölvu
|
||||
Comment[is]=@APPLICATION_NAME@ forrit til samstillingar við tölvu
|
||||
GenericName[is]=Samstilling á möppum
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,6 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[it]=@APPLICATION_ICON_NAME@
|
||||
Name[it]=Client di sincronizzazione desktop di @APPLICATION_NAME@
|
||||
Name[it]=@APPLICATION_NAME@ Desktop
|
||||
Comment[it]=Client di sincronizzazione desktop di @APPLICATION_NAME@
|
||||
GenericName[it]=Sincronizzazione cartelle
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,6 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[ja_JP]=@APPLICATION_ICON_NAME@
|
||||
Name[ja_JP]=@APPLICATION_NAME@ デスクトップ同期クライアント
|
||||
Name[ja_JP]=@APPLICATION_NAME@ デスクトップ
|
||||
Comment[ja_JP]=@APPLICATION_NAME@ デスクトップ同期クライアント
|
||||
GenericName[ja_JP]=フォルダーを同期する
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[ko]=@APPLICATION_ICON_NAME@
|
||||
Name[ko]=@APPLICATION_NAME@ 데스크톱 동기화 클라이언트
|
||||
Comment[ko]=@APPLICATION_NAME@ 데스크톱 동기화 클라이언트
|
||||
GenericName[ko]=폴더 동기화
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[lt_LT]=@APPLICATION_ICON_NAME@
|
||||
Name[lt_LT]=@APPLICATION_NAME@ darbalaukio sinchronizavimo kliento programa
|
||||
Comment[lt_LT]=@APPLICATION_NAME@ darbalaukio sinchronizavimo kliento programa
|
||||
GenericName[lt_LT]=Aplankų sinchronizavimas
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[lv]=@APPLICATION_ICON_NAME@
|
||||
Name[lv]=@APPLICATION_NAME@ darbavirsmas sinhronizešanas klients
|
||||
Comment[lv]=@APPLICATION_NAME@ darbavirsmas sinhronizešanas klients
|
||||
GenericName[lv]=Mapju Sinhronizēšana
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[mk]=@APPLICATION_ICON_NAME@
|
||||
Name[mk]=@APPLICATION_NAME@ клиент за синхронизација на компјутер
|
||||
Comment[mk]=@APPLICATION_NAME@ клиент за синхронизација на компјутер
|
||||
GenericName[mk]=Папка за синхронизација
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[nb_NO]=@APPLICATION_ICON_NAME@
|
||||
Name[nb_NO]=@APPLICATION_NAME@ klient for synkroinisering
|
||||
Comment[nb_NO]=@APPLICATION_NAME@ klient for synkroinisering
|
||||
GenericName[nb_NO]=Mappe synkroinisering
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,6 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[nl]=@APPLICATION_ICON_NAME@
|
||||
Name[nl]=@APPLICATION_NAME@ desktop sync client
|
||||
Name[nl]=@APPLICATION_NAME@ Desktop
|
||||
Comment[nl]=@APPLICATION_NAME@ desktopsynchronisatieclient
|
||||
GenericName[nl]=Map synchronisatie
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[oc]=@APPLICATION_ICON_NAME@
|
||||
Name[oc]=@APPLICATION_NAME@ client de sincronizacion
|
||||
Comment[oc]=@APPLICATION_NAME@ client de sincronizacion
|
||||
GenericName[oc]=Sincro. dossièr
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,6 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[pl]=@APPLICATION_ICON_NAME@
|
||||
Name[pl]=@APPLICATION_NAME@ desktopowy klient synchronizacji
|
||||
Comment[pl]=@APPLICATION_NAME@ desktopowy klient synchronizacji
|
||||
Name[pl]=@APPLICATION_NAME@ Desktop
|
||||
Comment[pl]=Desktopowy klient synchronizacji @APPLICATION_NAME@
|
||||
GenericName[pl]=Katalog synchronizacji
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,6 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[pt_BR]=@APPLICATION_ICON_NAME@
|
||||
Name[pt_BR]=@APPLICATION_NAME@ cliente de sincronização desktop
|
||||
Name[pt_BR]=@APPLICATION_NAME@ Desktop
|
||||
Comment[pt_BR]=@APPLICATION_NAME@ cliente de sincronização desktop
|
||||
GenericName[pt_BR]=Sincronizar pasta
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[pt_PT]=@APPLICATION_ICON_NAME@
|
||||
Name[pt_PT]=@APPLICATION_NAME@ - Cliente de Sincronização da Área de Trabalho
|
||||
Comment[pt_PT]=@APPLICATION_NAME@ - Cliente de Sincronização da Área de Trabalho
|
||||
GenericName[pt_PT]=Sincronização de Pasta
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[ro]=@APPLICATION_ICON_NAME@
|
||||
Name[ro]=@APPLICATION_NAME@ client de sincronizare pentru desktop
|
||||
Comment[ro]=@APPLICATION_NAME@ client de sincronizare pentru desktop
|
||||
GenericName[ro]=Sincronizare director
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[ru]=@APPLICATION_ICON_NAME@
|
||||
Name[ru]=@APPLICATION_NAME@ для ПК
|
||||
Comment[ru]=Клиент синхронизации @APPLICATION_NAME@ для ПК
|
||||
GenericName[ru]=Синхронизация папок
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[sc]=@NÙMENE_ICONA_APLICATZIONE@
|
||||
Name[sc]=@NÙMENE_APLICATZIONE@ cliente sicronizadore de iscrivania
|
||||
Comment[sc]=@NÙMENE_APLICATZIONE@ cliente de sincronizatzione iscrivania
|
||||
GenericName[sc]=Sincronizadore de cartellas
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[sk_SK]=@APPLICATION_ICON_NAME@
|
||||
Name[sk_SK]=@APPLICATION_NAME@ synchronizačný klient pre PC
|
||||
Comment[sk_SK]=@APPLICATION_NAME@ synchronizačný klient pre PC
|
||||
GenericName[sk_SK]=Synchronizácia priečinkov
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,6 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[sl]=@APPLICATION_ICON_NAME@
|
||||
Name[sl]=@APPLICATION_NAME@ program za usklajevanje
|
||||
Comment[sl]=@APPLICATION_NAME@ program za usklajevanje
|
||||
Name[sl]=Namizni program @APPLICATION_NAME@
|
||||
Comment[sl]=Program za usklajevanje @APPLICATION_NAME@
|
||||
GenericName[sl]=Usklajevanje map
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[sr]=@APPLICATION_ICON_NAME@
|
||||
Name[sr]=@APPLICATION_NAME@ десктоп клијент за синхронизацију
|
||||
Comment[sr]=@APPLICATION_NAME@ десктоп клијент за синхронизацију
|
||||
GenericName[sr]=Синхронизација фасцикли
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[sv]=@APPLICATION_ICON_NAME@
|
||||
Name[sv]=@APPLICATION_NAME@ desktopssynkklient
|
||||
Comment[sv]=@APPLICATION_NAME@ desktopssynkroniseringsklient
|
||||
GenericName[sv]=Mappsynkronisering
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[sw]=@APPLICATION_ICON_NAME@
|
||||
Name[sw]=Teja ya @APPLICATION_NAME@ ya kufanana faili kwa seva na faili ziko hapa
|
||||
Comment[sw]=Teja ya @APPLICATION_NAME@ ya kufanana faili kwa seva na faili ziko hapa
|
||||
GenericName[sw]=Fanana Kabrasha
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,6 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[tr]=@APPLICATION_ICON_NAME@
|
||||
Name[tr]=@APPLICATION_NAME@ masaüstü eşiteme istemcisi
|
||||
Name[tr]=@APPLICATION_NAME@ Masaüstü
|
||||
Comment[tr]=@APPLICATION_NAME@ masaüstü eşitleme istemcisi
|
||||
GenericName[tr]=Klasör Eşitleme
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[uk]=@APPLICATION_ICON_NAME@
|
||||
Name[uk]=@APPLICATION_NAME@ клієнт для ПК
|
||||
Comment[uk]=Клієнт синхронізації @APPLICATION_NAME@ для ПК
|
||||
GenericName[uk]=Синхронізація тек
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,6 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[zh_CN]=@APPLICATION_ICON_NAME@
|
||||
Name[zh_CN]=@APPLICATION_NAME@ 桌面同步客户端
|
||||
Name[zh_CN]=@APPLICATION_NAME@ 桌面
|
||||
Comment[zh_CN]=@APPLICATION_NAME@ 桌面同步客户端
|
||||
GenericName[zh_CN]=文件夹同步
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,6 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[zh_HK]=@APPLICATION_ICON_NAME@
|
||||
Name[zh_HK]= @APPLICATION_NAME@ 桌面同步客戶端
|
||||
Name[zh_HK]=@APPLICATION_NAME@ 桌面電腦
|
||||
Comment[zh_HK]= @APPLICATION_NAME@ 桌面同步客戶端
|
||||
GenericName[zh_HK]=資料夾同步
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
@@ -22,6 +22,6 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[zh_TW]=@APPLICATION_ICON_NAME@
|
||||
Name[zh_TW]=@APPLICATION_NAME@ 桌面同步客戶端
|
||||
Name[zh_TW]=@APPLICATION_NAME@ 桌面版
|
||||
Comment[zh_TW]=@APPLICATION_NAME@ 桌面同步客戶端
|
||||
GenericName[zh_TW]=資料夾同步
|
||||
|
||||
@@ -1,9 +1,14 @@
|
||||
set( MIRALL_VERSION_MAJOR 3 )
|
||||
set( MIRALL_VERSION_MINOR 1 )
|
||||
set( MIRALL_VERSION_PATCH 81 )
|
||||
set( MIRALL_VERSION_YEAR 2020 )
|
||||
set( MIRALL_VERSION_MINOR 2 )
|
||||
set( MIRALL_VERSION_PATCH 2 )
|
||||
set( MIRALL_VERSION_YEAR 2021 )
|
||||
set( MIRALL_SOVERSION 0 )
|
||||
|
||||
# Minimum supported server version according to https://docs.nextcloud.com/server/latest/admin_manual/release_schedule.html
|
||||
set(NEXTCLOUD_SERVER_VERSION_MIN_SUPPORTED_MAJOR 19)
|
||||
set(NEXTCLOUD_SERVER_VERSION_MIN_SUPPORTED_MINOR 0)
|
||||
set(NEXTCLOUD_SERVER_VERSION_MIN_SUPPORTED_PATCH 0)
|
||||
|
||||
if ( NOT DEFINED MIRALL_VERSION_SUFFIX )
|
||||
set( MIRALL_VERSION_SUFFIX "git") #e.g. beta1, beta2, rc1
|
||||
endif( NOT DEFINED MIRALL_VERSION_SUFFIX )
|
||||
|
||||
@@ -52,6 +52,9 @@
|
||||
<Property Id="INSTALLDIR">
|
||||
<RegistrySearch Id="RegistryInstallDir" Type="raw" Root="HKLM" Key="Software\$(var.AppVendor)\$(var.AppName)" Win64="no" />
|
||||
</Property>
|
||||
<Property Id="WINDOWSRELEASEID">
|
||||
<RegistrySearch Id="RegistryWindowsReleaseId" Type="raw" Root="HKLM" Key="Software\Microsoft\Windows NT\CurrentVersion" Name="ReleaseId"/>
|
||||
</Property>
|
||||
|
||||
<!-- Detect legacy NSIS installation -->
|
||||
<Property Id="NSIS_UNINSTALLEXE">
|
||||
@@ -77,8 +80,8 @@
|
||||
<!-- Uninstall: Remove sync folders from Explorer's Navigation Pane, only effective for the current user (home users) -->
|
||||
<Custom Action="RemoveNavigationPaneEntries" After="RemoveFiles">(NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")</Custom>
|
||||
|
||||
<!-- Schedule Reboot for the Shell Extensions -->
|
||||
<ScheduleReboot After="InstallFinalize">NOT (DO_NOT_SCHEDULE_REBOOT=1)</ScheduleReboot>
|
||||
<!-- Schedule Reboot for the Shell Extensions (in silent installation mode only, or if SCHEDULE_REBOOT argument is set-->
|
||||
<ScheduleReboot After="InstallFinalize">(SCHEDULE_REBOOT=1) OR NOT (UILevel=2)</ScheduleReboot>
|
||||
</InstallExecuteSequence>
|
||||
|
||||
<!-- "Add or Remove" Programs Entries -->
|
||||
@@ -214,6 +217,6 @@
|
||||
<Condition Level="0">(NO_DESKTOP_SHORTCUT=1)</Condition>
|
||||
</Feature>
|
||||
</Feature>
|
||||
|
||||
<Condition Message="This application only runs on Windows 10, version 1709 or higher!">(VersionNT>=603 AND WINDOWSRELEASEID>=1709)</Condition>
|
||||
</Product>
|
||||
</Wix>
|
||||
|
||||
@@ -41,16 +41,16 @@ master_doc = 'index'
|
||||
|
||||
# General information about the project.
|
||||
project = u'Nextcloud Client Manual'
|
||||
copyright = u'2013-2020, The Nextcloud developers'
|
||||
copyright = u'2013-2021, The Nextcloud developers'
|
||||
|
||||
# The version info for the project you're documenting, acts as replacement for
|
||||
# |version| and |release|, also used in various other places throughout the
|
||||
# built documents.
|
||||
#
|
||||
# The short X.Y version.
|
||||
version = '3.0'
|
||||
version = '3.2'
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
release = '3.0'
|
||||
release = '3.2.2'
|
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||
# for a list of supported languages.
|
||||
|
||||
|
Before Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 31 KiB |
BIN
doc/images/wizard_advanced.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
doc/images/wizard_flow2.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
doc/images/wizard_setup.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
doc/images/wizard_welcome.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
@@ -6,6 +6,10 @@ You can download the latest version of the Nextcloud Desktop Synchronization
|
||||
Client from the `Nextcloud download page`_.
|
||||
There are clients for Linux, macOs, and Microsoft Windows.
|
||||
|
||||
The currently supported server releases are the latest three stable versions
|
||||
at time of publication. It means that the |version| release series is supporting
|
||||
server major version 19, 20 and 21.
|
||||
|
||||
Installation on Mac OS X and Windows is the same as for any software
|
||||
application: download the program and then double-click it to launch the
|
||||
installation, and then follow the installation wizard. After it is installed and
|
||||
@@ -27,7 +31,7 @@ download page.
|
||||
System Requirements
|
||||
----------------------------------
|
||||
|
||||
- Windows 8.1+
|
||||
- Windows 10+
|
||||
- macOS 10.12+ (**64-bit only**)
|
||||
- macOS 10.10 & 10.11 (**64-bit and up to client legacy version 2.6.5 only**)
|
||||
- CentOS 6 & 7 (64-bit only)
|
||||
@@ -169,36 +173,49 @@ Installation Wizard
|
||||
-------------------
|
||||
|
||||
The installation wizard takes you step-by-step through configuration options and
|
||||
account setup. First you need to enter the URL of your Nextcloud server.
|
||||
account setup. First, you need to enter the URL of your Nextcloud server.
|
||||
|
||||
.. image:: images/client-1.png
|
||||
.. image:: images/wizard_welcome.png
|
||||
:alt: form for choosing between login and registering
|
||||
|
||||
If you already have an account on a Nextcloud instance, you want to
|
||||
press the button ``Login to your Nextcloud``. If you don't have a
|
||||
Nextcloud instance and an account there, you might want to register an
|
||||
account with a provider. Press ``Create account with Provider`` in
|
||||
that case. Please keep in mind that the desktop client might have
|
||||
built without provider support. In that case, you won't see this
|
||||
page. Instead, you will be prompted with the next page.
|
||||
|
||||
.. image:: images/wizard_setup.png
|
||||
:alt: form for entering Nextcloud server URL
|
||||
|
||||
Enter your Nextcloud login on the next screen.
|
||||
Enter the URL for your Nextcloud instance. The URL is the same URL that
|
||||
you type into your browser when you try to access your Nextcloud
|
||||
instance.
|
||||
|
||||
.. image:: images/client-2.png
|
||||
:alt: form for entering your Nextcloud login
|
||||
.. image:: images/wizard_flow2.png
|
||||
:alt: form waiting for authorization
|
||||
|
||||
On the Local Folder Option screen you may sync
|
||||
all of your files on the Nextcloud server, or select individual folders. The
|
||||
default local sync folder is ``Nextcloud``, in your home directory. You may
|
||||
change this as well.
|
||||
Now your web browser should open and prompt you to login into your
|
||||
Nextcloud instance. Enter your username and password in your web
|
||||
browser and grant access. After you did that, go back to the
|
||||
wizard. Please keep in mind that you might not need to enter your
|
||||
username and password if you are already logged in to your browser.
|
||||
|
||||
.. image:: images/client-3.png
|
||||
.. image:: images/wizard_advanced.png
|
||||
:alt: Select which remote folders to sync, and which local folder to store
|
||||
them in.
|
||||
|
||||
When you have completed selecting your sync folders, click the Connect button
|
||||
at the bottom right. The client will attempt to connect to your Nextcloud
|
||||
server, and when it is successful you'll see two buttons: one to connect to
|
||||
your Nextcloud Web GUI, and one to open your local folder. It will also start
|
||||
synchronizing your files.
|
||||
On the local folder options screen, you may sync all of your files on
|
||||
the Nextcloud server, or select individual folders. The default local
|
||||
sync folder is ``Nextcloud``, in your home directory. You may change
|
||||
this as well.
|
||||
|
||||
.. image:: images/client-4.png
|
||||
:alt: A successful server connection, showing a button to connect to your
|
||||
Web GUI, and one to open your local Nextcloud folder
|
||||
|
||||
Click the Finish button, and you're all done.
|
||||
When you have completed selecting your sync folders, click the Connect
|
||||
button at the bottom right. The client will attempt to connect to your
|
||||
Nextcloud server, and when it is successful, the wizard closes
|
||||
itself. You can now observe the sync activity if you open the main
|
||||
dialogue by clicking on the tray icon.
|
||||
|
||||
.. Links
|
||||
|
||||
|
||||
@@ -18,10 +18,8 @@ Improvements and New Features
|
||||
The |version| release of the Nextcloud desktop sync client has many new features and
|
||||
improvements.
|
||||
|
||||
* Show server notifications on the client
|
||||
* Improved sync speed
|
||||
* Improved handling of Win32 file locks and network files
|
||||
* Improved user notifications about ignored files and conflicts
|
||||
* Add warnings for old server versions
|
||||
* Update of QtKeyChain to support Windows credential store
|
||||
* Packaging of dolphin overlay icon module for bleeding edge distributions
|
||||
* Virtual Files on Windows
|
||||
* Support for the user status from the server
|
||||
* Many improvements to the sync engine
|
||||
* Make the end-to-end encryption work more reliable
|
||||
* Improve sync performance
|
||||
|
||||
53344
src/3rdparty/sqlite3/sqlite3.c
vendored
2338
src/3rdparty/sqlite3/sqlite3.h
vendored
@@ -44,6 +44,12 @@ struct OCSYNC_EXPORT VfsSetupParams
|
||||
*/
|
||||
QString filesystemPath;
|
||||
|
||||
// Folder display name in Windows Explorer
|
||||
QString displayName;
|
||||
|
||||
// Folder alias
|
||||
QString alias;
|
||||
|
||||
/** The path to the synced folder on the account
|
||||
*
|
||||
* Always ends with /.
|
||||
|
||||
@@ -52,7 +52,7 @@ struct csync_vio_handle_t {
|
||||
QString path; // Always ends with '\'
|
||||
};
|
||||
|
||||
static int _csync_vio_local_stat_mb(const mbchar_t *uri, csync_file_stat_t *buf);
|
||||
static int _csync_vio_local_stat_mb(const QString &path, csync_file_stat_t *buf);
|
||||
|
||||
csync_vio_handle_t *csync_vio_local_opendir(const QString &name) {
|
||||
|
||||
@@ -163,7 +163,8 @@ std::unique_ptr<csync_file_stat_t> csync_vio_local_readdir(csync_vio_handle_t *h
|
||||
} else if (handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
|
||||
file_stat->type = ItemTypeDirectory;
|
||||
} else {
|
||||
file_stat->type = ItemTypeFile;
|
||||
// exclude ".lnk" files as they are not essential, but, causing troubles when enabling the VFS due to QFileInfo::isDir() and other methods are freezing, which causes the ".lnk" files to start hydrating and freezing the app eventually.
|
||||
file_stat->type = !OCC::FileSystem::isLnkFile(path) ? ItemTypeFile : ItemTypeSoftLink;
|
||||
}
|
||||
|
||||
/* Check for the hidden flag */
|
||||
@@ -174,12 +175,12 @@ std::unique_ptr<csync_file_stat_t> csync_vio_local_readdir(csync_vio_handle_t *h
|
||||
file_stat->size = (handle->ffd.nFileSizeHigh * ((int64_t)(MAXDWORD)+1)) + handle->ffd.nFileSizeLow;
|
||||
file_stat->modtime = FileTimeToUnixTime(&handle->ffd.ftLastWriteTime, &rem);
|
||||
|
||||
std::wstring fullPath;
|
||||
QString fullPath;
|
||||
fullPath.reserve(handle->path.size() + std::wcslen(handle->ffd.cFileName));
|
||||
fullPath += handle->path.toStdWString(); // path always ends with '\', by construction
|
||||
fullPath += handle->ffd.cFileName;
|
||||
fullPath += handle->path; // path always ends with '\', by construction
|
||||
fullPath += QString::fromWCharArray(handle->ffd.cFileName);
|
||||
|
||||
if (_csync_vio_local_stat_mb(fullPath.data(), file_stat.get()) < 0) {
|
||||
if (_csync_vio_local_stat_mb(fullPath, file_stat.get()) < 0) {
|
||||
// Will get excluded by _csync_detect_update.
|
||||
file_stat->type = ItemTypeSkip;
|
||||
}
|
||||
@@ -190,12 +191,11 @@ std::unique_ptr<csync_file_stat_t> csync_vio_local_readdir(csync_vio_handle_t *h
|
||||
|
||||
int csync_vio_local_stat(const QString &uri, csync_file_stat_t *buf)
|
||||
{
|
||||
const std::wstring wuri = uri.toStdWString();
|
||||
int rc = _csync_vio_local_stat_mb(wuri.data(), buf);
|
||||
int rc = _csync_vio_local_stat_mb(uri, buf);
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int _csync_vio_local_stat_mb(const mbchar_t *wuri, csync_file_stat_t *buf)
|
||||
static int _csync_vio_local_stat_mb(const QString &path, csync_file_stat_t *buf)
|
||||
{
|
||||
/* Almost nothing to do since csync_vio_local_readdir already filled up most of the information
|
||||
But we still need to fetch the file ID.
|
||||
@@ -206,18 +206,20 @@ static int _csync_vio_local_stat_mb(const mbchar_t *wuri, csync_file_stat_t *buf
|
||||
BY_HANDLE_FILE_INFORMATION fileInfo;
|
||||
ULARGE_INTEGER FileIndex;
|
||||
|
||||
h = CreateFileW( wuri, 0, FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE,
|
||||
const auto longPath = OCC::FileSystem::longWinPath(path);
|
||||
|
||||
h = CreateFileW(longPath.toStdWString().data(), 0, FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE,
|
||||
nullptr, OPEN_EXISTING,
|
||||
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT,
|
||||
nullptr );
|
||||
if( h == INVALID_HANDLE_VALUE ) {
|
||||
qCCritical(lcCSyncVIOLocal, "CreateFileW failed on %ls", wuri);
|
||||
qCCritical(lcCSyncVIOLocal) << "CreateFileW failed on" << longPath;
|
||||
errno = GetLastError();
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(!GetFileInformationByHandle( h, &fileInfo ) ) {
|
||||
qCCritical(lcCSyncVIOLocal, "GetFileInformationByHandle failed on %ls", wuri);
|
||||
qCCritical(lcCSyncVIOLocal) << "GetFileInformationByHandle failed on" << longPath;
|
||||
errno = GetLastError();
|
||||
CloseHandle(h);
|
||||
return -1;
|
||||
|
||||
@@ -98,6 +98,7 @@ set(client_SRCS
|
||||
systray.cpp
|
||||
thumbnailjob.cpp
|
||||
userinfo.cpp
|
||||
userstatus.cpp
|
||||
accountstate.cpp
|
||||
addcertificatedialog.cpp
|
||||
authenticationdialog.cpp
|
||||
@@ -222,8 +223,6 @@ set( final_src
|
||||
${MIRALL_RC_SRC}
|
||||
${client_SRCS}
|
||||
${client_UI_SRCS}
|
||||
${client_version}
|
||||
${client_manifest}
|
||||
${guiMoc}
|
||||
${client_I18N}
|
||||
${3rdparty_SRC}
|
||||
@@ -252,7 +251,7 @@ if(APPLE)
|
||||
file(GLOB_RECURSE OWNCLOUD_SIDEBAR_ICONS "${theme_dir}/colored/*-${APPLICATION_ICON_NAME}-sidebar*")
|
||||
MESSAGE(STATUS "OWNCLOUD_SIDEBAR_ICONS: ${APPLICATION_ICON_NAME}: ${OWNCLOUD_SIDEBAR_ICONS}")
|
||||
endif()
|
||||
ecm_add_app_icon(final_src ICONS "${OWNCLOUD_ICONS}" SIDEBAR_ICONS "${OWNCLOUD_SIDEBAR_ICONS}" OUTFILE_BASENAME "${APPLICATION_ICON_NAME}")
|
||||
ecm_add_app_icon(APP_ICON ICONS "${OWNCLOUD_ICONS}" SIDEBAR_ICONS "${OWNCLOUD_SIDEBAR_ICONS}" OUTFILE_BASENAME "${APPLICATION_ICON_NAME}")
|
||||
|
||||
if(UNIX AND NOT APPLE)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIE")
|
||||
@@ -314,13 +313,13 @@ if(NOT BUILD_OWNCLOUD_OSX_BUNDLE)
|
||||
endif()
|
||||
|
||||
# we may not add MACOSX_BUNDLE here, if not building one
|
||||
add_executable(${APPLICATION_EXECUTABLE} WIN32 main.cpp)
|
||||
add_executable(${APPLICATION_EXECUTABLE} WIN32 main.cpp ${client_version} ${client_manifest} ${APP_ICON})
|
||||
else()
|
||||
# set(CMAKE_INSTALL_PREFIX ".") # Examples use /Applications. hurmpf.
|
||||
set(MACOSX_BUNDLE_ICON_FILE "${APPLICATION_ICON_NAME}.icns")
|
||||
|
||||
# we must add MACOSX_BUNDLE only if building a bundle
|
||||
add_executable(${APPLICATION_EXECUTABLE} WIN32 MACOSX_BUNDLE main.cpp)
|
||||
add_executable(${APPLICATION_EXECUTABLE} WIN32 MACOSX_BUNDLE main.cpp ${APP_ICON})
|
||||
|
||||
set (QM_DIR ${OWNCLOUD_OSX_BUNDLE}/Contents/Resources/Translations)
|
||||
install(FILES ${client_I18N} DESTINATION ${QM_DIR})
|
||||
@@ -429,11 +428,13 @@ if(BUILD_OWNCLOUD_OSX_BUNDLE AND NOT BUILD_LIBRARIES_ONLY)
|
||||
|
||||
add_custom_command(TARGET ${APPLICATION_EXECUTABLE} POST_BUILD
|
||||
COMMAND "${MACDEPLOYQT_EXECUTABLE}"
|
||||
"$<TARGET_FILE_DIR:${APPLICATION_EXECUTABLE}>/../.."
|
||||
-qmldir=${CMAKE_SOURCE_DIR}/src/gui
|
||||
-always-overwrite
|
||||
-executable="$<TARGET_FILE_DIR:${APPLICATION_EXECUTABLE}>/${cmd_NAME}"
|
||||
${NO_STRIP}
|
||||
"$<TARGET_FILE_DIR:${APPLICATION_EXECUTABLE}>/../.."
|
||||
-qmldir=${CMAKE_SOURCE_DIR}/src/gui
|
||||
-always-overwrite
|
||||
-executable="$<TARGET_FILE_DIR:${APPLICATION_EXECUTABLE}>/${cmd_NAME}"
|
||||
${NO_STRIP}
|
||||
COMMAND "${CMAKE_COMMAND}"
|
||||
-E rm -rf "${BIN_OUTPUT_DIRECTORY}/${OWNCLOUD_OSX_BUNDLE}/Contents/PlugIns/bearer"
|
||||
COMMENT "Running macdeployqt..."
|
||||
)
|
||||
endif()
|
||||
|
||||
@@ -380,6 +380,7 @@ void AccountManager::deleteAccount(AccountState *account)
|
||||
// Forget E2E keys
|
||||
account->account()->e2e()->forgetSensitiveData(account->account());
|
||||
|
||||
emit accountSyncConnectionRemoved(account);
|
||||
emit accountRemoved(account);
|
||||
}
|
||||
|
||||
|
||||
@@ -114,6 +114,7 @@ public slots:
|
||||
Q_SIGNALS:
|
||||
void accountAdded(AccountState *account);
|
||||
void accountRemoved(AccountState *account);
|
||||
void accountSyncConnectionRemoved(AccountState *account);
|
||||
void removeAccountFolders(AccountState *account);
|
||||
};
|
||||
}
|
||||
|
||||
@@ -385,8 +385,7 @@ void AccountSettings::slotEditCurrentLocalIgnoredFiles()
|
||||
|
||||
void AccountSettings::openIgnoredFilesDialog(const QString & absFolderPath)
|
||||
{
|
||||
Q_ASSERT(absFolderPath.startsWith('/'));
|
||||
Q_ASSERT(absFolderPath.endsWith('/'));
|
||||
Q_ASSERT(QFileInfo(absFolderPath).isAbsolute());
|
||||
|
||||
const QString ignoreFile = absFolderPath + ".sync-exclude.lst";
|
||||
auto layout = new QVBoxLayout();
|
||||
|
||||
@@ -44,6 +44,8 @@ AccountState::AccountState(AccountPtr account)
|
||||
, _waitingForNewCredentials(false)
|
||||
, _maintenanceToConnectedDelay(60000 + (qrand() % (4 * 60000))) // 1-5min delay
|
||||
, _remoteWipe(new RemoteWipe(_account))
|
||||
, _userStatus(new UserStatus(this))
|
||||
, _isDesktopNotificationsAllowed(true)
|
||||
{
|
||||
qRegisterMetaType<AccountState *>("AccountState*");
|
||||
|
||||
@@ -125,6 +127,21 @@ void AccountState::setState(State state)
|
||||
emit stateChanged(_state);
|
||||
}
|
||||
|
||||
UserStatus::Status AccountState::status() const
|
||||
{
|
||||
return _userStatus->status();
|
||||
}
|
||||
|
||||
QString AccountState::statusMessage() const
|
||||
{
|
||||
return _userStatus->message();
|
||||
}
|
||||
|
||||
QUrl AccountState::statusIcon() const
|
||||
{
|
||||
return _userStatus->icon();
|
||||
}
|
||||
|
||||
QString AccountState::stateString(State state)
|
||||
{
|
||||
switch (state) {
|
||||
@@ -205,6 +222,16 @@ void AccountState::setNavigationAppsEtagResponseHeader(const QByteArray &value)
|
||||
_navigationAppsEtagResponseHeader = value;
|
||||
}
|
||||
|
||||
bool AccountState::isDesktopNotificationsAllowed() const
|
||||
{
|
||||
return _isDesktopNotificationsAllowed;
|
||||
}
|
||||
|
||||
void AccountState::setDesktopNotificationsAllowed(bool isAllowed)
|
||||
{
|
||||
_isDesktopNotificationsAllowed = isAllowed;
|
||||
}
|
||||
|
||||
void AccountState::checkConnectivity()
|
||||
{
|
||||
if (isSignedOut() || _waitingForNewCredentials) {
|
||||
@@ -422,6 +449,12 @@ void AccountState::fetchNavigationApps(){
|
||||
job->getNavigationApps();
|
||||
}
|
||||
|
||||
void AccountState::fetchUserStatus()
|
||||
{
|
||||
connect(_userStatus, &UserStatus::fetchUserStatusFinished, this, &AccountState::statusChanged);
|
||||
_userStatus->fetchUserStatus(_account);
|
||||
}
|
||||
|
||||
void AccountState::slotEtagResponseHeaderReceived(const QByteArray &value, int statusCode){
|
||||
if(statusCode == 200){
|
||||
qCDebug(lcAccountState) << "New navigation apps ETag Response Header received " << value;
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
#include <QPointer>
|
||||
#include "connectionvalidator.h"
|
||||
#include "creds/abstractcredentials.h"
|
||||
#include "userstatus.h"
|
||||
#include <memory>
|
||||
|
||||
class QSettings;
|
||||
@@ -161,6 +162,32 @@ public:
|
||||
///Asks for user credentials
|
||||
void handleInvalidCredentials();
|
||||
|
||||
/** Returns the user status (Online, Dnd, Away, Offline, Invisible)
|
||||
* https://gist.github.com/georgehrke/55a0412007f13be1551d1f9436a39675
|
||||
*/
|
||||
UserStatus::Status status() const;
|
||||
|
||||
/** Returns the user status Message (emoji + text)
|
||||
*/
|
||||
QString statusMessage() const;
|
||||
|
||||
/** Returns the user status icon url
|
||||
*/
|
||||
QUrl statusIcon() const;
|
||||
|
||||
/** Returns the notifications status retrieved by the notificatons endpoint
|
||||
* https://github.com/nextcloud/desktop/issues/2318#issuecomment-680698429
|
||||
*/
|
||||
bool isDesktopNotificationsAllowed() const;
|
||||
|
||||
/** Set desktop notifications status retrieved by the notificatons endpoint
|
||||
*/
|
||||
void setDesktopNotificationsAllowed(bool isAllowed);
|
||||
|
||||
/** Fetch the user status (status, icon, message)
|
||||
*/
|
||||
void fetchUserStatus();
|
||||
|
||||
public slots:
|
||||
/// Triggers a ping to the server to update state and
|
||||
/// connection status and errors.
|
||||
@@ -174,6 +201,7 @@ signals:
|
||||
void stateChanged(State state);
|
||||
void isConnectedChanged();
|
||||
void hasFetchedNavigationApps();
|
||||
void statusChanged();
|
||||
|
||||
protected Q_SLOTS:
|
||||
void slotConnectionValidatorResult(ConnectionValidator::Status status, const QStringList &errors);
|
||||
@@ -223,6 +251,8 @@ private:
|
||||
*/
|
||||
AccountAppList _apps;
|
||||
|
||||
UserStatus *_userStatus;
|
||||
bool _isDesktopNotificationsAllowed;
|
||||
};
|
||||
|
||||
class AccountApp : public QObject
|
||||
|
||||
@@ -156,8 +156,8 @@ void WebFlowCredentials::askFromUser() {
|
||||
_askDialog->setUrl(url);
|
||||
}
|
||||
|
||||
QString msg = tr("You have been logged out of %1 as user %2. Please login again")
|
||||
.arg(_account->displayName(), _user);
|
||||
QString msg = tr("You have been logged out of %1 as user %2. Please login again.")
|
||||
.arg(_account->displayName(), _user);
|
||||
_askDialog->setInfo(msg);
|
||||
|
||||
_askDialog->show();
|
||||
|
||||
@@ -27,19 +27,12 @@ WebFlowCredentialsDialog::WebFlowCredentialsDialog(Account *account, bool useFlo
|
||||
_layout->setSpacing(0);
|
||||
_layout->setMargin(0);
|
||||
|
||||
if(_useFlow2) {
|
||||
_headerBanner = new HeaderBanner(this);
|
||||
_layout->addWidget(_headerBanner);
|
||||
Theme *theme = Theme::instance();
|
||||
_headerBanner->setup(tr("Log in"), theme->wizardHeaderLogo(), theme->wizardHeaderBanner(),
|
||||
Qt::AutoText, QString::fromLatin1("color:#fff;"));
|
||||
}
|
||||
|
||||
_containerLayout = new QVBoxLayout(this);
|
||||
_containerLayout->setSpacing(spacing);
|
||||
_containerLayout->setMargin(margin);
|
||||
|
||||
_infoLabel = new QLabel();
|
||||
_infoLabel->setAlignment(Qt::AlignCenter);
|
||||
_containerLayout->addWidget(_infoLabel);
|
||||
|
||||
if (_useFlow2) {
|
||||
|
||||
@@ -300,6 +300,14 @@ void Folder::setSyncPaused(bool paused)
|
||||
emit canSyncChanged();
|
||||
}
|
||||
|
||||
void Folder::onAssociatedAccountRemoved()
|
||||
{
|
||||
if (_vfs) {
|
||||
_vfs->stop();
|
||||
_vfs->unregisterFolder();
|
||||
}
|
||||
}
|
||||
|
||||
void Folder::setSyncState(SyncResult::Status state)
|
||||
{
|
||||
_syncResult.setStatus(state);
|
||||
@@ -486,6 +494,8 @@ void Folder::startVfs()
|
||||
|
||||
VfsSetupParams vfsParams;
|
||||
vfsParams.filesystemPath = path();
|
||||
vfsParams.displayName = shortGuiRemotePathOrAppName();
|
||||
vfsParams.alias = alias();
|
||||
vfsParams.remotePath = remotePathTrailingSlash();
|
||||
vfsParams.account = _accountState->account();
|
||||
vfsParams.journal = &_journal;
|
||||
|
||||
@@ -206,6 +206,8 @@ public:
|
||||
*/
|
||||
virtual void wipeForRemoval();
|
||||
|
||||
void onAssociatedAccountRemoved();
|
||||
|
||||
void setSyncState(SyncResult::Status state);
|
||||
|
||||
void setDirtyNetworkLimits();
|
||||
|
||||
@@ -19,9 +19,12 @@
|
||||
|
||||
#include <QDir>
|
||||
#include <QMessageBox>
|
||||
#include <QLoggingCategory>
|
||||
|
||||
namespace OCC {
|
||||
|
||||
Q_LOGGING_CATEGORY(lcFolderCreationDialog, "nextcloud.gui.foldercreationdialog", QtInfoMsg)
|
||||
|
||||
FolderCreationDialog::FolderCreationDialog(const QString &destination, QWidget *parent)
|
||||
: QDialog(parent)
|
||||
, ui(new Ui::FolderCreationDialog)
|
||||
@@ -37,7 +40,7 @@ FolderCreationDialog::FolderCreationDialog(const QString &destination, QWidget *
|
||||
|
||||
const QString suggestedFolderNamePrefix = QObject::tr("New folder");
|
||||
|
||||
const auto newFolderFullPath = _destination + "/" + suggestedFolderNamePrefix;
|
||||
const QString newFolderFullPath = _destination + QLatin1Char('/') + suggestedFolderNamePrefix;
|
||||
if (!QDir(newFolderFullPath).exists()) {
|
||||
ui->newFolderNameEdit->setText(suggestedFolderNamePrefix);
|
||||
} else {
|
||||
|
||||
@@ -76,6 +76,9 @@ FolderMan::FolderMan(QObject *parent)
|
||||
connect(AccountManager::instance(), &AccountManager::removeAccountFolders,
|
||||
this, &FolderMan::slotRemoveFoldersForAccount);
|
||||
|
||||
connect(AccountManager::instance(), &AccountManager::accountSyncConnectionRemoved,
|
||||
this, &FolderMan::slotAccountRemoved);
|
||||
|
||||
connect(_lockWatcher.data(), &LockWatcher::fileUnlocked,
|
||||
this, &FolderMan::slotWatchedFileUnlocked);
|
||||
|
||||
@@ -902,6 +905,15 @@ void FolderMan::runEtagJobIfPossible(Folder *folder)
|
||||
QMetaObject::invokeMethod(folder, "slotRunEtagJob", Qt::QueuedConnection);
|
||||
}
|
||||
|
||||
void FolderMan::slotAccountRemoved(AccountState *accountState)
|
||||
{
|
||||
for (const auto &folder : qAsConst(_folderMap)) {
|
||||
if (folder->accountState() == accountState) {
|
||||
folder->onAssociatedAccountRemoved();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void FolderMan::slotRemoveFoldersForAccount(AccountState *accountState)
|
||||
{
|
||||
QVarLengthArray<Folder *, 16> foldersToRemove;
|
||||
@@ -1477,7 +1489,7 @@ QString FolderMan::trayTooltipStatusString(
|
||||
case SyncResult::Success:
|
||||
case SyncResult::Problem:
|
||||
if (hasUnresolvedConflicts) {
|
||||
folderMessage = tr("Sync was successful, unresolved conflicts.");
|
||||
folderMessage = tr("Sync finished with unresolved conflicts.");
|
||||
} else {
|
||||
folderMessage = tr("Last Sync was successful.");
|
||||
}
|
||||
|
||||
@@ -264,6 +264,8 @@ private slots:
|
||||
void slotStartScheduledFolderSync();
|
||||
void slotEtagPollTimerTimeout();
|
||||
|
||||
void slotAccountRemoved(AccountState *accountState);
|
||||
|
||||
void slotRemoveFoldersForAccount(AccountState *accountState);
|
||||
|
||||
// Wraps the Folder::syncStateChange() signal into the
|
||||
|
||||
@@ -64,10 +64,7 @@ int main(int argc, char **argv)
|
||||
// OpenSSL 1.1.0: No explicit initialisation or de-initialisation is necessary.
|
||||
|
||||
QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps, true);
|
||||
#ifdef Q_OS_WIN
|
||||
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling, true);
|
||||
#endif // !Q_OS_WIN
|
||||
|
||||
#ifdef Q_OS_MAC
|
||||
Mac::CocoaInitializer cocoaInit; // RIIA
|
||||
#endif
|
||||
|
||||
@@ -86,9 +86,6 @@ void NavigationPaneHelper::updateCloudStorageRegistry()
|
||||
// We currently don't distinguish between new and existing CLSIDs, if it's there we just
|
||||
// save over it. We at least need to update the tile in case we are suddently using multiple accounts.
|
||||
foreach (Folder *folder, _folderMan->map()) {
|
||||
if (folder->vfs().mode() == Vfs::WindowsCfApi) {
|
||||
continue;
|
||||
}
|
||||
if (!folder->navigationPaneClsid().isNull()) {
|
||||
// If it already exists, unmark it for removal, this is a valid sync root.
|
||||
entriesToRemove.removeOne(folder->navigationPaneClsid());
|
||||
|
||||
@@ -86,17 +86,6 @@ bool OwncloudSetupWizard::bringWizardToFrontIfVisible()
|
||||
return false;
|
||||
}
|
||||
|
||||
if (wiz->_ocWizard->currentId() == WizardCommon::Page_ShibbolethCreds) {
|
||||
// Try to find if there is a browser open and raise that instead (Issue #6105)
|
||||
const auto allWindow = qApp->topLevelWidgets();
|
||||
auto it = std::find_if(allWindow.cbegin(), allWindow.cend(), [](QWidget *w)
|
||||
{ return QLatin1String(w->metaObject()->className()) == QLatin1String("OCC::ShibbolethWebView"); });
|
||||
if (it != allWindow.cend()) {
|
||||
ownCloudGui::raiseDialog(*it);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
ownCloudGui::raiseDialog(wiz->_ocWizard);
|
||||
return true;
|
||||
}
|
||||
@@ -413,7 +402,7 @@ void OwncloudSetupWizard::slotAuthError()
|
||||
|
||||
// bring wizard to top
|
||||
_ocWizard->bringToTop();
|
||||
if (_ocWizard->currentId() == WizardCommon::Page_ShibbolethCreds || _ocWizard->currentId() == WizardCommon::Page_OAuthCreds || _ocWizard->currentId() == WizardCommon::Page_Flow2AuthCreds) {
|
||||
if (_ocWizard->currentId() == WizardCommon::Page_OAuthCreds || _ocWizard->currentId() == WizardCommon::Page_Flow2AuthCreds) {
|
||||
_ocWizard->back();
|
||||
}
|
||||
_ocWizard->displayError(errorMsg, _ocWizard->currentId() == WizardCommon::Page_ServerSetup && checkDowngradeAdvised(reply));
|
||||
|
||||
@@ -31,70 +31,6 @@
|
||||
</property>
|
||||
<item row="0" column="0">
|
||||
<widget class="QStackedWidget" name="stack">
|
||||
<property name="palette">
|
||||
<palette>
|
||||
<active>
|
||||
<colorrole role="Base">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>252</red>
|
||||
<green>252</green>
|
||||
<blue>252</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Window">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</active>
|
||||
<inactive>
|
||||
<colorrole role="Base">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>252</red>
|
||||
<green>252</green>
|
||||
<blue>252</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Window">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</inactive>
|
||||
<disabled>
|
||||
<colorrole role="Base">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Window">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</disabled>
|
||||
</palette>
|
||||
</property>
|
||||
<property name="lineWidth">
|
||||
<number>0</number>
|
||||
</property>
|
||||
|
||||
@@ -180,11 +180,11 @@ Q_LOGGING_CATEGORY(lcPublicLink, "nextcloud.gui.socketapi.publiclink", QtInfoMsg
|
||||
void SocketListener::sendMessage(const QString &message, bool doWait) const
|
||||
{
|
||||
if (!socket) {
|
||||
qCInfo(lcSocketApi) << "Not sending message to dead socket:" << message;
|
||||
qCWarning(lcSocketApi) << "Not sending message to dead socket:" << message;
|
||||
return;
|
||||
}
|
||||
|
||||
qCInfo(lcSocketApi) << "Sending SocketAPI message -->" << message << "to" << socket;
|
||||
qCDebug(lcSocketApi) << "Sending SocketAPI message -->" << message << "to" << socket;
|
||||
QString localMessage = message;
|
||||
if (!localMessage.endsWith(QLatin1Char('\n'))) {
|
||||
localMessage.append(QLatin1Char('\n'));
|
||||
@@ -313,6 +313,7 @@ void SocketApi::slotNewConnection()
|
||||
foreach (Folder *f, FolderMan::instance()->map()) {
|
||||
if (f->canSync()) {
|
||||
QString message = buildRegisterPathMessage(removeTrailingSlash(f->path()));
|
||||
qCInfo(lcSocketApi) << "Trying to send SocketAPI Register Path Message -->" << message << "to" << listener.socket;
|
||||
listener.sendMessage(message);
|
||||
}
|
||||
}
|
||||
@@ -417,6 +418,7 @@ void SocketApi::slotRegisterPath(const QString &alias)
|
||||
if (f) {
|
||||
QString message = buildRegisterPathMessage(removeTrailingSlash(f->path()));
|
||||
foreach (auto &listener, _listeners) {
|
||||
qCInfo(lcSocketApi) << "Trying to send SocketAPI Register Path Message -->" << message << "to" << listener.socket;
|
||||
listener.sendMessage(message);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -48,6 +48,8 @@ void ServerNotificationHandler::slotFetchNotifications()
|
||||
this, &ServerNotificationHandler::slotNotificationsReceived);
|
||||
QObject::connect(_notificationJob.data(), &JsonApiJob::etagResponseHeaderReceived,
|
||||
this, &ServerNotificationHandler::slotEtagResponseHeaderReceived);
|
||||
QObject::connect(_notificationJob.data(), &JsonApiJob::allowDesktopNotificationsChanged,
|
||||
this, &ServerNotificationHandler::slotAllowDesktopNotificationsChanged);
|
||||
_notificationJob->setProperty(propertyAccountStateC, QVariant::fromValue<AccountState *>(_accountState));
|
||||
_notificationJob->addRawHeader("If-None-Match", _accountState->notificationsEtagResponseHeader());
|
||||
_notificationJob->start();
|
||||
@@ -62,6 +64,14 @@ void ServerNotificationHandler::slotEtagResponseHeaderReceived(const QByteArray
|
||||
}
|
||||
}
|
||||
|
||||
void ServerNotificationHandler::slotAllowDesktopNotificationsChanged(bool isAllowed)
|
||||
{
|
||||
auto *account = qvariant_cast<AccountState *>(sender()->property(propertyAccountStateC));
|
||||
if (account != nullptr) {
|
||||
account->setDesktopNotificationsAllowed(isAllowed);
|
||||
}
|
||||
}
|
||||
|
||||
void ServerNotificationHandler::slotIconDownloaded(QByteArray iconData)
|
||||
{
|
||||
iconCache.insert(sender()->property("activityId").toInt(),iconData);
|
||||
|
||||
@@ -26,6 +26,7 @@ private slots:
|
||||
void slotNotificationsReceived(const QJsonDocument &json, int statusCode);
|
||||
void slotEtagResponseHeaderReceived(const QByteArray &value, int statusCode);
|
||||
void slotIconDownloaded(QByteArray iconData);
|
||||
void slotAllowDesktopNotificationsChanged(bool isAllowed);
|
||||
|
||||
private:
|
||||
QPointer<JsonApiJob> _notificationJob;
|
||||
|
||||
@@ -35,7 +35,7 @@ MenuItem {
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
onContainsMouseChanged: {
|
||||
accountStateIndicatorBackground.color = (containsMouse ? "#f6f6f6" : "white")
|
||||
accountStatusIndicatorBackground.color = (containsMouse ? "#f6f6f6" : "white")
|
||||
}
|
||||
onClicked: {
|
||||
if (!isCurrentUser) {
|
||||
@@ -71,8 +71,8 @@ MenuItem {
|
||||
Layout.preferredHeight: (userLineLayout.height -16)
|
||||
Layout.preferredWidth: (userLineLayout.height -16)
|
||||
Rectangle {
|
||||
id: accountStateIndicatorBackground
|
||||
width: accountStateIndicator.sourceSize.width + 2
|
||||
id: accountStatusIndicatorBackground
|
||||
width: accountStatusIndicator.sourceSize.width + 2
|
||||
height: width
|
||||
anchors.bottom: accountAvatar.bottom
|
||||
anchors.right: accountAvatar.right
|
||||
@@ -80,18 +80,16 @@ MenuItem {
|
||||
radius: width*0.5
|
||||
}
|
||||
Image {
|
||||
id: accountStateIndicator
|
||||
source: model.isConnected
|
||||
? Style.stateOnlineImageSource
|
||||
: Style.stateOfflineImageSource
|
||||
id: accountStatusIndicator
|
||||
source: model.statusIcon
|
||||
cache: false
|
||||
x: accountStateIndicatorBackground.x + 1
|
||||
y: accountStateIndicatorBackground.y + 1
|
||||
x: accountStatusIndicatorBackground.x + 1
|
||||
y: accountStatusIndicatorBackground.y + 1
|
||||
sourceSize.width: Style.accountAvatarStateIndicatorSize
|
||||
sourceSize.height: Style.accountAvatarStateIndicatorSize
|
||||
|
||||
Accessible.role: Accessible.Indicator
|
||||
Accessible.name: model.isConnected ? qsTr("Account connected") : qsTr("Account not connected")
|
||||
Accessible.name: model.isStatusOnline ? qsTr("Current user status is online") : qsTr("Current user status is do not disturb")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -109,6 +107,14 @@ MenuItem {
|
||||
font.pixelSize: 12
|
||||
font.bold: true
|
||||
}
|
||||
Label {
|
||||
id: userStatusMessage
|
||||
width: 128
|
||||
text: statusMessage
|
||||
elide: Text.ElideRight
|
||||
color: "black"
|
||||
font.pixelSize: 10
|
||||
}
|
||||
Label {
|
||||
id: accountServer
|
||||
width: 128
|
||||
@@ -223,13 +229,4 @@ MenuItem {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: UserModel
|
||||
onRefreshCurrentUserGui: {
|
||||
accountStateIndicator.source = model.isConnected
|
||||
? Style.stateOnlineImageSource
|
||||
: Style.stateOfflineImageSource
|
||||
}
|
||||
}
|
||||
} // MenuItem userLine
|
||||
|
||||
@@ -53,6 +53,7 @@ User::User(AccountStatePtr &account, const bool &isCurrent, QObject *parent)
|
||||
connect(this, &User::guiLog, Logger::instance(), &Logger::guiLog);
|
||||
|
||||
connect(_account->account().data(), &Account::accountChangedAvatar, this, &User::avatarChanged);
|
||||
connect(_account.data(), &AccountState::statusChanged, this, &User::statusChanged);
|
||||
|
||||
connect(_activityModel, &ActivityListModel::sendNotificationRequest, this, &User::slotSendNotificationRequest);
|
||||
}
|
||||
@@ -87,7 +88,7 @@ void User::slotBuildNotificationDisplay(const ActivityList &list)
|
||||
|
||||
// Assemble a tray notification for the NEW notification
|
||||
ConfigFile cfg;
|
||||
if (cfg.optionalServerNotifications()) {
|
||||
if (cfg.optionalServerNotifications() && isDesktopNotificationsAllowed()) {
|
||||
if (AccountManager::instance()->accounts().count() == 1) {
|
||||
emit guiLog(activity._subject, "");
|
||||
} else {
|
||||
@@ -185,6 +186,8 @@ void User::slotRefreshImmediately() {
|
||||
|
||||
void User::slotRefresh()
|
||||
{
|
||||
slotRefreshUserStatus();
|
||||
|
||||
if (checkPushNotificationsAreReady()) {
|
||||
// we are relying on WebSocket push notifications - ignore refresh attempts from UI
|
||||
_timeSinceLastCheck[_account.data()].invalidate();
|
||||
@@ -216,6 +219,14 @@ void User::slotRefreshActivities()
|
||||
_activityModel->slotRefreshActivity();
|
||||
}
|
||||
|
||||
void User::slotRefreshUserStatus()
|
||||
{
|
||||
// TODO: check for _account->account()->capabilities().userStatus()
|
||||
if (_account.data() && _account.data()->isConnected()) {
|
||||
_account.data()->fetchUserStatus();
|
||||
}
|
||||
}
|
||||
|
||||
void User::slotRefreshNotifications()
|
||||
{
|
||||
// start a server notification handler if no notification requests
|
||||
@@ -413,19 +424,15 @@ void User::slotAddError(const QString &folderAlias, const QString &message, Erro
|
||||
}
|
||||
}
|
||||
|
||||
bool User::isValueableActivity(const Folder *folder, const SyncFileItemPtr &item) const
|
||||
bool User::isActivityOfCurrentAccount(const Folder *folder) const
|
||||
{
|
||||
// Ignore activity from a different account
|
||||
if (folder->accountState() != _account.data()) {
|
||||
return false;
|
||||
}
|
||||
return folder->accountState() == _account.data();
|
||||
}
|
||||
|
||||
bool User::isUnsolvableConflict(const SyncFileItemPtr &item) const
|
||||
{
|
||||
// We just care about conflict issues that we are able to resolve
|
||||
if (item->_status == SyncFileItem::Conflict && !Utility::isConflictFile(item->_file)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
return item->_status == SyncFileItem::Conflict && !Utility::isConflictFile(item->_file);
|
||||
}
|
||||
|
||||
void User::slotItemCompleted(const QString &folder, const SyncFileItemPtr &item)
|
||||
@@ -435,56 +442,62 @@ void User::slotItemCompleted(const QString &folder, const SyncFileItemPtr &item)
|
||||
if (!folderInstance)
|
||||
return;
|
||||
|
||||
if (isValueableActivity(folderInstance, item)) {
|
||||
qCWarning(lcActivity) << "Item " << item->_file << " retrieved resulted in " << item->_errorString;
|
||||
if (!isActivityOfCurrentAccount(folderInstance)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Activity activity;
|
||||
activity._type = Activity::SyncFileItemType; //client activity
|
||||
activity._status = item->_status;
|
||||
activity._dateTime = QDateTime::currentDateTime();
|
||||
activity._message = item->_originalFile;
|
||||
activity._link = folderInstance->accountState()->account()->url();
|
||||
activity._accName = folderInstance->accountState()->account()->displayName();
|
||||
activity._file = item->_file;
|
||||
activity._folder = folder;
|
||||
activity._fileAction = "";
|
||||
if (isUnsolvableConflict(item)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (item->_instruction == CSYNC_INSTRUCTION_REMOVE) {
|
||||
activity._fileAction = "file_deleted";
|
||||
} else if (item->_instruction == CSYNC_INSTRUCTION_NEW) {
|
||||
activity._fileAction = "file_created";
|
||||
} else if (item->_instruction == CSYNC_INSTRUCTION_RENAME) {
|
||||
activity._fileAction = "file_renamed";
|
||||
qCWarning(lcActivity) << "Item " << item->_file << " retrieved resulted in " << item->_errorString;
|
||||
|
||||
Activity activity;
|
||||
activity._type = Activity::SyncFileItemType; //client activity
|
||||
activity._status = item->_status;
|
||||
activity._dateTime = QDateTime::currentDateTime();
|
||||
activity._message = item->_originalFile;
|
||||
activity._link = folderInstance->accountState()->account()->url();
|
||||
activity._accName = folderInstance->accountState()->account()->displayName();
|
||||
activity._file = item->_file;
|
||||
activity._folder = folder;
|
||||
activity._fileAction = "";
|
||||
|
||||
if (item->_instruction == CSYNC_INSTRUCTION_REMOVE) {
|
||||
activity._fileAction = "file_deleted";
|
||||
} else if (item->_instruction == CSYNC_INSTRUCTION_NEW) {
|
||||
activity._fileAction = "file_created";
|
||||
} else if (item->_instruction == CSYNC_INSTRUCTION_RENAME) {
|
||||
activity._fileAction = "file_renamed";
|
||||
} else {
|
||||
activity._fileAction = "file_changed";
|
||||
}
|
||||
|
||||
if (item->_status == SyncFileItem::NoStatus || item->_status == SyncFileItem::Success) {
|
||||
qCWarning(lcActivity) << "Item " << item->_file << " retrieved successfully.";
|
||||
|
||||
if (item->_direction != SyncFileItem::Up) {
|
||||
activity._message = tr("Synced %1").arg(item->_originalFile);
|
||||
} else if (activity._fileAction == "file_renamed") {
|
||||
activity._message = tr("You renamed %1").arg(item->_originalFile);
|
||||
} else if (activity._fileAction == "file_deleted") {
|
||||
activity._message = tr("You deleted %1").arg(item->_originalFile);
|
||||
} else if (activity._fileAction == "file_created") {
|
||||
activity._message = tr("You created %1").arg(item->_originalFile);
|
||||
} else {
|
||||
activity._fileAction = "file_changed";
|
||||
activity._message = tr("You changed %1").arg(item->_originalFile);
|
||||
}
|
||||
|
||||
if (item->_status == SyncFileItem::NoStatus || item->_status == SyncFileItem::Success) {
|
||||
qCWarning(lcActivity) << "Item " << item->_file << " retrieved successfully.";
|
||||
_activityModel->addSyncFileItemToActivityList(activity);
|
||||
} else {
|
||||
qCWarning(lcActivity) << "Item " << item->_file << " retrieved resulted in error " << item->_errorString;
|
||||
activity._subject = item->_errorString;
|
||||
|
||||
if (item->_direction != SyncFileItem::Up) {
|
||||
activity._message = tr("Synced %1").arg(item->_originalFile);
|
||||
} else if (activity._fileAction == "file_renamed") {
|
||||
activity._message = tr("You renamed %1").arg(item->_originalFile);
|
||||
} else if (activity._fileAction == "file_deleted") {
|
||||
activity._message = tr("You deleted %1").arg(item->_originalFile);
|
||||
} else if (activity._fileAction == "file_created") {
|
||||
activity._message = tr("You created %1").arg(item->_originalFile);
|
||||
} else {
|
||||
activity._message = tr("You changed %1").arg(item->_originalFile);
|
||||
}
|
||||
|
||||
_activityModel->addSyncFileItemToActivityList(activity);
|
||||
if (item->_status == SyncFileItem::Status::FileIgnored) {
|
||||
_activityModel->addIgnoredFileToList(activity);
|
||||
} else {
|
||||
qCWarning(lcActivity) << "Item " << item->_file << " retrieved resulted in error " << item->_errorString;
|
||||
activity._subject = item->_errorString;
|
||||
|
||||
if (item->_status == SyncFileItem::Status::FileIgnored) {
|
||||
_activityModel->addIgnoredFileToList(activity);
|
||||
} else {
|
||||
// add 'protocol error' to activity list
|
||||
_activityModel->addErrorToActivityList(activity);
|
||||
}
|
||||
// add 'protocol error' to activity list
|
||||
_activityModel->addErrorToActivityList(activity);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -555,6 +568,21 @@ QString User::server(bool shortened) const
|
||||
return serverUrl;
|
||||
}
|
||||
|
||||
UserStatus::Status User::status() const
|
||||
{
|
||||
return _account->status();
|
||||
}
|
||||
|
||||
QString User::statusMessage() const
|
||||
{
|
||||
return _account->statusMessage();
|
||||
}
|
||||
|
||||
QUrl User::statusIcon() const
|
||||
{
|
||||
return _account->statusIcon();
|
||||
}
|
||||
|
||||
QImage User::avatar() const
|
||||
{
|
||||
return AvatarJob::makeCircularAvatar(_account->account()->avatar());
|
||||
@@ -604,6 +632,12 @@ bool User::isConnected() const
|
||||
return (_account->connectionStatus() == AccountState::ConnectionStatus::Connected);
|
||||
}
|
||||
|
||||
|
||||
bool User::isDesktopNotificationsAllowed() const
|
||||
{
|
||||
return _account.data()->isDesktopNotificationsAllowed();
|
||||
}
|
||||
|
||||
void User::removeAccount() const
|
||||
{
|
||||
AccountManager::instance()->deleteAccount(_account.data());
|
||||
@@ -665,6 +699,16 @@ Q_INVOKABLE bool UserModel::isUserConnected(const int &id)
|
||||
return _users[id]->isConnected();
|
||||
}
|
||||
|
||||
Q_INVOKABLE QUrl UserModel::statusIcon(int id)
|
||||
{
|
||||
if (id < 0 || id >= _users.size()) {
|
||||
return {};
|
||||
}
|
||||
|
||||
return _users[id]->statusIcon();
|
||||
}
|
||||
|
||||
|
||||
QImage UserModel::avatarById(const int &id)
|
||||
{
|
||||
if (id < 0 || id >= _users.size())
|
||||
@@ -701,6 +745,11 @@ void UserModel::addUser(AccountStatePtr &user, const bool &isCurrent)
|
||||
emit dataChanged(index(row, 0), index(row, 0), {UserModel::AvatarRole});
|
||||
});
|
||||
|
||||
connect(u, &User::statusChanged, this, [this, row] {
|
||||
emit dataChanged(index(row, 0), index(row, 0), {UserModel::StatusIconRole,
|
||||
UserModel::StatusMessageRole});
|
||||
});
|
||||
|
||||
_users << u;
|
||||
if (isCurrent) {
|
||||
_currentUserId = _users.indexOf(_users.last());
|
||||
@@ -839,6 +888,10 @@ QVariant UserModel::data(const QModelIndex &index, int role) const
|
||||
return _users[index.row()]->name();
|
||||
} else if (role == ServerRole) {
|
||||
return _users[index.row()]->server();
|
||||
} else if (role == StatusIconRole) {
|
||||
return _users[index.row()]->statusIcon();
|
||||
} else if (role == StatusMessageRole) {
|
||||
return _users[index.row()]->statusMessage();
|
||||
} else if (role == AvatarRole) {
|
||||
return _users[index.row()]->avatarUrl();
|
||||
} else if (role == IsCurrentUserRole) {
|
||||
@@ -856,6 +909,8 @@ QHash<int, QByteArray> UserModel::roleNames() const
|
||||
QHash<int, QByteArray> roles;
|
||||
roles[NameRole] = "name";
|
||||
roles[ServerRole] = "server";
|
||||
roles[StatusIconRole] = "statusIcon";
|
||||
roles[StatusMessageRole] = "statusMessage";
|
||||
roles[AvatarRole] = "avatar";
|
||||
roles[IsCurrentUserRole] = "isCurrentUser";
|
||||
roles[IsConnectedRole] = "isConnected";
|
||||
|
||||
@@ -19,6 +19,8 @@ class User : public QObject
|
||||
Q_OBJECT
|
||||
Q_PROPERTY(QString name READ name NOTIFY nameChanged)
|
||||
Q_PROPERTY(QString server READ server CONSTANT)
|
||||
Q_PROPERTY(QUrl statusIcon READ statusIcon NOTIFY statusChanged)
|
||||
Q_PROPERTY(QString statusMessage READ statusMessage NOTIFY statusChanged)
|
||||
Q_PROPERTY(bool hasLocalFolder READ hasLocalFolder NOTIFY hasLocalFolderChanged)
|
||||
Q_PROPERTY(bool serverHasTalk READ serverHasTalk NOTIFY serverHasTalkChanged)
|
||||
Q_PROPERTY(QString avatar READ avatarUrl NOTIFY avatarChanged)
|
||||
@@ -45,6 +47,10 @@ public:
|
||||
void logout() const;
|
||||
void removeAccount() const;
|
||||
QString avatarUrl() const;
|
||||
bool isDesktopNotificationsAllowed() const;
|
||||
UserStatus::Status status() const;
|
||||
QString statusMessage() const;
|
||||
QUrl statusIcon() const;
|
||||
|
||||
signals:
|
||||
void guiLog(const QString &, const QString &);
|
||||
@@ -53,6 +59,7 @@ signals:
|
||||
void serverHasTalkChanged();
|
||||
void avatarChanged();
|
||||
void accountStateChanged(int state);
|
||||
void statusChanged();
|
||||
|
||||
public slots:
|
||||
void slotItemCompleted(const QString &folder, const SyncFileItemPtr &item);
|
||||
@@ -67,6 +74,7 @@ public slots:
|
||||
void slotRefreshNotifications();
|
||||
void slotRefreshActivities();
|
||||
void slotRefresh();
|
||||
void slotRefreshUserStatus();
|
||||
void slotRefreshImmediately();
|
||||
void setNotificationRefreshInterval(std::chrono::milliseconds interval);
|
||||
void slotRebuildNavigationAppList();
|
||||
@@ -80,7 +88,8 @@ private:
|
||||
void connectPushNotifications() const;
|
||||
bool checkPushNotificationsAreReady() const;
|
||||
|
||||
bool isValueableActivity(const Folder *folder, const SyncFileItemPtr &item) const;
|
||||
bool isActivityOfCurrentAccount(const Folder *folder) const;
|
||||
bool isUnsolvableConflict(const SyncFileItemPtr &item) const;
|
||||
|
||||
private:
|
||||
AccountStatePtr _account;
|
||||
@@ -131,6 +140,7 @@ public:
|
||||
Q_INVOKABLE bool currentUserHasLocalFolder();
|
||||
int currentUserId() const;
|
||||
Q_INVOKABLE bool isUserConnected(const int &id);
|
||||
Q_INVOKABLE QUrl statusIcon(int id);
|
||||
Q_INVOKABLE void switchCurrentUser(const int &id);
|
||||
Q_INVOKABLE void login(const int &id);
|
||||
Q_INVOKABLE void logout(const int &id);
|
||||
@@ -141,6 +151,8 @@ public:
|
||||
enum UserRoles {
|
||||
NameRole = Qt::UserRole + 1,
|
||||
ServerRole,
|
||||
StatusIconRole,
|
||||
StatusMessageRole,
|
||||
AvatarRole,
|
||||
IsCurrentUserRole,
|
||||
IsConnectedRole,
|
||||
|
||||
@@ -35,8 +35,8 @@ Window {
|
||||
}
|
||||
|
||||
onVisibleChanged: {
|
||||
currentAccountStateIndicator.source = ""
|
||||
currentAccountStateIndicator.source = UserModel.isUserConnected(UserModel.currentUserId)
|
||||
folderStateIndicator.source = ""
|
||||
folderStateIndicator.source = UserModel.isUserConnected(UserModel.currentUserId)
|
||||
? Style.stateOnlineImageSource
|
||||
: Style.stateOfflineImageSource
|
||||
|
||||
@@ -49,8 +49,8 @@ Window {
|
||||
Connections {
|
||||
target: UserModel
|
||||
onRefreshCurrentUserGui: {
|
||||
currentAccountStateIndicator.source = ""
|
||||
currentAccountStateIndicator.source = UserModel.isUserConnected(UserModel.currentUserId)
|
||||
folderStateIndicator.source = ""
|
||||
folderStateIndicator.source = UserModel.isUserConnected(UserModel.currentUserId)
|
||||
? Style.stateOnlineImageSource
|
||||
: Style.stateOfflineImageSource
|
||||
}
|
||||
@@ -328,7 +328,7 @@ Window {
|
||||
Accessible.name: qsTr("Current user avatar")
|
||||
|
||||
Rectangle {
|
||||
id: currentAccountStateIndicatorBackground
|
||||
id: currentAccountStatusIndicatorBackground
|
||||
width: Style.accountAvatarStateIndicatorSize + 2
|
||||
height: width
|
||||
anchors.bottom: currentAccountAvatar.bottom
|
||||
@@ -348,18 +348,16 @@ Window {
|
||||
}
|
||||
|
||||
Image {
|
||||
id: currentAccountStateIndicator
|
||||
source: UserModel.isUserConnected(UserModel.currentUserId)
|
||||
? Style.stateOnlineImageSource
|
||||
: Style.stateOfflineImageSource
|
||||
id: currentAccountStatusIndicator
|
||||
source: UserModel.currentUser.statusIcon
|
||||
cache: false
|
||||
x: currentAccountStateIndicatorBackground.x + 1
|
||||
y: currentAccountStateIndicatorBackground.y + 1
|
||||
x: currentAccountStatusIndicatorBackground.x + 1
|
||||
y: currentAccountStatusIndicatorBackground.y + 1
|
||||
sourceSize.width: Style.accountAvatarStateIndicatorSize
|
||||
sourceSize.height: Style.accountAvatarStateIndicatorSize
|
||||
|
||||
Accessible.role: Accessible.Indicator
|
||||
Accessible.name: UserModel.isUserConnected(UserModel.currentUserId()) ? qsTr("Connected") : qsTr("Disconnected")
|
||||
Accessible.name: UserModel.isUserStatusOnline(UserModel.currentUserId()) ? qsTr("Current user status is online") : qsTr("Current user status is do not disturb")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -379,9 +377,9 @@ Window {
|
||||
font.bold: true
|
||||
}
|
||||
Label {
|
||||
id: currentAccountServer
|
||||
id: currentUserStatus
|
||||
width: Style.currentAccountLabelWidth
|
||||
text: UserModel.currentUser.server
|
||||
text: UserModel.currentUser.statusMessage
|
||||
elide: Text.ElideRight
|
||||
color: Style.ncTextColor
|
||||
font.pixelSize: Style.subLinePixelSize
|
||||
@@ -405,31 +403,57 @@ Window {
|
||||
}
|
||||
}
|
||||
|
||||
// Filler between account dropdown and header app buttons
|
||||
Item {
|
||||
id: trayWindowHeaderSpacer
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
RowLayout {
|
||||
id: openLocalFolderRowLayout
|
||||
spacing: 0
|
||||
Layout.preferredWidth: Style.trayWindowHeaderHeight
|
||||
Layout.preferredHeight: Style.trayWindowHeaderHeight
|
||||
|
||||
HeaderButton {
|
||||
id: openLocalFolderButton
|
||||
visible: UserModel.currentUser.hasLocalFolder
|
||||
icon.source: "qrc:///client/theme/white/folder.svg"
|
||||
onClicked: UserModel.openCurrentAccountLocalFolder()
|
||||
|
||||
Rectangle {
|
||||
id: folderStateIndicatorBackground
|
||||
width: Style.folderStateIndicatorSize
|
||||
height: width
|
||||
anchors.top: openLocalFolderButton.verticalCenter
|
||||
anchors.left: openLocalFolderButton.horizontalCenter
|
||||
color: Style.ncBlue
|
||||
radius: width*0.5
|
||||
z: 1
|
||||
}
|
||||
}
|
||||
|
||||
HeaderButton {
|
||||
id: openLocalFolderButton
|
||||
|
||||
visible: UserModel.currentUser.hasLocalFolder
|
||||
icon.source: "qrc:///client/theme/white/folder.svg"
|
||||
onClicked: UserModel.openCurrentAccountLocalFolder()
|
||||
Image {
|
||||
id: folderStateIndicator
|
||||
source: UserModel.isUserConnected(UserModel.currentUserId)
|
||||
? Style.stateOnlineImageSource
|
||||
: Style.stateOfflineImageSource
|
||||
cache: false
|
||||
anchors.top: openLocalFolderButton.verticalCenter
|
||||
anchors.left: openLocalFolderButton.horizontalCenter
|
||||
|
||||
sourceSize.width: Style.folderStateIndicatorSize
|
||||
sourceSize.height: Style.folderStateIndicatorSize
|
||||
|
||||
Accessible.role: Accessible.Indicator
|
||||
Accessible.name: UserModel.isUserConnected(UserModel.currentUserId()) ? qsTr("Connected") : qsTr("Disconnected")
|
||||
}
|
||||
|
||||
Accessible.role: Accessible.Button
|
||||
Accessible.name: qsTr("Open local folder of current account")
|
||||
Accessible.onPressAction: openLocalFolderButton.clicked()
|
||||
}
|
||||
|
||||
HeaderButton {
|
||||
id: trayWindowTalkButton
|
||||
|
||||
|
||||
visible: UserModel.currentUser.serverHasTalk
|
||||
icon.source: "qrc:///client/theme/white/talk-app.svg"
|
||||
onClicked: UserModel.openCurrentAccountTalk()
|
||||
|
||||
|
||||
Accessible.role: Accessible.Button
|
||||
Accessible.name: qsTr("Open Nextcloud Talk in browser")
|
||||
Accessible.onPressAction: trayWindowTalkButton.clicked()
|
||||
@@ -438,6 +462,7 @@ Window {
|
||||
HeaderButton {
|
||||
id: trayWindowAppsButton
|
||||
icon.source: "qrc:///client/theme/white/more-apps.svg"
|
||||
|
||||
onClicked: {
|
||||
if(appsMenu.count <= 0) {
|
||||
UserModel.openCurrentAccountServer()
|
||||
|
||||
@@ -149,11 +149,11 @@ QString OCUpdater::statusString() const
|
||||
case DownloadComplete:
|
||||
return tr("%1 available. Restart application to start the update.").arg(updateVersion);
|
||||
case DownloadFailed:
|
||||
return tr("Could not download update. Please click <a href='%1'>here</a> to download the update manually.").arg(_updateInfo.web());
|
||||
return tr("Could not download update. Please open %1 to download the update manually.").arg(_updateInfo.web());
|
||||
case DownloadTimedOut:
|
||||
return tr("Could not check for new updates.");
|
||||
case UpdateOnlyAvailableThroughSystem:
|
||||
return tr("New %1 is available. Please click <a href='%2'>here</a> to download the update.").arg(updateVersion, _updateInfo.web());
|
||||
return tr("New %1 is available. Please open %2 to download the update.").arg(updateVersion, _updateInfo.web());
|
||||
case CheckingServer:
|
||||
return tr("Checking update server …");
|
||||
case Unknown:
|
||||
|
||||
@@ -28,6 +28,8 @@
|
||||
#include "config.h"
|
||||
#include "configfile.h"
|
||||
|
||||
#include <QSysInfo>
|
||||
|
||||
namespace OCC {
|
||||
|
||||
Q_LOGGING_CATEGORY(lcUpdater, "nextcloud.gui.updater", QtInfoMsg)
|
||||
@@ -88,6 +90,9 @@ QUrlQuery Updater::getQueryParams()
|
||||
}
|
||||
query.addQueryItem(QStringLiteral("version"), clientVersion());
|
||||
query.addQueryItem(QStringLiteral("platform"), platform);
|
||||
query.addQueryItem(QStringLiteral("osRelease"), QSysInfo::productType());
|
||||
query.addQueryItem(QStringLiteral("osVersion"), QSysInfo::productVersion());
|
||||
query.addQueryItem(QStringLiteral("kernelVersion"), QSysInfo::kernelVersion());
|
||||
query.addQueryItem(QStringLiteral("oem"), theme->appName());
|
||||
query.addQueryItem(QStringLiteral("buildArch"), QSysInfo::buildCpuArchitecture());
|
||||
query.addQueryItem(QStringLiteral("currentArch"), QSysInfo::currentCpuArchitecture());
|
||||
|
||||
126
src/gui/userstatus.cpp
Normal file
@@ -0,0 +1,126 @@
|
||||
/*
|
||||
* Copyright (C) by Camila <hello@camila.codes>
|
||||
*
|
||||
* 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 "userstatus.h"
|
||||
#include "account.h"
|
||||
#include "accountstate.h"
|
||||
#include "networkjobs.h"
|
||||
#include "folderman.h"
|
||||
#include "creds/abstractcredentials.h"
|
||||
#include "theme.h"
|
||||
|
||||
#include <QTimer>
|
||||
#include <QJsonDocument>
|
||||
#include <QJsonObject>
|
||||
|
||||
namespace OCC {
|
||||
|
||||
Q_LOGGING_CATEGORY(lcUserStatus, "nextcloud.gui.userstatus", QtInfoMsg)
|
||||
|
||||
UserStatus::UserStatus(QObject *parent)
|
||||
: QObject(parent)
|
||||
{
|
||||
}
|
||||
|
||||
UserStatus::Status UserStatus::stringToEnum(const QString &status) const
|
||||
{
|
||||
// it needs to match the Status enum
|
||||
const QHash<QString, Status> preDefinedStatus{{"online", Status::Online},
|
||||
{"dnd", Status::DoNotDisturb}, //DoNotDisturb
|
||||
{"away", Status::Away},
|
||||
{"offline", Status::Offline},
|
||||
{"invisible", Status::Invisible}};
|
||||
|
||||
// api should return invisible, dnd,... toLower() it is to make sure
|
||||
// it matches _preDefinedStatus, otherwise the default is online (0)
|
||||
const auto statusKey = status.isEmpty() ? QStringLiteral("online") : status.toLower();
|
||||
return preDefinedStatus.value(statusKey, Status::Online);
|
||||
}
|
||||
|
||||
QString UserStatus::enumToString(Status status) const
|
||||
{
|
||||
switch (status) {
|
||||
case Status::Away:
|
||||
return tr("Away");
|
||||
case Status::DoNotDisturb:
|
||||
return tr("Do not disturb");
|
||||
case Status::Invisible:
|
||||
case Status::Offline:
|
||||
return tr("Offline");
|
||||
default:
|
||||
return tr("Online");
|
||||
}
|
||||
}
|
||||
|
||||
void UserStatus::fetchUserStatus(AccountPtr account)
|
||||
{
|
||||
if (_job) {
|
||||
_job->deleteLater();
|
||||
}
|
||||
|
||||
_job = new JsonApiJob(account, QStringLiteral("/ocs/v2.php/apps/user_status/api/v1/user_status"), this);
|
||||
connect(_job.data(), &JsonApiJob::jsonReceived, this, &UserStatus::slotFetchUserStatusFinished);
|
||||
_job->start();
|
||||
}
|
||||
|
||||
void UserStatus::slotFetchUserStatusFinished(const QJsonDocument &json, int statusCode)
|
||||
{
|
||||
const QJsonObject defaultValues {
|
||||
{"icon", ""},
|
||||
{"message", ""},
|
||||
{"status", "online"}
|
||||
};
|
||||
|
||||
if (statusCode != 200) {
|
||||
qCInfo(lcUserStatus) << "Slot fetch UserStatus finished with status code" << statusCode;
|
||||
qCInfo(lcUserStatus) << "Using then default values as if user has not set any status" << defaultValues;
|
||||
}
|
||||
|
||||
const auto retrievedData = json.object().value("ocs").toObject().value("data").toObject(defaultValues);
|
||||
const auto emoji = retrievedData.value("icon").toString();
|
||||
const auto message = retrievedData.value("message").toString();
|
||||
|
||||
_status = stringToEnum(retrievedData.value("status").toString());
|
||||
const auto visibleStatusText = message.isEmpty() ? enumToString(_status) : message;
|
||||
|
||||
_message = QString("%1 %2").arg(emoji, visibleStatusText);
|
||||
emit fetchUserStatusFinished();
|
||||
}
|
||||
|
||||
UserStatus::Status UserStatus::status() const
|
||||
{
|
||||
return _status;
|
||||
}
|
||||
|
||||
QString UserStatus::message() const
|
||||
{
|
||||
return _message.trimmed();
|
||||
}
|
||||
|
||||
QUrl UserStatus::icon() const
|
||||
{
|
||||
switch (_status) {
|
||||
case Status::Away:
|
||||
return Theme::instance()->statusAwayImageSource();
|
||||
case Status::DoNotDisturb:
|
||||
return Theme::instance()->statusDoNotDisturbImageSource();
|
||||
case Status::Invisible:
|
||||
case Status::Offline:
|
||||
return Theme::instance()->statusInvisibleImageSource();
|
||||
default:
|
||||
return Theme::instance()->statusOnlineImageSource();
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace OCC
|
||||