mirror of
https://github.com/chylex/Nextcloud-Desktop.git
synced 2026-04-03 09:11:33 +02:00
Compare commits
253 Commits
techprevie
...
v2.5.0-rc1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
58302e9fc0 | ||
|
|
8acc5573ff | ||
|
|
6224f6a1fa | ||
|
|
44bc637237 | ||
|
|
99d4f81892 | ||
|
|
98bedf1031 | ||
|
|
eb31e9205c | ||
|
|
c8204f1725 | ||
|
|
174f99728f | ||
|
|
dcdf6d966d | ||
|
|
3e79ebed60 | ||
|
|
5237a2c3e2 | ||
|
|
6e0d636989 | ||
|
|
d246c1e8b9 | ||
|
|
96541d8ab8 | ||
|
|
091c4fd9b0 | ||
|
|
8098566140 | ||
|
|
21dc97b809 | ||
|
|
0f9b8daa57 | ||
|
|
cddb9aa8ba | ||
|
|
24606c0105 | ||
|
|
3384f7e28b | ||
|
|
6b7328bb87 | ||
|
|
f3529e3dd7 | ||
|
|
305952e32e | ||
|
|
c37186cc56 | ||
|
|
4e866123c5 | ||
|
|
35c0c9c0b1 | ||
|
|
d3bc9fbdf3 | ||
|
|
0cf2970134 | ||
|
|
206f081505 | ||
|
|
1c8307f264 | ||
|
|
2d65091f27 | ||
|
|
a492ab8294 | ||
|
|
3da6f45ba9 | ||
|
|
856d40fd99 | ||
|
|
846075704e | ||
|
|
156308c72e | ||
|
|
c99a35a8a5 | ||
|
|
f937fdd624 | ||
|
|
1f8c3074a6 | ||
|
|
11673005db | ||
|
|
df24a25829 | ||
|
|
2dc7ff7332 | ||
|
|
7ace48d5de | ||
|
|
56ccff4ee8 | ||
|
|
9d9f96a685 | ||
|
|
052c37acda | ||
|
|
fd2e88e13b | ||
|
|
28b399ec2b | ||
|
|
4bb936f876 | ||
|
|
6805d91033 | ||
|
|
8da2b9dbf8 | ||
|
|
45ff3385c7 | ||
|
|
53cc6a1611 | ||
|
|
bfc8154e68 | ||
|
|
74d8f32f37 | ||
|
|
a5e329a1c5 | ||
|
|
3fe44f0d25 | ||
|
|
e207c91228 | ||
|
|
cdf922f51d | ||
|
|
45ffc0ae09 | ||
|
|
e214234001 | ||
|
|
54e58b51ab | ||
|
|
debe37308f | ||
|
|
7c096d08aa | ||
|
|
ac631d008c | ||
|
|
f1cad3443b | ||
|
|
cacde7a3aa | ||
|
|
b533c3582e | ||
|
|
69f18f6b7d | ||
|
|
de80f7d6ca | ||
|
|
38ec3b8972 | ||
|
|
52d40235b6 | ||
|
|
0ee662bb0e | ||
|
|
5733e90b09 | ||
|
|
95d2c64c1b | ||
|
|
b71c753a94 | ||
|
|
bd88ddfa07 | ||
|
|
373c6cd631 | ||
|
|
a464ad2c71 | ||
|
|
f3dd97f29c | ||
|
|
6587955668 | ||
|
|
9013036685 | ||
|
|
ebd632f582 | ||
|
|
ce22007b16 | ||
|
|
6a1043cef0 | ||
|
|
82f3b4c91f | ||
|
|
d0b6a611f2 | ||
|
|
714a4090a7 | ||
|
|
63d7e54ef3 | ||
|
|
a2f4917daf | ||
|
|
a09f1d14ba | ||
|
|
96c37b1fac | ||
|
|
f4dfdf5889 | ||
|
|
08e4ba3363 | ||
|
|
4f83bba829 | ||
|
|
90d3917481 | ||
|
|
d9cc362258 | ||
|
|
0a5f890bf9 | ||
|
|
b873311bc5 | ||
|
|
eaa4e77626 | ||
|
|
7a7799407d | ||
|
|
a4e23e7655 | ||
|
|
56ea525499 | ||
|
|
e84bdd59c7 | ||
|
|
b5f484aaf5 | ||
|
|
264b77c634 | ||
|
|
23d64dd3ac | ||
|
|
67f793a49e | ||
|
|
d202942a2c | ||
|
|
d338c130af | ||
|
|
283c4b13a1 | ||
|
|
40007537ea | ||
|
|
6122a47241 | ||
|
|
ce3339a00f | ||
|
|
14df7a3273 | ||
|
|
9330d2b178 | ||
|
|
87dd198b52 | ||
|
|
a68c95522d | ||
|
|
cba0627a9c | ||
|
|
cb69944b5c | ||
|
|
f80517d719 | ||
|
|
13cfd80093 | ||
|
|
17ac41377e | ||
|
|
0b8459ca14 | ||
|
|
537fac70bf | ||
|
|
cf150caa2b | ||
|
|
23d276021e | ||
|
|
599f6f0228 | ||
|
|
bddc573c54 | ||
|
|
1a73d3323a | ||
|
|
2bfb99f174 | ||
|
|
f4a704164f | ||
|
|
e730f95a71 | ||
|
|
9f1f99f4db | ||
|
|
d236c3c011 | ||
|
|
73ccccb8a7 | ||
|
|
7ab2a9bfcb | ||
|
|
b19abe9c86 | ||
|
|
44026763b8 | ||
|
|
617cd6dfdb | ||
|
|
3a489b73f9 | ||
|
|
07013783ea | ||
|
|
7c77864396 | ||
|
|
3b8dde601d | ||
|
|
d9f79215a7 | ||
|
|
309b0b6382 | ||
|
|
9d021d004d | ||
|
|
452f64221e | ||
|
|
72419a1149 | ||
|
|
ab5c4749c1 | ||
|
|
5cdf8a2997 | ||
|
|
bfd8897f22 | ||
|
|
8c19be7213 | ||
|
|
4a47d1c8ef | ||
|
|
e3d7c9f1ea | ||
|
|
fbd8438072 | ||
|
|
efc2f0eded | ||
|
|
3e839b2e44 | ||
|
|
678e2c873e | ||
|
|
121c0d8433 | ||
|
|
881c7f804f | ||
|
|
2e55702258 | ||
|
|
964470fc11 | ||
|
|
c4d01b6aea | ||
|
|
0f80ecbb39 | ||
|
|
bf35821bc0 | ||
|
|
d896edeee8 | ||
|
|
328f82297a | ||
|
|
cafdcf77cb | ||
|
|
ed705ba98c | ||
|
|
2844c925eb | ||
|
|
ea8676ad2c | ||
|
|
028da61824 | ||
|
|
16337bf656 | ||
|
|
d8bf20310b | ||
|
|
cdd84dce6e | ||
|
|
647df7bcee | ||
|
|
64e21d5083 | ||
|
|
ea0bdddb2a | ||
|
|
e9b4453814 | ||
|
|
1991d71136 | ||
|
|
6a7a08bd01 | ||
|
|
d5a0ec7d8b | ||
|
|
eecbdb00de | ||
|
|
085de2825a | ||
|
|
cf3ee4b3a4 | ||
|
|
8f7bc8cff9 | ||
|
|
ff9177edc3 | ||
|
|
c8d5d9a622 | ||
|
|
fa4328a596 | ||
|
|
985c2ed1ca | ||
|
|
034d5b60aa | ||
|
|
a2f7355d4a | ||
|
|
17d4aeeb78 | ||
|
|
a214ecf788 | ||
|
|
0d9de74726 | ||
|
|
8b996772a4 | ||
|
|
fa5143a66d | ||
|
|
8cbc757a56 | ||
|
|
e9ae10ba6c | ||
|
|
5bcc4ece77 | ||
|
|
135bcaea3e | ||
|
|
29c11618b3 | ||
|
|
a15a470ea2 | ||
|
|
1d4fc91d79 | ||
|
|
ef9c302b5e | ||
|
|
c1c5e5da5f | ||
|
|
14615855d0 | ||
|
|
f0ef2c27a3 | ||
|
|
b50db09b01 | ||
|
|
86991b9996 | ||
|
|
c27943b46d | ||
|
|
ef71e6b0f7 | ||
|
|
8e8a619ee1 | ||
|
|
27076c0f28 | ||
|
|
fc6e6149e5 | ||
|
|
13e2bb099b | ||
|
|
8fd0ca4587 | ||
|
|
2aa942e4b8 | ||
|
|
92aaa09643 | ||
|
|
0e2cd30ea1 | ||
|
|
bc44c62471 | ||
|
|
2434523f33 | ||
|
|
534a92b709 | ||
|
|
233e10ecb1 | ||
|
|
cefc6b531c | ||
|
|
5c7c92157f | ||
|
|
176a2e6f84 | ||
|
|
647d16c792 | ||
|
|
3ad33a368a | ||
|
|
951096f569 | ||
|
|
489c0529c4 | ||
|
|
3576fbb2a5 | ||
|
|
8dedb9084e | ||
|
|
f6ef11a5c9 | ||
|
|
1d868eb809 | ||
|
|
c3aafa722a | ||
|
|
b85bad0566 | ||
|
|
a4507db31a | ||
|
|
e551b89ba7 | ||
|
|
7cbca28eb7 | ||
|
|
a1967d551d | ||
|
|
2b825a1748 | ||
|
|
5110f9618a | ||
|
|
d30f8b9094 | ||
|
|
758c2ad9ac | ||
|
|
c919b7e069 | ||
|
|
be3640dc51 | ||
|
|
343402740f | ||
|
|
1364755141 | ||
|
|
09f83f4fa9 |
@@ -6,7 +6,7 @@ clone:
|
||||
|
||||
pipeline:
|
||||
qt-5.7:
|
||||
image: nextcloudci/client-5.7:client-5.7-3
|
||||
image: nextcloudci/client-5.7:client-5.7-4
|
||||
commands:
|
||||
# Install QtKeyChain
|
||||
- /bin/bash -c "
|
||||
@@ -34,7 +34,7 @@ pipeline:
|
||||
matrix:
|
||||
TESTS: qt-5.7
|
||||
qt-5.8:
|
||||
image: nextcloudci/client-5.8:client-5.8-3
|
||||
image: nextcloudci/client-5.8:client-5.8-4
|
||||
commands:
|
||||
# Install QtKeyChain
|
||||
- /bin/bash -c "
|
||||
@@ -62,7 +62,7 @@ pipeline:
|
||||
matrix:
|
||||
TESTS: qt-5.8
|
||||
qt-5.9:
|
||||
image: nextcloudci/client-5.9:client-5.9-4
|
||||
image: nextcloudci/client-5.9:client-5.9-5
|
||||
commands:
|
||||
# Install QtKeyChain
|
||||
- /bin/bash -c "
|
||||
|
||||
64
.github/issue_template.md
vendored
Normal file
64
.github/issue_template.md
vendored
Normal file
@@ -0,0 +1,64 @@
|
||||
<!---
|
||||
Please try to only report a bug if it happens with the latest version
|
||||
The latest version can be seen by checking https://download.nextcloud.com/desktop/
|
||||
For support try our forums: https://help.nextcloud.com
|
||||
--->
|
||||
|
||||
|
||||
### Expected behaviour
|
||||
Tell us what should happen
|
||||
|
||||
### Actual behaviour
|
||||
Tell us what happens instead
|
||||
|
||||
### Steps to reproduce
|
||||
1.
|
||||
2.
|
||||
3.
|
||||
|
||||
### Client configuration
|
||||
Client version:
|
||||
|
||||
Operating system:
|
||||
|
||||
OS language:
|
||||
|
||||
Qt version used by client package (Linux only, see also Settings dialog):
|
||||
|
||||
Client package (From Nextcloud or distro) (Linux only):
|
||||
|
||||
Installation path of client:
|
||||
|
||||
|
||||
### Server configuration
|
||||
<!---
|
||||
Optional section. It depends on the issue.
|
||||
--->
|
||||
|
||||
Operating system:
|
||||
|
||||
Web server:
|
||||
|
||||
Database:
|
||||
|
||||
PHP version:
|
||||
|
||||
Nextcloud version:
|
||||
|
||||
Storage backend (external storage):
|
||||
|
||||
### Logs
|
||||
|
||||
Please use Gist (https://gist.github.com/) or a similar code paster for longer
|
||||
logs.
|
||||
|
||||
```Template for output < 10 lines```
|
||||
|
||||
1. Client logfile: Output of `nextcloud --logwindow` or `nextcloud --logfile log.txt`
|
||||
(On Windows using `cmd.exe`, you might need to first `cd` into the Nextcloud directory)
|
||||
(See also https://docs.nextcloud.com/desktop/2.3/troubleshooting.html#log-files)
|
||||
|
||||
2. Web server error log:
|
||||
|
||||
3. Server logfile: nextcloud log (data/nextcloud.log):
|
||||
|
||||
7
.gitignore
vendored
7
.gitignore
vendored
@@ -164,3 +164,10 @@ UpgradeLog*.htm
|
||||
# Microsoft Fakes
|
||||
FakesAssemblies/
|
||||
|
||||
#cmake temporary stuff
|
||||
CMakeCache.txt
|
||||
CMakeFiles/
|
||||
CPackConfig.cmake
|
||||
CPackOptions.cmake
|
||||
CPackSourceConfig.cmake
|
||||
|
||||
|
||||
2
.gitmodules
vendored
2
.gitmodules
vendored
@@ -1,6 +1,6 @@
|
||||
[submodule "src/3rdparty/qtmacgoodies"]
|
||||
path = src/3rdparty/qtmacgoodies
|
||||
url = https://github.com/guruz/qtmacgoodies.git
|
||||
url = https://github.com/camilasan/qtmacgoodies.git
|
||||
[submodule "binary"]
|
||||
path = binary
|
||||
url = git://github.com/owncloud/owncloud-client-binary.git
|
||||
|
||||
204
.tx/nextcloud.client-desktop/ca_translation
Normal file
204
.tx/nextcloud.client-desktop/ca_translation
Normal file
@@ -0,0 +1,204 @@
|
||||
[Desktop Entry]
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||
X-GNOME-Autostart-Delay=3
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
Comment[ca]=@APPLICATION_NAME@ client de sincronització d'escriptori
|
||||
Icon[ca]=@APPLICATION_ICON_NAME@
|
||||
Name[ca]=@APPLICATION_NAME@ client de sincro d'escriptori
|
||||
GenericName[ca]=Directori de sincronització
|
||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_EXECUTABLE@
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||
X-GNOME-Autostart-Delay=3
|
||||
# Translations
|
||||
@@ -198,7 +198,7 @@ X-GNOME-Autostart-Delay=3
|
||||
|
||||
|
||||
# Translations
|
||||
Comment[cs_CZ]=@APPLICATION_NAME@ desktopový synchronizační klient
|
||||
Icon[cs_CZ]=@APPLICATION_EXECUTABLE@
|
||||
Name[cs_CZ]=@APPLICATION_NAME@ desktopový synchronizační klient
|
||||
Comment[cs_CZ]=@APPLICATION_NAME@ synchronizační klient pro desktop
|
||||
Icon[cs_CZ]=@NAZEV_IKONY_APLIKACE@
|
||||
Name[cs_CZ]=@APPLICATION_NAME@ synchronizační klient pro desktop
|
||||
GenericName[cs_CZ]=Synchronizace složek
|
||||
|
||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_EXECUTABLE@
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||
X-GNOME-Autostart-Delay=3
|
||||
# Translations
|
||||
@@ -198,7 +198,7 @@ X-GNOME-Autostart-Delay=3
|
||||
|
||||
|
||||
# Translations
|
||||
Comment[de_DE]=@APPLICATION_NAME@ Client zur Desktop-Synchronisation
|
||||
Icon[de_DE]=@APPLICATION_EXECUTABLE@
|
||||
Name[de_DE]=@APPLICATION_NAME@ Client zur Desktop-Synchronisation
|
||||
GenericName[de_DE]=Synchronisationsordner
|
||||
Comment[de]=@APPLICATION_NAME@ Client zur Desktop-Synchronisation
|
||||
Icon[de]=@APPLICATION_ICON_NAME@
|
||||
Name[de]=@APPLICATION_NAME@ Client zur Desktop-Synchronisation
|
||||
GenericName[de]=Synchronisationsordner
|
||||
|
||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_EXECUTABLE@
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||
X-GNOME-Autostart-Delay=3
|
||||
# Translations
|
||||
@@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
|
||||
|
||||
# Translations
|
||||
Comment[en_GB]=@APPLICATION_NAME@ desktop synchronisation client
|
||||
Icon[en_GB]=@APPLICATION_EXECUTABLE@
|
||||
Name[en_GB]=@APPLICATION_NAME@ desktop sync client
|
||||
GenericName[en_GB]=Folder Sync
|
||||
|
||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_EXECUTABLE@
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||
X-GNOME-Autostart-Delay=3
|
||||
# Translations
|
||||
@@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
|
||||
|
||||
# Translations
|
||||
Comment[es_CL]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||
Icon[es_CL]=@APPLICATION_EXECUTABLE@
|
||||
Name[es_CL]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||
GenericName[es_CL]=Sincronización de carpeta
|
||||
|
||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_EXECUTABLE@
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||
X-GNOME-Autostart-Delay=3
|
||||
# Translations
|
||||
@@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
|
||||
|
||||
# Translations
|
||||
Comment[es_CO]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||
Icon[es_CO]=@APPLICATION_EXECUTABLE@
|
||||
Name[es_CO]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||
GenericName[es_CO]=Sincronización de carpeta
|
||||
|
||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_EXECUTABLE@
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||
X-GNOME-Autostart-Delay=3
|
||||
# Translations
|
||||
@@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
|
||||
|
||||
# Translations
|
||||
Comment[es_CR]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||
Icon[es_CR]=@APPLICATION_EXECUTABLE@
|
||||
Name[es_CR]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||
GenericName[es_CR]=Sincronización de carpeta
|
||||
|
||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_EXECUTABLE@
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||
X-GNOME-Autostart-Delay=3
|
||||
# Translations
|
||||
@@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
|
||||
|
||||
# Translations
|
||||
Comment[es_DO]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||
Icon[es_DO]=@APPLICATION_EXECUTABLE@
|
||||
Name[es_DO]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||
GenericName[es_DO]=Sincronización de carpeta
|
||||
|
||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_EXECUTABLE@
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||
X-GNOME-Autostart-Delay=3
|
||||
# Translations
|
||||
@@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
|
||||
|
||||
# Translations
|
||||
Comment[es_EC]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||
Icon[es_EC]=@APPLICATION_EXECUTABLE@
|
||||
Name[es_EC]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||
GenericName[es_EC]=Sincronización de carpeta
|
||||
|
||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_EXECUTABLE@
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||
X-GNOME-Autostart-Delay=3
|
||||
# Translations
|
||||
@@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
|
||||
|
||||
# Translations
|
||||
Comment[es_GT]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||
Icon[es_GT]=@APPLICATION_EXECUTABLE@
|
||||
Name[es_GT]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||
GenericName[es_GT]=Sincronización de carpeta
|
||||
|
||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_EXECUTABLE@
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||
X-GNOME-Autostart-Delay=3
|
||||
# Translations
|
||||
@@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
|
||||
|
||||
# Translations
|
||||
Comment[es_MX]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||
Icon[es_MX]=@APPLICATION_EXECUTABLE@
|
||||
Name[es_MX]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||
GenericName[es_MX]=Sincronización de carpeta
|
||||
|
||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_EXECUTABLE@
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||
X-GNOME-Autostart-Delay=3
|
||||
# Translations
|
||||
@@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
|
||||
|
||||
# Translations
|
||||
Comment[es_SV]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||
Icon[es_SV]=@APPLICATION_EXECUTABLE@
|
||||
Name[es_SV]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||
GenericName[es_SV]=Sincronización de carpeta
|
||||
|
||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_EXECUTABLE@
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||
X-GNOME-Autostart-Delay=3
|
||||
# Translations
|
||||
@@ -199,6 +199,6 @@ X-GNOME-Autostart-Delay=3
|
||||
|
||||
# Translations
|
||||
Comment[es]=Cliente de sincronización de escritorio @APPLICATION_NAME@
|
||||
Icon[es]=@APPLICATION_EXECUTABLE@
|
||||
Icon[es]=@APPLICATION_ICON_NAME@
|
||||
Name[es]=Cliente de sincronización de escritorio @APPLICATION_NAME@
|
||||
GenericName[es]=Sincronización de carpetas
|
||||
|
||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_EXECUTABLE@
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||
X-GNOME-Autostart-Delay=3
|
||||
# Translations
|
||||
@@ -198,7 +198,7 @@ X-GNOME-Autostart-Delay=3
|
||||
|
||||
|
||||
# Translations
|
||||
Comment[fr]=Client desktop de synchronisation @APPLICATION_NAME@
|
||||
Icon[fr]=@APPLICATION_EXECUTABLE@
|
||||
Comment[fr]=Client de synchronisation @APPLICATION_NAME@ desktop
|
||||
Icon[fr]=@APPLICATION_ICON_NAME@
|
||||
Name[fr]=Client desktop de synchronisation @APPLICATION_NAME@
|
||||
GenericName[fr]=Synchronisation du dossier
|
||||
|
||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_EXECUTABLE@
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||
X-GNOME-Autostart-Delay=3
|
||||
# Translations
|
||||
@@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
|
||||
|
||||
# Translations
|
||||
Comment[he]=@APPLICATION_NAME@ לקוח סנכרון לשולחן העבודה
|
||||
Icon[he]=@APPLICATION_EXECUTABLE@
|
||||
Name[he]=@APPLICATION_NAME@ לקוח סנכרון לשולחן העבודה
|
||||
GenericName[he]=סנכרון תיקיות
|
||||
|
||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_EXECUTABLE@
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||
X-GNOME-Autostart-Delay=3
|
||||
# Translations
|
||||
|
||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_EXECUTABLE@
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||
X-GNOME-Autostart-Delay=3
|
||||
# Translations
|
||||
@@ -199,6 +199,6 @@ X-GNOME-Autostart-Delay=3
|
||||
|
||||
# Translations
|
||||
Comment[is]=@APPLICATION_NAME@ forrit til samstillingar við tölvu
|
||||
Icon[is]=@APPLICATION_EXECUTABLE@
|
||||
Icon[is]=@APPLICATION_ICON_NAME@
|
||||
Name[is]=@APPLICATION_NAME@ forrit til samstillingar við tölvu
|
||||
GenericName[is]=Samstilling á möppum
|
||||
|
||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_EXECUTABLE@
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||
X-GNOME-Autostart-Delay=3
|
||||
# Translations
|
||||
@@ -199,6 +199,6 @@ X-GNOME-Autostart-Delay=3
|
||||
|
||||
# Translations
|
||||
Comment[it]=Client di sincronizzazione desktop di @APPLICATION_NAME@
|
||||
Icon[it]=@APPLICATION_EXECUTABLE@
|
||||
Icon[it]=@APPLICATION_ICON_NAME@
|
||||
Name[it]=Client di sincronizzazione desktop di @APPLICATION_NAME@
|
||||
GenericName[it]=Sincronizzazione cartelle
|
||||
|
||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_EXECUTABLE@
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||
X-GNOME-Autostart-Delay=3
|
||||
# Translations
|
||||
@@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
|
||||
|
||||
# Translations
|
||||
Comment[ja_JP]=@APPLICATION_NAME@ デスクトップ同期クライアント
|
||||
Icon[ja_JP]=@APPLICATION_EXECUTABLE@
|
||||
Name[ja_JP]=@APPLICATION_NAME@ デスクトップ同期クライアント
|
||||
GenericName[ja_JP]=フォルダーを同期する
|
||||
|
||||
204
.tx/nextcloud.client-desktop/lt_LT_translation
Normal file
204
.tx/nextcloud.client-desktop/lt_LT_translation
Normal file
@@ -0,0 +1,204 @@
|
||||
[Desktop Entry]
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||
X-GNOME-Autostart-Delay=3
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
Comment[lt_LT]=@APPLICATION_NAME@ darbalaukio sinchronizavimo kliento programa
|
||||
Icon[lt_LT]=@APPLICATION_ICON_NAME@
|
||||
Name[lt_LT]=@APPLICATION_NAME@ darbalaukio sinchronizavimo kliento programa
|
||||
GenericName[lt_LT]=Aplankų sinchronizavimas
|
||||
204
.tx/nextcloud.client-desktop/lv_translation
Normal file
204
.tx/nextcloud.client-desktop/lv_translation
Normal file
@@ -0,0 +1,204 @@
|
||||
[Desktop Entry]
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||
X-GNOME-Autostart-Delay=3
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
Comment[lv]=@APPLICATION_NAME@ darbavirsmas sinhronizešanas klients
|
||||
Icon[lv]=@APPLICATION_ICON_NAME@
|
||||
Name[lv]=@APPLICATION_NAME@ darbavirsmas sinhronizešanas klients
|
||||
GenericName[lv]=Mapju Sinhronizēšana
|
||||
203
.tx/nextcloud.client-desktop/nb_translation
Normal file
203
.tx/nextcloud.client-desktop/nb_translation
Normal file
@@ -0,0 +1,203 @@
|
||||
[Desktop Entry]
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||
X-GNOME-Autostart-Delay=3
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
Comment[nb_NO]=@APPLICATION_NAME@ klient for synkroinisering
|
||||
Name[nb_NO]=@APPLICATION_NAME@ klient for synkroinisering
|
||||
GenericName[nb_NO]=Mappe synkroinisering
|
||||
204
.tx/nextcloud.client-desktop/nl_translation
Normal file
204
.tx/nextcloud.client-desktop/nl_translation
Normal file
@@ -0,0 +1,204 @@
|
||||
[Desktop Entry]
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||
X-GNOME-Autostart-Delay=3
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
Comment[nl]=@APPLICATION_NAME@ desktopsynchronisatieclient
|
||||
Icon[nl]=@APPLICATION_ICON_NAME@
|
||||
Name[nl]=@APPLICATION_NAME@ desktop sync client
|
||||
GenericName[nl]=Map synchronisatie
|
||||
204
.tx/nextcloud.client-desktop/pl_translation
Normal file
204
.tx/nextcloud.client-desktop/pl_translation
Normal file
@@ -0,0 +1,204 @@
|
||||
[Desktop Entry]
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||
X-GNOME-Autostart-Delay=3
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
Comment[pl]=@APPLICATION_NAME@ desktopowy klient synchronizacji
|
||||
Icon[pl]=@APPLICATION_ICON_NAME@
|
||||
Name[pl]=@APPLICATION_NAME@ desktopowy klient synchronizacji
|
||||
GenericName[pl]=Katalog synchronizacji
|
||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_EXECUTABLE@
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||
X-GNOME-Autostart-Delay=3
|
||||
# Translations
|
||||
@@ -199,6 +199,6 @@ X-GNOME-Autostart-Delay=3
|
||||
|
||||
# Translations
|
||||
Comment[pt_BR]=@APPLICATION_NAME@ cliente de sincronização desktop
|
||||
Icon[pt_BR]=@APPLICATION_EXECUTABLE@
|
||||
Icon[pt_BR]=@APPLICATION_ICON_NAME@
|
||||
Name[pt_BR]=@APPLICATION_NAME@ cliente de sincronização desktop
|
||||
GenericName[pt_BR]=Sincronizar Pasta
|
||||
|
||||
203
.tx/nextcloud.client-desktop/pt_translation
Normal file
203
.tx/nextcloud.client-desktop/pt_translation
Normal file
@@ -0,0 +1,203 @@
|
||||
[Desktop Entry]
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||
X-GNOME-Autostart-Delay=3
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
Comment[pt_PT]=@APPLICATION_NAME@ - Cliente de Sincronização da Área de Trabalho
|
||||
Name[pt_PT]=@APPLICATION_NAME@ - Cliente de Sincronização da Área de Trabalho
|
||||
GenericName[pt_PT]=Sincronização de Pasta
|
||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_EXECUTABLE@
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||
X-GNOME-Autostart-Delay=3
|
||||
# Translations
|
||||
@@ -199,6 +199,6 @@ X-GNOME-Autostart-Delay=3
|
||||
|
||||
# Translations
|
||||
Comment[ru]=Клиент синхронизации @APPLICATION_NAME@ для ПК
|
||||
Icon[ru]=@APPLICATION_EXECUTABLE@
|
||||
Icon[ru]=@APPLICATION_ICON_NAME@
|
||||
Name[ru]=@APPLICATION_NAME@ клиент для ПК
|
||||
GenericName[ru]=Синхронизация папок
|
||||
|
||||
204
.tx/nextcloud.client-desktop/sk_translation
Normal file
204
.tx/nextcloud.client-desktop/sk_translation
Normal file
@@ -0,0 +1,204 @@
|
||||
[Desktop Entry]
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||
X-GNOME-Autostart-Delay=3
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
Comment[sk_SK]=@APPLICATION_NAME@ Synchronizačný klient pre PC
|
||||
Icon[sk_SK]=@APPLICATION_ICON_NAME@
|
||||
Name[sk_SK]=@APPLICATION_NAME@ Synchronizačný klient pre PC
|
||||
GenericName[sk_SK]=Synchnonizácia priečinka
|
||||
204
.tx/nextcloud.client-desktop/sl_translation
Normal file
204
.tx/nextcloud.client-desktop/sl_translation
Normal file
@@ -0,0 +1,204 @@
|
||||
[Desktop Entry]
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||
X-GNOME-Autostart-Delay=3
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
Comment[sl]=@APPLICATION_NAME@ odjemalec za usklajevanje
|
||||
Icon[sl]=@APPLICATION_ICON_NAME@
|
||||
Name[sl]=@APPLICATION_NAME@ odjemalec za usklajevanje
|
||||
GenericName[sl]=Usklajevanje map
|
||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_EXECUTABLE@
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||
X-GNOME-Autostart-Delay=3
|
||||
# Translations
|
||||
@@ -199,6 +199,6 @@ X-GNOME-Autostart-Delay=3
|
||||
|
||||
# Translations
|
||||
Comment[sr]=@APPLICATION_NAME@ десктоп клијент за синхронизацију
|
||||
Icon[sr]=@APPLICATION_EXECUTABLE@
|
||||
Icon[sr]=@APPLICATION_ICON_NAME@
|
||||
Name[sr]=@APPLICATION_NAME@ десктоп клијент за синхронизацију
|
||||
GenericName[sr]=Синхронизација фасцикли
|
||||
|
||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_EXECUTABLE@
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||
X-GNOME-Autostart-Delay=3
|
||||
# Translations
|
||||
@@ -199,6 +199,6 @@ X-GNOME-Autostart-Delay=3
|
||||
|
||||
# Translations
|
||||
Comment[tr]=@APPLICATION_NAME@ masaüstü eşitleme istemcisi
|
||||
Icon[tr]=@APPLICATION_EXECUTABLE@
|
||||
Icon[tr]=@APPLICATION_ICON_NAME@
|
||||
Name[tr]=@APPLICATION_NAME@ masaüstü eşiteme istemcisi
|
||||
GenericName[tr]=Klasör Eşitleme
|
||||
|
||||
204
.tx/nextcloud.client-desktop/zh_CN_translation
Normal file
204
.tx/nextcloud.client-desktop/zh_CN_translation
Normal file
@@ -0,0 +1,204 @@
|
||||
[Desktop Entry]
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||
X-GNOME-Autostart-Delay=3
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
Comment[zh_CN]=@APPLICATION_NAME@ 桌面同步客户端
|
||||
Icon[zh_CN]=@APPLICATION_ICON_NAME@
|
||||
Name[zh_CN]=@APPLICATION_NAME@ 桌面同步客户端
|
||||
GenericName[zh_CN]=文件夹同步
|
||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_EXECUTABLE@
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||
X-GNOME-Autostart-Delay=3
|
||||
# Translations
|
||||
@@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
|
||||
|
||||
# Translations
|
||||
Comment[zh_TW]=@APPLICATION_NAME@ 桌面同步客戶端
|
||||
Icon[zh_TW]=@APPLICATION_EXECUTABLE@
|
||||
Name[zh_TW]=@APPLICATION_NAME@ 桌面同步客戶端
|
||||
GenericName[zh_TW]=資料夾同步
|
||||
|
||||
@@ -174,8 +174,6 @@ endif()
|
||||
if(BUILD_CLIENT)
|
||||
if(APPLE)
|
||||
find_package(Sparkle)
|
||||
find_package(FUSE REQUIRED)
|
||||
include_directories(BEFORE ${FUSE_INCLUDE_DIR})
|
||||
endif(APPLE)
|
||||
|
||||
if(UNIX)
|
||||
@@ -185,7 +183,7 @@ if(BUILD_CLIENT)
|
||||
endif()
|
||||
find_package(Sphinx)
|
||||
find_package(PdfLatex)
|
||||
find_package(OpenSSL 1.1 REQUIRED)
|
||||
find_package(OpenSSL 1.1 REQUIRED )
|
||||
|
||||
find_package(ZLIB REQUIRED)
|
||||
find_package(GLib2)
|
||||
@@ -245,9 +243,7 @@ configure_file(version.h.in ${CMAKE_CURRENT_BINARY_DIR}/version.h)
|
||||
if(BUILD_OWNCLOUD_OSX_BUNDLE)
|
||||
install(FILES sync-exclude.lst DESTINATION ${OWNCLOUD_OSX_BUNDLE}/Contents/Resources/)
|
||||
configure_file(sync-exclude.lst bin/${OWNCLOUD_OSX_BUNDLE}/Contents/Resources/sync-exclude.lst COPYONLY)
|
||||
configure_file(LoopbackFS.icns bin/${OWNCLOUD_OSX_BUNDLE}/Contents/Resources/LoopbackFS.icns COPYONLY)
|
||||
elseif(BUILD_CLIENT)
|
||||
install( FILES sync-exclude.lst DESTINATION ${SYSCONFDIR}/${APPLICATION_SHORTNAME} )
|
||||
configure_file(sync-exclude.lst bin/sync-exclude.lst COPYONLY)
|
||||
configure_file(LoopbackFS.icns bin/LoopbackFS.icns COPYONLY)
|
||||
endif()
|
||||
|
||||
BIN
LoopbackFS.icns
BIN
LoopbackFS.icns
Binary file not shown.
18
README.md
18
README.md
@@ -17,30 +17,36 @@ with your computer.
|
||||
|
||||
##### Clone the repo and create build directory
|
||||
```
|
||||
$ git clone git@github.com:nextcloud/desktop.git
|
||||
$ git clone https://github.com/nextcloud/desktop.git
|
||||
$ cd desktop
|
||||
$ mkdir build
|
||||
$ cd build
|
||||
```
|
||||
##### Compile and install
|
||||
|
||||
For development reasons it is better to install the client on user space
|
||||
instead on the global system. For example you could use in the next
|
||||
instructions `path-to-install-folder/` as `~/.local/` in a linux system. If
|
||||
you want to install system wide you could use `/usr/local` or `/opt/nextcloud/`.
|
||||
|
||||
##### Linux
|
||||
|
||||
```
|
||||
$ cmake .. -DCMAKE_INSTALL_PREFIX=path-to-install-folder/ -DCMAKE_BUILD_TYPE=Debug -DNO_SHIBBOLETH=1
|
||||
$ cmake .. -DCMAKE_INSTALL_PREFIX=path-to-install-folder/ -DCMAKE_BUILD_TYPE=Debug -DNO_SHIBBOLETH=1 -DQTKEYCHAIN_LIBRARY=/path-to-qt5keychain-folder/lib64/libqt5keychain.so -DQTKEYCHAIN_INCLUDE_DIR=/path-to-qt5keychain-folder/include/qt5keychain/ -DOPENSSL_ROOT_DIR=/path-to-openssl-folder/ -DOPENSSL_INCLUDE_DIR=path-to-openssl-folder/include -DOPENSSL_LIBRARIES=path-to-openssl-folder/lib
|
||||
$ make install
|
||||
```
|
||||
|
||||
##### Windows
|
||||
|
||||
```
|
||||
$ cmake -G "Visual Studio 15 2017 Win64" .. -DCMAKE_INSTALL_PREFIX=path-to-install-folder/ -DCMAKE_BUILD_TYPE=Debug -DNO_SHIBBOLETH=1
|
||||
$ cmake -G "Visual Studio 15 2017 Win64" .. -DCMAKE_INSTALL_PREFIX=path-to-install-folder/ -DCMAKE_BUILD_TYPE=Debug -DNO_SHIBBOLETH=1 -DPng2Ico_EXECUTABLE=/path-to-install-png2ico/png2ico.exe -DQTKEYCHAIN_LIBRARY=/path-to-qt5keychain-folder/lib/qt5keychain.lib -DQTKEYCHAIN_INCLUDE_DIR=/path-to-qt5keychain-folder/include/qt5keychain/ -DOPENSSL_ROOT_DIR=/path-to-openssl-folder/ -DOPENSSL_INCLUDE_DIR=path-to-openssl-folder/include -DOPENSSL_LIBRARIES=path-to-openssl-folder/lib
|
||||
$ cmake --build . --config Debug --target install
|
||||
```
|
||||
|
||||
##### Mac OS
|
||||
|
||||
```
|
||||
$ cmake .. -DCMAKE_INSTALL_PREFIX=path-to-install-folder/ -DCMAKE_BUILD_TYPE=Debug -DNO_SHIBBOLETH=1
|
||||
$ cmake .. -DCMAKE_INSTALL_PREFIX=path-to-install-folder/ -DCMAKE_BUILD_TYPE=Debug -DNO_SHIBBOLETH=1 -DQTKEYCHAIN_LIBRARY=/path-to-qt5keychain-folder/lib/libqt5keychain.dylib -DQTKEYCHAIN_INCLUDE_DIR=/path-to-qt5keychain-folder/include/qt5keychain/ -DOPENSSL_ROOT_DIR=/path-to-openssl-folder/ -DOPENSSL_INCLUDE_DIR=path-to-openssl-folder/include -DOPENSSL_LIBRARIES=path-to-openssl-folder/lib
|
||||
$ make install
|
||||
```
|
||||
|
||||
@@ -69,6 +75,8 @@ of your report being lost. :boom:
|
||||
|
||||
- If you created a patch :heart_eyes:, please submit a [Pull
|
||||
Request](https://github.com/nextcloud/client/pulls).
|
||||
- How to create a pull request? This guide will help you get started: [Opening a pull request](https://opensource.guide/how-to-contribute/#opening-a-pull-request) :heart:
|
||||
|
||||
|
||||
## :satellite: Contact us
|
||||
|
||||
@@ -99,5 +107,3 @@ https://github.com/nextcloud/desktop.
|
||||
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.
|
||||
|
||||
|
||||
|
||||
@@ -1,88 +0,0 @@
|
||||
Source: nextcloud-client
|
||||
Section: contrib/devel
|
||||
Priority: optional
|
||||
Maintainer: István Váradi <ivaradi@varadiistvan.hu>
|
||||
Build-Depends: cmake,
|
||||
debhelper,
|
||||
cdbs,
|
||||
dh-python,
|
||||
extra-cmake-modules (>= 5.16),
|
||||
kdelibs5-dev,
|
||||
kio-dev,
|
||||
libcmocka-dev,
|
||||
libhttp-dav-perl,
|
||||
libinotify-dev [kfreebsd-any],
|
||||
libqt5webkit5-dev,
|
||||
libsqlite3-dev,
|
||||
libssl-dev (>> 1.0.0),
|
||||
zlib1g-dev,
|
||||
optipng,
|
||||
pkg-kde-tools,
|
||||
python-sphinx | python3-sphinx,
|
||||
python3-all,
|
||||
qt5keychain-dev,
|
||||
qtwebengine5-dev,
|
||||
qtdeclarative5-dev,
|
||||
qttools5-dev,
|
||||
qttools5-dev-tools,
|
||||
xvfb
|
||||
Standards-Version: 3.9.8
|
||||
Homepage: https://github.com/nextcloud/client_theming
|
||||
#Vcs-Git: git://anonscm.debian.org/collab-maint/nextcloud-client.git
|
||||
#Vcs-Browser: https://anonscm.debian.org/cgit/collab-maint/nextcloud-client.git
|
||||
|
||||
Package: nextcloud-client
|
||||
Architecture: any
|
||||
Depends: libnextcloudsync0 (=${binary:Version}), ${shlibs:Depends}, ${misc:Depends}, libgnome-keyring0, nextcloud-client-l10n
|
||||
Description: Nextcloud desktop sync client
|
||||
Use the desktop client to keep your files synchronized
|
||||
between your Nextcloud server and your desktop. Select
|
||||
one or more directories on your local machine and always
|
||||
have access to your latest files wherever you are.
|
||||
|
||||
Package: libnextcloudsync0
|
||||
Architecture: any
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends}
|
||||
Description: Nextcloud sync library
|
||||
Used by the Nextcloud desktop client as the synchronization engine.
|
||||
|
||||
Package: libnextcloudsync-dev
|
||||
Architecture: any
|
||||
Section: contrib/libdevel
|
||||
Depends: libnextcloudsync0 (=${binary:Version}), ${misc:Depends}
|
||||
Description: Nextcloud sync library development files
|
||||
The headers and development library for the Nextcloud sync library.
|
||||
|
||||
Package: nextcloud-client-l10n
|
||||
Architecture: all
|
||||
Depends: ${misc:Depends}
|
||||
Description: Nextcloud client internatialization files
|
||||
The translation files.
|
||||
|
||||
Package: nextcloud-client-nautilus
|
||||
Architecture: all
|
||||
Depends: nextcloud-client (>=${binary:Version}), libnextcloudsync0, python-nautilus, nautilus, ${misc:Depends}
|
||||
Description: Nautilus plugin for Nextcloud
|
||||
This package contains a Nautilus plugin to display
|
||||
synchronization status icons for Nextcloud files.
|
||||
|
||||
Package: nextcloud-client-nemo
|
||||
Architecture: all
|
||||
Depends: nextcloud-client (>=${binary:Version}), libnextcloudsync0, python-nemo | nemo-python, nemo, ${misc:Depends}
|
||||
Description: Nemo plugin for Nextcloud
|
||||
This package contains a Nemo plugin to display
|
||||
synchronization status icons for Nextcloud files.
|
||||
|
||||
Package: nextcloud-client-caja
|
||||
Architecture: all
|
||||
Depends: nextcloud-client (>=${binary:Version}), libnextcloudsync0, python-caja, caja, ${misc:Depends}
|
||||
Description: Caja plugin for Nextcloud
|
||||
This package contains a Caja plugin to display
|
||||
synchronization status icons for Nextcloud files.
|
||||
|
||||
Package: nextcloud-client-dolphin
|
||||
Architecture: any
|
||||
Depends: dolphin (>= 4:15.12.1), libnextcloudsync0 (= ${binary:Version}), nextcloud-client, ${misc:Depends}, ${shlibs:Depends}
|
||||
Description: Dolphin plugin for Nextcloud
|
||||
This package contains a Dolphin plugin to display
|
||||
synchronization status icons for Nextcloud files.
|
||||
@@ -13,8 +13,9 @@ Build-Depends: cmake,
|
||||
libhttp-dav-perl,
|
||||
libinotify-dev [kfreebsd-any],
|
||||
libqt5webkit5-dev,
|
||||
libqt5svg5-dev,
|
||||
libsqlite3-dev,
|
||||
libssl-dev (>> 1.0.0),
|
||||
libssl-dev (>= 1.1.0),
|
||||
zlib1g-dev,
|
||||
optipng,
|
||||
pkg-kde-tools,
|
||||
|
||||
@@ -13,6 +13,7 @@ Build-Depends: cmake,
|
||||
libhttp-dav-perl,
|
||||
libinotify-dev [kfreebsd-any],
|
||||
libqt5webkit5-dev,
|
||||
libqt5svg5-dev,
|
||||
libsqlite3-dev,
|
||||
libssl-dev (>> 1.0.0),
|
||||
zlib1g-dev,
|
||||
@@ -33,7 +34,8 @@ Homepage: https://github.com/nextcloud/client_theming
|
||||
|
||||
Package: nextcloud-client
|
||||
Architecture: any
|
||||
Depends: libnextcloudsync0 (=${binary:Version}), ${shlibs:Depends}, ${misc:Depends}, libgnome-keyring0, nextcloud-client-l10n
|
||||
Depends: libnextcloudsync0 (=${binary:Version}), ${shlibs:Depends}, ${misc:Depends}, nextcloud-client-l10n
|
||||
Recommends: libgnome-keyring0
|
||||
Description: Nextcloud desktop sync client
|
||||
Use the desktop client to keep your files synchronized
|
||||
between your Nextcloud server and your desktop. Select
|
||||
11
admin/linux/debian/debian.xenial/post-patches/libssl.patch
Normal file
11
admin/linux/debian/debian.xenial/post-patches/libssl.patch
Normal file
@@ -0,0 +1,11 @@
|
||||
--- nextcloud-client-2.5.0.orig/CMakeLists.txt 2018-08-13 16:19:57.191634632 +0200
|
||||
+++ nextcloud-client-2.5.0/CMakeLists.txt 2018-08-13 16:20:05.167612238 +0200
|
||||
@@ -183,7 +183,7 @@
|
||||
endif()
|
||||
find_package(Sphinx)
|
||||
find_package(PdfLatex)
|
||||
- find_package(OpenSSL 1.1 REQUIRED )
|
||||
+ find_package(OpenSSL 1.0 REQUIRED )
|
||||
|
||||
find_package(ZLIB REQUIRED)
|
||||
find_package(GLib2)
|
||||
@@ -8,13 +8,14 @@ Build-Depends: cmake,
|
||||
dh-python,
|
||||
extra-cmake-modules (>= 5.16),
|
||||
kdelibs5-dev,
|
||||
kio-dev,
|
||||
libkf5kio-dev,
|
||||
libcmocka-dev,
|
||||
libhttp-dav-perl,
|
||||
libinotify-dev [kfreebsd-any],
|
||||
libqt5svg5-dev,
|
||||
libqt5webkit5-dev,
|
||||
libsqlite3-dev,
|
||||
libssl-dev (>> 1.0.0),
|
||||
libssl-dev (>= 1.1.0),
|
||||
zlib1g-dev,
|
||||
optipng,
|
||||
pkg-kde-tools,
|
||||
@@ -33,8 +34,7 @@ Homepage: https://github.com/nextcloud/client_theming
|
||||
|
||||
Package: nextcloud-client
|
||||
Architecture: any
|
||||
Depends: libnextcloudsync0 (=${binary:Version}), ${shlibs:Depends}, ${misc:Depends}, nextcloud-client-l10n
|
||||
Recommends: libgnome-keyring0
|
||||
Depends: libnextcloudsync0 (=${binary:Version}), ${shlibs:Depends}, ${misc:Depends}, libgnome-keyring0, nextcloud-client-l10n
|
||||
Description: Nextcloud desktop sync client
|
||||
Use the desktop client to keep your files synchronized
|
||||
between your Nextcloud server and your desktop. Select
|
||||
|
||||
@@ -16,5 +16,3 @@ configure_file(create_mac.sh.cmake ${CMAKE_CURRENT_BINARY_DIR}/create_mac.sh)
|
||||
configure_file(macosx.pkgproj.cmake ${CMAKE_CURRENT_BINARY_DIR}/macosx.pkgproj)
|
||||
configure_file(pre_install.sh.cmake ${CMAKE_CURRENT_BINARY_DIR}/pre_install.sh)
|
||||
configure_file(post_install.sh.cmake ${CMAKE_CURRENT_BINARY_DIR}/post_install.sh)
|
||||
configure_file(fuse/FUSE\ for\ macOS\ 3.8.1.pkg ${CMAKE_CURRENT_BINARY_DIR}/fuse/FUSE\ for\ macOS\ 3.8.1.pkg COPYONLY)
|
||||
configure_file(fuse/settings.plist ${CMAKE_CURRENT_BINARY_DIR}/fuse/settings.plist COPYONLY)
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>URL</key>
|
||||
<string>https://github.com/libfuse/libfuse</string>
|
||||
</dict>
|
||||
</plist>
|
||||
Binary file not shown.
@@ -1,8 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>URL</key>
|
||||
<string>https://osxfuse.github.io</string>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -1,35 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleAllowMixedLocalizations</key>
|
||||
<true/>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>English</string>
|
||||
<key>CFBundleDisplayName</key>
|
||||
<string>Uninstaller</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>applet</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string>Uninstaller</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>Uninstaller</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>aplt</string>
|
||||
<key>LSMinimumSystemVersionByArchitecture</key>
|
||||
<dict>
|
||||
<key>x86_64</key>
|
||||
<string>10.6</string>
|
||||
</dict>
|
||||
<key>LSRequiresCarbon</key>
|
||||
<true/>
|
||||
<key>LSUIElement</key>
|
||||
<true/>
|
||||
<key>NSHumanReadableCopyright</key>
|
||||
<string>Copyright © Benjamin Fleischer. All rights reserved.</string>
|
||||
</dict>
|
||||
</plist>
|
||||
Binary file not shown.
@@ -1 +0,0 @@
|
||||
APPLaplt
|
||||
@@ -1,10 +0,0 @@
|
||||
"welcome_text" = "Remove FUSE for macOS?";
|
||||
"welcome_message" = "In case FUSE for macOS was installed using a package manager (e.g. Homebrew, MacPorts), please follow the instructions provided by the package manager for removing FUSE for macOS.\n\nIt is recommended to restart the Mac once the uninstallation is complete. Would you like to continue?";
|
||||
"welcome_no" = "No";
|
||||
"welcome_yes" = "Yes";
|
||||
|
||||
"uninstaller_successful_text" = "Uninstallation successful";
|
||||
"uninstaller_successful_message" = "FUSE for macOS has been sucessfully removed.";
|
||||
|
||||
"uninstaller_failed_text" = "Uninstallation failed";
|
||||
"uninstaller_failed_message" = "FUSE for macOS could not be removed due to an unknown error.";
|
||||
@@ -1,10 +0,0 @@
|
||||
"welcome_text" = "FUSE for macOS entfernen?";
|
||||
"welcome_message" = "Falls FUSE for macOS mit Hilfe eines Paket Managers (z.B. Homebrew, MacPorts) installiert wurde, folgen Sie bitte den Anweisungen des Paket Managers, um FUSE for macOS zu entfernen.\n\nEs wird empfohlen den Mac nach Abschluss der Deinstallation neu zu starten. Möchten Sie fortfahren?";
|
||||
"welcome_no" = "Nein";
|
||||
"welcome_yes" = "Ja";
|
||||
|
||||
"uninstaller_successful_text" = "Deinstallation erfolgreich";
|
||||
"uninstaller_successful_message" = "FUSE for macOS wurde erfolgreich entfernt.";
|
||||
|
||||
"uninstaller_failed_text" = "Deinstallation fehlgeschlagen";
|
||||
"uninstaller_failed_message" = "Bei der Deinstallation von FUSE for macOS ist ein unbekannter Fehler aufgetreten.";
|
||||
@@ -1,247 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Copyright (c) 2011-2014 Benjamin Fleischer
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright notice, this
|
||||
# list of conditions and the following disclaimer.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
# may be used to endorse or promote products derived from this software
|
||||
# without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
# Requires common.sh
|
||||
# Requires math.sh
|
||||
# Requires string.sh
|
||||
|
||||
|
||||
function array_is_array
|
||||
{
|
||||
if common_is_variable "${1}"
|
||||
then
|
||||
[[ "`declare -p "${1}" 2> /dev/null`" =~ ^"declare -"[^=]{0,}"a"[^=]{0,}" ${1}=" ]]
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
function array_create
|
||||
{
|
||||
common_assert "common_variable_is_legal_name `string_escape "${1}"`"
|
||||
|
||||
eval "${1}=()"
|
||||
}
|
||||
|
||||
function array_size
|
||||
{
|
||||
common_assert "array_is_array `string_escape "${1}"`"
|
||||
|
||||
eval "printf \"%u\" \${#${1}[@]}"
|
||||
}
|
||||
|
||||
function array_get
|
||||
{
|
||||
if [[ -z "${3}" ]]
|
||||
then
|
||||
common_assert "common_is_variable `string_escape "${1}"`"
|
||||
common_assert "math_is_integer `string_escape "${2}"` && [[ ${2} -ge 0 ]]"
|
||||
|
||||
eval "string_escape \"\${${1}[${2}]}\""
|
||||
else
|
||||
common_assert "common_is_variable `string_escape "${3}"`"
|
||||
|
||||
eval "${3}=`array_get "${1}" "${2}"`"
|
||||
fi
|
||||
}
|
||||
|
||||
function array_set
|
||||
{
|
||||
common_assert "common_is_variable `string_escape "${1}"`"
|
||||
common_assert "math_is_integer `string_escape "${2}"` && [[ ${2} -ge 0 ]]"
|
||||
|
||||
eval "${1}[${2}]=`string_escape "${3}"`"
|
||||
}
|
||||
|
||||
function array_append
|
||||
{
|
||||
common_assert "common_is_variable `string_escape "${1}"`"
|
||||
|
||||
eval "${1}+=(`string_escape "${2}"`)"
|
||||
}
|
||||
|
||||
function array_get_elements
|
||||
{
|
||||
common_assert "common_is_variable `string_escape "${1}"`"
|
||||
|
||||
function array_get_elements_serialize
|
||||
{
|
||||
local offset=$(( ${#} / 2 + 1 ))
|
||||
|
||||
if [[ ${#} -ge ${offset} ]]
|
||||
then
|
||||
printf '[%q]=%q' "${1}" "${!offset}"
|
||||
shift
|
||||
|
||||
while [[ ${#} -ge ${offset} ]]
|
||||
do
|
||||
printf ' [%q]=%q' "${1}" "${!offset}"
|
||||
shift
|
||||
done
|
||||
fi
|
||||
}
|
||||
eval "array_get_elements_serialize \"\${!${1}[@]}\" \"\${${1}[@]}\""
|
||||
|
||||
local rc=${?}
|
||||
unset -f array_get_elements_serialize
|
||||
return ${rc}
|
||||
}
|
||||
|
||||
function array_foreach
|
||||
{
|
||||
common_assert "common_is_variable `string_escape "${1}"`"
|
||||
common_assert "common_is_function `string_escape "${2}"`"
|
||||
common_assert "[[ ! `string_escape "${2}"` =~ ^array_foreach_ ]]"
|
||||
|
||||
eval "
|
||||
function array_foreach_internal
|
||||
{
|
||||
while [[ \${#} -gt 0 ]]
|
||||
do
|
||||
if ${2} \"\${1}\"
|
||||
then
|
||||
shift
|
||||
else
|
||||
return \${?}
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
function array_foreach_wrapper
|
||||
{
|
||||
array_foreach_internal \"\${${1}[@]}\"
|
||||
}
|
||||
" && array_foreach_wrapper
|
||||
|
||||
local rc=${?}
|
||||
unset -f array_foreach_internal
|
||||
unset -f array_foreach_wrapper
|
||||
return ${rc}
|
||||
}
|
||||
|
||||
function array_contains
|
||||
{
|
||||
eval "
|
||||
function array_contains_compare
|
||||
{
|
||||
[[ \"\${1}\" != `string_escape "${2}"` ]]
|
||||
}
|
||||
" && ! array_foreach "${1}" array_contains_compare
|
||||
|
||||
local rc=${?}
|
||||
unset -f array_contains_compare
|
||||
return ${rc}
|
||||
}
|
||||
|
||||
function array_sort
|
||||
{
|
||||
common_assert "common_is_variable `string_escape "${1}"`"
|
||||
common_assert "common_is_function `string_escape "${2}"`"
|
||||
common_assert "[[ ! `string_escape "${2}"` =~ ^array_sort_ ]]"
|
||||
common_assert "[[ `string_escape "${3}"` =~ !? ]]"
|
||||
|
||||
eval "
|
||||
function array_sort_quicksort
|
||||
{
|
||||
local -a left=()
|
||||
local -a right=()
|
||||
local pivot=""
|
||||
|
||||
if [[ \${#} -eq 0 ]]
|
||||
then
|
||||
return 0
|
||||
fi
|
||||
|
||||
pivot=\"\${1}\"
|
||||
shift
|
||||
|
||||
while [[ \${#} -gt 0 ]]
|
||||
do
|
||||
${2} \"\${1}\" \"\${pivot}\"
|
||||
if [[ ${3} \${?} -le 1 ]]
|
||||
then
|
||||
left[\${#left[@]}]=\"\${1}\"
|
||||
else
|
||||
right[\${#right[@]}]=\"\${1}\"
|
||||
fi
|
||||
shift
|
||||
done
|
||||
|
||||
if [[ \${#left[@]} -gt 0 ]]
|
||||
then
|
||||
array_sort_quicksort \"\${left[@]}\"
|
||||
fi
|
||||
string_escape \"\${pivot}\"
|
||||
printf \"%s\" \"\${IFS}\"
|
||||
if [[ \${#right[@]} -gt 0 ]]
|
||||
then
|
||||
array_sort_quicksort \"\${right[@]}\"
|
||||
fi
|
||||
}
|
||||
|
||||
function array_sort_wrapper
|
||||
{
|
||||
eval \"${1}=(\$(array_sort_quicksort \"\${${1}[@]}\"))\"
|
||||
}
|
||||
" && array_sort_wrapper
|
||||
|
||||
local rc=${?}
|
||||
unset -f array_sort_quicksort
|
||||
unset -f array_sort_wrapper
|
||||
return ${rc}
|
||||
}
|
||||
|
||||
function array_join
|
||||
{
|
||||
common_assert "common_is_variable `string_escape "${1}"`"
|
||||
|
||||
eval "
|
||||
function array_join_internal
|
||||
{
|
||||
printf \"%s\" \"\${1}\"
|
||||
shift
|
||||
while [[ \${#} -gt 0 ]]
|
||||
do
|
||||
printf \"%s%s\" `string_escape "${2:-, }"` \"\${1}\"
|
||||
shift
|
||||
done
|
||||
printf \"\n\"
|
||||
}
|
||||
|
||||
function array_join_wrapper
|
||||
{
|
||||
array_join_internal \"\${${1}[@]}\"
|
||||
}
|
||||
" && array_join_wrapper
|
||||
|
||||
local rc=${?}
|
||||
unset -f array_join_internal
|
||||
unset -f array_join_wrapper
|
||||
return ${rc}
|
||||
}
|
||||
@@ -1,578 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Copyright (c) 2011-2014 Benjamin Fleischer
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright notice, this
|
||||
# list of conditions and the following disclaimer.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
# may be used to endorse or promote products derived from this software
|
||||
# without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
# Requires array.sh
|
||||
# Requires math.sh
|
||||
# Requires string.sh
|
||||
|
||||
|
||||
declare -a COMMON_LOG_PREFIX=()
|
||||
declare -i COMMON_LOG_VERBOSE=2
|
||||
|
||||
|
||||
function common_log_initialize
|
||||
{
|
||||
common_log_set_verbose ${COMMON_LOG_VERBOSE}
|
||||
}
|
||||
|
||||
function common_log_set_verbose
|
||||
{
|
||||
local verbose="${1}"
|
||||
|
||||
common_assert "math_is_integer `string_escape "${verbose}"`"
|
||||
common_assert "[[ ${verbose} -gt 0 ]]"
|
||||
|
||||
COMMON_LOG_VERBOSE=${verbose}
|
||||
|
||||
if (( COMMON_LOG_VERBOSE > 4 ))
|
||||
then
|
||||
exec 3>&1
|
||||
exec 4>&2
|
||||
else
|
||||
exec 3> /dev/null
|
||||
exec 4> /dev/null
|
||||
fi
|
||||
}
|
||||
|
||||
function common_log
|
||||
{
|
||||
local -a options=()
|
||||
common_getopt options "v:,verbose:,c:,color:,t,trace,o:,offset:" "${@}"
|
||||
common_die_on_error "${options[@]}"
|
||||
|
||||
set -- "${options[@]}"
|
||||
|
||||
local -i verbose=2
|
||||
local color=""
|
||||
local -i trace=0
|
||||
local -i trace_offset=0
|
||||
|
||||
while [[ ${#} -gt 0 ]]
|
||||
do
|
||||
case "${1}" in
|
||||
--)
|
||||
shift
|
||||
break
|
||||
;;
|
||||
-v|--verbose)
|
||||
verbose="${2}"
|
||||
shift 2
|
||||
;;
|
||||
-c|--color)
|
||||
color="${2}"
|
||||
shift 2
|
||||
;;
|
||||
-t|--trace)
|
||||
trace=1
|
||||
shift
|
||||
;;
|
||||
-o|--trace-offset)
|
||||
trace_offset="${2}"
|
||||
shift 2
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if (( verbose > COMMON_LOG_VERBOSE ))
|
||||
then
|
||||
return 0
|
||||
fi
|
||||
|
||||
if [[ -z "${color}" ]]
|
||||
then
|
||||
case ${verbose} in
|
||||
1|2)
|
||||
color="1;30"
|
||||
;;
|
||||
4)
|
||||
color="0;37"
|
||||
;;
|
||||
[0-9]+)
|
||||
color="0:30"
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
if (( trace == 1 ))
|
||||
then
|
||||
local -a stack=()
|
||||
local -i i=${trace_offset}
|
||||
local caller=""
|
||||
local function=""
|
||||
local file=""
|
||||
local line=""
|
||||
|
||||
while caller="`caller ${i}`"
|
||||
do
|
||||
function="`/usr/bin/cut -d " " -f 2 <<< "${caller}"`"
|
||||
file="`/usr/bin/cut -d " " -f 3- <<< "${caller}"`"
|
||||
line="`/usr/bin/cut -d " " -f 1 <<< "${caller}"`"
|
||||
|
||||
array_append stack "at ${function} (${file}, line ${line})"
|
||||
|
||||
(( i++ ))
|
||||
done
|
||||
|
||||
set -- "${@}" "${stack[@]}"
|
||||
fi
|
||||
|
||||
while [[ ${#} -gt 0 ]]
|
||||
do
|
||||
if [[ ${#COMMON_LOG_PREFIX[@]} -gt 0 ]]
|
||||
then
|
||||
printf "%-20s | " "${COMMON_LOG_PREFIX}" >&2
|
||||
fi
|
||||
printf "\033[${color}m%s\033[0m\n" "${1}" >&2
|
||||
shift
|
||||
done
|
||||
}
|
||||
|
||||
function common_log_variable
|
||||
{
|
||||
while [[ ${#} -gt 0 ]]
|
||||
do
|
||||
common_log -v 4 -- "`common_variable_print "${1}"`"
|
||||
shift
|
||||
done
|
||||
}
|
||||
|
||||
function common_warn
|
||||
{
|
||||
common_log -v 1 -c "0;31" -o 1 "${@}"
|
||||
}
|
||||
|
||||
function common_die
|
||||
{
|
||||
if [[ ${#} -eq 0 ]]
|
||||
then
|
||||
set -- "Unspecified error"
|
||||
fi
|
||||
|
||||
common_log -v 1 -c "1;31" -o 1 "${@}"
|
||||
echo -ne "\a" >&2
|
||||
|
||||
if (( BASH_SUBSHELL > 0 ))
|
||||
then
|
||||
kill -SIGTERM 0
|
||||
fi
|
||||
exit 1
|
||||
}
|
||||
|
||||
function common_assert
|
||||
{
|
||||
if [[ -n "${1}" ]]
|
||||
then
|
||||
eval "${1}"
|
||||
if (( ${?} != 0 ))
|
||||
then
|
||||
if [[ -n "${2}" ]]
|
||||
then
|
||||
common_die -t -o 2 "${2}"
|
||||
else
|
||||
common_die -t -o 2 "Assertion '${1}' failed"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
function common_die_on_error
|
||||
{
|
||||
if (( ${?} != 0 ))
|
||||
then
|
||||
common_die "${@}"
|
||||
fi
|
||||
}
|
||||
|
||||
function common_warn_on_error
|
||||
{
|
||||
if (( ${?} != 0 ))
|
||||
then
|
||||
common_warn "${@}"
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
function common_signal_trap_initialize
|
||||
{
|
||||
local signal=""
|
||||
for signal in SIGINT SIGTERM
|
||||
do
|
||||
trap "common_signal_trap \"${signal}\"" "${signal}"
|
||||
done
|
||||
}
|
||||
|
||||
function common_signal_trap
|
||||
{
|
||||
local signal="${1}"
|
||||
|
||||
common_log -v 4 "Received signal: ${signal}"
|
||||
case "${signal}" in
|
||||
SIGINT)
|
||||
common_warn "Aborted by user"
|
||||
exit 130
|
||||
;;
|
||||
SIGTERM)
|
||||
exit 143
|
||||
;;
|
||||
*)
|
||||
common_warn "Ignore signal: ${signal}"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
|
||||
function common_getopt
|
||||
{
|
||||
function common_getopt_internal
|
||||
{
|
||||
local variable="${1}"
|
||||
|
||||
local -a specs=()
|
||||
IFS="," read -ra specs <<< "${2}"
|
||||
|
||||
common_assert "array_is_array `string_escape ${variable}`"
|
||||
|
||||
local -i error=0
|
||||
local -a out=()
|
||||
|
||||
function common_getopt_spec
|
||||
{
|
||||
case "${1: -1}" in
|
||||
":")
|
||||
common_variable_set "${2}" "${1:0:$((${#1} - 1))}"
|
||||
common_variable_set "${3}" 1
|
||||
;;
|
||||
"?")
|
||||
common_variable_set "${2}" "${1:0:$((${#1} - 1))}"
|
||||
common_variable_set "${3}" 2
|
||||
;;
|
||||
*)
|
||||
common_variable_set "${2}" "${1}"
|
||||
common_variable_set "${3}" 0
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
local spec_name=""
|
||||
local -i spec_has_argument=0
|
||||
|
||||
local option=""
|
||||
local option_name=""
|
||||
local option_argument=""
|
||||
local -i option_has_argument=0
|
||||
|
||||
local -i match_found=0
|
||||
local match_name=""
|
||||
local -i match_has_argument=0
|
||||
|
||||
shift 2
|
||||
while [[ ${#} -gt 0 ]]
|
||||
do
|
||||
case ${1} in
|
||||
--)
|
||||
break
|
||||
;;
|
||||
-)
|
||||
out+=("--")
|
||||
break
|
||||
;;
|
||||
--*)
|
||||
option="${1:2}"
|
||||
shift
|
||||
|
||||
option_name="`/usr/bin/sed -E -n -e 's/^([^=]*).*$/\1/p' <<< "${option}"`"
|
||||
option_argument="`/usr/bin/sed -E -n -e 's/^[^=]*=(.*)$/\1/p' <<< "${option}"`"
|
||||
|
||||
[[ ! "${option}" =~ "=" ]]
|
||||
option_has_argument=${?}
|
||||
|
||||
match_found=0
|
||||
match_name=""
|
||||
match_has_argument=0
|
||||
for spec in "${specs[@]}"
|
||||
do
|
||||
common_getopt_spec "${spec}" spec_name spec_has_argument
|
||||
|
||||
if [[ ${#spec_name} -eq 1 ]]
|
||||
then
|
||||
continue
|
||||
fi
|
||||
|
||||
if [[ "${spec_name:0:${#option_name}}" = "${option_name}" ]]
|
||||
then
|
||||
match_name="${spec_name}"
|
||||
match_has_argument=${spec_has_argument}
|
||||
|
||||
if [[ ${#spec_name} -eq ${#option_name} ]]
|
||||
then
|
||||
match_found=1
|
||||
break
|
||||
elif (( match_found != 0 ))
|
||||
then
|
||||
error=1
|
||||
out=("Option '${option_name}' is ambiguous")
|
||||
break 2
|
||||
else
|
||||
match_found=1
|
||||
fi
|
||||
fi
|
||||
done
|
||||
if (( match_found == 0 ))
|
||||
then
|
||||
error=1
|
||||
out=("Illegal option '${option_name}'")
|
||||
break
|
||||
fi
|
||||
if (( match_has_argument != 2 && option_has_argument != match_has_argument ))
|
||||
then
|
||||
error=1
|
||||
if (( option_has_argument == 0 ))
|
||||
then
|
||||
out=("Option '${option_name}' requires an argument")
|
||||
else
|
||||
out=("Option '${option_name}' does not allow an argument")
|
||||
fi
|
||||
break
|
||||
fi
|
||||
|
||||
out+=("--${match_name}")
|
||||
if (( match_has_argument != 0 ))
|
||||
then
|
||||
out+=("${option_argument}")
|
||||
fi
|
||||
;;
|
||||
-*)
|
||||
option="${1:1}"
|
||||
shift
|
||||
|
||||
option_name="${option:0:1}"
|
||||
option_argument="${option:1}"
|
||||
|
||||
match_found=0
|
||||
for spec in "${specs[@]}"
|
||||
do
|
||||
common_getopt_spec "${spec}" spec_name spec_has_argument
|
||||
|
||||
if [[ "${option_name}" = "${spec_name}" ]]
|
||||
then
|
||||
match_found=1
|
||||
|
||||
out+=("-${option_name}")
|
||||
if (( spec_has_argument == 0 ))
|
||||
then
|
||||
if [[ -n "${option_argument}" ]]
|
||||
then
|
||||
set -- "-${option_argument}" "${@}"
|
||||
fi
|
||||
else
|
||||
if [[ -z "${option_argument}" ]]
|
||||
then
|
||||
if [[ ${#} -le 0 ]]
|
||||
then
|
||||
error=1
|
||||
out=("Option '${option_name}' requires an argument")
|
||||
break 2
|
||||
fi
|
||||
option_argument="${1}"
|
||||
shift
|
||||
fi
|
||||
|
||||
out+=("${option_argument}")
|
||||
fi
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
if (( match_found == 0 ))
|
||||
then
|
||||
error=1
|
||||
out=("Illegal option '${option_name}'")
|
||||
break
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
out+=("--")
|
||||
break
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if (( error == 0 ))
|
||||
then
|
||||
out+=("${@}")
|
||||
fi
|
||||
|
||||
printf "%s=%s\n" "${variable}" "`common_variable_clone out`"
|
||||
printf "return %d\n" ${error}
|
||||
}
|
||||
|
||||
eval "`common_getopt_internal "${@}"`"
|
||||
}
|
||||
|
||||
function common_sudo
|
||||
{
|
||||
local prompt="${1}"
|
||||
|
||||
common_assert "[[ -n `string_escape "${prompt}"` ]]"
|
||||
common_assert "[[ ${#} -gt 1 ]]"
|
||||
|
||||
if [[ ${#COMMON_LOG_PREFIX[@]} -gt 0 ]]
|
||||
then
|
||||
prompt="`printf "%-20s | %s" "${COMMON_LOG_PREFIX}" "${prompt}"`"
|
||||
fi
|
||||
|
||||
sudo -p "${prompt}: " "${@:2}"
|
||||
}
|
||||
|
||||
|
||||
function common_is_function
|
||||
{
|
||||
[[ "`type -t "${1}"`" == "function" ]]
|
||||
}
|
||||
|
||||
function common_function_is_legal_name
|
||||
{
|
||||
[[ "${1}" =~ ^[a-zA-Z_][0-9a-zA-Z_]*$ ]]
|
||||
}
|
||||
|
||||
|
||||
function common_is_variable
|
||||
{
|
||||
compgen -A variable | grep ^"${1}"$ > /dev/null
|
||||
}
|
||||
|
||||
function common_variable_is_legal_name
|
||||
{
|
||||
[[ "${1}" =~ ^[a-zA-Z_][0-9a-zA-Z_]*$ ]]
|
||||
}
|
||||
|
||||
function common_variable_is_readonly
|
||||
{
|
||||
if common_is_variable "${1}"
|
||||
then
|
||||
[[ "`declare -p "${1}" 2> /dev/null`" =~ ^"declare -"[^=]{0,}"r"[^=]{0,}" ${1}=" ]]
|
||||
fi
|
||||
}
|
||||
|
||||
function common_variable_get
|
||||
{
|
||||
common_assert "common_is_variable `string_escape "${1}"`"
|
||||
|
||||
string_escape "${!1}"
|
||||
}
|
||||
|
||||
function common_variable_set
|
||||
{
|
||||
common_assert "common_variable_is_legal_name `string_escape "${1}"`"
|
||||
|
||||
eval "${1}=`string_escape "${2}"`"
|
||||
}
|
||||
|
||||
function common_variable_clone
|
||||
{
|
||||
if [[ -z "${2}" ]]
|
||||
then
|
||||
common_assert "common_is_variable `string_escape "${1}"`"
|
||||
|
||||
if array_is_array "${1}"
|
||||
then
|
||||
printf "("
|
||||
array_get_elements "${1}"
|
||||
printf ")"
|
||||
else
|
||||
common_variable_get "${1}"
|
||||
fi
|
||||
else
|
||||
common_assert "common_variable_is_legal_name `string_escape "${2}"`"
|
||||
|
||||
eval "${2}=`common_variable_clone "${1}"`"
|
||||
fi
|
||||
}
|
||||
|
||||
function common_variable_print
|
||||
{
|
||||
common_assert "common_is_variable `string_escape "${1}"`"
|
||||
|
||||
printf "%s=" "${1}"
|
||||
common_variable_clone "${1}"
|
||||
printf "\n"
|
||||
}
|
||||
|
||||
function common_variable_require
|
||||
{
|
||||
while [[ ${#} -gt 0 ]]
|
||||
do
|
||||
if ! common_is_variable "${1}"
|
||||
then
|
||||
common_die "Variable not declared: ${1}"
|
||||
fi
|
||||
shift
|
||||
done
|
||||
}
|
||||
|
||||
function common_variable_expand
|
||||
{
|
||||
while [[ ${#} -gt 0 ]]
|
||||
do
|
||||
eval "echo \${!${1}@}"
|
||||
shift
|
||||
done
|
||||
}
|
||||
|
||||
|
||||
function common_path_absolute
|
||||
{
|
||||
local path="${1}"
|
||||
local -a tokens=()
|
||||
local -i tokens_count=0
|
||||
local -i i=0
|
||||
|
||||
if [[ ! "${path}" =~ ^/ ]]
|
||||
then
|
||||
path="`pwd -P`/${path}"
|
||||
fi
|
||||
IFS="/" read -ra tokens <<< "${path}"
|
||||
tokens_count=${#tokens[@]}
|
||||
|
||||
for (( i=0 ; i < ${tokens_count} ; i++ ))
|
||||
do
|
||||
case "${tokens[${i}]}" in
|
||||
.|"")
|
||||
unset -v tokens[${i}]
|
||||
;;
|
||||
..)
|
||||
unset -v tokens[$(( i - 1 ))]
|
||||
unset -v tokens[${i}]
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
printf "/"
|
||||
array_join tokens "/"
|
||||
}
|
||||
@@ -1,52 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Copyright (c) 2014 Benjamin Fleischer
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright notice, this
|
||||
# list of conditions and the following disclaimer.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
# may be used to endorse or promote products derived from this software
|
||||
# without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
|
||||
function installer_is_package_installed
|
||||
{
|
||||
local identifier="${1}"
|
||||
|
||||
/usr/sbin/pkgutil --pkg-info "${identifier}" > /dev/null 2>&1
|
||||
}
|
||||
|
||||
function installer_package_get_info
|
||||
{
|
||||
local identifier="${1}"
|
||||
local field="${2}"
|
||||
|
||||
local info=""
|
||||
info="`/usr/sbin/pkgutil --pkg-info "${identifier}" 2> /dev/null`"
|
||||
|
||||
if [[ ${?} -eq 0 ]]
|
||||
then
|
||||
/usr/bin/sed -E -n -e "s/^${field}: (.*)$/\1/p" <<< "${info}"
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
@@ -1,50 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Copyright (c) 2011-2016 Benjamin Fleischer
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright notice, this
|
||||
# list of conditions and the following disclaimer.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
# may be used to endorse or promote products derived from this software
|
||||
# without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
# Requires common.sh
|
||||
|
||||
|
||||
function macos_get_version
|
||||
{
|
||||
sw_vers -productVersion | /usr/bin/cut -d . -f 1,2 2> /dev/null
|
||||
}
|
||||
|
||||
function macos_unload_kext
|
||||
{
|
||||
local identifier="${1}"
|
||||
|
||||
common_assert "[[ -n `string_escape "${identifier}"` ]]"
|
||||
|
||||
if [[ -n "`/usr/sbin/kextstat -l -b "${identifier}"`" ]]
|
||||
then
|
||||
/sbin/kextunload -b "${identifier}" 1>&3 2>&4
|
||||
else
|
||||
return 0
|
||||
fi
|
||||
}
|
||||
@@ -1,76 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Copyright (c) 2011-2014 Benjamin Fleischer
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright notice, this
|
||||
# list of conditions and the following disclaimer.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
# may be used to endorse or promote products derived from this software
|
||||
# without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
# Requires common.sh
|
||||
# Requires string.sh
|
||||
|
||||
|
||||
function math_is_integer
|
||||
{
|
||||
[[ "${1}" =~ ^-?[0-9]+$ ]]
|
||||
}
|
||||
|
||||
function math_compare
|
||||
{
|
||||
if (( ${1} < ${2} ))
|
||||
then
|
||||
return 1
|
||||
fi
|
||||
if (( ${1} > ${2} ))
|
||||
then
|
||||
return 2
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
function math_max
|
||||
{
|
||||
common_assert "math_is_integer `string_escape "${1}"`"
|
||||
common_assert "math_is_integer `string_escape "${2}"`"
|
||||
|
||||
if (( ${1} > ${2} ))
|
||||
then
|
||||
printf "%s" "${1}"
|
||||
else
|
||||
printf "%s" "${2}"
|
||||
fi
|
||||
}
|
||||
|
||||
function math_min
|
||||
{
|
||||
common_assert "math_is_integer `string_escape "${1}"`"
|
||||
common_assert "math_is_integer `string_escape "${2}"`"
|
||||
|
||||
if (( ${1} < ${2} ))
|
||||
then
|
||||
printf "%s" "${1}"
|
||||
else
|
||||
printf "%s" "${2}"
|
||||
fi
|
||||
}
|
||||
@@ -1,160 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Copyright (c) 2014 Benjamin Fleischer
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright notice, this
|
||||
# list of conditions and the following disclaimer.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
# may be used to endorse or promote products derived from this software
|
||||
# without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
# Requires common.sh
|
||||
|
||||
|
||||
function osxfuse_uninstall_macfuse
|
||||
{
|
||||
/bin/rm -rf "/Library/Application Support/Developer/Shared/Xcode/Project Templates/MacFUSE"
|
||||
/bin/rm -rf "/Library/Filesystems/fusefs.fs"
|
||||
/bin/rm -rf "/Library/Frameworks/MacFUSE.framework"
|
||||
/bin/rm -rf "/Library/PreferencePanes/MacFUSE.prefPane"
|
||||
/bin/rm -f "/Library/Preferences/com.google.macfuse.plist"
|
||||
/bin/rm -rf "/usr/local/include/fuse"
|
||||
/bin/rm -f "/usr/local/include/fuse.h"
|
||||
/bin/rm -f "/usr/local/lib/libfuse.0.dylib"
|
||||
/bin/rm -f "/usr/local/lib/libfuse.2.7.3.dylib"
|
||||
/bin/rm -f "/usr/local/lib/libfuse.2.dylib"
|
||||
/bin/rm -f "/usr/local/lib/libfuse.dylib"
|
||||
/bin/rm -f "/usr/local/lib/libfuse.la"
|
||||
/bin/rm -f "/usr/local/lib/libfuse_ino64.2.7.3.dylib"
|
||||
/bin/rm -f "/usr/local/lib/libfuse_ino64.2.dylib"
|
||||
/bin/rm -f "/usr/local/lib/libfuse_ino64.dylib"
|
||||
/bin/rm -f "/usr/local/lib/libfuse_ino64.la"
|
||||
/bin/rm -f "/usr/local/lib/pkgconfig/fuse.pc"
|
||||
|
||||
/bin/rm -rf "/Library/Receipts/MacFUSE.pkg"
|
||||
/bin/rm -rf "/Library/Receipts/MacFUSE Core.pkg"
|
||||
|
||||
/usr/sbin/pkgutil --forget "com.google.macfuse" 1>&3 2>&4
|
||||
/usr/sbin/pkgutil --forget "com.google.macfuse.core" 1>&3 2>&4
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
function osxfuse_uninstall_osxfuse_2_core
|
||||
{
|
||||
/bin/rm -rf "/Library/Filesystems/osxfusefs.fs"
|
||||
/bin/rm -rf "/Library/Frameworks/OSXFUSE.framework"
|
||||
/bin/rm -rf "/usr/local/include/osxfuse"
|
||||
/bin/rm -f "/usr/local/lib/libosxfuse.2.dylib"
|
||||
/bin/rm -f "/usr/local/lib/libosxfuse.dylib"
|
||||
/bin/rm -f "/usr/local/lib/libosxfuse.la"
|
||||
/bin/rm -f "/usr/local/lib/libosxfuse_i32.2.dylib"
|
||||
/bin/rm -f "/usr/local/lib/libosxfuse_i32.dylib"
|
||||
/bin/rm -f "/usr/local/lib/libosxfuse_i32.la"
|
||||
/bin/rm -f "/usr/local/lib/libosxfuse_i64.2.dylib"
|
||||
/bin/rm -f "/usr/local/lib/libosxfuse_i64.dylib"
|
||||
/bin/rm -f "/usr/local/lib/libosxfuse_i64.la"
|
||||
/bin/rm -f "/usr/local/lib/pkgconfig/fuse.pc"
|
||||
/bin/rm -f "/usr/local/lib/pkgconfig/osxfuse.pc"
|
||||
|
||||
/usr/sbin/pkgutil --forget "com.github.osxfuse.pkg.Core" 1>&3 2>&4
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
function osxfuse_uninstall_osxfuse_2_macfuse
|
||||
{
|
||||
/bin/rm -rf "/Library/Frameworks/MacFUSE.framework"
|
||||
/bin/rm -f "/usr/local/lib/libfuse.0.dylib"
|
||||
/bin/rm -f "/usr/local/lib/libfuse.2.dylib"
|
||||
/bin/rm -f "/usr/local/lib/libfuse.dylib"
|
||||
/bin/rm -f "/usr/local/lib/libfuse.la"
|
||||
/bin/rm -f "/usr/local/lib/libfuse_ino64.2.dylib"
|
||||
/bin/rm -f "/usr/local/lib/libfuse_ino64.dylib"
|
||||
/bin/rm -f "/usr/local/lib/libfuse_ino64.la"
|
||||
/bin/rm -f "/usr/local/lib/libmacfuse_i32.2.dylib"
|
||||
/bin/rm -f "/usr/local/lib/libmacfuse_i32.dylib"
|
||||
/bin/rm -f "/usr/local/lib/libmacfuse_i64.2.dylib"
|
||||
/bin/rm -f "/usr/local/lib/libmacfuse_i64.dylib"
|
||||
|
||||
/usr/sbin/pkgutil --forget "com.google.macfuse.core" 1>&3 2>&4
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
function osxfuse_uninstall_osxfuse_2_prefpane
|
||||
{
|
||||
/bin/rm -rf "/Library/PreferencePanes/OSXFUSE.prefPane"
|
||||
/bin/rm -f "/Library/Preferences/com.github.osxfuse.OSXFUSE.plist"
|
||||
|
||||
/usr/sbin/pkgutil --forget "com.github.osxfuse.pkg.PrefPane" 1>&3 2>&4
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
function osxfuse_uninstall_osxfuse_3_core
|
||||
{
|
||||
/bin/rm -rf "/Library/Filesystems/osxfuse.fs"
|
||||
/bin/rm -rf "/Library/Frameworks/OSXFUSE.framework"
|
||||
/bin/rm -rf "/usr/local/include/osxfuse"
|
||||
/bin/rm -f "/usr/local/lib/libosxfuse.2.dylib"
|
||||
/bin/rm -f "/usr/local/lib/libosxfuse.dylib"
|
||||
/bin/rm -f "/usr/local/lib/libosxfuse.la"
|
||||
/bin/rm -f "/usr/local/lib/libosxfuse_i64.2.dylib"
|
||||
/bin/rm -f "/usr/local/lib/libosxfuse_i64.dylib"
|
||||
/bin/rm -f "/usr/local/lib/libosxfuse_i64.la"
|
||||
/bin/rm -f "/usr/local/lib/pkgconfig/fuse.pc"
|
||||
/bin/rm -f "/usr/local/lib/pkgconfig/osxfuse.pc"
|
||||
|
||||
/usr/sbin/pkgutil --forget "com.github.osxfuse.pkg.Core" 1>&3 2>&4
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
function osxfuse_uninstall_osxfuse_3_macfuse
|
||||
{
|
||||
/bin/rm -rf "/Library/Frameworks/MacFUSE.framework"
|
||||
/bin/rm -rf "/usr/local/include/fuse"
|
||||
/bin/rm -f "/usr/local/include/fuse.h"
|
||||
/bin/rm -f "/usr/local/lib/libfuse.0.dylib"
|
||||
/bin/rm -f "/usr/local/lib/libfuse.2.dylib"
|
||||
/bin/rm -f "/usr/local/lib/libfuse.dylib"
|
||||
/bin/rm -f "/usr/local/lib/libfuse.la"
|
||||
/bin/rm -f "/usr/local/lib/libfuse_ino64.2.dylib"
|
||||
/bin/rm -f "/usr/local/lib/libfuse_ino64.dylib"
|
||||
/bin/rm -f "/usr/local/lib/libfuse_ino64.la"
|
||||
/bin/rm -f "/usr/local/lib/pkgconfig/macfuse.pc"
|
||||
|
||||
/usr/sbin/pkgutil --forget "com.github.osxfuse.pkg.MacFUSE" 1>&3 2>&4
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
function osxfuse_uninstall_osxfuse_3_prefpane
|
||||
{
|
||||
/bin/rm -rf "/Library/PreferencePanes/OSXFUSE.prefPane"
|
||||
/bin/rm -f "/Library/Preferences/com.github.osxfuse.OSXFUSE.plist"
|
||||
|
||||
/usr/sbin/pkgutil --forget "com.github.osxfuse.pkg.PrefPane" 1>&3 2>&4
|
||||
|
||||
return 0
|
||||
}
|
||||
@@ -1,87 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Copyright (c) 2011-2014 Benjamin Fleischer
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright notice, this
|
||||
# list of conditions and the following disclaimer.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
# may be used to endorse or promote products derived from this software
|
||||
# without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
|
||||
function string_trim
|
||||
{
|
||||
local string="${1}"
|
||||
|
||||
! shopt -q extglob
|
||||
local -i extglob=${?}
|
||||
|
||||
if (( extglob == 0 ))
|
||||
then
|
||||
shopt -s extglob
|
||||
fi
|
||||
|
||||
string="${string##+([[:space:]])}"
|
||||
string="${string%%+([[:space:]])}"
|
||||
|
||||
if (( extglob == 0 ))
|
||||
then
|
||||
shopt -u extglob
|
||||
fi
|
||||
|
||||
printf "%s" "${string}"
|
||||
}
|
||||
|
||||
function string_lowercase
|
||||
{
|
||||
/usr/bin/tr '[A-Z]' '[a-z]'
|
||||
}
|
||||
|
||||
function string_uppercase
|
||||
{
|
||||
/usr/bin/tr '[a-z]' '[A-Z]'
|
||||
}
|
||||
|
||||
function string_escape
|
||||
{
|
||||
local count="${2:-1}"
|
||||
|
||||
if [[ "${count}" =~ [0-9]+ ]] && (( count > 0 ))
|
||||
then
|
||||
printf "%q" "`string_escape "${1}" $(( count - 1 ))`"
|
||||
else
|
||||
printf "%s" "${1}"
|
||||
fi
|
||||
}
|
||||
|
||||
function string_compare
|
||||
{
|
||||
if [[ "${1}" < "${2}" ]]
|
||||
then
|
||||
return 1
|
||||
fi
|
||||
if [[ "${1}" > "${2}" ]]
|
||||
then
|
||||
return 2
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
@@ -1,87 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Copyright (c) 2011-2014 Benjamin Fleischer
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright notice, this
|
||||
# list of conditions and the following disclaimer.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
# may be used to endorse or promote products derived from this software
|
||||
# without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
# Requires common.sh
|
||||
# Requires math.sh
|
||||
# Requires string.sh
|
||||
|
||||
|
||||
function version_is_version
|
||||
{
|
||||
[[ "${1}" =~ ^[0-9]+(\.[0-9]+)*$ ]]
|
||||
}
|
||||
|
||||
function version_compare
|
||||
{
|
||||
common_assert "version_is_version `string_escape "${1}"`"
|
||||
common_assert "version_is_version `string_escape "${2}"`"
|
||||
|
||||
local -a version1=()
|
||||
local -a version2=()
|
||||
|
||||
IFS="." read -ra version1 <<< "${1}"
|
||||
IFS="." read -ra version2 <<< "${2}"
|
||||
|
||||
local -i i=0
|
||||
local t1=""
|
||||
local t2=""
|
||||
for (( i=0 ; i < `math_max ${#version1[@]} ${#version2[@]}` ; i++ ))
|
||||
do
|
||||
t1=${version1[${i}]:-0}
|
||||
t2=${version2[${i}]:-0}
|
||||
|
||||
if (( t1 < t2 ))
|
||||
then
|
||||
return 1
|
||||
fi
|
||||
if (( t1 > t2 ))
|
||||
then
|
||||
return 2
|
||||
fi
|
||||
done
|
||||
return 0
|
||||
}
|
||||
|
||||
function version_compare_eq
|
||||
{
|
||||
version_compare "${1}" "${2}"
|
||||
(( ${?} == 0 ))
|
||||
}
|
||||
|
||||
function version_compare_le
|
||||
{
|
||||
version_compare "${1}" "${2}"
|
||||
(( ${?} != 2 ))
|
||||
}
|
||||
|
||||
function version_compare_ge
|
||||
{
|
||||
version_compare "${1}" "${2}"
|
||||
(( ${?} != 1 ))
|
||||
}
|
||||
Binary file not shown.
@@ -1,137 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Copyright (c) 2014 Benjamin Fleischer
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright notice, this
|
||||
# list of conditions and the following disclaimer.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# 3. Neither the name of the copyright holder nor the names of its contributors
|
||||
# may be used to endorse or promote products derived from this software
|
||||
# without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
|
||||
function uninstall_osxfuse_main
|
||||
{
|
||||
# Source libraries
|
||||
|
||||
local library_path=""
|
||||
for library_path in "${BASH_SOURCE[0]%/*}/lib"/*.sh
|
||||
do
|
||||
if [[ -f "${library_path}" ]]
|
||||
then
|
||||
source "${library_path}" || return 1
|
||||
fi
|
||||
done
|
||||
|
||||
common_log_initialize
|
||||
common_signal_trap_initialize
|
||||
|
||||
# Uninstall core
|
||||
|
||||
local core_version="`installer_package_get_info com.github.osxfuse.pkg.Core version`"
|
||||
|
||||
if [[ -z "${core_version}" ]]
|
||||
then
|
||||
if [[ -e "/Library/Filesystems/osxfuse.fs" ]]
|
||||
then
|
||||
core_version="3.0"
|
||||
|
||||
elif [[ -e "/Library/Filesystems/osxfusefs.fs" ]]
|
||||
then
|
||||
core_version="2.3"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ -n "${core_version}" ]]
|
||||
then
|
||||
if version_compare_ge "${core_version}" 3.0
|
||||
then
|
||||
macos_unload_kext "com.github.osxfuse.filesystems.osxfuse"
|
||||
osxfuse_uninstall_osxfuse_3_core
|
||||
|
||||
elif version_compare_ge "${core_version}" 2.3
|
||||
then
|
||||
macos_unload_kext "com.github.osxfuse.filesystems.osxfusefs"
|
||||
osxfuse_uninstall_osxfuse_2_core
|
||||
fi
|
||||
fi
|
||||
|
||||
# Uninstall preference pane
|
||||
|
||||
local prefpane_version="`installer_package_get_info com.github.osxfuse.pkg.PrefPane version`"
|
||||
|
||||
if [[ -z "${prefpane_version}" ]]
|
||||
then
|
||||
if [[ -e "/Library/PreferencePanes/OSXFUSE.prefPane" ]]
|
||||
then
|
||||
prefpane_version="3.0"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ -n "${prefpane_version}" ]]
|
||||
then
|
||||
if version_compare_ge "${prefpane_version}" 3.0
|
||||
then
|
||||
osxfuse_uninstall_osxfuse_3_prefpane
|
||||
|
||||
elif version_compare_ge "${prefpane_version}" 2.3
|
||||
then
|
||||
osxfuse_uninstall_osxfuse_2_prefpane
|
||||
fi
|
||||
fi
|
||||
|
||||
# Uninstall MacFUSE compatibility layer
|
||||
|
||||
local macfuse_version="`installer_package_get_info com.github.osxfuse.pkg.MacFUSE version`"
|
||||
|
||||
if [[ -z "${macfuse_version}" ]]
|
||||
then
|
||||
macfuse_version="`installer_package_get_info com.google.macfuse.core version`"
|
||||
fi
|
||||
|
||||
if [[ -z "${macfuse_version}" ]]
|
||||
then
|
||||
if [[ -e /usr/local/lib/pkgconfig/macfuse.pc ]]
|
||||
then
|
||||
macfuse_version="3.0"
|
||||
|
||||
elif [[ -e /usr/local/lib/libmacfuse_i32.2.dylib ]]
|
||||
then
|
||||
macfuse_version="2.3"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ -n "${macfuse_version}" ]]
|
||||
then
|
||||
if version_compare_ge "${macfuse_version}" 3.0
|
||||
then
|
||||
osxfuse_uninstall_osxfuse_3_macfuse
|
||||
|
||||
elif version_compare_ge "${macfuse_version}" 2.3
|
||||
then
|
||||
osxfuse_uninstall_osxfuse_2_macfuse
|
||||
fi
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
uninstall_osxfuse_main "${@}"
|
||||
Binary file not shown.
Binary file not shown.
|
Before Width: | Height: | Size: 362 B |
@@ -1,341 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>files</key>
|
||||
<dict>
|
||||
<key>Resources/English.lproj/Localizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
0Wjn3NrPepmcOASicNLS2raGv6k=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>Resources/German.lproj/Localizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
4buJ6nBrQzNa0CURYrv6fDLWXMc=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>Resources/Scripts/lib/array.sh</key>
|
||||
<data>
|
||||
acATIcnlFIi6qM0DXuVy5gdtFEc=
|
||||
</data>
|
||||
<key>Resources/Scripts/lib/common.sh</key>
|
||||
<data>
|
||||
ENbs4voSh0jU5KEK5BvFWSTjcNw=
|
||||
</data>
|
||||
<key>Resources/Scripts/lib/installer.sh</key>
|
||||
<data>
|
||||
GZbRDSAeVo5JyzznWzc3BhFuUGo=
|
||||
</data>
|
||||
<key>Resources/Scripts/lib/macos.sh</key>
|
||||
<data>
|
||||
e9Er5/UuqM3WdHEePY4vV/IBgxg=
|
||||
</data>
|
||||
<key>Resources/Scripts/lib/math.sh</key>
|
||||
<data>
|
||||
vTIVoM4Ta6BENguDomO8mSUTtto=
|
||||
</data>
|
||||
<key>Resources/Scripts/lib/osxfuse.sh</key>
|
||||
<data>
|
||||
yiCIOaPBCbVxNL4CMPRDV14AKSk=
|
||||
</data>
|
||||
<key>Resources/Scripts/lib/string.sh</key>
|
||||
<data>
|
||||
m3XuFEuae7unzvq2PMsL/+tKZfU=
|
||||
</data>
|
||||
<key>Resources/Scripts/lib/version.sh</key>
|
||||
<data>
|
||||
Maq9UhAmPuP1u0uG0CClOnEtXUI=
|
||||
</data>
|
||||
<key>Resources/Scripts/main.scpt</key>
|
||||
<data>
|
||||
SL2QzuMln6cM4yRRGLNVqm5eS/w=
|
||||
</data>
|
||||
<key>Resources/Scripts/uninstall_osxfuse.sh</key>
|
||||
<data>
|
||||
PLOe6Huk3962Njim7rKpCLhRLW0=
|
||||
</data>
|
||||
<key>Resources/Uninstaller.icns</key>
|
||||
<data>
|
||||
kL6mz31YXPBrUTT9Xk5T1T4Dhpg=
|
||||
</data>
|
||||
<key>Resources/applet.rsrc</key>
|
||||
<data>
|
||||
/jVQqMpNI1L5OTLhyJaYiMBCQY8=
|
||||
</data>
|
||||
</dict>
|
||||
<key>files2</key>
|
||||
<dict>
|
||||
<key>Resources/English.lproj/Localizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
0Wjn3NrPepmcOASicNLS2raGv6k=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
lTTq7JkVc0CP5qPxIwk54tsVL+rEiv9NMy2cuke49Tg=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>Resources/German.lproj/Localizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
4buJ6nBrQzNa0CURYrv6fDLWXMc=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
LhPdZbWcZjiUTy+nVQc+ybd0l0GpwKoKDP3TDrSNdUA=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>Resources/Scripts/lib/array.sh</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
acATIcnlFIi6qM0DXuVy5gdtFEc=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
n4ua44AdK1W8tQrVaNoEbE4KNiFaUPXRCjzUdP9wHHA=
|
||||
</data>
|
||||
</dict>
|
||||
<key>Resources/Scripts/lib/common.sh</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
ENbs4voSh0jU5KEK5BvFWSTjcNw=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
kH6kB2aWWzDgMHvo8zS4YLcpXSSaylMzSnEn0gQQpoc=
|
||||
</data>
|
||||
</dict>
|
||||
<key>Resources/Scripts/lib/installer.sh</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
GZbRDSAeVo5JyzznWzc3BhFuUGo=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
2Z/2eNbV2UZJCRyQ+8zMHin9TGBC15mXny15HcIJPZo=
|
||||
</data>
|
||||
</dict>
|
||||
<key>Resources/Scripts/lib/macos.sh</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
e9Er5/UuqM3WdHEePY4vV/IBgxg=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
WojtBY9VGpZjVX+xxjzOUGZR4H/o4zkDuNOcfPvFKug=
|
||||
</data>
|
||||
</dict>
|
||||
<key>Resources/Scripts/lib/math.sh</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
vTIVoM4Ta6BENguDomO8mSUTtto=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
aozCiQoNO6hiHmvUbWsebuMGVs8GAC19L4Qj7MSXFUk=
|
||||
</data>
|
||||
</dict>
|
||||
<key>Resources/Scripts/lib/osxfuse.sh</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
yiCIOaPBCbVxNL4CMPRDV14AKSk=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
zyarGvNeCuciX2oW3fH2SQ5KRiyMWlNUsmdCFK6n4Nk=
|
||||
</data>
|
||||
</dict>
|
||||
<key>Resources/Scripts/lib/string.sh</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
m3XuFEuae7unzvq2PMsL/+tKZfU=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
/vj6gilOvFq6Fz/rDQeT7tpYcOw684tKnVED/Uf/fIA=
|
||||
</data>
|
||||
</dict>
|
||||
<key>Resources/Scripts/lib/version.sh</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
Maq9UhAmPuP1u0uG0CClOnEtXUI=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
wfjFX+pXNt58pax1r1g8tld4SjgO/Ln9cwqDR7uactc=
|
||||
</data>
|
||||
</dict>
|
||||
<key>Resources/Scripts/main.scpt</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
SL2QzuMln6cM4yRRGLNVqm5eS/w=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
kq5sWt58LkxZlUULW60hlhRHz4eU6R61vqWiTjK0Scc=
|
||||
</data>
|
||||
</dict>
|
||||
<key>Resources/Scripts/uninstall_osxfuse.sh</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
PLOe6Huk3962Njim7rKpCLhRLW0=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
XBBbe5Gi2uNwDt8Bux07CSzeSQyZehHsBtSTM8M8Iyg=
|
||||
</data>
|
||||
</dict>
|
||||
<key>Resources/Uninstaller.icns</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
kL6mz31YXPBrUTT9Xk5T1T4Dhpg=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
fC0GPJXmpV4oDKdvRlAQBNfIN2Uomq/vlnFP1IcWMlk=
|
||||
</data>
|
||||
</dict>
|
||||
<key>Resources/applet.rsrc</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
/jVQqMpNI1L5OTLhyJaYiMBCQY8=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
0jPapEMRihcikRr/mzmNOcrNOYLHxGEOVmOrcBa6U/E=
|
||||
</data>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>rules</key>
|
||||
<dict>
|
||||
<key>^Resources/</key>
|
||||
<true/>
|
||||
<key>^Resources/.*\.lproj/</key>
|
||||
<dict>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<real>1000</real>
|
||||
</dict>
|
||||
<key>^Resources/.*\.lproj/locversion.plist$</key>
|
||||
<dict>
|
||||
<key>omit</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<real>1100</real>
|
||||
</dict>
|
||||
<key>^Resources/Base\.lproj/</key>
|
||||
<dict>
|
||||
<key>weight</key>
|
||||
<real>1010</real>
|
||||
</dict>
|
||||
<key>^version.plist$</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>rules2</key>
|
||||
<dict>
|
||||
<key>.*\.dSYM($|/)</key>
|
||||
<dict>
|
||||
<key>weight</key>
|
||||
<real>11</real>
|
||||
</dict>
|
||||
<key>^(.*/)?\.DS_Store$</key>
|
||||
<dict>
|
||||
<key>omit</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<real>2000</real>
|
||||
</dict>
|
||||
<key>^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/</key>
|
||||
<dict>
|
||||
<key>nested</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<real>10</real>
|
||||
</dict>
|
||||
<key>^.*</key>
|
||||
<true/>
|
||||
<key>^Info\.plist$</key>
|
||||
<dict>
|
||||
<key>omit</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<real>20</real>
|
||||
</dict>
|
||||
<key>^PkgInfo$</key>
|
||||
<dict>
|
||||
<key>omit</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<real>20</real>
|
||||
</dict>
|
||||
<key>^Resources/</key>
|
||||
<dict>
|
||||
<key>weight</key>
|
||||
<real>20</real>
|
||||
</dict>
|
||||
<key>^Resources/.*\.lproj/</key>
|
||||
<dict>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<real>1000</real>
|
||||
</dict>
|
||||
<key>^Resources/.*\.lproj/locversion.plist$</key>
|
||||
<dict>
|
||||
<key>omit</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<real>1100</real>
|
||||
</dict>
|
||||
<key>^Resources/Base\.lproj/</key>
|
||||
<dict>
|
||||
<key>weight</key>
|
||||
<real>1010</real>
|
||||
</dict>
|
||||
<key>^[^/]+$</key>
|
||||
<dict>
|
||||
<key>nested</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<real>10</real>
|
||||
</dict>
|
||||
<key>^embedded\.provisionprofile$</key>
|
||||
<dict>
|
||||
<key>weight</key>
|
||||
<real>20</real>
|
||||
</dict>
|
||||
<key>^version\.plist$</key>
|
||||
<dict>
|
||||
<key>weight</key>
|
||||
<real>20</real>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -1,8 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>URL</key>
|
||||
<string>https://github.com/osxfuse/osxfuse/wiki</string>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -1,91 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<array>
|
||||
<dict>
|
||||
<key>childItems</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>childItems</key>
|
||||
<array/>
|
||||
<key>choiceDescription</key>
|
||||
<string>Installs the FUSE for macOS core components, including the FUSE kernel extension, the shared library libosxfuse and OSXFUSE.framework.</string>
|
||||
<key>choiceIdentifier</key>
|
||||
<string>com.github.osxfuse.pkg.Core</string>
|
||||
<key>choiceIsEnabled</key>
|
||||
<false/>
|
||||
<key>choiceIsSelected</key>
|
||||
<integer>1</integer>
|
||||
<key>choiceIsVisible</key>
|
||||
<true/>
|
||||
<key>choiceSizeInKilobytes</key>
|
||||
<integer>4540</integer>
|
||||
<key>choiceTitle</key>
|
||||
<string>FUSE for macOS Core Components</string>
|
||||
<key>pathsOfActivePackagesInChoice</key>
|
||||
<array>
|
||||
<string>file://localhost/Users/JesusDeloya/clarodrive-desktop/admin/osx/fuse/FUSE%20for%20macOS%203.8.1.pkg#Core.pkg</string>
|
||||
</array>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>childItems</key>
|
||||
<array/>
|
||||
<key>choiceDescription</key>
|
||||
<string>Installs the FUSE for macOS Preference Pane which is used to download and install updates or remove FUSE for macOS.</string>
|
||||
<key>choiceIdentifier</key>
|
||||
<string>com.github.osxfuse.pkg.PrefPane</string>
|
||||
<key>choiceIsEnabled</key>
|
||||
<true/>
|
||||
<key>choiceIsSelected</key>
|
||||
<integer>1</integer>
|
||||
<key>choiceIsVisible</key>
|
||||
<true/>
|
||||
<key>choiceSizeInKilobytes</key>
|
||||
<integer>2669</integer>
|
||||
<key>choiceTitle</key>
|
||||
<string>FUSE for macOS Preference Pane</string>
|
||||
<key>pathsOfActivePackagesInChoice</key>
|
||||
<array>
|
||||
<string>file://localhost/Users/JesusDeloya/clarodrive-desktop/admin/osx/fuse/FUSE%20for%20macOS%203.8.1.pkg#PrefPane.pkg</string>
|
||||
</array>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>childItems</key>
|
||||
<array/>
|
||||
<key>choiceDescription</key>
|
||||
<string>Installs the compatibility layer for legacy MacFUSE file systems, that have not been ported to FUSE for macOS.</string>
|
||||
<key>choiceIdentifier</key>
|
||||
<string>com.github.osxfuse.pkg.MacFUSE</string>
|
||||
<key>choiceIsEnabled</key>
|
||||
<true/>
|
||||
<key>choiceIsSelected</key>
|
||||
<integer>0</integer>
|
||||
<key>choiceIsVisible</key>
|
||||
<true/>
|
||||
<key>choiceSizeInKilobytes</key>
|
||||
<integer>1743</integer>
|
||||
<key>choiceTitle</key>
|
||||
<string>MacFUSE Compatibility Layer</string>
|
||||
<key>pathsOfActivePackagesInChoice</key>
|
||||
<array>
|
||||
<string>file://localhost/Users/JesusDeloya/clarodrive-desktop/admin/osx/fuse/FUSE%20for%20macOS%203.8.1.pkg#MacFUSE.pkg</string>
|
||||
</array>
|
||||
</dict>
|
||||
</array>
|
||||
<key>choiceIdentifier</key>
|
||||
<string>__ROOT_CHOICE_IDENT_FUSEformacOS</string>
|
||||
<key>choiceIsEnabled</key>
|
||||
<true/>
|
||||
<key>choiceIsSelected</key>
|
||||
<integer>1</integer>
|
||||
<key>choiceIsVisible</key>
|
||||
<true/>
|
||||
<key>choiceSizeInKilobytes</key>
|
||||
<integer>0</integer>
|
||||
<key>choiceTitle</key>
|
||||
<string>FUSE for macOS</string>
|
||||
<key>pathsOfActivePackagesInChoice</key>
|
||||
<array/>
|
||||
</dict>
|
||||
</array>
|
||||
</plist>
|
||||
@@ -1,3 +0,0 @@
|
||||
<?xmlversion="1.0"encoding="UTF-8"?>
|
||||
<!DOCTYPEplistPUBLIC"-//Apple//DTDPLIST1.0//EN""http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist><array><dict><key>choiceIdentifier</key><string>__ROOT_CHOICE_IDENT_FUSEformacOS</string><key>choiceIsEnabled</key><true/><key>choiceIsSelected</key><integer>1</integer><key>choiceIsVisible</key><true/><key>choiceSizeInKilobytes</key><integer>0</integer><key>choiceTitle</key><string>FUSEformacOS</string><key>pathsOfActivePackagesInChoice</key><array/><key>childItems</key><array><dict><key>childItems</key><array/><key>choiceDescription</key><string>InstallstheFUSEformacOScorecomponents,includingtheFUSEkernelextension,thesharedlibrarylibosxfuseandOSXFUSE.framework.</string><key>choiceIdentifier</key><string>com.github.osxfuse.pkg.Core</string><key>choiceIsEnabled</key><false/><key>choiceIsSelected</key><integer>1</integer><key>choiceIsVisible</key><true/><key>choiceSizeInKilobytes</key><integer>4540</integer><key>choiceTitle</key><string>FUSEformacOSCoreComponents</string><key>pathsOfActivePackagesInChoice</key><array><string>file://localhost/Users/JesusDeloya/clarodrive-desktop/admin/osx/fuse/FUSE%20for%20macOS%203.8.1.pkg#Core.pkg</string></array></dict><dict><key>childItems</key><array/><key>choiceDescription</key><string>InstallstheFUSEformacOSPreferencePanewhichisusedtodownloadandinstallupdatesorremoveFUSEformacOS.</string><key>choiceIdentifier</key><string>com.github.osxfuse.pkg.PrefPane</string><key>choiceIsEnabled</key><true/><key>choiceIsSelected</key><integer>1</integer><key>choiceIsVisible</key><true/><key>choiceSizeInKilobytes</key><integer>2669</integer><key>choiceTitle</key><string>FUSEformacOSPreferencePane</string><key>pathsOfActivePackagesInChoice</key><array><string>file://localhost/Users/JesusDeloya/clarodrive-desktop/admin/osx/fuse/FUSE%20for%20macOS%203.8.1.pkg#PrefPane.pkg</string></array></dict><dict><key>childItems</key><array/><key>choiceDescription</key><string>InstallsthecompatibilitylayerforlegacyMacFUSEfilesystems,thathavenotbeenportedtoFUSEformacOS.</string><key>choiceIdentifier</key><string>com.github.osxfuse.pkg.MacFUSE</string><key>choiceIsEnabled</key><true/><key>choiceIsSelected</key><integer>1</integer><key>choiceIsVisible</key><true/><key>choiceSizeInKilobytes</key><integer>1743</integer><key>choiceTitle</key><string>MacFUSECompatibilityLayer</string><key>pathsOfActivePackagesInChoice</key><array><string>file://localhost/Users/JesusDeloya/clarodrive-desktop/admin/osx/fuse/FUSE%20for%20macOS%203.8.1.pkg#MacFUSE.pkg</string></array></dict></array></dict></array></plist>
|
||||
@@ -486,72 +486,7 @@
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<key>RESOURCES</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>CHILDREN</key>
|
||||
<array/>
|
||||
<key>GID</key>
|
||||
<integer>0</integer>
|
||||
<key>PATH</key>
|
||||
<string>com.clarodrive.trashdetector.plist</string>
|
||||
<key>PATH_TYPE</key>
|
||||
<integer>1</integer>
|
||||
<key>PERMISSIONS</key>
|
||||
<integer>420</integer>
|
||||
<key>TYPE</key>
|
||||
<integer>3</integer>
|
||||
<key>UID</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CHILDREN</key>
|
||||
<array/>
|
||||
<key>GID</key>
|
||||
<integer>0</integer>
|
||||
<key>PATH</key>
|
||||
<string>fuse/FUSE for macOS 3.8.1.pkg</string>
|
||||
<key>PATH_TYPE</key>
|
||||
<integer>1</integer>
|
||||
<key>PERMISSIONS</key>
|
||||
<integer>420</integer>
|
||||
<key>TYPE</key>
|
||||
<integer>3</integer>
|
||||
<key>UID</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CHILDREN</key>
|
||||
<array/>
|
||||
<key>GID</key>
|
||||
<integer>0</integer>
|
||||
<key>PATH</key>
|
||||
<string>fuse/settings.plist</string>
|
||||
<key>PATH_TYPE</key>
|
||||
<integer>1</integer>
|
||||
<key>PERMISSIONS</key>
|
||||
<integer>420</integer>
|
||||
<key>TYPE</key>
|
||||
<integer>3</integer>
|
||||
<key>UID</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CHILDREN</key>
|
||||
<array/>
|
||||
<key>GID</key>
|
||||
<integer>0</integer>
|
||||
<key>PATH</key>
|
||||
<string>uninstallCD.applescript</string>
|
||||
<key>PATH_TYPE</key>
|
||||
<integer>1</integer>
|
||||
<key>PERMISSIONS</key>
|
||||
<integer>420</integer>
|
||||
<key>TYPE</key>
|
||||
<integer>3</integer>
|
||||
<key>UID</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
</array>
|
||||
<array/>
|
||||
</dict>
|
||||
<key>PACKAGE_SETTINGS</key>
|
||||
<dict>
|
||||
@@ -571,536 +506,6 @@
|
||||
<key>UUID</key>
|
||||
<string>7D7219B7-1897-48C3-8533-842BDEC46F71</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>PACKAGE_FILES</key>
|
||||
<dict>
|
||||
<key>DEFAULT_INSTALL_LOCATION</key>
|
||||
<string>/</string>
|
||||
<key>HIERARCHY</key>
|
||||
<dict>
|
||||
<key>CHILDREN</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>CHILDREN</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>CHILDREN</key>
|
||||
<array/>
|
||||
<key>GID</key>
|
||||
<integer>80</integer>
|
||||
<key>PATH</key>
|
||||
<string>Utilities</string>
|
||||
<key>PATH_TYPE</key>
|
||||
<integer>0</integer>
|
||||
<key>PERMISSIONS</key>
|
||||
<integer>493</integer>
|
||||
<key>TYPE</key>
|
||||
<integer>1</integer>
|
||||
<key>UID</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
</array>
|
||||
<key>GID</key>
|
||||
<integer>80</integer>
|
||||
<key>PATH</key>
|
||||
<string>Applications</string>
|
||||
<key>PATH_TYPE</key>
|
||||
<integer>0</integer>
|
||||
<key>PERMISSIONS</key>
|
||||
<integer>509</integer>
|
||||
<key>TYPE</key>
|
||||
<integer>1</integer>
|
||||
<key>UID</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CHILDREN</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>CHILDREN</key>
|
||||
<array/>
|
||||
<key>GID</key>
|
||||
<integer>80</integer>
|
||||
<key>PATH</key>
|
||||
<string>Application Support</string>
|
||||
<key>PATH_TYPE</key>
|
||||
<integer>0</integer>
|
||||
<key>PERMISSIONS</key>
|
||||
<integer>493</integer>
|
||||
<key>TYPE</key>
|
||||
<integer>1</integer>
|
||||
<key>UID</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CHILDREN</key>
|
||||
<array/>
|
||||
<key>GID</key>
|
||||
<integer>0</integer>
|
||||
<key>PATH</key>
|
||||
<string>Documentation</string>
|
||||
<key>PATH_TYPE</key>
|
||||
<integer>0</integer>
|
||||
<key>PERMISSIONS</key>
|
||||
<integer>493</integer>
|
||||
<key>TYPE</key>
|
||||
<integer>1</integer>
|
||||
<key>UID</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CHILDREN</key>
|
||||
<array/>
|
||||
<key>GID</key>
|
||||
<integer>0</integer>
|
||||
<key>PATH</key>
|
||||
<string>Filesystems</string>
|
||||
<key>PATH_TYPE</key>
|
||||
<integer>0</integer>
|
||||
<key>PERMISSIONS</key>
|
||||
<integer>493</integer>
|
||||
<key>TYPE</key>
|
||||
<integer>1</integer>
|
||||
<key>UID</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CHILDREN</key>
|
||||
<array/>
|
||||
<key>GID</key>
|
||||
<integer>0</integer>
|
||||
<key>PATH</key>
|
||||
<string>Frameworks</string>
|
||||
<key>PATH_TYPE</key>
|
||||
<integer>0</integer>
|
||||
<key>PERMISSIONS</key>
|
||||
<integer>493</integer>
|
||||
<key>TYPE</key>
|
||||
<integer>1</integer>
|
||||
<key>UID</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CHILDREN</key>
|
||||
<array/>
|
||||
<key>GID</key>
|
||||
<integer>0</integer>
|
||||
<key>PATH</key>
|
||||
<string>Input Methods</string>
|
||||
<key>PATH_TYPE</key>
|
||||
<integer>0</integer>
|
||||
<key>PERMISSIONS</key>
|
||||
<integer>493</integer>
|
||||
<key>TYPE</key>
|
||||
<integer>1</integer>
|
||||
<key>UID</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CHILDREN</key>
|
||||
<array/>
|
||||
<key>GID</key>
|
||||
<integer>0</integer>
|
||||
<key>PATH</key>
|
||||
<string>Internet Plug-Ins</string>
|
||||
<key>PATH_TYPE</key>
|
||||
<integer>0</integer>
|
||||
<key>PERMISSIONS</key>
|
||||
<integer>493</integer>
|
||||
<key>TYPE</key>
|
||||
<integer>1</integer>
|
||||
<key>UID</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CHILDREN</key>
|
||||
<array/>
|
||||
<key>GID</key>
|
||||
<integer>0</integer>
|
||||
<key>PATH</key>
|
||||
<string>LaunchAgents</string>
|
||||
<key>PATH_TYPE</key>
|
||||
<integer>0</integer>
|
||||
<key>PERMISSIONS</key>
|
||||
<integer>493</integer>
|
||||
<key>TYPE</key>
|
||||
<integer>1</integer>
|
||||
<key>UID</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CHILDREN</key>
|
||||
<array/>
|
||||
<key>GID</key>
|
||||
<integer>0</integer>
|
||||
<key>PATH</key>
|
||||
<string>LaunchDaemons</string>
|
||||
<key>PATH_TYPE</key>
|
||||
<integer>0</integer>
|
||||
<key>PERMISSIONS</key>
|
||||
<integer>493</integer>
|
||||
<key>TYPE</key>
|
||||
<integer>1</integer>
|
||||
<key>UID</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CHILDREN</key>
|
||||
<array/>
|
||||
<key>GID</key>
|
||||
<integer>0</integer>
|
||||
<key>PATH</key>
|
||||
<string>PreferencePanes</string>
|
||||
<key>PATH_TYPE</key>
|
||||
<integer>0</integer>
|
||||
<key>PERMISSIONS</key>
|
||||
<integer>493</integer>
|
||||
<key>TYPE</key>
|
||||
<integer>1</integer>
|
||||
<key>UID</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CHILDREN</key>
|
||||
<array/>
|
||||
<key>GID</key>
|
||||
<integer>0</integer>
|
||||
<key>PATH</key>
|
||||
<string>Preferences</string>
|
||||
<key>PATH_TYPE</key>
|
||||
<integer>0</integer>
|
||||
<key>PERMISSIONS</key>
|
||||
<integer>493</integer>
|
||||
<key>TYPE</key>
|
||||
<integer>1</integer>
|
||||
<key>UID</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CHILDREN</key>
|
||||
<array/>
|
||||
<key>GID</key>
|
||||
<integer>80</integer>
|
||||
<key>PATH</key>
|
||||
<string>Printers</string>
|
||||
<key>PATH_TYPE</key>
|
||||
<integer>0</integer>
|
||||
<key>PERMISSIONS</key>
|
||||
<integer>493</integer>
|
||||
<key>TYPE</key>
|
||||
<integer>1</integer>
|
||||
<key>UID</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CHILDREN</key>
|
||||
<array/>
|
||||
<key>GID</key>
|
||||
<integer>0</integer>
|
||||
<key>PATH</key>
|
||||
<string>PrivilegedHelperTools</string>
|
||||
<key>PATH_TYPE</key>
|
||||
<integer>0</integer>
|
||||
<key>PERMISSIONS</key>
|
||||
<integer>493</integer>
|
||||
<key>TYPE</key>
|
||||
<integer>1</integer>
|
||||
<key>UID</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CHILDREN</key>
|
||||
<array/>
|
||||
<key>GID</key>
|
||||
<integer>0</integer>
|
||||
<key>PATH</key>
|
||||
<string>QuickLook</string>
|
||||
<key>PATH_TYPE</key>
|
||||
<integer>0</integer>
|
||||
<key>PERMISSIONS</key>
|
||||
<integer>493</integer>
|
||||
<key>TYPE</key>
|
||||
<integer>1</integer>
|
||||
<key>UID</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CHILDREN</key>
|
||||
<array/>
|
||||
<key>GID</key>
|
||||
<integer>0</integer>
|
||||
<key>PATH</key>
|
||||
<string>QuickTime</string>
|
||||
<key>PATH_TYPE</key>
|
||||
<integer>0</integer>
|
||||
<key>PERMISSIONS</key>
|
||||
<integer>493</integer>
|
||||
<key>TYPE</key>
|
||||
<integer>1</integer>
|
||||
<key>UID</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CHILDREN</key>
|
||||
<array/>
|
||||
<key>GID</key>
|
||||
<integer>0</integer>
|
||||
<key>PATH</key>
|
||||
<string>Screen Savers</string>
|
||||
<key>PATH_TYPE</key>
|
||||
<integer>0</integer>
|
||||
<key>PERMISSIONS</key>
|
||||
<integer>493</integer>
|
||||
<key>TYPE</key>
|
||||
<integer>1</integer>
|
||||
<key>UID</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CHILDREN</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>CHILDREN</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>CHILDREN</key>
|
||||
<array/>
|
||||
<key>GID</key>
|
||||
<integer>0</integer>
|
||||
<key>PATH</key>
|
||||
<string>Library/ScriptingAdditions/SyncStateFinder.osax/Contents</string>
|
||||
<key>PATH_TYPE</key>
|
||||
<integer>3</integer>
|
||||
<key>PERMISSIONS</key>
|
||||
<integer>493</integer>
|
||||
<key>TYPE</key>
|
||||
<integer>3</integer>
|
||||
<key>UID</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
</array>
|
||||
<key>GID</key>
|
||||
<integer>0</integer>
|
||||
<key>PATH</key>
|
||||
<string>SyncStateFinder.osax</string>
|
||||
<key>PATH_TYPE</key>
|
||||
<integer>0</integer>
|
||||
<key>PERMISSIONS</key>
|
||||
<integer>493</integer>
|
||||
<key>TYPE</key>
|
||||
<integer>2</integer>
|
||||
<key>UID</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
</array>
|
||||
<key>GID</key>
|
||||
<integer>0</integer>
|
||||
<key>PATH</key>
|
||||
<string>ScriptingAdditions</string>
|
||||
<key>PATH_TYPE</key>
|
||||
<integer>0</integer>
|
||||
<key>PERMISSIONS</key>
|
||||
<integer>493</integer>
|
||||
<key>TYPE</key>
|
||||
<integer>2</integer>
|
||||
<key>UID</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CHILDREN</key>
|
||||
<array/>
|
||||
<key>GID</key>
|
||||
<integer>0</integer>
|
||||
<key>PATH</key>
|
||||
<string>Scripts</string>
|
||||
<key>PATH_TYPE</key>
|
||||
<integer>0</integer>
|
||||
<key>PERMISSIONS</key>
|
||||
<integer>493</integer>
|
||||
<key>TYPE</key>
|
||||
<integer>1</integer>
|
||||
<key>UID</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CHILDREN</key>
|
||||
<array/>
|
||||
<key>GID</key>
|
||||
<integer>0</integer>
|
||||
<key>PATH</key>
|
||||
<string>Services</string>
|
||||
<key>PATH_TYPE</key>
|
||||
<integer>0</integer>
|
||||
<key>PERMISSIONS</key>
|
||||
<integer>493</integer>
|
||||
<key>TYPE</key>
|
||||
<integer>1</integer>
|
||||
<key>UID</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CHILDREN</key>
|
||||
<array/>
|
||||
<key>GID</key>
|
||||
<integer>0</integer>
|
||||
<key>PATH</key>
|
||||
<string>Widgets</string>
|
||||
<key>PATH_TYPE</key>
|
||||
<integer>0</integer>
|
||||
<key>PERMISSIONS</key>
|
||||
<integer>493</integer>
|
||||
<key>TYPE</key>
|
||||
<integer>1</integer>
|
||||
<key>UID</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
</array>
|
||||
<key>GID</key>
|
||||
<integer>0</integer>
|
||||
<key>PATH</key>
|
||||
<string>Library</string>
|
||||
<key>PATH_TYPE</key>
|
||||
<integer>0</integer>
|
||||
<key>PERMISSIONS</key>
|
||||
<integer>493</integer>
|
||||
<key>TYPE</key>
|
||||
<integer>1</integer>
|
||||
<key>UID</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CHILDREN</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>CHILDREN</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>CHILDREN</key>
|
||||
<array/>
|
||||
<key>GID</key>
|
||||
<integer>0</integer>
|
||||
<key>PATH</key>
|
||||
<string>Extensions</string>
|
||||
<key>PATH_TYPE</key>
|
||||
<integer>0</integer>
|
||||
<key>PERMISSIONS</key>
|
||||
<integer>493</integer>
|
||||
<key>TYPE</key>
|
||||
<integer>1</integer>
|
||||
<key>UID</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
</array>
|
||||
<key>GID</key>
|
||||
<integer>0</integer>
|
||||
<key>PATH</key>
|
||||
<string>Library</string>
|
||||
<key>PATH_TYPE</key>
|
||||
<integer>0</integer>
|
||||
<key>PERMISSIONS</key>
|
||||
<integer>493</integer>
|
||||
<key>TYPE</key>
|
||||
<integer>1</integer>
|
||||
<key>UID</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
</array>
|
||||
<key>GID</key>
|
||||
<integer>0</integer>
|
||||
<key>PATH</key>
|
||||
<string>System</string>
|
||||
<key>PATH_TYPE</key>
|
||||
<integer>0</integer>
|
||||
<key>PERMISSIONS</key>
|
||||
<integer>493</integer>
|
||||
<key>TYPE</key>
|
||||
<integer>1</integer>
|
||||
<key>UID</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CHILDREN</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>CHILDREN</key>
|
||||
<array/>
|
||||
<key>GID</key>
|
||||
<integer>0</integer>
|
||||
<key>PATH</key>
|
||||
<string>Shared</string>
|
||||
<key>PATH_TYPE</key>
|
||||
<integer>0</integer>
|
||||
<key>PERMISSIONS</key>
|
||||
<integer>1023</integer>
|
||||
<key>TYPE</key>
|
||||
<integer>1</integer>
|
||||
<key>UID</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
</array>
|
||||
<key>GID</key>
|
||||
<integer>80</integer>
|
||||
<key>PATH</key>
|
||||
<string>Users</string>
|
||||
<key>PATH_TYPE</key>
|
||||
<integer>0</integer>
|
||||
<key>PERMISSIONS</key>
|
||||
<integer>493</integer>
|
||||
<key>TYPE</key>
|
||||
<integer>1</integer>
|
||||
<key>UID</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
</array>
|
||||
<key>GID</key>
|
||||
<integer>0</integer>
|
||||
<key>PATH</key>
|
||||
<string>/</string>
|
||||
<key>PATH_TYPE</key>
|
||||
<integer>0</integer>
|
||||
<key>PERMISSIONS</key>
|
||||
<integer>493</integer>
|
||||
<key>TYPE</key>
|
||||
<integer>1</integer>
|
||||
<key>UID</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<key>PAYLOAD_TYPE</key>
|
||||
<integer>0</integer>
|
||||
<key>VERSION</key>
|
||||
<integer>2</integer>
|
||||
</dict>
|
||||
<key>PACKAGE_SCRIPTS</key>
|
||||
<dict>
|
||||
<key>POSTINSTALL_PATH</key>
|
||||
<dict/>
|
||||
<key>PREINSTALL_PATH</key>
|
||||
<dict/>
|
||||
<key>RESOURCES</key>
|
||||
<array/>
|
||||
</dict>
|
||||
<key>PACKAGE_SETTINGS</key>
|
||||
<dict>
|
||||
<key>AUTHENTICATION</key>
|
||||
<integer>1</integer>
|
||||
<key>CONCLUSION_ACTION</key>
|
||||
<integer>0</integer>
|
||||
<key>IDENTIFIER</key>
|
||||
<string>com.ownCloud.finderPlugin</string>
|
||||
<key>LOCATION</key>
|
||||
<integer>0</integer>
|
||||
<key>NAME</key>
|
||||
<string>Legacy Finder Plugin (OS X 10.9 or older)</string>
|
||||
<key>OVERWRITE_PERMISSIONS</key>
|
||||
<false/>
|
||||
<key>VERSION</key>
|
||||
<string>@MIRALL_VERSION_FULL@</string>
|
||||
</dict>
|
||||
<key>TYPE</key>
|
||||
<integer>0</integer>
|
||||
<key>UUID</key>
|
||||
<string>39F61FCD-6EAA-4F3A-81C6-25E3F667DFB5</string>
|
||||
</dict>
|
||||
</array>
|
||||
<key>PROJECT</key>
|
||||
<dict>
|
||||
@@ -1168,56 +573,15 @@
|
||||
<key>UUID</key>
|
||||
<string>9647ADC0-BD53-4D7D-A561-73D383AACDE1</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>DESCRIPTION</key>
|
||||
<array/>
|
||||
<key>OPTIONS</key>
|
||||
<dict>
|
||||
<key>HIDDEN</key>
|
||||
<false/>
|
||||
<key>STATE</key>
|
||||
<integer>1</integer>
|
||||
</dict>
|
||||
<key>PACKAGE_UUID</key>
|
||||
<string>39F61FCD-6EAA-4F3A-81C6-25E3F667DFB5</string>
|
||||
<key>REQUIREMENTS</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>BEHAVIOR</key>
|
||||
<integer>1</integer>
|
||||
<key>DICTIONARY</key>
|
||||
<dict>
|
||||
<key>IC_REQUIREMENT_JAVASCRIPT_FUNCTION</key>
|
||||
<string>olderOsx</string>
|
||||
<key>IC_REQUIREMENT_JAVASCRIPT_PARAMETERS</key>
|
||||
<array/>
|
||||
</dict>
|
||||
<key>IDENTIFIER</key>
|
||||
<string>fr.whitebox.Packages.requirement.javascript</string>
|
||||
<key>MESSAGE</key>
|
||||
<array/>
|
||||
<key>NAME</key>
|
||||
<string>JavaScript</string>
|
||||
<key>STATE</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</array>
|
||||
<key>TITLE</key>
|
||||
<array/>
|
||||
<key>TOOLTIP</key>
|
||||
<array/>
|
||||
<key>TYPE</key>
|
||||
<integer>0</integer>
|
||||
<key>UUID</key>
|
||||
<string>1D2C47E0-5FD3-4623-B934-1347C66782D0</string>
|
||||
</dict>
|
||||
</array>
|
||||
<key>REMOVED</key>
|
||||
<dict/>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>INSTALLATION TYPE</key>
|
||||
<integer>0</integer>
|
||||
<integer>1</integer>
|
||||
<key>MODE</key>
|
||||
<integer>1</integer>
|
||||
</dict>
|
||||
<key>INSTALLATION_STEPS</key>
|
||||
<array>
|
||||
@@ -1310,7 +674,7 @@
|
||||
<key>LANGUAGE</key>
|
||||
<string>English</string>
|
||||
<key>VALUE</key>
|
||||
<string>@APPLICATION_NAME_XML_ESCAPED@</string>
|
||||
<string>@APPLICATION_NAME_XML_ESCAPED@ Client</string>
|
||||
</dict>
|
||||
</array>
|
||||
</dict>
|
||||
@@ -1337,7 +701,7 @@
|
||||
<key>BUILD_PATH</key>
|
||||
<dict>
|
||||
<key>PATH</key>
|
||||
<string>../install/.</string>
|
||||
<string>@CMAKE_INSTALL_PREFIX@/.</string>
|
||||
<key>PATH_TYPE</key>
|
||||
<integer>3</integer>
|
||||
</dict>
|
||||
@@ -1515,18 +879,6 @@
|
||||
<string>@CMAKE_INSTALL_DIR@</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>SHARED_GLOBAL_DATA</key>
|
||||
<dict>
|
||||
<key>IC_REQUIREMENT_JAVASCRIPT_SHARED_SOURCE_CODE</key>
|
||||
<string>
|
||||
function olderOsx() {
|
||||
if(system.compareVersions(system.version.ProductVersion, '10.10') == -1) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
</string>
|
||||
</dict>
|
||||
<key>TYPE</key>
|
||||
<integer>0</integer>
|
||||
<key>VERSION</key>
|
||||
|
||||
@@ -3,6 +3,4 @@
|
||||
# kill the old version. see issue #2044
|
||||
killall @APPLICATION_EXECUTABLE@
|
||||
|
||||
installer -pkg FUSE\ for\ macOS\ 3.8.1.pkg -target / -applyChoiceChangesXML settings.plist
|
||||
|
||||
exit 0
|
||||
|
||||
@@ -1,43 +0,0 @@
|
||||
# Find the FUSE includes and library
|
||||
#
|
||||
# Once done this will define
|
||||
# FUSE_FOUND - system has FUSE
|
||||
# FUSE_INCLUDE_DIR - the FUSE include directory
|
||||
# FUSE_LIBRARIES - List of libraries when using FUSE.
|
||||
#
|
||||
# Distributed under the OSI-approved BSD License (the "License");
|
||||
# see accompanying file Copyright.txt for details.
|
||||
#
|
||||
# This software is distributed WITHOUT ANY WARRANTY; without even the
|
||||
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See the License for more information.
|
||||
|
||||
# check if already in cache, be silent
|
||||
IF (FUSE_INCLUDE_DIR)
|
||||
SET (FUSE_FIND_QUIETLY TRUE)
|
||||
ENDIF (FUSE_INCLUDE_DIR)
|
||||
|
||||
# find includes
|
||||
FIND_PATH (FUSE_INCLUDE_DIR fuse.h
|
||||
/usr/local/include/osxfuse
|
||||
/usr/local/include
|
||||
/usr/include
|
||||
)
|
||||
|
||||
# find lib
|
||||
if (APPLE)
|
||||
SET(FUSE_NAMES libosxfuse.dylib fuse)
|
||||
else (APPLE)
|
||||
SET(FUSE_NAMES fuse)
|
||||
endif (APPLE)
|
||||
|
||||
FIND_LIBRARY(FUSE_LIBRARIES
|
||||
NAMES ${FUSE_NAMES}
|
||||
PATHS /lib64 /lib /usr/lib64 /usr/lib /usr/local/lib64 /usr/local/lib
|
||||
)
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
|
||||
find_package_handle_standard_args(FUSE DEFAULT_MSG FUSE_INCLUDE_DIR FUSE_LIBRARIES)
|
||||
mark_as_advanced(FUSE_INCLUDE_DIR FUSE_LIBRARIES)
|
||||
|
||||
19
doc/faq.rst
19
doc/faq.rst
@@ -21,6 +21,25 @@ When a deeply nested directory is excluded from synchronization it will be
|
||||
listed with other ignored files and directories in the "Not synced" tab of
|
||||
the "Activity" pane.
|
||||
|
||||
There Was A Warning About Changes In Synchronized Folders Not Being Tracked Reliably.
|
||||
-------------------------------------------------------------------------------------
|
||||
|
||||
On linux when the synchronized folder contains very many subfolders the
|
||||
operating system may not allow for enough inotify watches to monitor the
|
||||
changes in all of them.
|
||||
|
||||
In this case the client will not be able to immediately start the
|
||||
synchronization process when a file in one of the unmonitored folders changes.
|
||||
Instead, the client will show the warning and manually scan folders for changes
|
||||
in a regular interval (two hours by default).
|
||||
|
||||
This problem can be solved by setting the fs.inotify.max_user_watches
|
||||
sysctl to a higher value. This can usually be done either temporarily::
|
||||
|
||||
echo 524288 > /proc/sys/fs/inotify/max_user_watches
|
||||
|
||||
or permanently by adjusting ``/etc/sysctl.conf``.
|
||||
|
||||
I Want To Move My Local Sync Folder
|
||||
-----------------------------------
|
||||
|
||||
|
||||
@@ -24,7 +24,9 @@ The other options are:
|
||||
``--logflush``
|
||||
Clears (flushes) the log file after each write action.
|
||||
|
||||
``--logdebug``
|
||||
Also output debug-level messages in the log (equivalent to setting the env var QT_LOGGING_RULES="qt.*=true;*.debug=true").
|
||||
)
|
||||
|
||||
``--confdir`` `<dirname>`
|
||||
Uses the specified configuration directory.
|
||||
|
||||
|
||||
|
||||
865
dokanLib/dokan.h
865
dokanLib/dokan.h
@@ -1,865 +0,0 @@
|
||||
/*
|
||||
Dokan : user-mode file system library for Windows
|
||||
|
||||
Copyright (C) 2015 - 2018 Adrien J. <liryna.stark@gmail.com> and Maxime C. <maxime@islog.com>
|
||||
Copyright (C) 2007 - 2011 Hiroki Asakawa <info@dokan-dev.net>
|
||||
|
||||
http://dokan-dev.github.io
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU Lesser General Public License as published by the Free
|
||||
Software Foundation; either version 3 of the License, or (at your option) any
|
||||
later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License along
|
||||
with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef DOKAN_H_
|
||||
#define DOKAN_H_
|
||||
|
||||
/** Do not include NTSTATUS. Fix duplicate preprocessor definitions */
|
||||
#define WIN32_NO_STATUS
|
||||
#include <windows.h>
|
||||
#undef WIN32_NO_STATUS
|
||||
#include <ntstatus.h>
|
||||
|
||||
#include "fileinfo.h"
|
||||
#include "public.h"
|
||||
|
||||
#ifdef _EXPORTING
|
||||
/** Export dokan API see also dokan.def for export */
|
||||
#define DOKANAPI __stdcall
|
||||
#else
|
||||
/** Import dokan API */
|
||||
#define DOKANAPI __declspec(dllimport) __stdcall
|
||||
#endif
|
||||
|
||||
/** Change calling convention to standard call */
|
||||
#define DOKAN_CALLBACK __stdcall
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/** @file */
|
||||
|
||||
/**
|
||||
* \defgroup Dokan Dokan
|
||||
* \brief Dokan Library const and methods
|
||||
*/
|
||||
/** @{ */
|
||||
|
||||
/** The current Dokan version (ver 1.0.0). \ref DOKAN_OPTIONS.Version */
|
||||
#define DOKAN_VERSION 100
|
||||
/** Minimum Dokan version (ver 1.0.0) accepted. */
|
||||
#define DOKAN_MINIMUM_COMPATIBLE_VERSION 100
|
||||
/** Maximum number of dokan instances.*/
|
||||
#define DOKAN_MAX_INSTANCES 32
|
||||
/** Driver file name including the DOKAN_MAJOR_API_VERSION */
|
||||
#define DOKAN_DRIVER_NAME L"dokan" DOKAN_MAJOR_API_VERSION L".sys"
|
||||
/** Network provider name including the DOKAN_MAJOR_API_VERSION */
|
||||
#define DOKAN_NP_NAME L"Dokan" DOKAN_MAJOR_API_VERSION
|
||||
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
* \defgroup DOKAN_OPTION DOKAN_OPTION
|
||||
* \brief All DOKAN_OPTION flags used in DOKAN_OPTIONS.Options
|
||||
* \see DOKAN_FILE_INFO
|
||||
*/
|
||||
/** @{ */
|
||||
|
||||
/** Enable ouput debug message */
|
||||
#define DOKAN_OPTION_DEBUG 1
|
||||
/** Enable ouput debug message to stderr */
|
||||
#define DOKAN_OPTION_STDERR 2
|
||||
/** Use alternate stream */
|
||||
#define DOKAN_OPTION_ALT_STREAM 4
|
||||
/** Enable mount drive as write-protected */
|
||||
#define DOKAN_OPTION_WRITE_PROTECT 8
|
||||
/** Use network drive - Dokan network provider needs to be installed */
|
||||
#define DOKAN_OPTION_NETWORK 16
|
||||
/** Use removable drive */
|
||||
#define DOKAN_OPTION_REMOVABLE 32
|
||||
/** Use mount manager */
|
||||
#define DOKAN_OPTION_MOUNT_MANAGER 64
|
||||
/** Mount the drive on current session only */
|
||||
#define DOKAN_OPTION_CURRENT_SESSION 128
|
||||
/** Enable Lockfile/Unlockfile operations. Otherwise Dokan will take care of it */
|
||||
#define DOKAN_OPTION_FILELOCK_USER_MODE 256
|
||||
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
* \struct DOKAN_OPTIONS
|
||||
* \brief Dokan mount options used to describe Dokan device behavior.
|
||||
* \see DokanMain
|
||||
*/
|
||||
typedef struct _DOKAN_OPTIONS {
|
||||
/** Version of the Dokan features requested (version "123" is equal to Dokan version 1.2.3). */
|
||||
USHORT Version;
|
||||
/** Number of threads to be used internally by Dokan library. More threads will handle more events at the same time. */
|
||||
USHORT ThreadCount;
|
||||
/** Features enabled for the mount. See \ref DOKAN_OPTION. */
|
||||
ULONG Options;
|
||||
/** FileSystem can store anything here. */
|
||||
ULONG64 GlobalContext;
|
||||
/** Mount point. Can be "M:\" (drive letter) or "C:\mount\dokan" (path in NTFS). */
|
||||
LPCWSTR MountPoint;
|
||||
/**
|
||||
* UNC Name for the Network Redirector
|
||||
* \see <a href="https://msdn.microsoft.com/en-us/library/windows/hardware/ff556761(v=vs.85).aspx">Support for UNC Naming</a>
|
||||
*/
|
||||
LPCWSTR UNCName;
|
||||
/** Max timeout in milliseconds of each request before Dokan gives up. */
|
||||
ULONG Timeout;
|
||||
/** Allocation Unit Size of the volume. This will affect the file size. */
|
||||
ULONG AllocationUnitSize;
|
||||
/** Sector Size of the volume. This will affect the file size. */
|
||||
ULONG SectorSize;
|
||||
} DOKAN_OPTIONS, *PDOKAN_OPTIONS;
|
||||
|
||||
/**
|
||||
* \struct DOKAN_FILE_INFO
|
||||
* \brief Dokan file information on the current operation.
|
||||
*/
|
||||
typedef struct _DOKAN_FILE_INFO {
|
||||
/**
|
||||
* Context that can be used to carry information between operations.
|
||||
* The context can carry whatever type like \c HANDLE, struct, int,
|
||||
* internal reference that will help the implementation understand the request context of the event.
|
||||
*/
|
||||
ULONG64 Context;
|
||||
/** Reserved. Used internally by Dokan library. Never modify. */
|
||||
ULONG64 DokanContext;
|
||||
/** A pointer to DOKAN_OPTIONS which was passed to DokanMain. */
|
||||
PDOKAN_OPTIONS DokanOptions;
|
||||
/**
|
||||
* Process ID for the thread that originally requested a given I/O operation.
|
||||
*/
|
||||
ULONG ProcessId;
|
||||
/**
|
||||
* Requesting a directory file.
|
||||
* Must be set in \ref DOKAN_OPERATIONS.ZwCreateFile if the file appears to be a folder.
|
||||
*/
|
||||
UCHAR IsDirectory;
|
||||
/** Flag if the file has to be deleted during DOKAN_OPERATIONS. Cleanup event. */
|
||||
UCHAR DeleteOnClose;
|
||||
/** Read or write is paging IO. */
|
||||
UCHAR PagingIo;
|
||||
/** Read or write is synchronous IO. */
|
||||
UCHAR SynchronousIo;
|
||||
/** Read or write directly from data source without cache */
|
||||
UCHAR Nocache;
|
||||
/** If \c TRUE, write to the current end of file instead of using the Offset parameter. */
|
||||
UCHAR WriteToEndOfFile;
|
||||
} DOKAN_FILE_INFO, *PDOKAN_FILE_INFO;
|
||||
|
||||
/**
|
||||
* \brief FillFindData Used to add an entry in FindFiles operation
|
||||
* \return 1 if buffer is full, otherwise 0 (currently it never returns 1)
|
||||
*/
|
||||
typedef int(WINAPI *PFillFindData)(PWIN32_FIND_DATAW, PDOKAN_FILE_INFO);
|
||||
|
||||
/**
|
||||
* \brief FillFindStreamData Used to add an entry in FindStreams
|
||||
* \return 1 if buffer is full, otherwise 0 (currently it never returns 1)
|
||||
*/
|
||||
typedef int(WINAPI *PFillFindStreamData)(PWIN32_FIND_STREAM_DATA,
|
||||
PDOKAN_FILE_INFO);
|
||||
|
||||
// clang-format off
|
||||
|
||||
/**
|
||||
* \struct DOKAN_OPERATIONS
|
||||
* \brief Dokan API callbacks interface
|
||||
*
|
||||
* DOKAN_OPERATIONS is a struct of callbacks that describe all Dokan API operations
|
||||
* that will be called when Windows access to the filesystem.
|
||||
*
|
||||
* If an error occurs, return NTSTATUS (https://support.microsoft.com/en-us/kb/113996).
|
||||
* Win32 Error can be converted to \c NTSTATUS with \ref DokanNtStatusFromWin32
|
||||
*
|
||||
* All callbacks can be set to \c NULL or return \c STATUS_NOT_IMPLEMENTED
|
||||
* if supporting one of them is not desired. Be aware that returning such values to important callbacks
|
||||
* such as DOKAN_OPERATIONS.ZwCreateFile / DOKAN_OPERATIONS.ReadFile / ... would make the filesystem not work or become unstable.
|
||||
*/
|
||||
typedef struct _DOKAN_OPERATIONS {
|
||||
/**
|
||||
* \brief CreateFile Dokan API callback
|
||||
*
|
||||
* CreateFile is called each time a request is made on a file system object.
|
||||
*
|
||||
* In case \c OPEN_ALWAYS & \c CREATE_ALWAYS are successfully opening an
|
||||
* existing file, \c STATUS_OBJECT_NAME_COLLISION should be returned instead of \c STATUS_SUCCESS .
|
||||
* This will inform Dokan that the file has been opened and not created during the request.
|
||||
*
|
||||
* If the file is a directory, CreateFile is also called.
|
||||
* In this case, CreateFile should return \c STATUS_SUCCESS when that directory
|
||||
* can be opened and DOKAN_FILE_INFO.IsDirectory has to be set to \c TRUE.
|
||||
* On the other hand, if DOKAN_FILE_INFO.IsDirectory is set to \c TRUE
|
||||
* but the path targets a file, \c STATUS_NOT_A_DIRECTORY must be returned.
|
||||
*
|
||||
* DOKAN_FILE_INFO.Context can be used to store Data (like \c HANDLE)
|
||||
* that can be retrieved in all other requests related to the Context.
|
||||
* To avoid memory leak, Context needs to be released in DOKAN_OPERATIONS.Cleanup.
|
||||
*
|
||||
* \param FileName File path requested by the Kernel on the FileSystem.
|
||||
* \param SecurityContext SecurityContext, see https://msdn.microsoft.com/en-us/library/windows/hardware/ff550613(v=vs.85).aspx
|
||||
* \param DesiredAccess Specifies an <a href="https://msdn.microsoft.com/en-us/library/windows/hardware/ff540466(v=vs.85).aspx">ACCESS_MASK</a> value that determines the requested access to the object.
|
||||
* \param FileAttributes Specifies one or more FILE_ATTRIBUTE_XXX flags, which represent the file attributes to set if a file is created or overwritten.
|
||||
* \param ShareAccess Type of share access, which is specified as zero or any combination of FILE_SHARE_* flags.
|
||||
* \param CreateDisposition Specifies the action to perform if the file does or does not exist.
|
||||
* \param CreateOptions Specifies the options to apply when the driver creates or opens the file.
|
||||
* \param DokanFileInfo Information about the file or directory.
|
||||
* \return \c STATUS_SUCCESS on success or NTSTATUS appropriate to the request result.
|
||||
* \see <a href="https://msdn.microsoft.com/en-us/library/windows/hardware/ff566424(v=vs.85).aspx">See ZwCreateFile for more information about the parameters of this callback (MSDN).</a>
|
||||
* \see DokanMapKernelToUserCreateFileFlags
|
||||
*/
|
||||
NTSTATUS(DOKAN_CALLBACK *ZwCreateFile)(LPCWSTR FileName,
|
||||
PDOKAN_IO_SECURITY_CONTEXT SecurityContext,
|
||||
ACCESS_MASK DesiredAccess,
|
||||
ULONG FileAttributes,
|
||||
ULONG ShareAccess,
|
||||
ULONG CreateDisposition,
|
||||
ULONG CreateOptions,
|
||||
PDOKAN_FILE_INFO DokanFileInfo);
|
||||
|
||||
/**
|
||||
* \brief Cleanup Dokan API callback
|
||||
*
|
||||
* Cleanup request before \ref CloseFile is called.
|
||||
*
|
||||
* When DOKAN_FILE_INFO.DeleteOnClose is \c TRUE, the file in Cleanup must be deleted.
|
||||
* See DeleteFile documentation for explanation.
|
||||
*
|
||||
* \param FileName File path requested by the Kernel on the FileSystem.
|
||||
* \param DokanFileInfo Information about the file or directory.
|
||||
* \see DeleteFile
|
||||
* \see DeleteDirectory
|
||||
*/
|
||||
void(DOKAN_CALLBACK *Cleanup)(LPCWSTR FileName,
|
||||
PDOKAN_FILE_INFO DokanFileInfo);
|
||||
|
||||
/**
|
||||
* \brief CloseFile Dokan API callback
|
||||
*
|
||||
* Clean remaining Context
|
||||
*
|
||||
* CloseFile is called at the end of the life of the context.
|
||||
* Anything remaining in \ref DOKAN_FILE_INFO.Context must be cleared before returning.
|
||||
*
|
||||
* \param FileName File path requested by the Kernel on the FileSystem.
|
||||
* \param DokanFileInfo Information about the file or directory.
|
||||
*/
|
||||
void(DOKAN_CALLBACK *CloseFile)(LPCWSTR FileName,
|
||||
PDOKAN_FILE_INFO DokanFileInfo);
|
||||
|
||||
/**
|
||||
* \brief ReadFile Dokan API callback
|
||||
*
|
||||
* ReadFile callback on the file previously opened in DOKAN_OPERATIONS.ZwCreateFile.
|
||||
* It can be called by different threads at the same time, so the read/context has to be thread safe.
|
||||
*
|
||||
* \param FileName File path requested by the Kernel on the FileSystem.
|
||||
* \param Buffer Read buffer that has to be filled with the read result.
|
||||
* \param BufferLength Buffer length and read size to continue with.
|
||||
* \param ReadLength Total data size that has been read.
|
||||
* \param Offset Offset from where the read has to be continued.
|
||||
* \param DokanFileInfo Information about the file or directory.
|
||||
* \return \c STATUS_SUCCESS on success or NTSTATUS appropriate to the request result.
|
||||
* \see WriteFile
|
||||
*/
|
||||
NTSTATUS(DOKAN_CALLBACK *ReadFile)(LPCWSTR FileName,
|
||||
LPVOID Buffer,
|
||||
DWORD BufferLength,
|
||||
LPDWORD ReadLength,
|
||||
LONGLONG Offset,
|
||||
PDOKAN_FILE_INFO DokanFileInfo);
|
||||
|
||||
/**
|
||||
* \brief WriteFile Dokan API callback
|
||||
*
|
||||
* WriteFile callback on the file previously opened in DOKAN_OPERATIONS.ZwCreateFile
|
||||
* It can be called by different threads at the same time, sp the write/context has to be thread safe.
|
||||
*
|
||||
* \param FileName File path requested by the Kernel on the FileSystem.
|
||||
* \param Buffer Data that has to be written.
|
||||
* \param NumberOfBytesToWrite Buffer length and write size to continue with.
|
||||
* \param NumberOfBytesWritten Total number of bytes that have been written.
|
||||
* \param Offset Offset from where the write has to be continued.
|
||||
* \param DokanFileInfo Information about the file or directory.
|
||||
* \return \c STATUS_SUCCESS on success or NTSTATUS appropriate to the request result.
|
||||
* \see ReadFile
|
||||
*/
|
||||
NTSTATUS(DOKAN_CALLBACK *WriteFile)(LPCWSTR FileName,
|
||||
LPCVOID Buffer,
|
||||
DWORD NumberOfBytesToWrite,
|
||||
LPDWORD NumberOfBytesWritten,
|
||||
LONGLONG Offset,
|
||||
PDOKAN_FILE_INFO DokanFileInfo);
|
||||
|
||||
/**
|
||||
* \brief FlushFileBuffers Dokan API callback
|
||||
*
|
||||
* Clears buffers for this context and causes any buffered data to be written to the file.
|
||||
*
|
||||
* \param FileName File path requested by the Kernel on the FileSystem.
|
||||
* \param DokanFileInfo Information about the file or directory.
|
||||
* \return \c STATUS_SUCCESS on success or NTSTATUS appropriate to the request result.
|
||||
*/
|
||||
NTSTATUS(DOKAN_CALLBACK *FlushFileBuffers)(LPCWSTR FileName,
|
||||
PDOKAN_FILE_INFO DokanFileInfo);
|
||||
|
||||
/**
|
||||
* \brief GetFileInformation Dokan API callback
|
||||
*
|
||||
* Get specific information on a file.
|
||||
*
|
||||
* \param FileName File path requested by the Kernel on the FileSystem.
|
||||
* \param Buffer BY_HANDLE_FILE_INFORMATION struct to fill.
|
||||
* \param DokanFileInfo Information about the file or directory.
|
||||
* \return \c STATUS_SUCCESS on success or NTSTATUS appropriate to the request result.
|
||||
*/
|
||||
NTSTATUS(DOKAN_CALLBACK *GetFileInformation)(LPCWSTR FileName,
|
||||
LPBY_HANDLE_FILE_INFORMATION Buffer,
|
||||
PDOKAN_FILE_INFO DokanFileInfo);
|
||||
|
||||
/**
|
||||
* \brief FindFiles Dokan API callback
|
||||
*
|
||||
* List all files in the requested path
|
||||
* \ref DOKAN_OPERATIONS.FindFilesWithPattern is checked first. If it is not implemented or
|
||||
* returns \c STATUS_NOT_IMPLEMENTED, then FindFiles is called, if implemented.
|
||||
*
|
||||
* \param FileName File path requested by the Kernel on the FileSystem.
|
||||
* \param FillFindData Callback that has to be called with PWIN32_FIND_DATAW that contain file information.
|
||||
* \param DokanFileInfo Information about the file or directory.
|
||||
* \return \c STATUS_SUCCESS on success or NTSTATUS appropriate to the request result.
|
||||
* \see FindFilesWithPattern
|
||||
*/
|
||||
NTSTATUS(DOKAN_CALLBACK *FindFiles)(LPCWSTR FileName,
|
||||
PFillFindData FillFindData,
|
||||
PDOKAN_FILE_INFO DokanFileInfo);
|
||||
|
||||
/**
|
||||
* \brief FindFilesWithPattern Dokan API callback
|
||||
*
|
||||
* Same as \ref DOKAN_OPERATIONS.FindFiles but with a search pattern.
|
||||
*
|
||||
* \param PathName Path requested by the Kernel on the FileSystem.
|
||||
* \param SearchPattern Search pattern.
|
||||
* \param FillFindData Callback that has to be called with PWIN32_FIND_DATAW that contains file information.
|
||||
* \param DokanFileInfo Information about the file or directory.
|
||||
* \return \c STATUS_SUCCESS on success or NTSTATUS appropriate to the request result.
|
||||
* \see FindFiles
|
||||
*/
|
||||
NTSTATUS(DOKAN_CALLBACK *FindFilesWithPattern)(LPCWSTR PathName,
|
||||
LPCWSTR SearchPattern,
|
||||
PFillFindData FillFindData,
|
||||
PDOKAN_FILE_INFO DokanFileInfo);
|
||||
|
||||
/**
|
||||
* \brief SetFileAttributes Dokan API callback
|
||||
*
|
||||
* Set file attributes on a specific file
|
||||
*
|
||||
* \param FileName File path requested by the Kernel on the FileSystem.
|
||||
* \param FileAttributes FileAttributes to set on file.
|
||||
* \param DokanFileInfo Information about the file or directory.
|
||||
* \return \c STATUS_SUCCESS on success or NTSTATUS appropriate to the request result.
|
||||
*/
|
||||
NTSTATUS(DOKAN_CALLBACK *SetFileAttributes)(LPCWSTR FileName,
|
||||
DWORD FileAttributes,
|
||||
PDOKAN_FILE_INFO DokanFileInfo);
|
||||
|
||||
/**
|
||||
* \brief SetFileTime Dokan API callback
|
||||
*
|
||||
* Set file attributes on a specific file
|
||||
*
|
||||
* \param FileName File path requested by the Kernel on the FileSystem.
|
||||
* \param CreationTime Creation FILETIME.
|
||||
* \param LastAccessTime LastAccess FILETIME.
|
||||
* \param LastWriteTime LastWrite FILETIME.
|
||||
* \param DokanFileInfo Information about the file or directory.
|
||||
* \return \c STATUS_SUCCESS on success or NTSTATUS appropriate to the request result.
|
||||
*/
|
||||
NTSTATUS(DOKAN_CALLBACK *SetFileTime)(LPCWSTR FileName,
|
||||
CONST FILETIME *CreationTime,
|
||||
CONST FILETIME *LastAccessTime,
|
||||
CONST FILETIME *LastWriteTime,
|
||||
PDOKAN_FILE_INFO DokanFileInfo);
|
||||
|
||||
/**
|
||||
* \brief DeleteFile Dokan API callback
|
||||
*
|
||||
* Check if it is possible to delete a file.
|
||||
*
|
||||
* DeleteFile will also be called with DOKAN_FILE_INFO.DeleteOnClose set to \c FALSE
|
||||
* to notify the driver when the file is no longer requested to be deleted.
|
||||
*
|
||||
* The file in DeleteFile should not be deleted, but instead the file
|
||||
* must be checked as to whether or not it can be deleted,
|
||||
* and \c STATUS_SUCCESS should be returned (when it can be deleted) or
|
||||
* appropriate error codes, such as \c STATUS_ACCESS_DENIED or
|
||||
* \c STATUS_OBJECT_NAME_NOT_FOUND, should be returned.
|
||||
*
|
||||
* When \c STATUS_SUCCESS is returned, a Cleanup call is received afterwards with
|
||||
* DOKAN_FILE_INFO.DeleteOnClose set to \c TRUE. Only then must the closing file
|
||||
* be deleted.
|
||||
*
|
||||
* \param FileName File path requested by the Kernel on the FileSystem.
|
||||
* \param DokanFileInfo Information about the file or directory.
|
||||
* \return \c STATUS_SUCCESS on success or NTSTATUS appropriate to the request result.
|
||||
* \see DeleteDirectory
|
||||
* \see Cleanup
|
||||
*/
|
||||
NTSTATUS(DOKAN_CALLBACK *DeleteFile)(LPCWSTR FileName,
|
||||
PDOKAN_FILE_INFO DokanFileInfo);
|
||||
|
||||
/**
|
||||
* \brief DeleteDirectory Dokan API callback
|
||||
*
|
||||
* Check if it is possible to delete a directory.
|
||||
*
|
||||
* DeleteDirectory will also be called with DOKAN_FILE_INFO.DeleteOnClose set to \c FALSE
|
||||
* to notify the driver when the file is no longer requested to be deleted.
|
||||
*
|
||||
* The Directory in DeleteDirectory should not be deleted, but instead
|
||||
* must be checked as to whether or not it can be deleted,
|
||||
* and \c STATUS_SUCCESS should be returned (when it can be deleted) or
|
||||
* appropriate error codes, such as \c STATUS_ACCESS_DENIED,
|
||||
* \c STATUS_OBJECT_PATH_NOT_FOUND, or \c STATUS_DIRECTORY_NOT_EMPTY, should
|
||||
* be returned.
|
||||
*
|
||||
* When \c STATUS_SUCCESS is returned, a Cleanup call is received afterwards with
|
||||
* DOKAN_FILE_INFO.DeleteOnClose set to \c TRUE. Only then must the closing file
|
||||
* be deleted.
|
||||
*
|
||||
* \param FileName File path requested by the Kernel on the FileSystem.
|
||||
* \param DokanFileInfo Information about the file or directory.
|
||||
* \return \c STATUS_SUCCESS on success or \c NTSTATUS appropriate to the request result.
|
||||
* \ref DeleteFile
|
||||
* \ref Cleanup
|
||||
*/
|
||||
NTSTATUS(DOKAN_CALLBACK *DeleteDirectory)(LPCWSTR FileName,
|
||||
PDOKAN_FILE_INFO DokanFileInfo);
|
||||
|
||||
/**
|
||||
* \brief MoveFile Dokan API callback
|
||||
*
|
||||
* Move a file or directory to a new destination
|
||||
*
|
||||
* \param FileName Path for the file to be moved.
|
||||
* \param NewFileName Path for the new location of the file.
|
||||
* \param ReplaceIfExisting If destination already exists, can it be replaced?
|
||||
* \param DokanFileInfo Information about the file or directory.
|
||||
* \return \c STATUS_SUCCESS on success or NTSTATUS appropriate to the request result.
|
||||
*/
|
||||
NTSTATUS(DOKAN_CALLBACK *MoveFile)(LPCWSTR FileName,
|
||||
LPCWSTR NewFileName,
|
||||
BOOL ReplaceIfExisting,
|
||||
PDOKAN_FILE_INFO DokanFileInfo);
|
||||
|
||||
/**
|
||||
* \brief SetEndOfFile Dokan API callback
|
||||
*
|
||||
* SetEndOfFile is used to truncate or extend a file (physical file size).
|
||||
*
|
||||
* \param FileName File path requested by the Kernel on the FileSystem.
|
||||
* \param ByteOffset File length to set.
|
||||
* \param DokanFileInfo Information about the file or directory.
|
||||
* \return \c STATUS_SUCCESS on success or NTSTATUS appropriate to the request result.
|
||||
*/
|
||||
NTSTATUS(DOKAN_CALLBACK *SetEndOfFile)(LPCWSTR FileName,
|
||||
LONGLONG ByteOffset,
|
||||
PDOKAN_FILE_INFO DokanFileInfo);
|
||||
|
||||
/**
|
||||
* \brief SetAllocationSize Dokan API callback
|
||||
*
|
||||
* SetAllocationSize is used to truncate or extend a file.
|
||||
*
|
||||
* \param FileName File path requested by the Kernel on the FileSystem.
|
||||
* \param AllocSize File length to set.
|
||||
* \param DokanFileInfo Information about the file or directory.
|
||||
* \return \c STATUS_SUCCESS on success or NTSTATUS appropriate to the request result.
|
||||
*/
|
||||
NTSTATUS(DOKAN_CALLBACK *SetAllocationSize)(LPCWSTR FileName,
|
||||
LONGLONG AllocSize,
|
||||
PDOKAN_FILE_INFO DokanFileInfo);
|
||||
|
||||
/**
|
||||
* \brief LockFile Dokan API callback
|
||||
*
|
||||
* Lock file at a specific offset and data length.
|
||||
* This is only used if \ref DOKAN_OPTION_FILELOCK_USER_MODE is enabled.
|
||||
*
|
||||
* \param FileName File path requested by the Kernel on the FileSystem.
|
||||
* \param ByteOffset Offset from where the lock has to be continued.
|
||||
* \param Length Data length to lock.
|
||||
* \param DokanFileInfo Information about the file or directory.
|
||||
* \return \c STATUS_SUCCESS on success or NTSTATUS appropriate to the request result.
|
||||
* \see UnlockFile
|
||||
*/
|
||||
NTSTATUS(DOKAN_CALLBACK *LockFile)(LPCWSTR FileName,
|
||||
LONGLONG ByteOffset,
|
||||
LONGLONG Length,
|
||||
PDOKAN_FILE_INFO DokanFileInfo);
|
||||
|
||||
/**
|
||||
* \brief UnlockFile Dokan API callback
|
||||
*
|
||||
* Unlock file at a specific offset and data length.
|
||||
* This is only used if \ref DOKAN_OPTION_FILELOCK_USER_MODE is enabled.
|
||||
*
|
||||
* \param FileName File path requested by the Kernel on the FileSystem.
|
||||
* \param ByteOffset Offset from where the lock has to be continued.
|
||||
* \param Length Data length to lock.
|
||||
* \param DokanFileInfo Information about the file or directory.
|
||||
* \return \c STATUS_SUCCESS on success or NTSTATUS appropriate to the request result.
|
||||
* \see LockFile
|
||||
*/
|
||||
NTSTATUS(DOKAN_CALLBACK *UnlockFile)(LPCWSTR FileName,
|
||||
LONGLONG ByteOffset,
|
||||
LONGLONG Length,
|
||||
PDOKAN_FILE_INFO DokanFileInfo);
|
||||
|
||||
/**
|
||||
* \brief GetDiskFreeSpace Dokan API callback
|
||||
*
|
||||
* Retrieves information about the amount of space that is available on a disk volume.
|
||||
* It consits of the total amount of space, the total amount of free space, and
|
||||
* the total amount of free space available to the user that is associated with the calling thread.
|
||||
*
|
||||
* Neither GetDiskFreeSpace nor \ref GetVolumeInformation
|
||||
* save the DOKAN_FILE_INFO.Context.
|
||||
* Before these methods are called, \ref ZwCreateFile may not be called.
|
||||
* (ditto \ref CloseFile and \ref Cleanup)
|
||||
*
|
||||
* \param FreeBytesAvailable Amount of available space.
|
||||
* \param TotalNumberOfBytes Total size of storage space
|
||||
* \param TotalNumberOfFreeBytes Amount of free space
|
||||
* \param DokanFileInfo Information about the file or directory.
|
||||
* \return \c STATUS_SUCCESS on success or \c NTSTATUS appropriate to the request result.
|
||||
* \see <a href="https://msdn.microsoft.com/en-us/library/windows/desktop/aa364937(v=vs.85).aspx"> GetDiskFreeSpaceEx function (MSDN)</a>
|
||||
* \see GetVolumeInformation
|
||||
*/
|
||||
NTSTATUS(DOKAN_CALLBACK *GetDiskFreeSpace)(PULONGLONG FreeBytesAvailable,
|
||||
PULONGLONG TotalNumberOfBytes,
|
||||
PULONGLONG TotalNumberOfFreeBytes,
|
||||
PDOKAN_FILE_INFO DokanFileInfo);
|
||||
|
||||
/**
|
||||
* \brief GetVolumeInformation Dokan API callback
|
||||
*
|
||||
* Retrieves information about the file system and volume associated with the specified root directory.
|
||||
*
|
||||
* Neither GetVolumeInformation nor GetDiskFreeSpace
|
||||
* save the \ref DOKAN_FILE_INFO#Context.
|
||||
* Before these methods are called, \ref ZwCreateFile may not be called.
|
||||
* (ditto \ref CloseFile and \ref Cleanup)
|
||||
*
|
||||
* FileSystemName could be anything up to 10 characters.
|
||||
* But Windows check few feature availability based on file system name.
|
||||
* For this, it is recommended to set NTFS or FAT here.
|
||||
*
|
||||
* \c FILE_READ_ONLY_VOLUME is automatically added to the
|
||||
* FileSystemFlags if \ref DOKAN_OPTION_WRITE_PROTECT was
|
||||
* specified in DOKAN_OPTIONS when the volume was mounted.
|
||||
*
|
||||
* \param VolumeNameBuffer A pointer to a buffer that receives the name of a specified volume.
|
||||
* \param VolumeNameSize The length of a volume name buffer.
|
||||
* \param VolumeSerialNumber A pointer to a variable that receives the volume serial number.
|
||||
* \param MaximumComponentLength A pointer to a variable that receives the maximum length.
|
||||
* \param FileSystemFlags A pointer to a variable that receives flags associated with the specified file system.
|
||||
* \param FileSystemNameBuffer A pointer to a buffer that receives the name of the file system.
|
||||
* \param FileSystemNameSize The length of the file system name buffer.
|
||||
* \param DokanFileInfo Information about the file or directory.
|
||||
* \return \c STATUS_SUCCESS on success or NTSTATUS appropriate to the request result.
|
||||
* \see <a href="https://msdn.microsoft.com/en-us/library/windows/desktop/aa364993(v=vs.85).aspx"> GetVolumeInformation function (MSDN)</a>
|
||||
* \see GetDiskFreeSpace
|
||||
*/
|
||||
NTSTATUS(DOKAN_CALLBACK *GetVolumeInformation)(LPWSTR VolumeNameBuffer,
|
||||
DWORD VolumeNameSize,
|
||||
LPDWORD VolumeSerialNumber,
|
||||
LPDWORD MaximumComponentLength,
|
||||
LPDWORD FileSystemFlags,
|
||||
LPWSTR FileSystemNameBuffer,
|
||||
DWORD FileSystemNameSize,
|
||||
PDOKAN_FILE_INFO DokanFileInfo);
|
||||
|
||||
/**
|
||||
* \brief Mounted Dokan API callback
|
||||
*
|
||||
* Called when Dokan successfully mounts the volume.
|
||||
*
|
||||
* \param DokanFileInfo Information about the file or directory.
|
||||
* \return \c STATUS_SUCCESS on success or NTSTATUS appropriate to the request result.
|
||||
* \see Unmounted
|
||||
*/
|
||||
NTSTATUS(DOKAN_CALLBACK *Mounted)(PDOKAN_FILE_INFO DokanFileInfo);
|
||||
|
||||
/**
|
||||
* \brief Unmounted Dokan API callback
|
||||
*
|
||||
* Called when Dokan is unmounting the volume.
|
||||
*
|
||||
* \param DokanFileInfo Information about the file or directory.
|
||||
* \return \c STATUS_SUCCESS on success or \c NTSTATUS appropriate to the request result.
|
||||
* \see Unmounted
|
||||
*/
|
||||
NTSTATUS(DOKAN_CALLBACK *Unmounted)(PDOKAN_FILE_INFO DokanFileInfo);
|
||||
|
||||
/**
|
||||
* \brief GetFileSecurity Dokan API callback
|
||||
*
|
||||
* Get specified information about the security of a file or directory.
|
||||
*
|
||||
* Return \c STATUS_NOT_IMPLEMENTED to let dokan library build a sddl of the current process user with authenticate user rights for context menu.
|
||||
* Return \c STATUS_BUFFER_OVERFLOW if buffer size is too small.
|
||||
*
|
||||
* \since Supported since version 0.6.0. The version must be specified in \ref DOKAN_OPTIONS.Version.
|
||||
* \param FileName File path requested by the Kernel on the FileSystem.
|
||||
* \param SecurityInformation A SECURITY_INFORMATION value that identifies the security information being requested.
|
||||
* \param SecurityDescriptor A pointer to a buffer that receives a copy of the security descriptor of the requested file.
|
||||
* \param BufferLength Specifies the size, in bytes, of the buffer.
|
||||
* \param LengthNeeded A pointer to the variable that receives the number of bytes necessary to store the complete security descriptor.
|
||||
* \param DokanFileInfo Information about the file or directory.
|
||||
* \return \c STATUS_SUCCESS on success or NTSTATUS appropriate to the request result.
|
||||
* \see SetFileSecurity
|
||||
* \see <a href="https://msdn.microsoft.com/en-us/library/windows/desktop/aa446639(v=vs.85).aspx">GetFileSecurity function (MSDN)</a>
|
||||
*/
|
||||
NTSTATUS(DOKAN_CALLBACK *GetFileSecurity)(LPCWSTR FileName,
|
||||
PSECURITY_INFORMATION SecurityInformation,
|
||||
PSECURITY_DESCRIPTOR SecurityDescriptor,
|
||||
ULONG BufferLength,
|
||||
PULONG LengthNeeded,
|
||||
PDOKAN_FILE_INFO DokanFileInfo);
|
||||
|
||||
/**
|
||||
* \brief SetFileSecurity Dokan API callback
|
||||
*
|
||||
* Sets the security of a file or directory object.
|
||||
*
|
||||
* \since Supported since version 0.6.0. The version must be specified in \ref DOKAN_OPTIONS.Version.
|
||||
* \param FileName File path requested by the Kernel on the FileSystem.
|
||||
* \param SecurityInformation Structure that identifies the contents of the security descriptor pointed by \a SecurityDescriptor param.
|
||||
* \param SecurityDescriptor A pointer to a SECURITY_DESCRIPTOR structure.
|
||||
* \param BufferLength Specifies the size, in bytes, of the buffer.
|
||||
* \param DokanFileInfo Information about the file or directory.
|
||||
* \return \c STATUS_SUCCESS on success or NTSTATUS appropriate to the request result.
|
||||
* \see GetFileSecurity
|
||||
* \see <a href="https://msdn.microsoft.com/en-us/library/windows/desktop/aa379577(v=vs.85).aspx">SetFileSecurity function (MSDN)</a>
|
||||
*/
|
||||
NTSTATUS(DOKAN_CALLBACK *SetFileSecurity)(LPCWSTR FileName,
|
||||
PSECURITY_INFORMATION SecurityInformation,
|
||||
PSECURITY_DESCRIPTOR SecurityDescriptor,
|
||||
ULONG BufferLength,
|
||||
PDOKAN_FILE_INFO DokanFileInfo);
|
||||
|
||||
/**
|
||||
* \brief FindStreams Dokan API callback
|
||||
*
|
||||
* Retrieve all NTFS Streams informations on the file.
|
||||
* This is only called if \ref DOKAN_OPTION_ALT_STREAM is enabled.
|
||||
*
|
||||
* \since Supported since version 0.8.0. The version must be specified in \ref DOKAN_OPTIONS.Version.
|
||||
* \param FileName File path requested by the Kernel on the FileSystem.
|
||||
* \param FillFindStreamData Callback that has to be called with PWIN32_FIND_STREAM_DATA that contain stream information.
|
||||
* \param DokanFileInfo Information about the file or directory.
|
||||
* \return \c STATUS_SUCCESS on success or NTSTATUS appropriate to the request result.
|
||||
*/
|
||||
NTSTATUS(DOKAN_CALLBACK *FindStreams)(LPCWSTR FileName,
|
||||
PFillFindStreamData FillFindStreamData,
|
||||
PDOKAN_FILE_INFO DokanFileInfo);
|
||||
|
||||
} DOKAN_OPERATIONS, *PDOKAN_OPERATIONS;
|
||||
|
||||
// clang-format on
|
||||
|
||||
/**
|
||||
* \defgroup DokanMainResult DokanMainResult
|
||||
* \brief \ref DokanMain returns error codes
|
||||
*/
|
||||
/** @{ */
|
||||
|
||||
/** Dokan mount succeed. */
|
||||
#define DOKAN_SUCCESS 0
|
||||
/** Dokan mount error. */
|
||||
#define DOKAN_ERROR -1
|
||||
/** Dokan mount failed - Bad drive letter. */
|
||||
#define DOKAN_DRIVE_LETTER_ERROR -2
|
||||
/** Dokan mount failed - Can't install driver. */
|
||||
#define DOKAN_DRIVER_INSTALL_ERROR -3
|
||||
/** Dokan mount failed - Driver answer that something is wrong. */
|
||||
#define DOKAN_START_ERROR -4
|
||||
/**
|
||||
* Dokan mount failed.
|
||||
* Can't assign a drive letter or mount point.
|
||||
* Probably already used by another volume.
|
||||
*/
|
||||
#define DOKAN_MOUNT_ERROR -5
|
||||
/**
|
||||
* Dokan mount failed.
|
||||
* Mount point is invalid.
|
||||
*/
|
||||
#define DOKAN_MOUNT_POINT_ERROR -6
|
||||
/**
|
||||
* Dokan mount failed.
|
||||
* Requested an incompatible version.
|
||||
*/
|
||||
#define DOKAN_VERSION_ERROR -7
|
||||
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
* \defgroup Dokan Dokan
|
||||
*/
|
||||
/** @{ */
|
||||
|
||||
/**
|
||||
* \brief Mount a new Dokan Volume.
|
||||
*
|
||||
* This function block until the device is unmounted.
|
||||
* If the mount fails, it will directly return a \ref DokanMainResult error.
|
||||
*
|
||||
* \param DokanOptions a \ref DOKAN_OPTIONS that describe the mount.
|
||||
* \param DokanOperations Instance of \ref DOKAN_OPERATIONS that will be called for each request made by the kernel.
|
||||
* \return \ref DokanMainResult status.
|
||||
*/
|
||||
int DOKANAPI DokanMain(PDOKAN_OPTIONS DokanOptions,
|
||||
PDOKAN_OPERATIONS DokanOperations);
|
||||
|
||||
/**
|
||||
* \brief Unmount a Dokan device from a driver letter.
|
||||
*
|
||||
* \param DriveLetter Dokan driver letter to unmount.
|
||||
* \return \c TRUE if device was unmounted or False in case of failure or device not found.
|
||||
*/
|
||||
BOOL DOKANAPI DokanUnmount(WCHAR DriveLetter);
|
||||
|
||||
/**
|
||||
* \brief Unmount a Dokan device from a mount point
|
||||
*
|
||||
* \param MountPoint Mount point to unmount ("Z", "Z:", "Z:\", "Z:\MyMountPoint").
|
||||
* \return \c TRUE if device was unmounted or False in case of failure or device not found.
|
||||
*/
|
||||
BOOL DOKANAPI DokanRemoveMountPoint(LPCWSTR MountPoint);
|
||||
|
||||
/**
|
||||
* \brief Unmount a Dokan device from a mount point
|
||||
*
|
||||
* Same as \ref DokanRemoveMountPoint
|
||||
* If Safe is \c TRUE, it will broadcast to all desktops and Shells
|
||||
* Safe should not be used during DLL_PROCESS_DETACH
|
||||
*
|
||||
* \see DokanRemoveMountPoint
|
||||
*
|
||||
* \param MountPoint Mount point to unmount ("Z", "Z:", "Z:\", "Z:\MyMountPoint").
|
||||
* \param Safe Process is not in DLL_PROCESS_DETACH state.
|
||||
* \return True if device was unmounted or False in case of failure or device not found.
|
||||
*/
|
||||
BOOL DOKANAPI DokanRemoveMountPointEx(LPCWSTR MountPoint, BOOL Safe);
|
||||
|
||||
/**
|
||||
* \brief Checks whether Name matches Expression
|
||||
*
|
||||
* \param Expression Expression can contain wildcard characters (? and *)
|
||||
* \param Name Name to check
|
||||
* \param IgnoreCase Case sensitive or not
|
||||
* \return result if name matches the expression
|
||||
*/
|
||||
BOOL DOKANAPI DokanIsNameInExpression(LPCWSTR Expression, LPCWSTR Name,
|
||||
BOOL IgnoreCase);
|
||||
|
||||
/**
|
||||
* \brief Get the version of Dokan.
|
||||
* The returned ULONG is the version number without the dots.
|
||||
* \return The version of Dokan
|
||||
*/
|
||||
ULONG DOKANAPI DokanVersion();
|
||||
|
||||
/**
|
||||
* \brief Get the version of the Dokan driver.
|
||||
* The returned ULONG is the version number without the dots.
|
||||
* \return The version of Dokan driver.
|
||||
*/
|
||||
ULONG DOKANAPI DokanDriverVersion();
|
||||
|
||||
/**
|
||||
* \brief Extends the timeout of the current IO operation in driver.
|
||||
*
|
||||
* \param Timeout Extended time in milliseconds requested.
|
||||
* \param DokanFileInfo \ref DOKAN_FILE_INFO of the operation to extend.
|
||||
* \return If the operation was successful.
|
||||
*/
|
||||
BOOL DOKANAPI DokanResetTimeout(ULONG Timeout, PDOKAN_FILE_INFO DokanFileInfo);
|
||||
|
||||
/**
|
||||
* \brief Get the handle to Access Token.
|
||||
*
|
||||
* This method needs be called in <a href="https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx">CreateFile</a> callback.
|
||||
* The caller must call <a href="https://msdn.microsoft.com/en-us/library/windows/desktop/ms724211(v=vs.85).aspx">CloseHandle</a>
|
||||
* for the returned handle.
|
||||
*
|
||||
* \param DokanFileInfo \ref DOKAN_FILE_INFO of the operation to extend.
|
||||
* \return A handle to the account token for the user on whose behalf the code is running.
|
||||
*/
|
||||
HANDLE DOKANAPI DokanOpenRequestorToken(PDOKAN_FILE_INFO DokanFileInfo);
|
||||
|
||||
/**
|
||||
* \brief Get active Dokan mount points.
|
||||
*
|
||||
* \param list Allocate array of DOKAN_CONTROL.
|
||||
* \param length Number of \ref DOKAN_CONTROL instances in list.
|
||||
* \param uncOnly Get only instances that have UNC Name.
|
||||
* \param nbRead Number of instances successfully retrieved.
|
||||
* \return List retrieved or not.
|
||||
*/
|
||||
BOOL DOKANAPI DokanGetMountPointList(PDOKAN_CONTROL list, ULONG length,
|
||||
BOOL uncOnly, PULONG nbRead);
|
||||
|
||||
/**
|
||||
* \brief Convert \ref DOKAN_OPERATIONS.ZwCreateFile parameters to <a href="https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx">CreateFile</a> parameters.
|
||||
*
|
||||
* Dokan Kernel forward the DesiredAccess directly from the IRP_MJ_CREATE.
|
||||
* This DesiredAccess has been converted from generic rights (user CreateFile request) to standard rights and will be converted back here.
|
||||
* https://msdn.microsoft.com/windows/hardware/drivers/ifs/access-mask
|
||||
*
|
||||
* \param DesiredAccess DesiredAccess from \ref DOKAN_OPERATIONS.ZwCreateFile.
|
||||
* \param FileAttributes FileAttributes from \ref DOKAN_OPERATIONS.ZwCreateFile.
|
||||
* \param CreateOptions CreateOptions from \ref DOKAN_OPERATIONS.ZwCreateFile.
|
||||
* \param CreateDisposition CreateDisposition from \ref DOKAN_OPERATIONS.ZwCreateFile.
|
||||
* \param outDesiredAccess New <a href="https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx">CreateFile</a> dwDesiredAccess.
|
||||
* \param outFileAttributesAndFlags New <a href="https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx">CreateFile</a> dwFlagsAndAttributes.
|
||||
* \param outCreationDisposition New <a href="https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx">CreateFile</a> dwCreationDisposition.
|
||||
* \see <a href="https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx">CreateFile function (MSDN)</a>
|
||||
*/
|
||||
void DOKANAPI DokanMapKernelToUserCreateFileFlags(
|
||||
ACCESS_MASK DesiredAccess, ULONG FileAttributes, ULONG CreateOptions, ULONG CreateDisposition,
|
||||
ACCESS_MASK* outDesiredAccess, DWORD *outFileAttributesAndFlags, DWORD *outCreationDisposition);
|
||||
|
||||
/**
|
||||
* \brief Convert WIN32 error to NTSTATUS
|
||||
*
|
||||
* https://support.microsoft.com/en-us/kb/113996
|
||||
*
|
||||
* \param Error Win32 Error to convert
|
||||
* \return NTSTATUS associate to the ERROR.
|
||||
*/
|
||||
NTSTATUS DOKANAPI DokanNtStatusFromWin32(DWORD Error);
|
||||
|
||||
/** @} */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // DOKAN_H_
|
||||
Binary file not shown.
1252
dokanLib/fileinfo.h
1252
dokanLib/fileinfo.h
File diff suppressed because it is too large
Load Diff
@@ -1,407 +0,0 @@
|
||||
/*
|
||||
Dokan : user-mode file system library for Windows
|
||||
|
||||
Copyright (C) 2015 - 2018 Adrien J. <liryna.stark@gmail.com> and Maxime C. <maxime@islog.com>
|
||||
Copyright (C) 2007 - 2011 Hiroki Asakawa <info@dokan-dev.net>
|
||||
|
||||
http://dokan-dev.github.io
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU Lesser General Public License as published by the Free
|
||||
Software Foundation; either version 3 of the License, or (at your option) any
|
||||
later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License along
|
||||
with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef PUBLIC_H_
|
||||
#define PUBLIC_H_
|
||||
|
||||
#ifndef DOKAN_MAJOR_API_VERSION
|
||||
#define DOKAN_MAJOR_API_VERSION L"1"
|
||||
#include <minwindef.h>
|
||||
//#include "C:/Program Files (x86)/Windows Kits/8.1/Include/shared/minwindef.h"
|
||||
#endif
|
||||
|
||||
#define DOKAN_DRIVER_VERSION 0x0000190
|
||||
|
||||
#define EVENT_CONTEXT_MAX_SIZE (1024 * 32)
|
||||
|
||||
#define IOCTL_TEST \
|
||||
CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||
|
||||
#define IOCTL_SET_DEBUG_MODE \
|
||||
CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||
|
||||
#define IOCTL_EVENT_WAIT \
|
||||
CTL_CODE(FILE_DEVICE_UNKNOWN, 0x802, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||
|
||||
#define IOCTL_EVENT_INFO \
|
||||
CTL_CODE(FILE_DEVICE_UNKNOWN, 0x803, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||
|
||||
#define IOCTL_EVENT_RELEASE \
|
||||
CTL_CODE(FILE_DEVICE_UNKNOWN, 0x804, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||
|
||||
#define IOCTL_EVENT_START \
|
||||
CTL_CODE(FILE_DEVICE_UNKNOWN, 0x805, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||
|
||||
#define IOCTL_EVENT_WRITE \
|
||||
CTL_CODE(FILE_DEVICE_UNKNOWN, 0x806, METHOD_OUT_DIRECT, FILE_ANY_ACCESS)
|
||||
|
||||
#define IOCTL_KEEPALIVE \
|
||||
CTL_CODE(FILE_DEVICE_UNKNOWN, 0x809, METHOD_NEITHER, FILE_ANY_ACCESS)
|
||||
|
||||
#define IOCTL_SERVICE_WAIT \
|
||||
CTL_CODE(FILE_DEVICE_UNKNOWN, 0x80A, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||
|
||||
#define IOCTL_RESET_TIMEOUT \
|
||||
CTL_CODE(FILE_DEVICE_UNKNOWN, 0x80B, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||
|
||||
#define IOCTL_GET_ACCESS_TOKEN \
|
||||
CTL_CODE(FILE_DEVICE_UNKNOWN, 0x80C, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||
|
||||
#define IOCTL_EVENT_MOUNTPOINT_LIST \
|
||||
CTL_CODE(FILE_DEVICE_UNKNOWN, 0x80D, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||
|
||||
#define IOCTL_MOUNTPOINT_CLEANUP \
|
||||
CTL_CODE(FILE_DEVICE_UNKNOWN, 0x80E, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||
|
||||
#define DRIVER_FUNC_INSTALL 0x01
|
||||
#define DRIVER_FUNC_REMOVE 0x02
|
||||
|
||||
#define DOKAN_MOUNTED 1
|
||||
#define DOKAN_USED 2
|
||||
#define DOKAN_START_FAILED 3
|
||||
|
||||
#define DOKAN_DEVICE_MAX 10
|
||||
|
||||
#define DOKAN_DEFAULT_SECTOR_SIZE 512
|
||||
#define DOKAN_DEFAULT_ALLOCATION_UNIT_SIZE 512
|
||||
#define DOKAN_DEFAULT_DISK_SIZE 1024 * 1024 * 1024
|
||||
|
||||
// used in CCB->Flags and FCB->Flags
|
||||
#define DOKAN_FILE_DIRECTORY 1
|
||||
#define DOKAN_FILE_DELETED 2
|
||||
#define DOKAN_FILE_OPENED 4
|
||||
#define DOKAN_DIR_MATCH_ALL 8
|
||||
#define DOKAN_DELETE_ON_CLOSE 16
|
||||
#define DOKAN_PAGING_IO 32
|
||||
#define DOKAN_SYNCHRONOUS_IO 64
|
||||
#define DOKAN_WRITE_TO_END_OF_FILE 128
|
||||
#define DOKAN_NOCACHE 256
|
||||
#define DOKAN_FILE_CHANGE_LAST_WRITE 512
|
||||
|
||||
// used in DOKAN_START->DeviceType
|
||||
#define DOKAN_DISK_FILE_SYSTEM 0
|
||||
#define DOKAN_NETWORK_FILE_SYSTEM 1
|
||||
|
||||
/*
|
||||
* This structure is used for copying UNICODE_STRING from the kernel mode driver
|
||||
* into the user mode driver.
|
||||
* https://msdn.microsoft.com/en-us/library/windows/hardware/ff564879(v=vs.85).aspx
|
||||
*/
|
||||
typedef struct _DOKAN_UNICODE_STRING_INTERMEDIATE {
|
||||
USHORT Length;
|
||||
USHORT MaximumLength;
|
||||
WCHAR Buffer[1];
|
||||
} DOKAN_UNICODE_STRING_INTERMEDIATE, *PDOKAN_UNICODE_STRING_INTERMEDIATE;
|
||||
|
||||
/*
|
||||
* This structure is used for copying ACCESS_STATE from the kernel mode driver
|
||||
* into the user mode driver.
|
||||
* https://msdn.microsoft.com/en-us/library/windows/hardware/ff538840(v=vs.85).aspx
|
||||
*/
|
||||
typedef struct _DOKAN_ACCESS_STATE_INTERMEDIATE {
|
||||
BOOLEAN SecurityEvaluated;
|
||||
BOOLEAN GenerateAudit;
|
||||
BOOLEAN GenerateOnClose;
|
||||
BOOLEAN AuditPrivileges;
|
||||
ULONG Flags;
|
||||
ACCESS_MASK RemainingDesiredAccess;
|
||||
ACCESS_MASK PreviouslyGrantedAccess;
|
||||
ACCESS_MASK OriginalDesiredAccess;
|
||||
|
||||
// Offset from the beginning of this structure to a SECURITY_DESCRIPTOR
|
||||
// if 0 that means there is no security descriptor
|
||||
ULONG SecurityDescriptorOffset;
|
||||
|
||||
// Offset from the beginning of this structure to a
|
||||
// DOKAN_UNICODE_STRING_INTERMEDIATE
|
||||
ULONG UnicodeStringObjectNameOffset;
|
||||
|
||||
// Offset from the beginning of this structure to a
|
||||
// DOKAN_UNICODE_STRING_INTERMEDIATE
|
||||
ULONG UnicodeStringObjectTypeOffset;
|
||||
} DOKAN_ACCESS_STATE_INTERMEDIATE, *PDOKAN_ACCESS_STATE_INTERMEDIATE;
|
||||
|
||||
typedef struct _DOKAN_ACCESS_STATE {
|
||||
BOOLEAN SecurityEvaluated;
|
||||
BOOLEAN GenerateAudit;
|
||||
BOOLEAN GenerateOnClose;
|
||||
BOOLEAN AuditPrivileges;
|
||||
ULONG Flags;
|
||||
ACCESS_MASK RemainingDesiredAccess;
|
||||
ACCESS_MASK PreviouslyGrantedAccess;
|
||||
ACCESS_MASK OriginalDesiredAccess;
|
||||
PSECURITY_DESCRIPTOR SecurityDescriptor;
|
||||
UNICODE_STRING ObjectName;
|
||||
UNICODE_STRING ObjectType;
|
||||
} DOKAN_ACCESS_STATE, *PDOKAN_ACCESS_STATE;
|
||||
|
||||
/*
|
||||
* This structure is used for copying IO_SECURITY_CONTEXT from the kernel mode
|
||||
* driver into the user mode driver.
|
||||
* https://msdn.microsoft.com/en-us/library/windows/hardware/ff550613(v=vs.85).aspx
|
||||
*/
|
||||
typedef struct _DOKAN_IO_SECURITY_CONTEXT_INTERMEDIATE {
|
||||
DOKAN_ACCESS_STATE_INTERMEDIATE AccessState;
|
||||
ACCESS_MASK DesiredAccess;
|
||||
} DOKAN_IO_SECURITY_CONTEXT_INTERMEDIATE,
|
||||
*PDOKAN_IO_SECURITY_CONTEXT_INTERMEDIATE;
|
||||
|
||||
typedef struct _DOKAN_IO_SECURITY_CONTEXT {
|
||||
DOKAN_ACCESS_STATE AccessState;
|
||||
ACCESS_MASK DesiredAccess;
|
||||
} DOKAN_IO_SECURITY_CONTEXT, *PDOKAN_IO_SECURITY_CONTEXT;
|
||||
|
||||
typedef struct _CREATE_CONTEXT {
|
||||
DOKAN_IO_SECURITY_CONTEXT_INTERMEDIATE SecurityContext;
|
||||
ULONG FileAttributes;
|
||||
ULONG CreateOptions;
|
||||
ULONG ShareAccess;
|
||||
ULONG FileNameLength;
|
||||
|
||||
// Offset from the beginning of this structure to the string
|
||||
ULONG FileNameOffset;
|
||||
} CREATE_CONTEXT, *PCREATE_CONTEXT;
|
||||
|
||||
typedef struct _CLEANUP_CONTEXT {
|
||||
ULONG FileNameLength;
|
||||
WCHAR FileName[1];
|
||||
|
||||
} CLEANUP_CONTEXT, *PCLEANUP_CONTEXT;
|
||||
|
||||
typedef struct _CLOSE_CONTEXT {
|
||||
ULONG FileNameLength;
|
||||
WCHAR FileName[1];
|
||||
|
||||
} CLOSE_CONTEXT, *PCLOSE_CONTEXT;
|
||||
|
||||
typedef struct _DIRECTORY_CONTEXT {
|
||||
ULONG FileInformationClass;
|
||||
ULONG FileIndex;
|
||||
ULONG BufferLength;
|
||||
ULONG DirectoryNameLength;
|
||||
ULONG SearchPatternLength;
|
||||
ULONG SearchPatternOffset;
|
||||
WCHAR DirectoryName[1];
|
||||
WCHAR SearchPatternBase[1];
|
||||
|
||||
} DIRECTORY_CONTEXT, *PDIRECTORY_CONTEXT;
|
||||
|
||||
typedef struct _READ_CONTEXT {
|
||||
LARGE_INTEGER ByteOffset;
|
||||
ULONG BufferLength;
|
||||
ULONG FileNameLength;
|
||||
WCHAR FileName[1];
|
||||
} READ_CONTEXT, *PREAD_CONTEXT;
|
||||
|
||||
typedef struct _WRITE_CONTEXT {
|
||||
LARGE_INTEGER ByteOffset;
|
||||
ULONG BufferLength;
|
||||
ULONG BufferOffset;
|
||||
ULONG RequestLength;
|
||||
ULONG FileNameLength;
|
||||
WCHAR FileName[2];
|
||||
// "2" means to keep last null of contents to write
|
||||
} WRITE_CONTEXT, *PWRITE_CONTEXT;
|
||||
|
||||
typedef struct _FILEINFO_CONTEXT {
|
||||
ULONG FileInformationClass;
|
||||
ULONG BufferLength;
|
||||
ULONG FileNameLength;
|
||||
WCHAR FileName[1];
|
||||
} FILEINFO_CONTEXT, *PFILEINFO_CONTEXT;
|
||||
|
||||
typedef struct _SETFILE_CONTEXT {
|
||||
ULONG FileInformationClass;
|
||||
ULONG BufferLength;
|
||||
ULONG BufferOffset;
|
||||
ULONG FileNameLength;
|
||||
WCHAR FileName[1];
|
||||
} SETFILE_CONTEXT, *PSETFILE_CONTEXT;
|
||||
|
||||
typedef struct _VOLUME_CONTEXT {
|
||||
ULONG FsInformationClass;
|
||||
ULONG BufferLength;
|
||||
} VOLUME_CONTEXT, *PVOLUME_CONTEXT;
|
||||
|
||||
typedef struct _LOCK_CONTEXT {
|
||||
LARGE_INTEGER ByteOffset;
|
||||
LARGE_INTEGER Length;
|
||||
ULONG Key;
|
||||
ULONG FileNameLength;
|
||||
WCHAR FileName[1];
|
||||
} LOCK_CONTEXT, *PLOCK_CONTEXT;
|
||||
|
||||
typedef struct _FLUSH_CONTEXT {
|
||||
ULONG FileNameLength;
|
||||
WCHAR FileName[1];
|
||||
} FLUSH_CONTEXT, *PFLUSH_CONTEXT;
|
||||
|
||||
typedef struct _UNMOUNT_CONTEXT {
|
||||
WCHAR DeviceName[64];
|
||||
ULONG Option;
|
||||
} UNMOUNT_CONTEXT, *PUNMOUNT_CONTEXT;
|
||||
|
||||
typedef struct _SECURITY_CONTEXT {
|
||||
SECURITY_INFORMATION SecurityInformation;
|
||||
ULONG BufferLength;
|
||||
ULONG FileNameLength;
|
||||
WCHAR FileName[1];
|
||||
} SECURITY_CONTEXT, *PSECURITY_CONTEXT;
|
||||
|
||||
typedef struct _SET_SECURITY_CONTEXT {
|
||||
SECURITY_INFORMATION SecurityInformation;
|
||||
ULONG BufferLength;
|
||||
ULONG BufferOffset;
|
||||
ULONG FileNameLength;
|
||||
WCHAR FileName[1];
|
||||
} SET_SECURITY_CONTEXT, *PSET_SECURITY_CONTEXT;
|
||||
|
||||
typedef struct _EVENT_CONTEXT {
|
||||
ULONG Length;
|
||||
ULONG MountId;
|
||||
ULONG SerialNumber;
|
||||
ULONG ProcessId;
|
||||
UCHAR MajorFunction;
|
||||
UCHAR MinorFunction;
|
||||
ULONG Flags;
|
||||
ULONG FileFlags;
|
||||
ULONG64 Context;
|
||||
union {
|
||||
DIRECTORY_CONTEXT Directory;
|
||||
READ_CONTEXT Read;
|
||||
WRITE_CONTEXT Write;
|
||||
FILEINFO_CONTEXT File;
|
||||
CREATE_CONTEXT Create;
|
||||
CLOSE_CONTEXT Close;
|
||||
SETFILE_CONTEXT SetFile;
|
||||
CLEANUP_CONTEXT Cleanup;
|
||||
LOCK_CONTEXT Lock;
|
||||
VOLUME_CONTEXT Volume;
|
||||
FLUSH_CONTEXT Flush;
|
||||
UNMOUNT_CONTEXT Unmount;
|
||||
SECURITY_CONTEXT Security;
|
||||
SET_SECURITY_CONTEXT SetSecurity;
|
||||
} Operation;
|
||||
} EVENT_CONTEXT, *PEVENT_CONTEXT;
|
||||
|
||||
#define WRITE_MAX_SIZE \
|
||||
(EVENT_CONTEXT_MAX_SIZE - sizeof(EVENT_CONTEXT) - 256 * sizeof(WCHAR))
|
||||
|
||||
typedef struct _EVENT_INFORMATION {
|
||||
ULONG SerialNumber;
|
||||
NTSTATUS Status;
|
||||
ULONG Flags;
|
||||
union {
|
||||
struct {
|
||||
ULONG Index;
|
||||
} Directory;
|
||||
struct {
|
||||
ULONG Flags;
|
||||
ULONG Information;
|
||||
} Create;
|
||||
struct {
|
||||
LARGE_INTEGER CurrentByteOffset;
|
||||
} Read;
|
||||
struct {
|
||||
LARGE_INTEGER CurrentByteOffset;
|
||||
} Write;
|
||||
struct {
|
||||
UCHAR DeleteOnClose;
|
||||
} Delete;
|
||||
struct {
|
||||
ULONG Timeout;
|
||||
} ResetTimeout;
|
||||
struct {
|
||||
HANDLE Handle;
|
||||
} AccessToken;
|
||||
} Operation;
|
||||
ULONG64 Context;
|
||||
ULONG BufferLength;
|
||||
UCHAR Buffer[8];
|
||||
|
||||
} EVENT_INFORMATION, *PEVENT_INFORMATION;
|
||||
|
||||
#define DOKAN_EVENT_ALTERNATIVE_STREAM_ON 1
|
||||
#define DOKAN_EVENT_WRITE_PROTECT 2
|
||||
#define DOKAN_EVENT_REMOVABLE 4
|
||||
#define DOKAN_EVENT_MOUNT_MANAGER 8
|
||||
#define DOKAN_EVENT_CURRENT_SESSION 16
|
||||
#define DOKAN_EVENT_FILELOCK_USER_MODE 32
|
||||
|
||||
typedef struct _EVENT_DRIVER_INFO {
|
||||
ULONG DriverVersion;
|
||||
ULONG Status;
|
||||
ULONG DeviceNumber;
|
||||
ULONG MountId;
|
||||
WCHAR DeviceName[64];
|
||||
} EVENT_DRIVER_INFO, *PEVENT_DRIVER_INFO;
|
||||
|
||||
typedef struct _EVENT_START {
|
||||
ULONG UserVersion;
|
||||
ULONG DeviceType;
|
||||
ULONG Flags;
|
||||
WCHAR MountPoint[260];
|
||||
WCHAR UNCName[64];
|
||||
ULONG IrpTimeout;
|
||||
} EVENT_START, *PEVENT_START;
|
||||
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable : 4201)
|
||||
typedef struct _DOKAN_RENAME_INFORMATION {
|
||||
#if (_WIN32_WINNT >= _WIN32_WINNT_WIN10_RS1)
|
||||
union {
|
||||
BOOLEAN ReplaceIfExists; // FileRenameInformation
|
||||
ULONG Flags; // FileRenameInformationEx
|
||||
} DUMMYUNIONNAME;
|
||||
#else
|
||||
BOOLEAN ReplaceIfExists;
|
||||
#endif
|
||||
ULONG FileNameLength;
|
||||
WCHAR FileName[1];
|
||||
} DOKAN_RENAME_INFORMATION, *PDOKAN_RENAME_INFORMATION;
|
||||
#pragma warning(pop)
|
||||
|
||||
typedef struct _DOKAN_LINK_INFORMATION {
|
||||
BOOLEAN ReplaceIfExists;
|
||||
ULONG FileNameLength;
|
||||
WCHAR FileName[1];
|
||||
} DOKAN_LINK_INFORMATION, *PDOKAN_LINK_INFORMATION;
|
||||
|
||||
/**
|
||||
* \struct DOKAN_CONTROL
|
||||
* \brief Dokan Control
|
||||
*/
|
||||
typedef struct _DOKAN_CONTROL {
|
||||
/** File System Type */
|
||||
ULONG Type;
|
||||
/** Mount point. Can be "M:\" (drive letter) or "C:\mount\dokan" (path in NTFS) */
|
||||
WCHAR MountPoint[MAX_PATH];
|
||||
/** UNC name used for network volume */
|
||||
WCHAR UNCName[64];
|
||||
/** Disk Device Name */
|
||||
WCHAR DeviceName[64];
|
||||
/** Volume Device Object */
|
||||
PVOID64 DeviceObject;
|
||||
/** Session ID of calling process */
|
||||
ULONG SessionId;
|
||||
} DOKAN_CONTROL, *PDOKAN_CONTROL;
|
||||
|
||||
#endif // PUBLIC_H_
|
||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_EXECUTABLE@
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||
X-GNOME-Autostart-Delay=3
|
||||
# Translations
|
||||
@@ -198,185 +198,185 @@ X-GNOME-Autostart-Delay=3
|
||||
Comment[oc]=@APPLICATION_NAME@ sincronizacion del client
|
||||
GenericName[oc]=Dorsièr de Sincronizacion
|
||||
Name[oc]=@APPLICATION_NAME@ sincronizacion del client
|
||||
Icon[oc]=@APPLICATION_EXECUTABLE@
|
||||
Icon[oc]=@APPLICATION_ICON_NAME@
|
||||
Comment[ar]=@APPLICATION_NAME@ زبون مزامنة مكتبي
|
||||
GenericName[ar]=مزامنة المجلد
|
||||
Name[ar]=@APPLICATION_NAME@ زبون مزامنة مكتبي
|
||||
Icon[ar]=@APPLICATION_EXECUTABLE@
|
||||
Icon[ar]=@APPLICATION_ICON_NAME@
|
||||
Comment[bg_BG]=@APPLICATION_NAME@ клиент за десктоп синхронизация
|
||||
GenericName[bg_BG]=Синхронизиране на папката
|
||||
Name[bg_BG]=@APPLICATION_NAME@ клиент десктоп синхронизация
|
||||
Icon[bg_BG]=@APPLICATION_EXECUTABLE@
|
||||
Icon[bg_BG]=@APPLICATION_ICON_NAME@
|
||||
Comment[ca]=Client de sincronització d'escriptori @APPLICATION_NAME@
|
||||
GenericName[ca]=Sincronització de carpetes
|
||||
Name[ca]=Client de sincronització d'escriptori @APPLICATION_NAME@
|
||||
Icon[ca]=@APPLICATION_EXECUTABLE@
|
||||
Icon[ca]=@APPLICATION_ICON_NAME@
|
||||
Comment[da]=@APPLICATION_NAME@ skrivebordsklient til synkronisering
|
||||
GenericName[da]=Mappesynkronisering
|
||||
Name[da]=@APPLICATION_NAME@ skrivebordsklient til synk
|
||||
Icon[da]=@APPLICATION_EXECUTABLE@
|
||||
Icon[da]=@APPLICATION_ICON_NAME@
|
||||
Comment[de]=@APPLICATION_NAME@ Desktop-Synchronisationsclient
|
||||
GenericName[de]=Ordner-Synchronisation
|
||||
Name[de]=@APPLICATION_NAME@ Desktop-Synchronisationsclient
|
||||
Icon[de]=@APPLICATION_EXECUTABLE@
|
||||
Icon[de]=@APPLICATION_ICON_NAME@
|
||||
Comment[ja_JP]=@APPLICATION_NAME@ デスクトップ同期クライアント
|
||||
GenericName[ja_JP]=フォルダー同期
|
||||
Name[ja_JP]=@APPLICATION_NAME@ デスクトップ同期クライアント
|
||||
Icon[ja_JP]=@APPLICATION_EXECUTABLE@
|
||||
Icon[ja_JP]=@APPLICATION_ICON_NAME@
|
||||
Comment[el]=@ΟΝΟΜΑ_ΕΦΑΡΜΟΓΗΣ@ συγχρονισμός επιφάνειας εργασίας πελάτη
|
||||
GenericName[el]=Συγχρονισμός φακέλου
|
||||
Name[el]=@ΟΝΟΜΑ_ΕΦΑΡΜΟΓΗΣ@ συγχρονισμός επιφάνειας εργασίας πελάτη
|
||||
Icon[el]=@APPLICATION_EXECUTABLE@
|
||||
Icon[el]=@APPLICATION_ICON_NAME@
|
||||
Comment[en_GB]=@APPLICATION_NAME@ desktop synchronisation client
|
||||
GenericName[en_GB]=Folder Sync
|
||||
Name[en_GB]=@APPLICATION_NAME@ desktop sync client
|
||||
Icon[en_GB]=@APPLICATION_EXECUTABLE@
|
||||
Icon[en_GB]=@APPLICATION_ICON_NAME@
|
||||
Comment[es]=@APPLICATION_NAME@ cliente de sincronización de escritorio
|
||||
GenericName[es]=Sincronización de carpeta
|
||||
Name[es]=@APPLICATION_NAME@ cliente de sincronización de escritorio
|
||||
Icon[es]=@APPLICATION_EXECUTABLE@
|
||||
Icon[es]=@APPLICATION_ICON_NAME@
|
||||
Comment[de_DE]=@APPLICATION_NAME@ Desktop-Synchronisationsclient
|
||||
GenericName[de_DE]=Ordner-Synchronisation
|
||||
Name[de_DE]=@APPLICATION_NAME@ Desktop-Synchronisationsclient
|
||||
Icon[de_DE]=@APPLICATION_EXECUTABLE@
|
||||
Icon[de_DE]=@APPLICATION_ICON_NAME@
|
||||
Comment[eu]=@APPLICATION_NAME@ mahaigaineko sinkronizazio bezeroa
|
||||
GenericName[eu]=Karpetaren sinkronizazioa
|
||||
Name[eu]=@APPLICATION_NAME@ mahaigaineko sinkronizazio bezeroa
|
||||
Icon[eu]=@APPLICATION_EXECUTABLE@
|
||||
Icon[eu]=@APPLICATION_ICON_NAME@
|
||||
GenericName[fa]=همسان سازی پوشهها
|
||||
Name[fa]=@APPLICATION_EXECUTABLE@ نسخهی همسان سازی مشتری
|
||||
Icon[fa]=@APPLICATION_EXECUTABLE@
|
||||
Icon[fa]=@APPLICATION_ICON_NAME@
|
||||
Comment[fr]=Synchronisez vos dossiers avec un serveur @APPLICATION_NAME@
|
||||
GenericName[fr]=Synchronisation de dossier
|
||||
Name[fr]=Client de synchronisation @APPLICATION_NAME@
|
||||
Icon[fr]=@APPLICATION_EXECUTABLE@
|
||||
Icon[fr]=@APPLICATION_ICON_NAME@
|
||||
Comment[gl]=@APPLICATION_NAME@ cliente de sincronización para escritorio
|
||||
GenericName[gl]=Sincronizar Cartafol
|
||||
Name[gl]=@APPLICATION_NAME@ cliente de sincronización para escritorio
|
||||
Icon[gl]=@APPLICATION_EXECUTABLE@
|
||||
Icon[gl]=@APPLICATION_ICON_NAME@
|
||||
Comment[he]=@APPLICATION_NAME@ לקוח סנכון שולחן עבודה
|
||||
GenericName[he]=סנכון תיקייה
|
||||
Name[he]=@APPLICATION_NAME@ לקוח סנכרון שולחן עבודה
|
||||
Icon[he]=@APPLICATION_EXECUTABLE@
|
||||
Icon[he]=@APPLICATION_ICON_NAME@
|
||||
Comment[ia]=@APPLICATION_NAME@ cliente de synchronisation pro scriptorio
|
||||
GenericName[ia]=Synchronisar Dossier
|
||||
Name[ia]=@APPLICATION_NAME@ cliente de synchronisation pro scriptorio
|
||||
Icon[ia]=@APPLICATION_EXECUTABLE@
|
||||
Icon[ia]=@APPLICATION_ICON_NAME@
|
||||
Comment[id]=Klien sinkronisasi desktop @APPLICATION_NAME@
|
||||
GenericName[id]=Folder Sync
|
||||
Name[id]=Klien sync desktop @APPLICATION_NAME@
|
||||
Icon[id]=@APPLICATION_EXECUTABLE@
|
||||
Icon[id]=@APPLICATION_ICON_NAME@
|
||||
Comment[is]=@APPLICATION_NAME@ skjáborðsforrit samstillingar
|
||||
GenericName[is]=Samstilling möppu
|
||||
Name[is]=@APPLICATION_NAME@ skjáborðsforrit samstillingar
|
||||
Icon[is]=@APPLICATION_EXECUTABLE@
|
||||
Icon[is]=@APPLICATION_ICON_NAME@
|
||||
Comment[it]=Client di sincronizzazione del desktop di @APPLICATION_NAME@
|
||||
GenericName[it]=Sincronizzazione cartella
|
||||
Name[it]=Client di sincronizzazione del desktop di @APPLICATION_NAME@
|
||||
Icon[it]=@APPLICATION_EXECUTABLE@
|
||||
Icon[it]=@APPLICATION_ICON_NAME@
|
||||
Comment[ko]=@APPLICATION_NAME@ 데스크톱 동기화 클라이언트
|
||||
GenericName[ko]=폴더 동기화
|
||||
Name[ko]=@APPLICATION_NAME@ 데스크톱 동기화 클라이언트
|
||||
Icon[ko]=@APPLICATION_EXECUTABLE@
|
||||
Icon[ko]=@APPLICATION_ICON_NAME@
|
||||
Comment[hu_HU]=@APPLICATION_NAME@ asztali szinkronizációs kliens
|
||||
GenericName[hu_HU]=Könyvtár szinkronizálás
|
||||
Name[hu_HU]=@APPLICATION_NAME@ asztali szinkr. kliens
|
||||
Icon[hu_HU]=@APPLICATION_EXECUTABLE@
|
||||
Icon[hu_HU]=@APPLICATION_ICON_NAME@
|
||||
Comment[af_ZA]=@APPLICATION_NAME@ werkskermsinchroniseerkliënt
|
||||
GenericName[af_ZA]=Vouersinchronisering
|
||||
Name[af_ZA]=@APPLICATION_NAME@ werkskermsinchroniseerkliënt
|
||||
Icon[af_ZA]=@APPLICATION_EXECUTABLE@
|
||||
Icon[af_ZA]=@APPLICATION_ICON_NAME@
|
||||
Comment[nl]=@APPLICATION_NAME@ desktop synchronisatie client
|
||||
GenericName[nl]=Mappen sync
|
||||
Name[nl]=@APPLICATION_NAME@ desktop sync client
|
||||
Icon[nl]=@APPLICATION_EXECUTABLE@
|
||||
Icon[nl]=@APPLICATION_ICON_NAME@
|
||||
Comment[et_EE]=@APPLICATION_NAME@ sünkroonimise klient töölauale
|
||||
GenericName[et_EE]=Kaustade sünkroonimine
|
||||
Name[et_EE]=@APPLICATION_NAME@ sünkroonimise klient töölauale
|
||||
Icon[et_EE]=@APPLICATION_EXECUTABLE@
|
||||
Icon[et_EE]=@APPLICATION_ICON_NAME@
|
||||
Comment[pl]=@APPLICATION_NAME@ klient synchronizacji dla komputerów stacjonarnych
|
||||
GenericName[pl]=Folder Synchronizacji
|
||||
Name[pl]=@APPLICATION_NAME@ klient synchronizacji dla komputerów stacjonarnych
|
||||
Icon[pl]=@APPLICATION_EXECUTABLE@
|
||||
Icon[pl]=@APPLICATION_ICON_NAME@
|
||||
Comment[pt_BR]=@APPLICATION_NAME@ cliente de sincronização do computador
|
||||
GenericName[pt_BR]=Sincronização de Pasta
|
||||
Name[pt_BR]=@APPLICATION_NAME@ cliente de sincronização de desktop
|
||||
Icon[pt_BR]=@APPLICATION_EXECUTABLE@
|
||||
Icon[pt_BR]=@APPLICATION_ICON_NAME@
|
||||
Comment[cs_CZ]=@APPLICATION_NAME@ počítačový synchronizační klient
|
||||
GenericName[cs_CZ]=Synchronizace adresáře
|
||||
Name[cs_CZ]=@APPLICATION_NAME@ počítačový synchronizační klient
|
||||
Icon[cs_CZ]=@APPLICATION_EXECUTABLE@
|
||||
Icon[cs_CZ]=@APPLICATION_ICON_NAME@
|
||||
Comment[ru]=Настольный клиент синхронизации @APPLICATION_NAME@
|
||||
GenericName[ru]=Синхронизация каталогов
|
||||
Name[ru]=Настольный клиент синхронизации @APPLICATION_NAME@
|
||||
Icon[ru]=@APPLICATION_EXECUTABLE@
|
||||
Icon[ru]=@APPLICATION_ICON_NAME@
|
||||
Comment[sl]=@APPLICATION_NAME@ ‒ Program za usklajevanje datotek z namizjem
|
||||
GenericName[sl]=Usklajevanje map
|
||||
Name[sl]=@APPLICATION_NAME@ ‒ Program za usklajevanje datotek z namizjem
|
||||
Icon[sl]=@APPLICATION_EXECUTABLE@
|
||||
Icon[sl]=@APPLICATION_ICON_NAME@
|
||||
Comment[sq]=Klient njëkohësimesh @APPLICATION_NAME@ për desktop
|
||||
GenericName[sq]=Njëkohësim Dosjesh
|
||||
Name[sq]=Klient njëkohësimesh @APPLICATION_NAME@ për desktop
|
||||
Icon[sq]=@APPLICATION_EXECUTABLE@
|
||||
Icon[sq]=@APPLICATION_ICON_NAME@
|
||||
Comment[fi_FI]=@APPLICATION_NAME@ työpöytäsynkronointisovellus
|
||||
GenericName[fi_FI]=Kansion synkronointi
|
||||
Name[fi_FI]=@APPLICATION_NAME@ työpöytäsynkronointisovellus
|
||||
Icon[fi_FI]=@APPLICATION_EXECUTABLE@
|
||||
Icon[fi_FI]=@APPLICATION_ICON_NAME@
|
||||
Comment[sv]=@APPLICATION_NAME@ desktop synkroniseringsklient
|
||||
GenericName[sv]=Mappsynk
|
||||
Name[sv]=@APPLICATION_NAME@ desktop synk-klient
|
||||
Icon[sv]=@APPLICATION_EXECUTABLE@
|
||||
Icon[sv]=@APPLICATION_ICON_NAME@
|
||||
Comment[tr]=@APPLICATION_NAME@ masaüstü eşitleme istemcisi
|
||||
GenericName[tr]=Dosya Eşitleme
|
||||
Name[tr]=@APPLICATION_NAME@ masaüstü eşitleme istemcisi
|
||||
Icon[tr]=@APPLICATION_EXECUTABLE@
|
||||
Icon[tr]=@APPLICATION_ICON_NAME@
|
||||
Comment[uk]=Настільний клієнт синхронізації @APPLICATION_NAME@
|
||||
GenericName[uk]=Синхронізація теки
|
||||
Name[uk]=Настільний клієнт синхронізації @APPLICATION_NAME@
|
||||
Icon[uk]=@APPLICATION_EXECUTABLE@
|
||||
Icon[uk]=@APPLICATION_ICON_NAME@
|
||||
Comment[ro]=@APPLICATION_NAME@ client de sincronizare pe desktop
|
||||
GenericName[ro]=Sincronizare director
|
||||
Name[ro]=@APPLICATION_NAME@ client de sincronizare pe desktop
|
||||
Icon[ro]=@APPLICATION_EXECUTABLE@
|
||||
Icon[ro]=@APPLICATION_ICON_NAME@
|
||||
Comment[zh_CN]=@APPLICATION_NAME@ 桌面同步客户端
|
||||
GenericName[zh_CN]=文件夹同步
|
||||
Name[zh_CN]=@APPLICATION_NAME@ 桌面同步客户端
|
||||
Icon[zh_CN]=@APPLICATION_EXECUTABLE@
|
||||
Icon[zh_CN]=@APPLICATION_ICON_NAME@
|
||||
Comment[zh_HK]=桌面版同步客户端
|
||||
Comment[zh_TW]=@APPLICATION_NAME@ 桌面同步客戶端
|
||||
GenericName[zh_TW]=資料夾同步
|
||||
Name[zh_TW]=@APPLICATION_NAME@ 桌面同步客戶端
|
||||
Icon[zh_TW]=@APPLICATION_EXECUTABLE@
|
||||
Icon[zh_TW]=@APPLICATION_ICON_NAME@
|
||||
Comment[es_AR]=Cliente de sincronización para escritorio @APPLICATION_NAME@
|
||||
GenericName[es_AR]=Sincronización de directorio
|
||||
Name[es_AR]=Cliente de sincronización para escritorio @APPLICATION_NAME@
|
||||
Icon[es_AR]=@APPLICATION_EXECUTABLE@
|
||||
Icon[es_AR]=@APPLICATION_ICON_NAME@
|
||||
Comment[lt_LT]=@APPLICATION_NAME@ darbalaukio sinchronizavimo programa
|
||||
GenericName[lt_LT]=Katalogo sinchnorizacija
|
||||
Name[lt_LT]=@APPLICATION_NAME@ darbalaukio programa
|
||||
Icon[lt_LT]=@APPLICATION_EXECUTABLE@
|
||||
Icon[lt_LT]=@APPLICATION_ICON_NAME@
|
||||
Comment[th_TH]=@APPLICATION_NAME@ ไคลเอนต์ประสานข้อมูลเดสก์ท็อป
|
||||
GenericName[th_TH]=ประสานข้อมูลโฟลเดอร์
|
||||
Name[th_TH]= @APPLICATION_NAME@ ไคลเอนต์ประสานข้อมูลเดสก์ท็อป
|
||||
Icon[th_TH]=@APPLICATION_EXECUTABLE@
|
||||
Icon[th_TH]=@APPLICATION_ICON_NAME@
|
||||
Comment[es_MX]=Cliente de escritorio para sincronziación de @APPLICATION_NAME@
|
||||
GenericName[es_MX]=Sincronización de Carpetas
|
||||
Name[es_MX]=Cliente de escritorio para sincronziación de @APPLICATION_NAME@
|
||||
Icon[es_MX]=@APPLICATION_EXECUTABLE@
|
||||
Icon[es_MX]=@APPLICATION_ICON_NAME@
|
||||
Comment[nb_NO]=@APPLICATION_NAME@ skrivebordssynkroniseringsklient
|
||||
GenericName[nb_NO]=Mappesynkronisering
|
||||
Name[nb_NO]=@APPLICATION_NAME@ skrivebordssynkroniseringsklient
|
||||
Icon[nb_NO]=@APPLICATION_EXECUTABLE@
|
||||
Icon[nb_NO]=@APPLICATION_ICON_NAME@
|
||||
Comment[nn_NO]=@APPLICATION_NAME@ klient for å synkronisera frå skrivebord
|
||||
GenericName[nn_NO]=Mappe synkronisering
|
||||
Name[nn_NO]=@APPLICATION_NAME@ klient for å synkronisera frå skrivebord
|
||||
Icon[nn_NO]=@APPLICATION_EXECUTABLE@
|
||||
Icon[nn_NO]=@APPLICATION_ICON_NAME@
|
||||
Comment[pt_PT]=@APPLICATION_NAME@ - Cliente de Sincronização para PC
|
||||
GenericName[pt_PT]=Sincronizar Pasta
|
||||
Name[pt_PT]=@APPLICATION_NAME@ - Cliente de Sincronização para PC
|
||||
Icon[pt_PT]=@APPLICATION_EXECUTABLE@
|
||||
Icon[km]=@APPLICATION_EXECUTABLE@
|
||||
Icon[pt_PT]=@APPLICATION_ICON_NAME@
|
||||
Icon[km]=@APPLICATION_ICON_NAME@
|
||||
Comment[lb]=@APPLICATION_NAME@ Desktop Synchronisatioun Client
|
||||
GenericName[lb]=Dossier Dync
|
||||
Name[lb]=@APPLICATION_NAME@ Desktop Sync Client
|
||||
Icon[lb]=@APPLICATION_EXECUTABLE@
|
||||
Icon[lb]=@APPLICATION_ICON_NAME@
|
||||
|
||||
@@ -22,11 +22,8 @@
|
||||
SyncClientProxy *_syncClientProxy;
|
||||
NSMutableSet *_registeredDirectories;
|
||||
NSString *_shareMenuTitle;
|
||||
NSString *_mirror_path;
|
||||
NSString *_fs_path;
|
||||
NSMutableDictionary *_strings;
|
||||
NSMutableArray *_menuItems;
|
||||
Boolean shouldBeChecked;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -76,10 +76,6 @@
|
||||
}
|
||||
|
||||
NSString* normalizedPath = [[url path] decomposedStringWithCanonicalMapping];
|
||||
if([normalizedPath containsString: _fs_path]) {
|
||||
[_syncClientProxy askForIcon:normalizedPath isDirectory:isDir];
|
||||
normalizedPath = [normalizedPath stringByReplacingOccurrencesOfString: _fs_path withString: _mirror_path];
|
||||
}
|
||||
[_syncClientProxy askForIcon:normalizedPath isDirectory:isDir];
|
||||
}
|
||||
|
||||
@@ -121,16 +117,9 @@
|
||||
|
||||
NSString *paths = [self selectedPathsSeparatedByRecordSeparator];
|
||||
// calling this IPC calls us back from client with several MENU_ITEM entries and then our askOnSocket returns again
|
||||
if([paths containsString:_fs_path]) {
|
||||
paths = [paths stringByReplacingOccurrencesOfString:_fs_path withString:_mirror_path];
|
||||
}
|
||||
|
||||
[_syncClientProxy askOnSocket:paths query:@"GET_MENU_ITEMS"];
|
||||
|
||||
id contextMenuTitle = [_strings objectForKey:@"CONTEXT_MENU_TITLE"];
|
||||
|
||||
[_syncClientProxy askOnSocket:paths query:@"GET_DOWNLOAD_MODE"];
|
||||
|
||||
if (contextMenuTitle && !onlyRootsSelected) {
|
||||
NSMenu *menu = [[NSMenu alloc] initWithTitle:@""];
|
||||
NSMenu *subMenu = [[NSMenu alloc] initWithTitle:@""];
|
||||
@@ -145,22 +134,12 @@
|
||||
NSMenuItem *actionItem = [subMenu addItemWithTitle:[item valueForKey:@"text"]
|
||||
action:@selector(subMenuActionClicked:)
|
||||
keyEquivalent:@""];
|
||||
|
||||
NSString *command = [[_menuItems objectAtIndex:idx] valueForKey:@"command"];
|
||||
if(shouldBeChecked && [command isEqualToString:@"OFFLINE_DOWNLOAD_MODE"]) {
|
||||
actionItem.state = NSOnState;
|
||||
} else if(!shouldBeChecked && [command isEqualToString:@"ONLINE_DOWNLOAD_MODE"]) {
|
||||
actionItem.state = NSOnState;
|
||||
} else {
|
||||
actionItem.state = NSOffState;
|
||||
}
|
||||
[actionItem setTag:idx];
|
||||
[actionItem setTarget:self];
|
||||
NSString *flags = [item valueForKey:@"flags"]; // e.g. "d"
|
||||
//if ([flags rangeOfString:@"d"].location != NSNotFound) {
|
||||
// [actionItem setEnabled:false];
|
||||
//}
|
||||
|
||||
if ([flags rangeOfString:@"d"].location != NSNotFound) {
|
||||
[actionItem setEnabled:false];
|
||||
}
|
||||
idx++;
|
||||
}
|
||||
return menu;
|
||||
@@ -168,14 +147,10 @@
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (void)subMenuActionClicked:(id)sender
|
||||
{
|
||||
- (void)subMenuActionClicked:(id)sender {
|
||||
long idx = [(NSMenuItem*)sender tag];
|
||||
NSString *command = [[_menuItems objectAtIndex:idx] valueForKey:@"command"];
|
||||
NSString *paths = [self selectedPathsSeparatedByRecordSeparator];
|
||||
if([paths containsString: _fs_path]) {
|
||||
paths = [paths stringByReplacingOccurrencesOfString: _fs_path withString: _mirror_path];
|
||||
}
|
||||
[_syncClientProxy askOnSocket:paths query:command];
|
||||
}
|
||||
|
||||
@@ -184,23 +159,9 @@
|
||||
- (void)setResultForPath:(NSString*)path result:(NSString*)result
|
||||
{
|
||||
NSString *normalizedPath = [path decomposedStringWithCanonicalMapping];
|
||||
if([normalizedPath containsString: _mirror_path]) {
|
||||
[[FIFinderSyncController defaultController] setBadgeIdentifier:result forURL:[NSURL fileURLWithPath:normalizedPath]];
|
||||
normalizedPath = [normalizedPath stringByReplacingOccurrencesOfString: _mirror_path withString: _fs_path];
|
||||
}
|
||||
|
||||
[[FIFinderSyncController defaultController] setBadgeIdentifier:result forURL:[NSURL fileURLWithPath:normalizedPath]];
|
||||
}
|
||||
|
||||
- (void)setDownloadMode:(NSString *)mode
|
||||
{
|
||||
if( [mode isEqualToString:@"OFFLINE"] ) {
|
||||
shouldBeChecked = true;
|
||||
} else {
|
||||
shouldBeChecked = false;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)reFetchFileNameCacheForPath:(NSString*)path
|
||||
{
|
||||
}
|
||||
@@ -209,21 +170,12 @@
|
||||
{
|
||||
assert(_registeredDirectories);
|
||||
[_registeredDirectories addObject:[NSURL fileURLWithPath:path]];
|
||||
_mirror_path = path;
|
||||
}
|
||||
|
||||
- (void)registerFs:(NSString*)path
|
||||
{
|
||||
assert(_registeredDirectories);
|
||||
[_registeredDirectories addObject:[NSURL fileURLWithPath:path]];
|
||||
_fs_path = path;
|
||||
[FIFinderSyncController defaultController].directoryURLs = _registeredDirectories;
|
||||
}
|
||||
|
||||
- (void)unregisterPath:(NSString*)path
|
||||
{
|
||||
[_registeredDirectories removeObject:[NSURL fileURLWithPath:path]];
|
||||
[_registeredDirectories removeObject:[NSURL fileURLWithPath:_fs_path]];
|
||||
[FIFinderSyncController defaultController].directoryURLs = _registeredDirectories;
|
||||
}
|
||||
|
||||
@@ -236,9 +188,7 @@
|
||||
{
|
||||
_menuItems = [[NSMutableArray alloc] init];
|
||||
}
|
||||
|
||||
- (void)addMenuItem:(NSDictionary *)item
|
||||
{
|
||||
- (void)addMenuItem:(NSDictionary *)item {
|
||||
[_menuItems addObject:item];
|
||||
}
|
||||
|
||||
@@ -255,4 +205,5 @@
|
||||
[FIFinderSyncController defaultController].directoryURLs = nil;
|
||||
}
|
||||
|
||||
@end
|
||||
@end
|
||||
|
||||
|
||||
@@ -17,10 +17,8 @@
|
||||
|
||||
@protocol SyncClientProxyDelegate <NSObject>
|
||||
- (void)setResultForPath:(NSString*)path result:(NSString*)result;
|
||||
- (void)setDownloadMode:(NSString*)mode;
|
||||
- (void)reFetchFileNameCacheForPath:(NSString*)path;
|
||||
- (void)registerPath:(NSString*)path;
|
||||
- (void)registerFs:(NSString*)path;
|
||||
- (void)unregisterPath:(NSString*)path;
|
||||
- (void)setString:(NSString*)key value:(NSString*)value;
|
||||
- (void)resetMenuItems;
|
||||
|
||||
@@ -113,15 +113,9 @@
|
||||
} else if( [[chunks objectAtIndex:0] isEqualToString:@"UPDATE_VIEW"] ) {
|
||||
NSString *path = [chunks objectAtIndex:1];
|
||||
[_delegate reFetchFileNameCacheForPath:path];
|
||||
} else if( [[chunks objectAtIndex:0] isEqualToString:@"GET_DOWNLOAD_MODE"] ) {
|
||||
NSString *mode = [chunks objectAtIndex:1];
|
||||
[_delegate setDownloadMode:mode];
|
||||
} else if( [[chunks objectAtIndex:0 ] isEqualToString:@"REGISTER_PATH"] ) {
|
||||
NSString *path = [chunks objectAtIndex:1];
|
||||
[_delegate registerPath:path];
|
||||
} else if( [[chunks objectAtIndex:0 ] isEqualToString:@"REGISTER_DRIVEFS"] ) {
|
||||
NSString *path = [chunks objectAtIndex:1];
|
||||
[_delegate registerFs:path];
|
||||
} else if( [[chunks objectAtIndex:0 ] isEqualToString:@"UNREGISTER_PATH"] ) {
|
||||
NSString *path = [chunks objectAtIndex:1];
|
||||
[_delegate unregisterPath:path];
|
||||
|
||||
@@ -234,7 +234,7 @@ class MenuExtension(GObject.GObject, Nautilus.MenuProvider):
|
||||
def ask_for_menu_items(self, files):
|
||||
record_separator = '\x1e'
|
||||
filesstring = record_separator.join(files)
|
||||
socketConnect.sendCommand('GET_MENU_ITEMS:{}\n'.format(filesstring))
|
||||
socketConnect.sendCommand(u'GET_MENU_ITEMS:{}\n'.format(filesstring))
|
||||
|
||||
done = False
|
||||
start = time.time()
|
||||
|
||||
@@ -34,7 +34,7 @@ using namespace std;
|
||||
#define PIPE_TIMEOUT 5*1000 //ms
|
||||
#define SOCK_BUFFER 4096
|
||||
|
||||
OCClientInterface::ContextMenuInfo OCClientInterface::FetchInfo()
|
||||
OCClientInterface::ContextMenuInfo OCClientInterface::FetchInfo(const std::wstring &files)
|
||||
{
|
||||
auto pipename = CommunicationSocket::DefaultPipePath();
|
||||
|
||||
@@ -45,36 +45,32 @@ OCClientInterface::ContextMenuInfo OCClientInterface::FetchInfo()
|
||||
if (!socket.Connect(pipename)) {
|
||||
return {};
|
||||
}
|
||||
socket.SendMsg(L"SHARE_MENU_TITLE\n");
|
||||
socket.SendMsg(L"GET_STRINGS:CONTEXT_MENU_TITLE\n");
|
||||
socket.SendMsg((L"GET_MENU_ITEMS:" + files + L"\n").data());
|
||||
|
||||
ContextMenuInfo info;
|
||||
std::wstring response;
|
||||
int sleptCount = 0;
|
||||
while (sleptCount < 5) {
|
||||
if (socket.ReadLine(&response)) {
|
||||
if (StringUtil::begins_with(response, wstring(L"REGISTER_DRIVEFS:"))) {
|
||||
wstring responsePath = response.substr(17); // length of REGISTER_DRIVEFS:
|
||||
info._defaultFileStreamLetterDrive = responsePath;
|
||||
//setLetterDrive(responsePath);
|
||||
}
|
||||
else if (StringUtil::begins_with(response, wstring(L"REGISTER_PATH:"))) {
|
||||
if (StringUtil::begins_with(response, wstring(L"REGISTER_PATH:"))) {
|
||||
wstring responsePath = response.substr(14); // length of REGISTER_PATH
|
||||
info.watchedDirectories.push_back(responsePath);
|
||||
}
|
||||
else if (StringUtil::begins_with(response, wstring(L"SHARE_MENU_TITLE:"))) {
|
||||
info.shareMenuTitle = response.substr(17); // length of SHARE_MENU_TITLE:
|
||||
else if (StringUtil::begins_with(response, wstring(L"STRING:"))) {
|
||||
wstring stringName, stringValue;
|
||||
if (!StringUtil::extractChunks(response, stringName, stringValue))
|
||||
continue;
|
||||
if (stringName == L"CONTEXT_MENU_TITLE")
|
||||
info.contextMenuTitle = move(stringValue);
|
||||
} else if (StringUtil::begins_with(response, wstring(L"MENU_ITEM:"))) {
|
||||
wstring commandName, flags, title;
|
||||
if (!StringUtil::extractChunks(response, commandName, flags, title))
|
||||
continue;
|
||||
info.menuItems.push_back({ commandName, flags, title });
|
||||
} else if (StringUtil::begins_with(response, wstring(L"GET_MENU_ITEMS:END"))) {
|
||||
break; // Stop once we completely received the last sent request
|
||||
}
|
||||
else if (StringUtil::begins_with(response, wstring(L"STREAM_SUBMENU_TITLE:"))) {
|
||||
info.streamSubMenuTitle = response.substr(21);
|
||||
}
|
||||
else if (StringUtil::begins_with(response, wstring(L"STREAM_OFFLINE_ITEM_TITLE:"))) {
|
||||
info.streamOfflineItemTitle = response.substr(26);
|
||||
}
|
||||
else if (StringUtil::begins_with(response, wstring(L"STREAM_ONLINE_ITEM_TITLE:"))) {
|
||||
info.streamOnlineItemTitle = response.substr(25);
|
||||
break; // Stop once we received the last sent request
|
||||
}
|
||||
|
||||
}
|
||||
else {
|
||||
Sleep(50);
|
||||
@@ -84,7 +80,7 @@ OCClientInterface::ContextMenuInfo OCClientInterface::FetchInfo()
|
||||
return info;
|
||||
}
|
||||
|
||||
void OCClientInterface::ShareObject(const std::wstring &path)
|
||||
void OCClientInterface::SendRequest(const wchar_t *verb, const std::wstring &path)
|
||||
{
|
||||
auto pipename = CommunicationSocket::DefaultPipePath();
|
||||
|
||||
@@ -97,73 +93,8 @@ void OCClientInterface::ShareObject(const std::wstring &path)
|
||||
}
|
||||
|
||||
wchar_t msg[SOCK_BUFFER] = { 0 };
|
||||
if (SUCCEEDED(StringCchPrintf(msg, SOCK_BUFFER, L"SHARE:%s\n", path.c_str())))
|
||||
if (SUCCEEDED(StringCchPrintf(msg, SOCK_BUFFER, L"%s:%s\n", verb, path.c_str())))
|
||||
{
|
||||
socket.SendMsg(msg);
|
||||
}
|
||||
}
|
||||
|
||||
void OCClientInterface::SetDownloadMode(const std::wstring &path, bool online)
|
||||
{
|
||||
auto pipename = CommunicationSocket::DefaultPipePath();
|
||||
|
||||
CommunicationSocket socket;
|
||||
if (!WaitNamedPipe(pipename.data(), PIPE_TIMEOUT)) {
|
||||
return;
|
||||
}
|
||||
if (!socket.Connect(pipename)) {
|
||||
return;
|
||||
}
|
||||
|
||||
wchar_t msg[SOCK_BUFFER] = { 0 };
|
||||
if (SUCCEEDED(StringCchPrintf(msg,
|
||||
SOCK_BUFFER,
|
||||
L"SET_DOWNLOAD_MODE:%s|%d\n",
|
||||
path.c_str(),
|
||||
online)
|
||||
)
|
||||
)
|
||||
{
|
||||
socket.SendMsg(msg);
|
||||
}
|
||||
}
|
||||
|
||||
std::wstring OCClientInterface::GetDownloadMode(const std::wstring &path)
|
||||
{
|
||||
CommunicationSocket socket;
|
||||
auto pipename = CommunicationSocket::DefaultPipePath();
|
||||
|
||||
if (!WaitNamedPipe(pipename.data(), PIPE_TIMEOUT))
|
||||
return L"";
|
||||
if (!socket.Connect(pipename))
|
||||
return L"";
|
||||
|
||||
wchar_t msg[SOCK_BUFFER] = { 0 };
|
||||
if (!SUCCEEDED(
|
||||
StringCchPrintf(msg,
|
||||
SOCK_BUFFER,
|
||||
L"GET_DOWNLOAD_MODE:%s\n",
|
||||
path.c_str())
|
||||
)
|
||||
)
|
||||
return L"";
|
||||
|
||||
socket.SendMsg(msg);
|
||||
std::wstring response;
|
||||
|
||||
int sleptCount = 0;
|
||||
while (sleptCount < 5)
|
||||
if (socket.ReadLine(&response))
|
||||
{
|
||||
if (StringUtil::begins_with(response, wstring(L"GET_DOWNLOAD_MODE:"))) {
|
||||
wstring downloadMode = response.substr(18);
|
||||
return downloadMode;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Sleep(50);
|
||||
++sleptCount;
|
||||
}
|
||||
return L"";
|
||||
}
|
||||
|
||||
@@ -45,18 +45,15 @@ class OCClientInterface
|
||||
public:
|
||||
struct ContextMenuInfo {
|
||||
std::vector<std::wstring> watchedDirectories;
|
||||
std::wstring shareMenuTitle;
|
||||
std::wstring streamSubMenuTitle;
|
||||
std::wstring streamOfflineItemTitle;
|
||||
std::wstring streamOnlineItemTitle;
|
||||
std::wstring _defaultFileStreamLetterDrive;
|
||||
|
||||
std::wstring contextMenuTitle;
|
||||
struct MenuItem
|
||||
{
|
||||
std::wstring command, flags, title;
|
||||
};
|
||||
std::vector<MenuItem> menuItems;
|
||||
};
|
||||
static ContextMenuInfo FetchInfo();
|
||||
static void ShareObject(const std::wstring &path);
|
||||
static void SetDownloadMode(const std::wstring &path, bool online);
|
||||
static std::wstring GetDownloadMode(const std::wstring &path);
|
||||
|
||||
static ContextMenuInfo FetchInfo(const std::wstring &files);
|
||||
static void SendRequest(const wchar_t *verb, const std::wstring &path);
|
||||
};
|
||||
|
||||
#endif //ABSTRACTSOCKETHANDLER_H
|
||||
|
||||
@@ -21,31 +21,11 @@
|
||||
#include <shlwapi.h>
|
||||
#include <shellapi.h>
|
||||
#include <StringUtil.h>
|
||||
#include <assert.h>
|
||||
|
||||
extern HINSTANCE g_hInst;
|
||||
extern long g_cDllRef;
|
||||
|
||||
#define IDM_FIRST 0
|
||||
#define IDM_SHARE 0
|
||||
#define IDM_DRIVEMENU 1
|
||||
#define IDM_DRIVEMENU_OFFLINE 2
|
||||
#define IDM_DRIVEMENU_ONLINE 3
|
||||
#define IDM_LAST 4
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
OCContextMenu::OCContextMenu(void)
|
||||
: m_cRef(1)
|
||||
, m_pszMenuText(L"&Share")
|
||||
, m_pszVerb("ocshare")
|
||||
, m_pwszVerb(L"ocshare")
|
||||
, m_pszVerbCanonicalName("OCShareViaOC")
|
||||
, m_pwszVerbCanonicalName(L"OCShareViaOC")
|
||||
, m_pszVerbHelpText("Share via ownCloud")
|
||||
, m_pwszVerbHelpText(L"Share via ownCloud")
|
||||
{
|
||||
InterlockedIncrement(&g_cDllRef);
|
||||
}
|
||||
@@ -55,14 +35,6 @@ OCContextMenu::~OCContextMenu(void)
|
||||
InterlockedDecrement(&g_cDllRef);
|
||||
}
|
||||
|
||||
|
||||
void OCContextMenu::OnVerbDisplayFileName(HWND hWnd)
|
||||
{
|
||||
OCClientInterface::ContextMenuInfo info = OCClientInterface::FetchInfo();
|
||||
OCClientInterface::ShareObject(std::wstring(m_szSelectedFile));
|
||||
}
|
||||
|
||||
|
||||
#pragma region IUnknown
|
||||
|
||||
// Query to the interface the component supported.
|
||||
@@ -103,12 +75,12 @@ IFACEMETHODIMP_(ULONG) OCContextMenu::Release()
|
||||
IFACEMETHODIMP OCContextMenu::Initialize(
|
||||
LPCITEMIDLIST pidlFolder, LPDATAOBJECT pDataObj, HKEY hKeyProgID)
|
||||
{
|
||||
m_selectedFiles.clear();
|
||||
|
||||
if (!pDataObj) {
|
||||
return E_INVALIDARG;
|
||||
}
|
||||
|
||||
HRESULT hr = E_FAIL;
|
||||
|
||||
FORMATETC fe = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
|
||||
STGMEDIUM stm;
|
||||
|
||||
@@ -116,14 +88,19 @@ IFACEMETHODIMP OCContextMenu::Initialize(
|
||||
// Get an HDROP handle.
|
||||
HDROP hDrop = static_cast<HDROP>(GlobalLock(stm.hGlobal));
|
||||
if (hDrop) {
|
||||
// Ignore multi-selections
|
||||
UINT nFiles = DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0);
|
||||
if (nFiles == 1) {
|
||||
for (int i = 0; i < nFiles; ++i) {
|
||||
// Get the path of the file.
|
||||
if (0 != DragQueryFile(hDrop, 0, m_szSelectedFile, ARRAYSIZE(m_szSelectedFile)))
|
||||
{
|
||||
hr = S_OK;
|
||||
wchar_t buffer[MAX_PATH];
|
||||
|
||||
if (!DragQueryFile(hDrop, i, buffer, ARRAYSIZE(buffer))) {
|
||||
m_selectedFiles.clear();
|
||||
break;
|
||||
}
|
||||
|
||||
if (i)
|
||||
m_selectedFiles += L'\x1e';
|
||||
m_selectedFiles += buffer;
|
||||
}
|
||||
|
||||
GlobalUnlock(stm.hGlobal);
|
||||
@@ -134,7 +111,7 @@ IFACEMETHODIMP OCContextMenu::Initialize(
|
||||
|
||||
// If any value other than S_OK is returned from the method, the context
|
||||
// menu item is not displayed.
|
||||
return hr;
|
||||
return m_selectedFiles.empty() ? E_FAIL : S_OK;
|
||||
}
|
||||
|
||||
#pragma endregion
|
||||
@@ -153,236 +130,86 @@ void InsertSeperator(HMENU hMenu, UINT indexMenu)
|
||||
|
||||
IFACEMETHODIMP OCContextMenu::QueryContextMenu(HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags)
|
||||
{
|
||||
//< Comment for file streaming test.
|
||||
/*
|
||||
// If uFlags include CMF_DEFAULTONLY then we should not do anything.
|
||||
if (CMF_DEFAULTONLY & uFlags)
|
||||
{
|
||||
return MAKE_HRESULT(SEVERITY_SUCCESS, 0, USHORT(0));
|
||||
}
|
||||
*/
|
||||
|
||||
OCClientInterface::ContextMenuInfo info = OCClientInterface::FetchInfo();
|
||||
|
||||
bool skip = true;
|
||||
size_t selectedFileLength = wcslen(m_szSelectedFile);
|
||||
for (const std::wstring path : info.watchedDirectories) {
|
||||
if (StringUtil::isDescendantOf(m_szSelectedFile, selectedFileLength, path)){
|
||||
skip = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (skip) {
|
||||
m_info = OCClientInterface::FetchInfo(m_selectedFiles);
|
||||
if (m_info.menuItems.empty()) {
|
||||
return MAKE_HRESULT(SEVERITY_SUCCESS, 0, USHORT(0));
|
||||
}
|
||||
|
||||
InsertSeperator(hMenu, indexMenu);
|
||||
indexMenu++;
|
||||
InsertSeperator(hMenu, indexMenu++);
|
||||
|
||||
// Query the download mode
|
||||
std::wstring downloadMode = OCClientInterface::GetDownloadMode(m_szSelectedFile);
|
||||
bool checkOnlineItem = downloadMode == L"ONLINE";
|
||||
bool checkOfflineItem = downloadMode == L"OFFLINE";
|
||||
|
||||
// Insert the drive Online|Offline submenu
|
||||
HMENU hSubmenu = CreateMenu();
|
||||
{
|
||||
// Create the submenu
|
||||
HMENU hDriveSubMenu = CreateMenu();
|
||||
if (!hDriveSubMenu)
|
||||
MENUITEMINFO mii = { sizeof(mii) };
|
||||
mii.fMask = MIIM_SUBMENU | MIIM_FTYPE | MIIM_STRING;
|
||||
mii.hSubMenu = hSubmenu;
|
||||
mii.fType = MFT_STRING;
|
||||
mii.dwTypeData = &m_info.contextMenuTitle[0];
|
||||
|
||||
if (!InsertMenuItem(hMenu, indexMenu++, TRUE, &mii))
|
||||
return HRESULT_FROM_WIN32(GetLastError());
|
||||
// Setup the "Online" item
|
||||
MENUITEMINFO menuInfoDriveOnline {0};
|
||||
menuInfoDriveOnline.cbSize = sizeof (MENUITEMINFO);
|
||||
menuInfoDriveOnline.fMask = MIIM_STRING;
|
||||
menuInfoDriveOnline.dwTypeData = &info.streamOnlineItemTitle[0];
|
||||
menuInfoDriveOnline.fMask |= MIIM_ID;
|
||||
menuInfoDriveOnline.wID = idCmdFirst + IDM_DRIVEMENU_ONLINE;
|
||||
menuInfoDriveOnline.fMask |= MIIM_STATE;
|
||||
menuInfoDriveOnline.fState = MFS_ENABLED;
|
||||
if (checkOnlineItem)
|
||||
menuInfoDriveOnline.fState |= MFS_CHECKED;
|
||||
// Insert it into the submenu
|
||||
if(!InsertMenuItem(hDriveSubMenu,
|
||||
0, // At position zero
|
||||
TRUE, // indicates the existing item by using its zero-based position. (For example, the first item in the menu has a position of 0.)
|
||||
&menuInfoDriveOnline
|
||||
))
|
||||
{
|
||||
return HRESULT_FROM_WIN32(GetLastError());
|
||||
}
|
||||
|
||||
|
||||
// Setup the "Online" item
|
||||
MENUITEMINFO menuInfoDriveOffline {0};
|
||||
menuInfoDriveOffline.cbSize = sizeof (MENUITEMINFO);
|
||||
menuInfoDriveOffline.fMask = MIIM_STRING;
|
||||
menuInfoDriveOffline.dwTypeData = &info.streamOfflineItemTitle[0];
|
||||
menuInfoDriveOffline.fMask |= MIIM_ID;
|
||||
menuInfoDriveOffline.wID = idCmdFirst + IDM_DRIVEMENU_OFFLINE;
|
||||
menuInfoDriveOffline.fMask |= MIIM_STATE;
|
||||
menuInfoDriveOffline.fState = MFS_ENABLED;
|
||||
if (checkOfflineItem)
|
||||
menuInfoDriveOffline.fState |= MFS_CHECKED;
|
||||
// Insert it into the submenu
|
||||
if (!InsertMenuItem(hDriveSubMenu,
|
||||
1, // At position one
|
||||
TRUE, // indicates the existing item by using its zero-based position. (For example, the first item in the menu has a position of 0.)
|
||||
&menuInfoDriveOffline
|
||||
))
|
||||
return HRESULT_FROM_WIN32(GetLastError());
|
||||
|
||||
|
||||
// Setup the "Share" item
|
||||
MENUITEMINFO menuInfoDriveShare{ 0 };
|
||||
menuInfoDriveShare.cbSize = sizeof(MENUITEMINFO);
|
||||
menuInfoDriveShare.fMask = MIIM_STRING;
|
||||
menuInfoDriveShare.dwTypeData = &info.shareMenuTitle[0];
|
||||
menuInfoDriveShare.fMask |= MIIM_ID;
|
||||
menuInfoDriveShare.wID = idCmdFirst + IDM_SHARE;
|
||||
menuInfoDriveShare.fMask |= MIIM_STATE;
|
||||
menuInfoDriveShare.fState = MFS_ENABLED;
|
||||
|
||||
//if (checkOfflineItem)
|
||||
//menuInfoDriveShare.fState |= MFS_CHECKED;
|
||||
|
||||
// Insert it into the submenu
|
||||
if (!InsertMenuItem(hDriveSubMenu,
|
||||
2, // At position one
|
||||
TRUE, // indicates the existing item by using its zero-based position. (For example, the first item in the menu has a position of 0.)
|
||||
&menuInfoDriveShare
|
||||
))
|
||||
return HRESULT_FROM_WIN32(GetLastError());
|
||||
|
||||
|
||||
// Insert the submenu below the "share" item
|
||||
MENUITEMINFO hDriveSubMenuInfo;
|
||||
hDriveSubMenuInfo.cbSize = sizeof (MENUITEMINFO);
|
||||
hDriveSubMenuInfo.fMask = MIIM_SUBMENU | MIIM_STATE | MIIM_STRING;
|
||||
hDriveSubMenuInfo.fState = MFS_ENABLED;
|
||||
// TODO: obtener el texto del cliente/gui
|
||||
hDriveSubMenuInfo.dwTypeData = &info.streamSubMenuTitle[0];
|
||||
hDriveSubMenuInfo.hSubMenu = hDriveSubMenu;
|
||||
|
||||
// Insert the subitem into the
|
||||
if (!InsertMenuItem(hMenu,
|
||||
indexMenu++,
|
||||
TRUE,
|
||||
&hDriveSubMenuInfo
|
||||
))
|
||||
return HRESULT_FROM_WIN32(GetLastError());
|
||||
|
||||
}
|
||||
InsertSeperator(hMenu, indexMenu++);
|
||||
|
||||
indexMenu++;
|
||||
InsertSeperator(hMenu, indexMenu);
|
||||
UINT indexSubMenu = 0;
|
||||
for (auto &item : m_info.menuItems) {
|
||||
bool disabled = item.flags.find(L'd') != std::string::npos;
|
||||
|
||||
MENUITEMINFO mii = { sizeof(mii) };
|
||||
mii.fMask = MIIM_ID | MIIM_FTYPE | MIIM_STRING | MIIM_STATE;
|
||||
mii.wID = idCmdFirst + indexSubMenu;
|
||||
mii.fType = MFT_STRING;
|
||||
mii.dwTypeData = &item.title[0];
|
||||
mii.fState = disabled ? MFS_DISABLED : MFS_ENABLED;
|
||||
|
||||
if (!InsertMenuItem(hSubmenu, indexSubMenu, true, &mii))
|
||||
return HRESULT_FROM_WIN32(GetLastError());
|
||||
indexSubMenu++;
|
||||
}
|
||||
|
||||
// Return an HRESULT value with the severity set to SEVERITY_SUCCESS.
|
||||
// Set the code value to the offset of the largest command identifier
|
||||
// that was assigned, plus one (1).
|
||||
|
||||
//< Comment for file streaming test.
|
||||
//return MAKE_HRESULT(SEVERITY_SUCCESS, 0, USHORT(IDM_SHARE + 1));
|
||||
|
||||
//< Append for file streaming test.
|
||||
return MAKE_HRESULT(SEVERITY_SUCCESS, 0, USHORT(IDM_LAST));
|
||||
return MAKE_HRESULT(SEVERITY_SUCCESS, 0, USHORT(indexSubMenu));
|
||||
}
|
||||
|
||||
IFACEMETHODIMP OCContextMenu::InvokeCommand(LPCMINVOKECOMMANDINFO pici)
|
||||
{
|
||||
std::wstring command;
|
||||
|
||||
// For the Unicode case, if the high-order word is not zero, the
|
||||
// command's verb string is in lpcmi->lpVerbW.
|
||||
if (HIWORD(((CMINVOKECOMMANDINFOEX*)pici)->lpVerbW))
|
||||
{
|
||||
// Is the verb supported by this context menu extension?
|
||||
if (StrCmpIW(((CMINVOKECOMMANDINFOEX*)pici)->lpVerbW, m_pwszVerb) == 0)
|
||||
{
|
||||
OnVerbDisplayFileName(pici->hwnd);
|
||||
}
|
||||
else
|
||||
{
|
||||
// If the verb is not recognized by the context menu handler, it
|
||||
// must return E_FAIL to allow it to be passed on to the other
|
||||
// context menu handlers that might implement that verb.
|
||||
command = ((CMINVOKECOMMANDINFOEX *)pici)->lpVerbW;
|
||||
} else {
|
||||
// If the command cannot be identified through the verb string, then
|
||||
// check the identifier offset.
|
||||
|
||||
auto offset = LOWORD(pici->lpVerb);
|
||||
if (offset >= m_info.menuItems.size())
|
||||
return E_FAIL;
|
||||
}
|
||||
}
|
||||
|
||||
// If the command cannot be identified through the verb string, then
|
||||
// check the identifier offset.
|
||||
else
|
||||
{
|
||||
// Is the command identifier offset supported by this context menu
|
||||
// extension?
|
||||
if (LOWORD(pici->lpVerb) == IDM_SHARE)
|
||||
{
|
||||
OnVerbDisplayFileName(pici->hwnd);
|
||||
}
|
||||
else if (LOWORD(pici->lpVerb) == IDM_DRIVEMENU_ONLINE)
|
||||
{
|
||||
OnDriveMenuOnline(pici->hwnd);
|
||||
}
|
||||
else if (LOWORD(pici->lpVerb) == IDM_DRIVEMENU_OFFLINE)
|
||||
{
|
||||
OnDriveMenuOffline(pici->hwnd);
|
||||
}
|
||||
else
|
||||
{
|
||||
// If the verb is not recognized by the context menu handler, it
|
||||
// must return E_FAIL to allow it to be passed on to the other
|
||||
// context menu handlers that might implement that verb.
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
command = m_info.menuItems[offset].command;
|
||||
}
|
||||
|
||||
OCClientInterface::SendRequest(command.data(), m_selectedFiles);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
IFACEMETHODIMP OCContextMenu::GetCommandString(UINT_PTR idCommand,
|
||||
UINT uFlags, UINT *pwReserved, LPSTR pszName, UINT cchMax)
|
||||
{
|
||||
HRESULT hr = E_INVALIDARG;
|
||||
|
||||
if (idCommand == IDM_SHARE)
|
||||
{
|
||||
switch (uFlags)
|
||||
{
|
||||
case GCS_HELPTEXTW:
|
||||
// Only useful for pre-Vista versions of Windows that have a
|
||||
// Status bar.
|
||||
hr = StringCchCopy(reinterpret_cast<PWSTR>(pszName), cchMax,
|
||||
m_pwszVerbHelpText);
|
||||
break;
|
||||
|
||||
case GCS_VERBW:
|
||||
// GCS_VERBW is an optional feature that enables a caller to
|
||||
// discover the canonical name for the verb passed in through
|
||||
// idCommand.
|
||||
hr = StringCchCopy(reinterpret_cast<PWSTR>(pszName), cchMax,
|
||||
m_pwszVerbCanonicalName);
|
||||
break;
|
||||
|
||||
default:
|
||||
hr = S_OK;
|
||||
}
|
||||
if (idCommand < m_info.menuItems.size() && uFlags == GCS_VERBW) {
|
||||
return StringCchCopyW(reinterpret_cast<PWSTR>(pszName), cchMax,
|
||||
m_info.menuItems[idCommand].command.data());
|
||||
}
|
||||
|
||||
// If the command (idCommand) is not supported by this context menu
|
||||
// extension handler, return E_INVALIDARG.
|
||||
|
||||
return hr;
|
||||
return E_INVALIDARG;
|
||||
}
|
||||
|
||||
void OCContextMenu::OnDriveMenuOffline(HWND hWnd)
|
||||
{
|
||||
OCClientInterface::SetDownloadMode(std::wstring(m_szSelectedFile), false);
|
||||
}
|
||||
|
||||
void OCContextMenu::OnDriveMenuOnline(HWND hWnd)
|
||||
{
|
||||
OCClientInterface::SetDownloadMode(std::wstring(m_szSelectedFile), true);
|
||||
}
|
||||
|
||||
|
||||
#pragma endregion
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
|
||||
#pragma once
|
||||
#include <shlobj.h> // For IShellExtInit and IContextMenu
|
||||
#include <string>
|
||||
#include "OCClientInterface.h"
|
||||
|
||||
class OCContextMenu : public IShellExtInit, public IContextMenu
|
||||
{
|
||||
@@ -43,27 +45,9 @@ private:
|
||||
// Reference count of component.
|
||||
long m_cRef;
|
||||
|
||||
// The name of the selected file.
|
||||
wchar_t m_szSelectedFile[MAX_PATH];
|
||||
|
||||
// The method that handles the "display" verb.
|
||||
void OnVerbDisplayFileName(HWND hWnd);
|
||||
|
||||
/// @brief changes the
|
||||
/// @param hWnd
|
||||
void OnDriveMenuOnline(HWND hWnd);
|
||||
|
||||
/// @brief
|
||||
/// @param hWnd
|
||||
void OnDriveMenuOffline(HWND hWnd);
|
||||
|
||||
PWSTR m_pszMenuText;
|
||||
PCSTR m_pszVerb;
|
||||
PCWSTR m_pwszVerb;
|
||||
PCSTR m_pszVerbCanonicalName;
|
||||
PCWSTR m_pwszVerbCanonicalName;
|
||||
PCSTR m_pszVerbHelpText;
|
||||
PCWSTR m_pwszVerbHelpText;
|
||||
// The name of the selected files (separated by '\x1e')
|
||||
std::wstring m_selectedFiles;
|
||||
OCClientInterface::ContextMenuInfo m_info;
|
||||
};
|
||||
|
||||
#endif //OCCONTEXTMENU_H
|
||||
|
||||
@@ -72,14 +72,13 @@ void RemotePathChecker::workerThreadLoop()
|
||||
|
||||
std::wstring response;
|
||||
while (!_stop && socket.ReadLine(&response)) {
|
||||
if (StringUtil::begins_with(response, wstring(L"REGISTER_PATH:"))) {
|
||||
if (StringUtil::begins_with(response, wstring(L"REGISTER_PATH:"))) {
|
||||
wstring responsePath = response.substr(14); // length of REGISTER_PATH:
|
||||
|
||||
auto sharedPtrCopy = atomic_load(&_watchedDirectories);
|
||||
auto vectorCopy = make_shared<vector<wstring>>(*sharedPtrCopy);
|
||||
vectorCopy->push_back(responsePath);
|
||||
|
||||
atomic_store(&_watchedDirectories, shared_ptr<const vector<wstring>>(vectorCopy));
|
||||
atomic_store(&_watchedDirectories, shared_ptr<const vector<wstring>>(vectorCopy));
|
||||
|
||||
// We don't keep track of all files and can't know which file is currently visible
|
||||
// to the user, but at least reload the root dir so that any shortcut to the root
|
||||
@@ -198,8 +197,6 @@ bool RemotePathChecker::IsMonitoredPath(const wchar_t* filePath, int* state)
|
||||
}
|
||||
|
||||
auto path = std::wstring(filePath);
|
||||
_pending.push(filePath);
|
||||
|
||||
|
||||
auto it = _cache.find(path);
|
||||
if (it != _cache.end()) {
|
||||
|
||||
@@ -40,11 +40,8 @@ public:
|
||||
~RemotePathChecker();
|
||||
std::shared_ptr<const std::vector<std::wstring>> WatchedDirectories() const;
|
||||
bool IsMonitoredPath(const wchar_t* filePath, int* state);
|
||||
void setLetterDrive(std::wstring str);
|
||||
std::wstring getLetterDrive();
|
||||
|
||||
private:
|
||||
std::wstring _defaultFileStreamLetterDrive;
|
||||
FileState _StrToFileState(const std::wstring &str);
|
||||
std::mutex _mutex;
|
||||
std::atomic<bool> _stop;
|
||||
|
||||
13003
src/3rdparty/nlohmann/json.hpp
vendored
13003
src/3rdparty/nlohmann/json.hpp
vendored
File diff suppressed because it is too large
Load Diff
2
src/3rdparty/qtmacgoodies
vendored
2
src/3rdparty/qtmacgoodies
vendored
Submodule src/3rdparty/qtmacgoodies updated: 2965f75667...ebc7ec6f68
8853
src/3rdparty/sqlite3/sqlite3.c
vendored
8853
src/3rdparty/sqlite3/sqlite3.c
vendored
File diff suppressed because it is too large
Load Diff
275
src/3rdparty/sqlite3/sqlite3.h
vendored
275
src/3rdparty/sqlite3/sqlite3.h
vendored
@@ -123,9 +123,9 @@ extern "C" {
|
||||
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
|
||||
** [sqlite_version()] and [sqlite_source_id()].
|
||||
*/
|
||||
#define SQLITE_VERSION "3.23.1"
|
||||
#define SQLITE_VERSION_NUMBER 3023001
|
||||
#define SQLITE_SOURCE_ID "2018-04-10 17:39:29 4bb2294022060e61de7da5c227a69ccd846ba330e31626ebcd59a94efd148b3b"
|
||||
#define SQLITE_VERSION "3.24.0"
|
||||
#define SQLITE_VERSION_NUMBER 3024000
|
||||
#define SQLITE_SOURCE_ID "2018-06-04 19:24:41 c7ee0833225bfd8c5ec2f9bf62b97c4e04d03bd9566366d5221ac8fb199a87ca"
|
||||
|
||||
/*
|
||||
** CAPI3REF: Run-Time Library Version Numbers
|
||||
@@ -504,6 +504,7 @@ SQLITE_API int sqlite3_exec(
|
||||
#define SQLITE_IOERR_COMMIT_ATOMIC (SQLITE_IOERR | (30<<8))
|
||||
#define SQLITE_IOERR_ROLLBACK_ATOMIC (SQLITE_IOERR | (31<<8))
|
||||
#define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8))
|
||||
#define SQLITE_LOCKED_VTAB (SQLITE_LOCKED | (2<<8))
|
||||
#define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8))
|
||||
#define SQLITE_BUSY_SNAPSHOT (SQLITE_BUSY | (2<<8))
|
||||
#define SQLITE_CANTOPEN_NOTEMPDIR (SQLITE_CANTOPEN | (1<<8))
|
||||
@@ -511,6 +512,7 @@ SQLITE_API int sqlite3_exec(
|
||||
#define SQLITE_CANTOPEN_FULLPATH (SQLITE_CANTOPEN | (3<<8))
|
||||
#define SQLITE_CANTOPEN_CONVPATH (SQLITE_CANTOPEN | (4<<8))
|
||||
#define SQLITE_CORRUPT_VTAB (SQLITE_CORRUPT | (1<<8))
|
||||
#define SQLITE_CORRUPT_SEQUENCE (SQLITE_CORRUPT | (2<<8))
|
||||
#define SQLITE_READONLY_RECOVERY (SQLITE_READONLY | (1<<8))
|
||||
#define SQLITE_READONLY_CANTLOCK (SQLITE_READONLY | (2<<8))
|
||||
#define SQLITE_READONLY_ROLLBACK (SQLITE_READONLY | (3<<8))
|
||||
@@ -1930,6 +1932,22 @@ struct sqlite3_mem_methods {
|
||||
** I/O required to support statement rollback.
|
||||
** The default value for this setting is controlled by the
|
||||
** [SQLITE_STMTJRNL_SPILL] compile-time option.
|
||||
**
|
||||
** [[SQLITE_CONFIG_SORTERREF_SIZE]]
|
||||
** <dt>SQLITE_CONFIG_SORTERREF_SIZE
|
||||
** <dd>The SQLITE_CONFIG_SORTERREF_SIZE option accepts a single parameter
|
||||
** of type (int) - the new value of the sorter-reference size threshold.
|
||||
** Usually, when SQLite uses an external sort to order records according
|
||||
** to an ORDER BY clause, all fields required by the caller are present in the
|
||||
** sorted records. However, if SQLite determines based on the declared type
|
||||
** of a table column that its values are likely to be very large - larger
|
||||
** than the configured sorter-reference size threshold - then a reference
|
||||
** is stored in each sorted record and the required column values loaded
|
||||
** from the database as records are returned in sorted order. The default
|
||||
** value for this option is to never use this optimization. Specifying a
|
||||
** negative value for this option restores the default behaviour.
|
||||
** This option is only available if SQLite is compiled with the
|
||||
** [SQLITE_ENABLE_SORTER_REFERENCES] compile-time option.
|
||||
** </dl>
|
||||
*/
|
||||
#define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */
|
||||
@@ -1959,6 +1977,7 @@ struct sqlite3_mem_methods {
|
||||
#define SQLITE_CONFIG_PMASZ 25 /* unsigned int szPma */
|
||||
#define SQLITE_CONFIG_STMTJRNL_SPILL 26 /* int nByte */
|
||||
#define SQLITE_CONFIG_SMALL_MALLOC 27 /* boolean */
|
||||
#define SQLITE_CONFIG_SORTERREF_SIZE 28 /* int nByte */
|
||||
|
||||
/*
|
||||
** CAPI3REF: Database Connection Configuration Options
|
||||
@@ -2095,6 +2114,21 @@ struct sqlite3_mem_methods {
|
||||
** 0 or 1 to indicate whether output-for-triggers has been disabled - 0 if
|
||||
** it is not disabled, 1 if it is.
|
||||
** </dd>
|
||||
**
|
||||
** <dt>SQLITE_DBCONFIG_RESET_DATABASE</dt>
|
||||
** <dd> Set the SQLITE_DBCONFIG_RESET_DATABASE flag and then run
|
||||
** [VACUUM] in order to reset a database back to an empty database
|
||||
** with no schema and no content. The following process works even for
|
||||
** a badly corrupted database file:
|
||||
** <ol>
|
||||
** <li> sqlite3_db_config(db, SQLITE_DBCONFIG_RESET_DATABASE, 1, 0);
|
||||
** <li> [sqlite3_exec](db, "[VACUUM]", 0, 0, 0);
|
||||
** <li> sqlite3_db_config(db, SQLITE_DBCONFIG_RESET_DATABASE, 0, 0);
|
||||
** </ol>
|
||||
** Because resetting a database is destructive and irreversible, the
|
||||
** process requires the use of this obscure API and multiple steps to help
|
||||
** ensure that it does not happen by accident.
|
||||
** </dd>
|
||||
** </dl>
|
||||
*/
|
||||
#define SQLITE_DBCONFIG_MAINDBNAME 1000 /* const char* */
|
||||
@@ -2106,7 +2140,8 @@ struct sqlite3_mem_methods {
|
||||
#define SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE 1006 /* int int* */
|
||||
#define SQLITE_DBCONFIG_ENABLE_QPSG 1007 /* int int* */
|
||||
#define SQLITE_DBCONFIG_TRIGGER_EQP 1008 /* int int* */
|
||||
#define SQLITE_DBCONFIG_MAX 1008 /* Largest DBCONFIG */
|
||||
#define SQLITE_DBCONFIG_RESET_DATABASE 1009 /* int int* */
|
||||
#define SQLITE_DBCONFIG_MAX 1009 /* Largest DBCONFIG */
|
||||
|
||||
/*
|
||||
** CAPI3REF: Enable Or Disable Extended Result Codes
|
||||
@@ -5492,6 +5527,41 @@ SQLITE_API SQLITE_EXTERN char *sqlite3_temp_directory;
|
||||
*/
|
||||
SQLITE_API SQLITE_EXTERN char *sqlite3_data_directory;
|
||||
|
||||
/*
|
||||
** CAPI3REF: Win32 Specific Interface
|
||||
**
|
||||
** These interfaces are available only on Windows. The
|
||||
** [sqlite3_win32_set_directory] interface is used to set the value associated
|
||||
** with the [sqlite3_temp_directory] or [sqlite3_data_directory] variable, to
|
||||
** zValue, depending on the value of the type parameter. The zValue parameter
|
||||
** should be NULL to cause the previous value to be freed via [sqlite3_free];
|
||||
** a non-NULL value will be copied into memory obtained from [sqlite3_malloc]
|
||||
** prior to being used. The [sqlite3_win32_set_directory] interface returns
|
||||
** [SQLITE_OK] to indicate success, [SQLITE_ERROR] if the type is unsupported,
|
||||
** or [SQLITE_NOMEM] if memory could not be allocated. The value of the
|
||||
** [sqlite3_data_directory] variable is intended to act as a replacement for
|
||||
** the current directory on the sub-platforms of Win32 where that concept is
|
||||
** not present, e.g. WinRT and UWP. The [sqlite3_win32_set_directory8] and
|
||||
** [sqlite3_win32_set_directory16] interfaces behave exactly the same as the
|
||||
** sqlite3_win32_set_directory interface except the string parameter must be
|
||||
** UTF-8 or UTF-16, respectively.
|
||||
*/
|
||||
SQLITE_API int sqlite3_win32_set_directory(
|
||||
unsigned long type, /* Identifier for directory being set or reset */
|
||||
void *zValue /* New value for directory being set or reset */
|
||||
);
|
||||
SQLITE_API int sqlite3_win32_set_directory8(unsigned long type, const char *zValue);
|
||||
SQLITE_API int sqlite3_win32_set_directory16(unsigned long type, const void *zValue);
|
||||
|
||||
/*
|
||||
** CAPI3REF: Win32 Directory Types
|
||||
**
|
||||
** These macros are only available on Windows. They define the allowed values
|
||||
** for the type argument to the [sqlite3_win32_set_directory] interface.
|
||||
*/
|
||||
#define SQLITE_WIN32_DATA_DIRECTORY_TYPE 1
|
||||
#define SQLITE_WIN32_TEMP_DIRECTORY_TYPE 2
|
||||
|
||||
/*
|
||||
** CAPI3REF: Test For Auto-Commit Mode
|
||||
** KEYWORDS: {autocommit mode}
|
||||
@@ -6224,6 +6294,10 @@ struct sqlite3_index_info {
|
||||
|
||||
/*
|
||||
** CAPI3REF: Virtual Table Scan Flags
|
||||
**
|
||||
** Virtual table implementations are allowed to set the
|
||||
** [sqlite3_index_info].idxFlags field to some combination of
|
||||
** these bits.
|
||||
*/
|
||||
#define SQLITE_INDEX_SCAN_UNIQUE 1 /* Scan visits at most 1 row */
|
||||
|
||||
@@ -6999,7 +7073,7 @@ SQLITE_API int sqlite3_test_control(int op, ...);
|
||||
#define SQLITE_TESTCTRL_ALWAYS 13
|
||||
#define SQLITE_TESTCTRL_RESERVE 14
|
||||
#define SQLITE_TESTCTRL_OPTIMIZATIONS 15
|
||||
#define SQLITE_TESTCTRL_ISKEYWORD 16
|
||||
#define SQLITE_TESTCTRL_ISKEYWORD 16 /* NOT USED */
|
||||
#define SQLITE_TESTCTRL_SCRATCHMALLOC 17 /* NOT USED */
|
||||
#define SQLITE_TESTCTRL_LOCALTIME_FAULT 18
|
||||
#define SQLITE_TESTCTRL_EXPLAIN_STMT 19 /* NOT USED */
|
||||
@@ -7013,6 +7087,189 @@ SQLITE_API int sqlite3_test_control(int op, ...);
|
||||
#define SQLITE_TESTCTRL_PARSER_COVERAGE 26
|
||||
#define SQLITE_TESTCTRL_LAST 26 /* Largest TESTCTRL */
|
||||
|
||||
/*
|
||||
** CAPI3REF: SQL Keyword Checking
|
||||
**
|
||||
** These routines provide access to the set of SQL language keywords
|
||||
** recognized by SQLite. Applications can uses these routines to determine
|
||||
** whether or not a specific identifier needs to be escaped (for example,
|
||||
** by enclosing in double-quotes) so as not to confuse the parser.
|
||||
**
|
||||
** The sqlite3_keyword_count() interface returns the number of distinct
|
||||
** keywords understood by SQLite.
|
||||
**
|
||||
** The sqlite3_keyword_name(N,Z,L) interface finds the N-th keyword and
|
||||
** makes *Z point to that keyword expressed as UTF8 and writes the number
|
||||
** of bytes in the keyword into *L. The string that *Z points to is not
|
||||
** zero-terminated. The sqlite3_keyword_name(N,Z,L) routine returns
|
||||
** SQLITE_OK if N is within bounds and SQLITE_ERROR if not. If either Z
|
||||
** or L are NULL or invalid pointers then calls to
|
||||
** sqlite3_keyword_name(N,Z,L) result in undefined behavior.
|
||||
**
|
||||
** The sqlite3_keyword_check(Z,L) interface checks to see whether or not
|
||||
** the L-byte UTF8 identifier that Z points to is a keyword, returning non-zero
|
||||
** if it is and zero if not.
|
||||
**
|
||||
** The parser used by SQLite is forgiving. It is often possible to use
|
||||
** a keyword as an identifier as long as such use does not result in a
|
||||
** parsing ambiguity. For example, the statement
|
||||
** "CREATE TABLE BEGIN(REPLACE,PRAGMA,END);" is accepted by SQLite, and
|
||||
** creates a new table named "BEGIN" with three columns named
|
||||
** "REPLACE", "PRAGMA", and "END". Nevertheless, best practice is to avoid
|
||||
** using keywords as identifiers. Common techniques used to avoid keyword
|
||||
** name collisions include:
|
||||
** <ul>
|
||||
** <li> Put all identifier names inside double-quotes. This is the official
|
||||
** SQL way to escape identifier names.
|
||||
** <li> Put identifier names inside [...]. This is not standard SQL,
|
||||
** but it is what SQL Server does and so lots of programmers use this
|
||||
** technique.
|
||||
** <li> Begin every identifier with the letter "Z" as no SQL keywords start
|
||||
** with "Z".
|
||||
** <li> Include a digit somewhere in every identifier name.
|
||||
** </ul>
|
||||
**
|
||||
** Note that the number of keywords understood by SQLite can depend on
|
||||
** compile-time options. For example, "VACUUM" is not a keyword if
|
||||
** SQLite is compiled with the [-DSQLITE_OMIT_VACUUM] option. Also,
|
||||
** new keywords may be added to future releases of SQLite.
|
||||
*/
|
||||
SQLITE_API int sqlite3_keyword_count(void);
|
||||
SQLITE_API int sqlite3_keyword_name(int,const char**,int*);
|
||||
SQLITE_API int sqlite3_keyword_check(const char*,int);
|
||||
|
||||
/*
|
||||
** CAPI3REF: Dynamic String Object
|
||||
** KEYWORDS: {dynamic string}
|
||||
**
|
||||
** An instance of the sqlite3_str object contains a dynamically-sized
|
||||
** string under construction.
|
||||
**
|
||||
** The lifecycle of an sqlite3_str object is as follows:
|
||||
** <ol>
|
||||
** <li> ^The sqlite3_str object is created using [sqlite3_str_new()].
|
||||
** <li> ^Text is appended to the sqlite3_str object using various
|
||||
** methods, such as [sqlite3_str_appendf()].
|
||||
** <li> ^The sqlite3_str object is destroyed and the string it created
|
||||
** is returned using the [sqlite3_str_finish()] interface.
|
||||
** </ol>
|
||||
*/
|
||||
typedef struct sqlite3_str sqlite3_str;
|
||||
|
||||
/*
|
||||
** CAPI3REF: Create A New Dynamic String Object
|
||||
** CONSTRUCTOR: sqlite3_str
|
||||
**
|
||||
** ^The [sqlite3_str_new(D)] interface allocates and initializes
|
||||
** a new [sqlite3_str] object. To avoid memory leaks, the object returned by
|
||||
** [sqlite3_str_new()] must be freed by a subsequent call to
|
||||
** [sqlite3_str_finish(X)].
|
||||
**
|
||||
** ^The [sqlite3_str_new(D)] interface always returns a pointer to a
|
||||
** valid [sqlite3_str] object, though in the event of an out-of-memory
|
||||
** error the returned object might be a special singleton that will
|
||||
** silently reject new text, always return SQLITE_NOMEM from
|
||||
** [sqlite3_str_errcode()], always return 0 for
|
||||
** [sqlite3_str_length()], and always return NULL from
|
||||
** [sqlite3_str_finish(X)]. It is always safe to use the value
|
||||
** returned by [sqlite3_str_new(D)] as the sqlite3_str parameter
|
||||
** to any of the other [sqlite3_str] methods.
|
||||
**
|
||||
** The D parameter to [sqlite3_str_new(D)] may be NULL. If the
|
||||
** D parameter in [sqlite3_str_new(D)] is not NULL, then the maximum
|
||||
** length of the string contained in the [sqlite3_str] object will be
|
||||
** the value set for [sqlite3_limit](D,[SQLITE_LIMIT_LENGTH]) instead
|
||||
** of [SQLITE_MAX_LENGTH].
|
||||
*/
|
||||
SQLITE_API sqlite3_str *sqlite3_str_new(sqlite3*);
|
||||
|
||||
/*
|
||||
** CAPI3REF: Finalize A Dynamic String
|
||||
** DESTRUCTOR: sqlite3_str
|
||||
**
|
||||
** ^The [sqlite3_str_finish(X)] interface destroys the sqlite3_str object X
|
||||
** and returns a pointer to a memory buffer obtained from [sqlite3_malloc64()]
|
||||
** that contains the constructed string. The calling application should
|
||||
** pass the returned value to [sqlite3_free()] to avoid a memory leak.
|
||||
** ^The [sqlite3_str_finish(X)] interface may return a NULL pointer if any
|
||||
** errors were encountered during construction of the string. ^The
|
||||
** [sqlite3_str_finish(X)] interface will also return a NULL pointer if the
|
||||
** string in [sqlite3_str] object X is zero bytes long.
|
||||
*/
|
||||
SQLITE_API char *sqlite3_str_finish(sqlite3_str*);
|
||||
|
||||
/*
|
||||
** CAPI3REF: Add Content To A Dynamic String
|
||||
** METHOD: sqlite3_str
|
||||
**
|
||||
** These interfaces add content to an sqlite3_str object previously obtained
|
||||
** from [sqlite3_str_new()].
|
||||
**
|
||||
** ^The [sqlite3_str_appendf(X,F,...)] and
|
||||
** [sqlite3_str_vappendf(X,F,V)] interfaces uses the [built-in printf]
|
||||
** functionality of SQLite to append formatted text onto the end of
|
||||
** [sqlite3_str] object X.
|
||||
**
|
||||
** ^The [sqlite3_str_append(X,S,N)] method appends exactly N bytes from string S
|
||||
** onto the end of the [sqlite3_str] object X. N must be non-negative.
|
||||
** S must contain at least N non-zero bytes of content. To append a
|
||||
** zero-terminated string in its entirety, use the [sqlite3_str_appendall()]
|
||||
** method instead.
|
||||
**
|
||||
** ^The [sqlite3_str_appendall(X,S)] method appends the complete content of
|
||||
** zero-terminated string S onto the end of [sqlite3_str] object X.
|
||||
**
|
||||
** ^The [sqlite3_str_appendchar(X,N,C)] method appends N copies of the
|
||||
** single-byte character C onto the end of [sqlite3_str] object X.
|
||||
** ^This method can be used, for example, to add whitespace indentation.
|
||||
**
|
||||
** ^The [sqlite3_str_reset(X)] method resets the string under construction
|
||||
** inside [sqlite3_str] object X back to zero bytes in length.
|
||||
**
|
||||
** These methods do not return a result code. ^If an error occurs, that fact
|
||||
** is recorded in the [sqlite3_str] object and can be recovered by a
|
||||
** subsequent call to [sqlite3_str_errcode(X)].
|
||||
*/
|
||||
SQLITE_API void sqlite3_str_appendf(sqlite3_str*, const char *zFormat, ...);
|
||||
SQLITE_API void sqlite3_str_vappendf(sqlite3_str*, const char *zFormat, va_list);
|
||||
SQLITE_API void sqlite3_str_append(sqlite3_str*, const char *zIn, int N);
|
||||
SQLITE_API void sqlite3_str_appendall(sqlite3_str*, const char *zIn);
|
||||
SQLITE_API void sqlite3_str_appendchar(sqlite3_str*, int N, char C);
|
||||
SQLITE_API void sqlite3_str_reset(sqlite3_str*);
|
||||
|
||||
/*
|
||||
** CAPI3REF: Status Of A Dynamic String
|
||||
** METHOD: sqlite3_str
|
||||
**
|
||||
** These interfaces return the current status of an [sqlite3_str] object.
|
||||
**
|
||||
** ^If any prior errors have occurred while constructing the dynamic string
|
||||
** in sqlite3_str X, then the [sqlite3_str_errcode(X)] method will return
|
||||
** an appropriate error code. ^The [sqlite3_str_errcode(X)] method returns
|
||||
** [SQLITE_NOMEM] following any out-of-memory error, or
|
||||
** [SQLITE_TOOBIG] if the size of the dynamic string exceeds
|
||||
** [SQLITE_MAX_LENGTH], or [SQLITE_OK] if there have been no errors.
|
||||
**
|
||||
** ^The [sqlite3_str_length(X)] method returns the current length, in bytes,
|
||||
** of the dynamic string under construction in [sqlite3_str] object X.
|
||||
** ^The length returned by [sqlite3_str_length(X)] does not include the
|
||||
** zero-termination byte.
|
||||
**
|
||||
** ^The [sqlite3_str_value(X)] method returns a pointer to the current
|
||||
** content of the dynamic string under construction in X. The value
|
||||
** returned by [sqlite3_str_value(X)] is managed by the sqlite3_str object X
|
||||
** and might be freed or altered by any subsequent method on the same
|
||||
** [sqlite3_str] object. Applications must not used the pointer returned
|
||||
** [sqlite3_str_value(X)] after any subsequent method call on the same
|
||||
** object. ^Applications may change the content of the string returned
|
||||
** by [sqlite3_str_value(X)] as long as they do not write into any bytes
|
||||
** outside the range of 0 to [sqlite3_str_length(X)] and do not read or
|
||||
** write any byte after any subsequent sqlite3_str method call.
|
||||
*/
|
||||
SQLITE_API int sqlite3_str_errcode(sqlite3_str*);
|
||||
SQLITE_API int sqlite3_str_length(sqlite3_str*);
|
||||
SQLITE_API char *sqlite3_str_value(sqlite3_str*);
|
||||
|
||||
/*
|
||||
** CAPI3REF: SQLite Runtime Status
|
||||
**
|
||||
@@ -8282,11 +8539,11 @@ SQLITE_API int sqlite3_vtab_on_conflict(sqlite3 *);
|
||||
** method of a [virtual table], then it returns true if and only if the
|
||||
** column is being fetched as part of an UPDATE operation during which the
|
||||
** column value will not change. Applications might use this to substitute
|
||||
** a lighter-weight value to return that the corresponding [xUpdate] method
|
||||
** understands as a "no-change" value.
|
||||
** a return value that is less expensive to compute and that the corresponding
|
||||
** [xUpdate] method understands as a "no-change" value.
|
||||
**
|
||||
** If the [xColumn] method calls sqlite3_vtab_nochange() and finds that
|
||||
** the column is not changed by the UPDATE statement, they the xColumn
|
||||
** the column is not changed by the UPDATE statement, then the xColumn
|
||||
** method can optionally return without setting a result, without calling
|
||||
** any of the [sqlite3_result_int|sqlite3_result_xxxxx() interfaces].
|
||||
** In that case, [sqlite3_value_nochange(X)] will return true for the
|
||||
@@ -8781,7 +9038,7 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_recover(sqlite3 *db, const c
|
||||
** been a prior call to [sqlite3_deserialize(D,S,...)] with the same
|
||||
** values of D and S.
|
||||
** The size of the database is written into *P even if the
|
||||
** SQLITE_SERIALIZE_NOCOPY bit is set but no contigious copy
|
||||
** SQLITE_SERIALIZE_NOCOPY bit is set but no contiguous copy
|
||||
** of the database exists.
|
||||
**
|
||||
** A call to sqlite3_serialize(D,S,P,F) might return NULL even if the
|
||||
|
||||
@@ -319,7 +319,7 @@ int main(int argc, char **argv)
|
||||
options.trustSSL = false;
|
||||
options.useNetrc = false;
|
||||
options.interactive = true;
|
||||
options.ignoreHiddenFiles = true;
|
||||
options.ignoreHiddenFiles = false; // Default is to sync hidden files
|
||||
options.nonShib = false;
|
||||
options.restartTimes = 3;
|
||||
options.uplimit = 0;
|
||||
|
||||
@@ -41,7 +41,6 @@
|
||||
"(" path " == " prefix " OR " IS_PREFIX_PATH_OF(prefix, path) ")"
|
||||
|
||||
namespace OCC {
|
||||
SyncJournalDb* SyncJournalDb::_instance = 0;
|
||||
|
||||
Q_LOGGING_CATEGORY(lcDb, "nextcloud.sync.database", QtInfoMsg)
|
||||
|
||||
@@ -101,16 +100,6 @@ SyncJournalDb::SyncJournalDb(const QString &dbFilePath, QObject *parent)
|
||||
if (_journalMode.isEmpty()) {
|
||||
_journalMode = defaultJournalMode(_dbFile);
|
||||
}
|
||||
|
||||
#ifndef Q_OS_LINUX
|
||||
ASSERT(!_instance);
|
||||
_instance = this;
|
||||
#endif
|
||||
}
|
||||
|
||||
SyncJournalDb *SyncJournalDb::instance()
|
||||
{
|
||||
return _instance;
|
||||
}
|
||||
|
||||
QString SyncJournalDb::makeDbName(const QString &localPath,
|
||||
@@ -499,18 +488,6 @@ bool SyncJournalDb::checkConnect()
|
||||
return sqlFail("Create table version", createQuery);
|
||||
}
|
||||
|
||||
// table for streaming information
|
||||
SqlQuery createStreamingSql(_db);
|
||||
createStreamingSql.prepare(
|
||||
"CREATE TABLE IF NOT EXISTS syncmode ("
|
||||
"path TEXT PRIMARY KEY,"
|
||||
"mode TEXT DEFAULT ('O'),"
|
||||
"lastaccess TEXT DEFAULT (''),"
|
||||
"downloaded TEXT DEFAULT ('N'))"
|
||||
);
|
||||
if (!createStreamingSql.exec())
|
||||
return sqlFail("create streaming table", createQuery);
|
||||
|
||||
bool forceRemoteDiscovery = false;
|
||||
|
||||
SqlQuery versionQuery("SELECT major, minor, patch FROM version;", _db);
|
||||
@@ -601,48 +578,6 @@ bool SyncJournalDb::checkConnect()
|
||||
return sqlFail("prepare _getErrorBlacklistQuery", _getErrorBlacklistQuery);
|
||||
}
|
||||
|
||||
/* _setErrorBlacklistQuery.reset(new SqlQuery(_db));
|
||||
if (_setErrorBlacklistQuery->prepare("INSERT OR REPLACE INTO blacklist "
|
||||
"(path, lastTryEtag, lastTryModtime, retrycount, errorstring, lastTryTime, ignoreDuration, renameTarget, errorCategory) "
|
||||
"VALUES ( ?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9)")) {
|
||||
return sqlFail("prepare _setErrorBlacklistQuery", *_setErrorBlacklistQuery);
|
||||
}*/
|
||||
|
||||
// Sync mode
|
||||
|
||||
if (!_getSyncModeDownloadQuery.initOrReset("SELECT downloaded FROM syncmode WHERE path=?1;", _db)) {
|
||||
return sqlFail("prepare _getErrorBlacklistQuery", _getSyncModeDownloadQuery);
|
||||
}
|
||||
|
||||
if (!_setSyncModeDownloadQuery.initOrReset("UPDATE syncmode SET downloaded=?2 WHERE path=?1;", _db)) {
|
||||
return sqlFail("prepare _getErrorBlacklistQuery", _setSyncModeDownloadQuery);
|
||||
}
|
||||
|
||||
if (!_getSyncModeQuery.initOrReset("SELECT mode FROM syncmode WHERE path=?1;", _db)) {
|
||||
return sqlFail("prepare _getErrorBlacklistQuery", _getSyncModeQuery);
|
||||
}
|
||||
|
||||
if (!_setSyncModeQuery.initOrReset("INSERT OR REPLACE INTO syncmode (path, mode) VALUES (?1, ?2);", _db)) {
|
||||
return sqlFail("prepare _getErrorBlacklistQuery", _setSyncModeQuery);
|
||||
}
|
||||
|
||||
if (!_deleteSyncModeQuery.initOrReset("DELETE FROM syncmode WHERE path=?1;", _db)) {
|
||||
return sqlFail("prepare _getErrorBlacklistQuery", _deleteSyncModeQuery);
|
||||
}
|
||||
|
||||
if (!_getSyncModePathsQuery.initOrReset("SELECT path from syncmode", _db)) {
|
||||
return sqlFail("prepare _getErrorBlacklistQuery", _getSyncModePathsQuery);
|
||||
}
|
||||
|
||||
// Last access time
|
||||
if (!_getLastAccessQuery.initOrReset("SELECT lastaccess FROM syncmode WHERE path=?1;", _db)) {
|
||||
return sqlFail("prepare _getErrorBlacklistQuery", _getLastAccessQuery);
|
||||
}
|
||||
|
||||
if (!_setLastAccessQuery.initOrReset("UPDATE syncmode SET lastaccess=?1 WHERE path=?2;", _db)) {
|
||||
return sqlFail("prepare _getErrorBlacklistQuery", _setLastAccessQuery);
|
||||
}
|
||||
|
||||
// don't start a new transaction now
|
||||
commitInternal(QString("checkConnect End"), false);
|
||||
|
||||
@@ -665,8 +600,9 @@ void SyncJournalDb::close()
|
||||
qCInfo(lcDb) << "Closing DB" << _dbFile;
|
||||
|
||||
commitTransaction();
|
||||
|
||||
_db.close();
|
||||
_avoidReadFromDbOnNextSyncFilter.clear();
|
||||
clearEtagStorageFilter();
|
||||
_metadataTableIsEmpty = false;
|
||||
}
|
||||
|
||||
@@ -888,10 +824,10 @@ bool SyncJournalDb::setFileRecord(const SyncJournalFileRecord &_record)
|
||||
SyncJournalFileRecord record = _record;
|
||||
QMutexLocker locker(&_mutex);
|
||||
|
||||
if (!_avoidReadFromDbOnNextSyncFilter.isEmpty()) {
|
||||
if (!_etagStorageFilter.isEmpty()) {
|
||||
// If we are a directory that should not be read from db next time, don't write the etag
|
||||
QByteArray prefix = record._path + "/";
|
||||
foreach (const QByteArray &it, _avoidReadFromDbOnNextSyncFilter) {
|
||||
foreach (const QByteArray &it, _etagStorageFilter) {
|
||||
if (it.startsWith(prefix)) {
|
||||
qCInfo(lcDb) << "Filtered writing the etag of" << prefix << "because it is a prefix of" << it;
|
||||
record._etag = "_invalid_";
|
||||
@@ -1880,7 +1816,12 @@ void SyncJournalDb::avoidReadFromDbOnNextSync(const QByteArray &fileName)
|
||||
// Prevent future overwrite of the etags of this folder and all
|
||||
// parent folders for this sync
|
||||
argument.append('/');
|
||||
_avoidReadFromDbOnNextSyncFilter.append(argument);
|
||||
_etagStorageFilter.append(argument);
|
||||
}
|
||||
|
||||
void SyncJournalDb::clearEtagStorageFilter()
|
||||
{
|
||||
_etagStorageFilter.clear();
|
||||
}
|
||||
|
||||
void SyncJournalDb::forceRemoteDiscoveryNextSync()
|
||||
@@ -2099,7 +2040,6 @@ void SyncJournalDb::commitInternal(const QString &context, bool startTrans)
|
||||
SyncJournalDb::~SyncJournalDb()
|
||||
{
|
||||
close();
|
||||
_instance = 0;
|
||||
}
|
||||
|
||||
bool SyncJournalDb::isConnected()
|
||||
@@ -2129,185 +2069,4 @@ bool operator==(const SyncJournalDb::UploadInfo &lhs,
|
||||
&& lhs._contentChecksum == rhs._contentChecksum;
|
||||
}
|
||||
|
||||
SyncJournalDb::SyncModeDownload SyncJournalDb::getSyncModeDownload(QString const & path)
|
||||
{
|
||||
QMutexLocker locker(&_mutex);
|
||||
if (!checkConnect())
|
||||
return SYNCMODE_DOWNLOADED_NONE;
|
||||
_getSyncModeDownloadQuery.reset_and_clear_bindings();
|
||||
_getSyncModeDownloadQuery.bindValue(1, path);
|
||||
if (!_getSyncModeDownloadQuery.exec()) {
|
||||
qWarning() << "Error SQL statement getSyncModeDownload: "
|
||||
<< _getSyncModeDownloadQuery.lastQuery() << " :"
|
||||
<< _getSyncModeDownloadQuery.error();
|
||||
return SYNCMODE_DOWNLOADED_NONE;
|
||||
}
|
||||
if (!_getSyncModeDownloadQuery.next())
|
||||
return SYNCMODE_DOWNLOADED_NONE;
|
||||
QString modeStr = _getSyncModeDownloadQuery.stringValue(0);
|
||||
if (modeStr.isEmpty())
|
||||
return SYNCMODE_DOWNLOADED_NONE;
|
||||
return static_cast<SyncModeDownload>(modeStr.begin()->toLatin1());
|
||||
}
|
||||
|
||||
int SyncJournalDb::setSyncModeDownload(QString const & path, SyncModeDownload mode)
|
||||
{
|
||||
QMutexLocker locker(&_mutex);
|
||||
if (!checkConnect())
|
||||
return -1;
|
||||
QString modeStr(static_cast<char>(mode));
|
||||
_setSyncModeDownloadQuery.reset_and_clear_bindings();
|
||||
_setSyncModeDownloadQuery.bindValue(1, path);
|
||||
_setSyncModeDownloadQuery.bindValue(2, modeStr);
|
||||
if (!_setSyncModeDownloadQuery.exec()) {
|
||||
qWarning() << "Error SQL statement setSyncModeDownload: "
|
||||
<< _setSyncModeDownloadQuery.lastQuery() << " :"
|
||||
<< _setSyncModeDownloadQuery.error();
|
||||
return -1;
|
||||
}
|
||||
return _setSyncModeDownloadQuery.numRowsAffected();
|
||||
}
|
||||
|
||||
|
||||
SyncJournalDb::SyncMode SyncJournalDb::getSyncMode(QString const & path)
|
||||
{
|
||||
QMutexLocker locker(&_mutex);
|
||||
if (!checkConnect())
|
||||
return SYNCMODE_NONE;
|
||||
_getSyncModeQuery.reset_and_clear_bindings();
|
||||
_getSyncModeQuery.bindValue(1, path);
|
||||
if (!_getSyncModeQuery.exec()) {
|
||||
qWarning() << "Error SQL statement getSyncMode: "
|
||||
<< _getSyncModeQuery.lastQuery() << " :"
|
||||
<< _getSyncModeQuery.error();
|
||||
return SYNCMODE_NONE;
|
||||
}
|
||||
if (!_getSyncModeQuery.next())
|
||||
return SYNCMODE_NONE;
|
||||
QString modeStr = _getSyncModeQuery.stringValue(0);
|
||||
if (modeStr.isEmpty())
|
||||
return SYNCMODE_NONE;
|
||||
return static_cast<SyncMode>(modeStr.begin()->toLatin1());
|
||||
}
|
||||
|
||||
int SyncJournalDb::setSyncMode(QString const & path, SyncMode mode)
|
||||
{
|
||||
QMutexLocker locker(&_mutex);
|
||||
if (!checkConnect())
|
||||
return -1;
|
||||
QString modeStr(static_cast<char>(mode));
|
||||
_setSyncModeQuery.reset_and_clear_bindings();
|
||||
_setSyncModeQuery.bindValue(1, path);
|
||||
_setSyncModeQuery.bindValue(2, modeStr);
|
||||
if (!_setSyncModeQuery.exec()) {
|
||||
qWarning() << "Error SQL statement setSyncMode: "
|
||||
<< _setSyncModeQuery.lastQuery() << " :"
|
||||
<< _setSyncModeQuery.error();
|
||||
return -1;
|
||||
}
|
||||
return _setSyncModeQuery.numRowsAffected();
|
||||
}
|
||||
|
||||
int SyncJournalDb::deleteSyncMode(QString const & path)
|
||||
{
|
||||
QMutexLocker locker(&_mutex);
|
||||
if (!checkConnect())
|
||||
return -1;
|
||||
_deleteSyncModeQuery.reset_and_clear_bindings();
|
||||
_deleteSyncModeQuery.bindValue(1, path);
|
||||
if (!_deleteSyncModeQuery.exec()) {
|
||||
qWarning() << "Error SQL statement setSyncMode: "
|
||||
<< _deleteSyncModeQuery.lastQuery() << " :"
|
||||
<< _deleteSyncModeQuery.error();
|
||||
return -1;
|
||||
}
|
||||
return _deleteSyncModeQuery.numRowsAffected();
|
||||
}
|
||||
|
||||
QDateTime SyncJournalDb::getLastAccess(QString const & path)
|
||||
{
|
||||
QMutexLocker locker(&_mutex);
|
||||
if (!checkConnect())
|
||||
return QDateTime{};
|
||||
_getLastAccessQuery.reset_and_clear_bindings();
|
||||
_getLastAccessQuery.bindValue(1, path);
|
||||
if (!_getLastAccessQuery.exec()) {
|
||||
qWarning() << "Error SQL statement getSyncMode: "
|
||||
<< _getLastAccessQuery.lastQuery() << " :"
|
||||
<< _getLastAccessQuery.error();
|
||||
return QDateTime{};
|
||||
}
|
||||
if (!_getLastAccessQuery.next())
|
||||
return QDateTime{};
|
||||
|
||||
QString dateString = _getLastAccessQuery.stringValue(0);
|
||||
QString format = "yyyy-MM-dd HH:mm:ss";
|
||||
QDateTime lastAccessDateTime = QDateTime::fromString(dateString, format);
|
||||
|
||||
if (lastAccessDateTime.isNull())
|
||||
qWarning() << "getLastAccess: "
|
||||
"Invalid date returned from journal DB";
|
||||
|
||||
return lastAccessDateTime;
|
||||
}
|
||||
|
||||
int SyncJournalDb::updateLastAccess(QString const & path)
|
||||
{
|
||||
QMutexLocker locker(&_mutex);
|
||||
if (!checkConnect())
|
||||
return -1;
|
||||
|
||||
QString format = "yyyy-MM-dd HH:mm:ss";
|
||||
QString currentDateTime = QDateTime::currentDateTime().toString(format);
|
||||
|
||||
_setLastAccessQuery.reset_and_clear_bindings();
|
||||
_setLastAccessQuery.bindValue(1, currentDateTime);
|
||||
_setLastAccessQuery.bindValue(2, path);
|
||||
if (!_setLastAccessQuery.exec()) {
|
||||
qWarning() << "Error SQL statement setSyncMode: "
|
||||
<< _setLastAccessQuery.lastQuery() << " :"
|
||||
<< _setLastAccessQuery.error();
|
||||
return -1;
|
||||
}
|
||||
return _setLastAccessQuery.numRowsAffected();
|
||||
}
|
||||
|
||||
qint64 SyncJournalDb::secondsSinceLastAccess(QString const & path)
|
||||
{
|
||||
QDateTime lastAccess = getLastAccess(path);
|
||||
if (lastAccess.isNull())
|
||||
return -1;
|
||||
qint64 seconds = lastAccess.secsTo(QDateTime::currentDateTime());
|
||||
// secsTo() might return negative values if the lastAccess datetime is after currentDateTime
|
||||
if (seconds < 0)
|
||||
return -1;
|
||||
return seconds;
|
||||
}
|
||||
|
||||
QList<QString> SyncJournalDb::getSyncModePaths()
|
||||
{
|
||||
QMutexLocker locker(&_mutex);
|
||||
if (!checkConnect())
|
||||
return QList<QString> {};
|
||||
QString path;
|
||||
_getSyncModePathsQuery.reset_and_clear_bindings();
|
||||
if (!_getSyncModePathsQuery.exec()) {
|
||||
qWarning() << "Error SQL statement getSyncModePaths: "
|
||||
<< _getSyncModePathsQuery.lastQuery() << " :"
|
||||
<< _getSyncModePathsQuery.error();
|
||||
return QList<QString>{};
|
||||
}
|
||||
|
||||
QList<QString> list;
|
||||
while (_getSyncModePathsQuery.next())
|
||||
list.append(_getSyncModePathsQuery.stringValue(0));
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
void SyncJournalDb::emitSyncStatusChanged(){
|
||||
qWarning() << Q_FUNC_INFO << "Syncing status changed! Emitting emitSyncStatusChanged.";
|
||||
emit syncStatusChanged();
|
||||
}
|
||||
|
||||
} // namespace OCC
|
||||
|
||||
@@ -31,7 +31,6 @@
|
||||
|
||||
namespace OCC {
|
||||
class SyncJournalFileRecord;
|
||||
class SyncJournalErrorBlacklistRecord;
|
||||
|
||||
/**
|
||||
* @brief Class that handles the sync database
|
||||
@@ -45,7 +44,6 @@ class OCSYNC_EXPORT SyncJournalDb : public QObject
|
||||
public:
|
||||
explicit SyncJournalDb(const QString &dbFilePath, QObject *parent = 0);
|
||||
virtual ~SyncJournalDb();
|
||||
static SyncJournalDb* instance();
|
||||
|
||||
/// Create a journal path for a specific configuration
|
||||
static QString makeDbName(const QString &localPath,
|
||||
@@ -147,6 +145,7 @@ public:
|
||||
void avoidRenamesOnNextSync(const QString &path) { avoidRenamesOnNextSync(path.toUtf8()); }
|
||||
void avoidRenamesOnNextSync(const QByteArray &path);
|
||||
void setPollInfo(const PollInfo &);
|
||||
|
||||
QVector<PollInfo> getPollInfos();
|
||||
|
||||
enum SelectiveSyncListType {
|
||||
@@ -179,10 +178,18 @@ public:
|
||||
* Since folders in the selective sync list will not be rediscovered (csync_ftw,
|
||||
* _csync_detect_update skip them), the _invalid_ marker will stay. And any
|
||||
* child items in the db will be ignored when reading a remote tree from the database.
|
||||
*
|
||||
* Any setFileRecord() call to affected directories before the next sync run will be
|
||||
* adjusted to retain the invalid etag via _etagStorageFilter.
|
||||
*/
|
||||
void avoidReadFromDbOnNextSync(const QString &fileName) { avoidReadFromDbOnNextSync(fileName.toUtf8()); }
|
||||
void avoidReadFromDbOnNextSync(const QByteArray &fileName);
|
||||
|
||||
/**
|
||||
* Wipe _etagStorageFilter. Also done implicitly on close().
|
||||
*/
|
||||
void clearEtagStorageFilter();
|
||||
|
||||
/**
|
||||
* Ensures full remote discovery happens on the next sync.
|
||||
*
|
||||
@@ -223,13 +230,13 @@ public:
|
||||
/// Store a new or updated record in the database
|
||||
void setConflictRecord(const ConflictRecord &record);
|
||||
|
||||
/// Retrieve a conflict record by path of the _conflict- file
|
||||
/// Retrieve a conflict record by path of the file with the conflict tag
|
||||
ConflictRecord conflictRecord(const QByteArray &path);
|
||||
|
||||
/// Delete a conflict record by path of the _conflict- file
|
||||
/// Delete a conflict record by path of the file with the conflict tag
|
||||
void deleteConflictRecord(const QByteArray &path);
|
||||
|
||||
/// Return all paths of _conflict- files with records in the db
|
||||
/// Return all paths of files with a conflict tag in the name and records in the db
|
||||
QByteArrayList conflictRecordPaths();
|
||||
|
||||
|
||||
@@ -240,90 +247,6 @@ public:
|
||||
*/
|
||||
void clearFileTable();
|
||||
|
||||
enum SyncMode {
|
||||
SYNCMODE_NONE = '\0',
|
||||
SYNCMODE_ONLINE = 'O',
|
||||
SYNCMODE_OFFLINE = 'S',
|
||||
};
|
||||
|
||||
enum SyncModeDownload {
|
||||
SYNCMODE_DOWNLOADED_NONE = '\0',
|
||||
SYNCMODE_DOWNLOADED_NO = 'N',
|
||||
SYNCMODE_DOWNLOADED_YES = 'Y',
|
||||
};
|
||||
|
||||
/**
|
||||
* Retrieves the sync mode of the provided path
|
||||
*
|
||||
* @path File path
|
||||
* @return integer representing if file has been donwloaded.
|
||||
*/
|
||||
SyncModeDownload getSyncModeDownload(QString const & path);
|
||||
|
||||
/**
|
||||
* Sets or registers the sync downloaded boolean
|
||||
*
|
||||
* @path File path
|
||||
* @N, Y : download option
|
||||
* @return Number of modified records on success. -1 on failure.
|
||||
*/
|
||||
int setSyncModeDownload(QString const & path, SyncModeDownload down);
|
||||
|
||||
/**
|
||||
* Retrieves the sync mode of the provided path
|
||||
*
|
||||
* @path File path
|
||||
* @return integer representing the download mode in case of success, -1 on failure. If multiple paths match the @path parameter, the first result will be returned
|
||||
*/
|
||||
SyncMode getSyncMode(QString const & path);
|
||||
|
||||
/**
|
||||
* Retrieves the sync mode of the provided path
|
||||
*
|
||||
* @return the list of paths in the
|
||||
*/
|
||||
QList<QString> getSyncModePaths();
|
||||
|
||||
/**
|
||||
* Sets or registers the sync mode
|
||||
*
|
||||
* @path File path
|
||||
* @mode New download mode
|
||||
* @return Number of modified records on success. -1 on failure.
|
||||
*/
|
||||
int setSyncMode(QString const & path, SyncMode mode);
|
||||
|
||||
/**
|
||||
* Deletes syncmode register matching the provided path
|
||||
*
|
||||
* @path File path
|
||||
* @return Number of affected records on success. -1 on failure.
|
||||
*/
|
||||
int deleteSyncMode(QString const & path);
|
||||
|
||||
/**
|
||||
* @brief Retrieves the last access local datetime of the given path
|
||||
* @path File path
|
||||
* @return On success, QDateTime representing the last access time. On failure, an invalid QDateTime object with null date and time.
|
||||
*/
|
||||
QDateTime getLastAccess(QString const & path);
|
||||
|
||||
/**
|
||||
* @brief Sets the last access time to the current local time in format yyyy-MM-dd HH:mm:ss
|
||||
* @path File path
|
||||
* @return Number of modified records on success. -1 on failure.
|
||||
*/
|
||||
int updateLastAccess(QString const & path);
|
||||
|
||||
/**
|
||||
* @brief Returns the difference in seconds between the current datetime and the record lastAccessDateTime
|
||||
* @path File path
|
||||
* @return Seconds since last accesson success. -1 on failure.
|
||||
*/
|
||||
qint64 secondsSinceLastAccess(QString const & path);
|
||||
|
||||
void emitSyncStatusChanged();
|
||||
|
||||
private:
|
||||
int getFileRecordCount();
|
||||
bool updateDatabaseStructure();
|
||||
@@ -350,13 +273,13 @@ private:
|
||||
int _transaction;
|
||||
bool _metadataTableIsEmpty;
|
||||
|
||||
SqlQuery _getFileRecordQuery;
|
||||
SqlQuery _setFileRecordQuery;
|
||||
SqlQuery _getFileRecordQuery;
|
||||
SqlQuery _getFileRecordQueryByMangledName;
|
||||
SqlQuery _getFileRecordQueryByInode;
|
||||
SqlQuery _getFileRecordQueryByFileId;
|
||||
SqlQuery _getFilesBelowPathQuery;
|
||||
SqlQuery _getAllFilesQuery;
|
||||
SqlQuery _setFileRecordQuery;
|
||||
SqlQuery _setFileRecordChecksumQuery;
|
||||
SqlQuery _setFileRecordLocalMetadataQuery;
|
||||
SqlQuery _getDownloadInfoQuery;
|
||||
@@ -376,28 +299,24 @@ private:
|
||||
SqlQuery _getDataFingerprintQuery;
|
||||
SqlQuery _setDataFingerprintQuery1;
|
||||
SqlQuery _setDataFingerprintQuery2;
|
||||
SqlQuery _getSyncModeDownloadQuery;
|
||||
SqlQuery _setSyncModeDownloadQuery;
|
||||
SqlQuery _getConflictRecordQuery;
|
||||
SqlQuery _setConflictRecordQuery;
|
||||
SqlQuery _deleteConflictRecordQuery;
|
||||
|
||||
SqlQuery _getSyncModeQuery;
|
||||
SqlQuery _setSyncModeQuery;
|
||||
SqlQuery _deleteSyncModeQuery;
|
||||
SqlQuery _getSyncModePathsQuery;
|
||||
SqlQuery _getLastAccessQuery;
|
||||
SqlQuery _setLastAccessQuery;
|
||||
|
||||
/* This is the list of paths we called avoidReadFromDbOnNextSync on.
|
||||
* It means that they should not be written to the DB in any case since doing
|
||||
* that would write the etag and would void the purpose of avoidReadFromDbOnNextSync
|
||||
/* Storing etags to these folders, or their parent folders, is filtered out.
|
||||
*
|
||||
* When avoidReadFromDbOnNextSync() is called some etags to _invalid_ in the
|
||||
* database. If this is done during a sync run, a later propagation job might
|
||||
* undo that by writing the correct etag to the database instead. This filter
|
||||
* will prevent this write and instead guarantee the _invalid_ etag stays in
|
||||
* place.
|
||||
*
|
||||
* The list is cleared on close() (end of sync run) and explicitly with
|
||||
* clearEtagStorageFilter() (start of sync run).
|
||||
*
|
||||
* The contained paths have a trailing /.
|
||||
*/
|
||||
QList<QByteArray> _avoidReadFromDbOnNextSyncFilter;
|
||||
|
||||
static SyncJournalDb *_instance;
|
||||
QList<QByteArray> _etagStorageFilter;
|
||||
|
||||
/** The journal mode to use for the db.
|
||||
*
|
||||
@@ -405,9 +324,6 @@ private:
|
||||
* variable, for specific filesystems, or when WAL fails in a particular way.
|
||||
*/
|
||||
QByteArray _journalMode;
|
||||
|
||||
signals:
|
||||
void syncStatusChanged();
|
||||
};
|
||||
|
||||
bool OCSYNC_EXPORT
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user