1
0
mirror of https://github.com/chylex/Nextcloud-Desktop.git synced 2026-04-03 09:11:33 +02:00

Compare commits

..

253 Commits

Author SHA1 Message Date
Nextcloud bot
58302e9fc0 [tx-robot] updated from transifex 2018-10-26 00:50:27 +00:00
Roeland Jago Douma
8acc5573ff Merge pull request #667 from nextcloud/upstream/pr/6592
SettingsDialog: Show the page for the newly created account
2018-10-25 08:23:51 +02:00
Roeland Jago Douma
6224f6a1fa Merge branch 'master' into upstream/pr/6592 2018-10-25 07:44:04 +02:00
Nextcloud bot
44bc637237 [tx-robot] updated from transifex 2018-10-25 00:49:57 +00:00
Julius Härtl
99d4f81892 Merge branch 'master' into upstream/pr/6592 2018-10-24 22:38:11 +02:00
Julius Härtl
98bedf1031 Merge pull request #659 from nextcloud/upstream/issues/6696-6610
Windows: Don't ignore files with FILE_ATTRIBUTE_TEMPORARY
2018-10-24 22:25:16 +02:00
Roeland Jago Douma
eb31e9205c Merge branch 'master' into upstream/issues/6696-6610 2018-10-24 16:50:39 +02:00
Roeland Jago Douma
c8204f1725 Merge pull request #640 from nextcloud/upstream/pr/6617
OAuth: Remove the timeout
2018-10-24 16:49:59 +02:00
Roeland Jago Douma
174f99728f Merge branch 'master' into upstream/pr/6617 2018-10-24 16:27:31 +02:00
Roeland Jago Douma
dcdf6d966d Merge pull request #717 from tuxmaster5000/gitignore
Add cmake temporary stuff
2018-10-24 13:22:56 +02:00
Roeland Jago Douma
3e79ebed60 Merge pull request #661 from nextcloud/upstream/pr/6712
nautilus: Fix GET_MENU_ITEMS with utf8 filenames #6643
2018-10-24 13:22:22 +02:00
Roeland Jago Douma
5237a2c3e2 Merge branch 'master' into upstream/pr/6712 2018-10-24 08:59:29 +02:00
Roeland Jago Douma
6e0d636989 Merge pull request #595 from nextcloud/upstream/pr/6485
Show a tray message when a folder watcher becomes unreliable #6119
2018-10-24 08:59:15 +02:00
Roeland Jago Douma
d246c1e8b9 Merge branch 'master' into upstream/pr/6485 2018-10-24 08:27:11 +02:00
Roeland Jago Douma
96541d8ab8 Merge pull request #657 from nextcloud/upstream/pr/6688
Support higher resolution theme icons
2018-10-24 08:23:41 +02:00
Roeland Jago Douma
091c4fd9b0 Merge branch 'master' into upstream/pr/6688 2018-10-24 07:29:10 +02:00
Nextcloud bot
8098566140 [tx-robot] updated from transifex 2018-10-24 00:50:56 +00:00
Roeland Jago Douma
21dc97b809 Merge pull request #644 from nextcloud/upstream/pr/6632
Reconcile: When detecting a local move, keep the local mtime
2018-10-23 23:13:58 +02:00
Julius Härtl
0f9b8daa57 Merge branch 'master' into upstream/pr/6712 2018-10-23 23:09:26 +02:00
Dominik Schmidt
cddb9aa8ba Support higher resolution theme icons 2018-10-23 23:07:17 +02:00
Roeland Jago Douma
24606c0105 Merge branch 'master' into upstream/pr/6632 2018-10-23 22:51:12 +02:00
Roeland Jago Douma
3384f7e28b Merge pull request #660 from nextcloud/upstream/pr/6674
Data-Fingerprint: Fix backup detection when fingerprint is empty
2018-10-23 22:50:54 +02:00
Roeland Jago Douma
6b7328bb87 Merge branch 'master' into upstream/pr/6632 2018-10-23 22:48:34 +02:00
Roeland Jago Douma
f3529e3dd7 Merge branch 'master' into upstream/pr/6674 2018-10-23 21:43:13 +02:00
Roeland Jago Douma
305952e32e Merge pull request #634 from nextcloud/upstream/issue/6581
Ensure GETFileJob notices finishing #6581
2018-10-23 21:26:21 +02:00
Roeland Jago Douma
c37186cc56 Merge branch 'master' into upstream/issue/6581 2018-10-23 21:08:51 +02:00
Roeland Jago Douma
4e866123c5 Merge pull request #635 from nextcloud/upstream/issue/6522
OAuth2: Try to refresh the token even if the credentials weren't ready.
2018-10-23 21:07:04 +02:00
Roeland Jago Douma
35c0c9c0b1 Merge branch 'master' into upstream/issue/6522 2018-10-23 20:13:28 +02:00
Roeland Jago Douma
d3bc9fbdf3 Merge pull request #639 from nextcloud/upstream/pr/6605
UpdateInfo: Remove unused code
2018-10-23 13:05:27 +02:00
Roeland Jago Douma
0cf2970134 Merge branch 'master' into upstream/pr/6605 2018-10-23 12:32:16 +02:00
Roeland Jago Douma
206f081505 Merge pull request #727 from nextcloud/fix-issue-268
Uses QByteArray to store private key.
2018-10-23 12:31:39 +02:00
Roeland Jago Douma
1c8307f264 Merge branch 'master' into fix-issue-268 2018-10-23 12:04:14 +02:00
Roeland Jago Douma
2d65091f27 Merge pull request #637 from nextcloud/upstream/issue/6545
Tray workarounds #6545
2018-10-23 11:48:08 +02:00
Roeland Jago Douma
a492ab8294 Merge branch 'master' into upstream/issue/6545 2018-10-23 10:59:56 +02:00
Nextcloud bot
3da6f45ba9 [tx-robot] updated from transifex 2018-10-23 00:43:03 +00:00
Julius Härtl
856d40fd99 Merge branch 'master' into upstream/issue/6581 2018-10-22 20:41:17 +02:00
Nextcloud bot
846075704e [tx-robot] updated from transifex 2018-10-22 00:45:03 +00:00
Roeland Jago Douma
156308c72e Merge branch 'master' into upstream/issue/6581 2018-10-21 14:19:07 +02:00
Camila Ayres
c99a35a8a5 Merge pull request #732 from st4ll1/master
Fix cmake command for linux in README too
2018-10-21 11:50:28 +02:00
Andreas Stallinger
f937fdd624 Fix cmake command for linux in README too 2018-10-21 10:40:44 +02:00
Nextcloud bot
1f8c3074a6 [tx-robot] updated from transifex 2018-10-21 00:44:18 +00:00
Nextcloud bot
11673005db [tx-robot] updated from transifex 2018-10-20 00:43:12 +00:00
Roeland Jago Douma
df24a25829 Merge pull request #396 from nextcloud/upstream/pr/6360
SyncJournal: Clear etag filter before sync
2018-10-19 20:26:30 +02:00
Roeland Jago Douma
2dc7ff7332 Merge branch 'master' into upstream/pr/6360 2018-10-19 16:13:09 +02:00
Roeland Jago Douma
7ace48d5de Merge pull request #643 from nextcloud/upstream/pr/6615
Log: Adjust update/reconcile log verbosity
2018-10-19 16:04:26 +02:00
Roeland Jago Douma
56ccff4ee8 Merge pull request #654 from nextcloud/upstream/sqlite-version-3-24
sqlite: Update bundled version to 3.24.0
2018-10-19 16:03:04 +02:00
Roeland Jago Douma
9d9f96a685 Merge branch 'master' into upstream/pr/6615 2018-10-19 15:43:50 +02:00
Nextcloud bot
052c37acda [tx-robot] updated from transifex 2018-10-19 00:42:46 +00:00
Nextcloud bot
fd2e88e13b [tx-robot] updated from transifex 2018-10-17 00:42:35 +00:00
tuxmaster5000
28b399ec2b Merge branch 'master' into gitignore 2018-10-16 08:55:18 +02:00
Roeland Jago Douma
4bb936f876 Merge pull request #709 from nextcloud/fix-issue-665
Fixes #665 Adds slot for confirmShare button.
2018-10-15 13:58:16 +02:00
Roeland Jago Douma
6805d91033 Merge branch 'master' into fix-issue-665 2018-10-15 13:47:18 +02:00
Nextcloud bot
8da2b9dbf8 [tx-robot] updated from transifex 2018-10-15 00:43:12 +00:00
Camila San
45ff3385c7 Uses QByteArray to store private key.
Removes QSslkey. See #268

Signed-off-by: Camila San <hello@camila.codes>
2018-10-15 00:21:08 +02:00
Camila Ayres
53cc6a1611 Merge branch 'master' into gitignore 2018-10-14 16:17:13 +02:00
Nextcloud bot
bfc8154e68 [tx-robot] updated from transifex 2018-10-14 00:43:12 +00:00
Nextcloud bot
74d8f32f37 [tx-robot] updated from transifex 2018-10-13 00:42:33 +00:00
tuxmaster5000
a5e329a1c5 Add cmake temporary stuff 2018-10-12 11:48:32 +02:00
Nextcloud bot
3fe44f0d25 [tx-robot] updated from transifex 2018-10-11 00:43:07 +00:00
Nextcloud bot
e207c91228 [tx-robot] updated from transifex 2018-10-10 00:50:58 +00:00
Nextcloud bot
cdf922f51d [tx-robot] updated from transifex 2018-10-09 00:49:05 +00:00
Camila Ayres
45ffc0ae09 Merge pull request #710 from kevin147147/patch-1
Rename INSTALL to INSTALL.md for Preview :)
2018-10-08 22:00:22 +02:00
kevin147147
e214234001 Rename README to README.md
Preview :)
2018-10-08 21:01:08 +02:00
kevin147147
54e58b51ab Rename INSTALL to INSTALL.md
Preview :)
2018-10-08 20:57:34 +02:00
Camila San
debe37308f Fixes #665 Adds slot for confirmShare button.
Signed-off-by: Camila San <hello@camila.codes>
2018-10-08 20:56:01 +02:00
Nextcloud bot
7c096d08aa [tx-robot] updated from transifex 2018-10-07 00:50:40 +00:00
Nextcloud bot
ac631d008c [tx-robot] updated from transifex 2018-10-06 00:48:41 +00:00
Nextcloud bot
f1cad3443b [tx-robot] updated from transifex 2018-10-05 00:51:40 +00:00
Nextcloud bot
cacde7a3aa [tx-robot] updated from transifex 2018-10-02 00:49:28 +00:00
Camila Ayres
b533c3582e Updates issue_template.md.
Signed-off-by: Camila San <hello@camila.codes>
2018-10-01 17:57:35 +02:00
Nextcloud bot
69f18f6b7d [tx-robot] updated from transifex 2018-10-01 00:49:10 +00:00
Nextcloud bot
de80f7d6ca [tx-robot] updated from transifex 2018-09-30 00:50:09 +00:00
Nextcloud bot
38ec3b8972 [tx-robot] updated from transifex 2018-09-29 00:47:33 +00:00
Nextcloud bot
52d40235b6 [tx-robot] updated from transifex 2018-09-28 00:43:34 +00:00
Nextcloud bot
0ee662bb0e [tx-robot] updated from transifex 2018-09-27 00:52:10 +00:00
Nextcloud bot
5733e90b09 [tx-robot] updated from transifex 2018-09-26 00:52:09 +00:00
Nextcloud bot
95d2c64c1b [tx-robot] updated from transifex 2018-09-25 00:51:54 +00:00
Nextcloud bot
b71c753a94 [tx-robot] updated from transifex 2018-09-24 00:49:25 +00:00
Nextcloud bot
bd88ddfa07 [tx-robot] updated from transifex 2018-09-23 01:19:35 +00:00
Nextcloud bot
373c6cd631 [tx-robot] updated from transifex 2018-09-22 00:52:01 +00:00
Nextcloud bot
a464ad2c71 [tx-robot] updated from transifex 2018-09-21 00:59:02 +00:00
Nextcloud bot
f3dd97f29c [tx-robot] updated from transifex 2018-09-20 00:50:44 +00:00
Nextcloud bot
6587955668 [tx-robot] updated from transifex 2018-09-19 00:49:32 +00:00
Nextcloud bot
9013036685 [tx-robot] updated from transifex 2018-09-17 00:52:18 +00:00
Nextcloud bot
ebd632f582 [tx-robot] updated from transifex 2018-09-16 00:51:19 +00:00
Nextcloud bot
ce22007b16 [tx-robot] updated from transifex 2018-09-15 00:50:19 +00:00
Nextcloud bot
6a1043cef0 [tx-robot] updated from transifex 2018-09-14 00:51:47 +00:00
Nextcloud bot
82f3b4c91f [tx-robot] updated from transifex 2018-09-13 00:50:42 +00:00
Nextcloud bot
d0b6a611f2 [tx-robot] updated from transifex 2018-09-12 00:49:42 +00:00
Camila Ayres
714a4090a7 Merge pull request #668 from nextcloud/update-qtmacgoodies
Updates submodule qtmacgoodies.
2018-09-11 16:41:45 +02:00
Camila San
63d7e54ef3 Updates submodule qtmacgoodies.
Signed-off-by: Camila San <hello@camila.codes>
2018-09-11 16:11:47 +02:00
Markus Goetz
a2f4917daf SettingsDialogMac: Show the page for the newly created account 2018-09-11 13:45:01 +02:00
Olivier Goffart
a09f1d14ba SettingsDialog: Show the page for the newly created account 2018-09-11 13:44:22 +02:00
Nextcloud bot
96c37b1fac [tx-robot] updated from transifex 2018-09-11 00:50:01 +00:00
Christian Kamm
f4dfdf5889 nautilus: Fix GET_MENU_ITEMS with utf8 filenames #6643 2018-09-10 21:06:57 +02:00
Olivier Goffart
08e4ba3363 Data-Fingerprint: Fix backup detection when fingerprint is empty
Add a test to test the data fingerprint feature make me realize it was broken.
The code was relying in the distinction between empty and null QByteArray,
but this was a bad idea as this difference is lost when going through QString.
2018-09-10 20:44:03 +02:00
Markus Goetz
4f83bba829 Windows: Don't ignore files with FILE_ATTRIBUTE_TEMPORARY
Too many applications incorrectly use this attribute.

For #6696 #6610
2018-09-10 20:20:40 +02:00
Camila San
90d3917481 Creates .github folder.
- Adds issue_template.md to folder .github - previously bug_report.md.
- This will enable the issue template when users creates issues.

Signed-off-by: Camila San <hello@camila.codes>
2018-09-10 17:17:39 +02:00
Camila San
d9cc362258 Adds bug_report.md file.
Signed-off-by: Camila San <hello@camila.codes>
2018-09-10 17:09:22 +02:00
Camila Ayres
0a5f890bf9 Adds bug_report template.
Signed-off-by: Camila San <hello@camila.codes>
2018-09-10 16:58:27 +02:00
Markus Goetz
b873311bc5 sqlite: Update bundled version to 3.24.0
For OS X and Windows.
2018-09-10 16:44:16 +02:00
Camila Ayres
eaa4e77626 Merge pull request #652 from ivaradi/nautilus-plugin-python-fix
Use encode()/decode() with Python 3 only.
2018-09-10 15:29:10 +02:00
István Váradi
7a7799407d Merge branch 'master' into nautilus-plugin-python-fix 2018-09-10 15:17:14 +02:00
István Váradi
a4e23e7655 Merge pull request #598 from ivaradi/icon-name-fix
Create symlinks for the small-letter application icon file names
2018-09-10 15:16:45 +02:00
István Váradi
56ea525499 Use encode()/decode() with Python 3 only 2018-09-10 15:05:46 +02:00
István Váradi
e84bdd59c7 Use the correct icon name variable in mirall.desktop.in 2018-09-10 14:54:24 +02:00
István Váradi
b5f484aaf5 Revert "Create symlinks for the small-letter application icon file names"
This reverts commit 328f82297a.
2018-09-10 14:50:14 +02:00
István Váradi
264b77c634 Merge branch 'master' into icon-name-fix 2018-09-10 14:08:35 +02:00
Nextcloud bot
23d64dd3ac [tx-robot] updated from transifex 2018-09-10 00:50:19 +00:00
Olivier Goffart
67f793a49e Log: Remove inaccurate comment about --logdebug
The exact string is actually "sync.*.debug=true\ngui.*.debug=true".
And this is not strictly equivalent to setting the env var, as it
calls QLoggingCategory::setFilterRules.
Over all, that's an implementation details that users do not care about.
2018-09-09 21:44:55 +02:00
Olivier Goffart
d202942a2c Reconcile: When detecting a local move, keep the local mtime
https://github.com/owncloud/client/issues/6629#issuecomment-402450691
2018-09-09 21:38:10 +02:00
Dmitry Mayorov
d338c130af added logdebug 2018-09-09 21:36:47 +02:00
Christian Kamm
283c4b13a1 Log: Adjust update/reconcile log verbosity
Not having these enabled by default is causing significant extra back
and forth with reporters since they must manually use --logdebug for the
log to be useful.
2018-09-09 21:34:41 +02:00
Olivier Goffart
40007537ea OAuth: Remove the timeout
There is no real reason to have a timeout. The connection can stay open
as long as we are not authenticated. The User can still re-open a browser
from the UI at any time.

Issue #6612
2018-09-09 17:57:38 +02:00
Markus Goetz
6122a47241 UpdateInfo: Remove unused code 2018-09-09 17:39:56 +02:00
Christian Kamm
ce3339a00f fixup: remove outdated Qt5.5 workaround code 2018-09-09 17:27:30 +02:00
Christian Kamm
14df7a3273 fixup: use initializer for contextMenuVisibleManual 2018-09-09 17:23:49 +02:00
Christian Kamm
9330d2b178 fixup: make logging "info" 2018-09-09 17:15:58 +02:00
Christian Kamm
87dd198b52 Tray workarounds #6545
* Disentangle the previous 'qdbusWorkarounds' into three different
  things
* Make not trusting tray.isVisible() a new workaround
* Introduce env vars for all workaround flags
* Use the workaround flags for OSX
* Determine workaround flags for KDE when the plasma integration plugin
  is missing
2018-09-09 13:17:31 +02:00
Olivier Goffart
a68c95522d OAuth2: Try to refresh the token even if the credentials weren't ready.
This can happen when the client is started and the internet connection
was not enabled. Then we would fetch the credentials, but we would
no do the refresh token step (because network is down).
So next time we try to connect, we would also not refresh the token
because the credentials are not marked as 'ready'

Reported in
https://github.com/owncloud/client/issues/6522#issuecomment-396845167
2018-09-09 12:00:59 +02:00
Christian Kamm
cba0627a9c Ensure GETFileJob notices finishing #6581
It could happen that readyRead was emitted for incoming data while the
download was not yet finished. Then the network job could finish with
no more data arriving - so readyRead wasn't emitted again.

To fix this, the finished signal also gets connected to the readyRead
slot.
2018-09-09 11:50:00 +02:00
Nextcloud bot
cb69944b5c [tx-robot] updated from transifex 2018-09-09 00:52:22 +00:00
Nextcloud bot
f80517d719 [tx-robot] updated from transifex 2018-09-08 00:50:03 +00:00
Camila Ayres
13cfd80093 Adds correct qt5keychain lib file name for cmake instructions in README.
Signed-off-by: Camila San <hello@camila.codes>
2018-09-06 10:57:33 +02:00
Camila Ayres
17ac41377e Fix README cmake instructions for the 3 platforms.
Signed-off-by: Camila San <hello@camila.codes>
2018-09-06 10:39:31 +02:00
Nextcloud bot
0b8459ca14 [tx-robot] updated from transifex 2018-09-06 00:52:07 +00:00
Roeland Jago Douma
537fac70bf Merge pull request #594 from hiiamok/windows-large-app-icon
Larger Windows App Icon
2018-09-05 22:54:42 +02:00
Oskar Kruschitz
cf150caa2b Merge branch 'master' into windows-large-app-icon 2018-09-05 13:24:08 +02:00
Camila Ayres
23d276021e Updates README cmake instruction for Windows.
Signed-off-by: Camila San <hello@camila.codes>
2018-09-05 13:23:58 +02:00
Roeland Jago Douma
599f6f0228 Merge pull request #624 from nextcloud/fix/279/abstract_webflow_qnam
Add a WebFlowCredentialsAccessManager
2018-09-05 13:01:06 +02:00
Camila Ayres
bddc573c54 Merge branch 'master' into fix/279/abstract_webflow_qnam 2018-09-05 12:42:56 +02:00
Camila Ayres
1a73d3323a Merge pull request #625 from hiiamok/mac-app-icon
Mac Application Icon
2018-09-05 12:41:09 +02:00
Oskar Kruschitz
2bfb99f174 Mac Application Icon
Replaced ownCloud.icns with APPLICATION_ICON_NAME variable
2018-09-05 11:57:26 +02:00
Oskar Kruschitz
f4a704164f Merge branch 'master' into windows-large-app-icon 2018-09-05 11:37:24 +02:00
Nextcloud bot
e730f95a71 [tx-robot] updated from transifex 2018-09-05 00:48:38 +00:00
Roeland Jago Douma
9f1f99f4db Add a WebFlowCredentialsAccessManager
Fixes #279

Some setups don't make Qt emit the right signals and the client would
end up in state where it could not do the initial authentications.
This is a similar hack that apparently already was is place for basic
http auth.

Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
2018-09-04 20:59:25 +02:00
Oskar Kruschitz
d236c3c011 Merge branch 'master' into windows-large-app-icon 2018-09-04 08:35:11 +02:00
Nextcloud bot
73ccccb8a7 [tx-robot] updated from transifex 2018-09-04 00:47:25 +00:00
Oskar Kruschitz
7ab2a9bfcb Merge branch 'master' into windows-large-app-icon 2018-09-03 12:51:26 +02:00
Camila Ayres
b19abe9c86 Merge pull request #614 from Titan-C/host_link
In setup wizard put link to nextcloud installation.
2018-09-02 13:18:00 +02:00
Camila Ayres
44026763b8 Merge branch 'master' into host_link 2018-09-02 12:55:44 +02:00
Camila Ayres
617cd6dfdb Merge pull request #615 from Titan-C/webview_scale
Web view scales vertically.
2018-09-02 12:54:41 +02:00
Camila Ayres
3a489b73f9 Merge branch 'master' into webview_scale 2018-09-02 12:23:44 +02:00
Camila Ayres
07013783ea Merge pull request #405 from nextcloud/sync-hidden-files
Sync hidden files by default.
2018-09-02 12:23:29 +02:00
Camila Ayres
7c77864396 Merge branch 'master' into sync-hidden-files 2018-09-02 12:01:07 +02:00
Nextcloud bot
3b8dde601d [tx-robot] updated from transifex 2018-09-02 00:50:43 +00:00
Tobia De Koninck
d9f79215a7 Fix the hiddensync state in the UI + also sync hidden in cmd 2018-09-01 16:30:27 +02:00
Jan-Christoph Borchardt
309b0b6382 Sync hidden files by default 2018-09-01 16:30:27 +02:00
Nextcloud bot
9d021d004d [tx-robot] updated from transifex 2018-09-01 00:48:21 +00:00
Óscar Nájera
452f64221e Web view scales vertically
Fix #591
2018-08-31 19:49:13 +02:00
Óscar Nájera
72419a1149 Remove hostButton from setup page 2018-08-31 18:35:52 +02:00
Óscar Nájera
ab5c4749c1 In setup wizard put link to nextcloud installation
Fix #604

Remove the not actionable button but a direct link to the nextcloud
installation page. In this case the button is changed for a label with an
html link to the website.
2018-08-31 18:32:00 +02:00
Nextcloud bot
5cdf8a2997 [tx-robot] updated from transifex 2018-08-31 00:48:47 +00:00
Camila Ayres
bfd8897f22 Merge branch 'master' into windows-large-app-icon 2018-08-30 17:05:04 +02:00
Camila Ayres
8c19be7213 Merge pull request #599 from Titan-C/unpause_resume
Rename Unpause To Resume.
2018-08-30 17:03:58 +02:00
Camila Ayres
4a47d1c8ef Merge branch 'master' into unpause_resume 2018-08-30 16:47:28 +02:00
Camila Ayres
e3d7c9f1ea Merge branch 'master' into icon-name-fix 2018-08-30 16:45:52 +02:00
Camila Ayres
fbd8438072 Merge pull request #603 from Titan-C/login_button
Hide login button on setup screen.
2018-08-30 16:43:41 +02:00
Camila Ayres
efc2f0eded Merge branch 'master' into login_button 2018-08-30 14:33:00 +02:00
Camila Ayres
3e839b2e44 Merge branch 'master' into unpause_resume 2018-08-30 13:31:34 +02:00
Camila Ayres
678e2c873e Merge pull request #601 from Titan-C/activity_hover_notooltip
Drop the ToolTipRole from the activity list.
2018-08-30 13:26:47 +02:00
Óscar Nájera
121c0d8433 Hide login button on setup screen
Fix #576
2018-08-30 13:24:23 +02:00
Camila Ayres
881c7f804f Merge branch 'master' into activity_hover_notooltip 2018-08-30 12:33:40 +02:00
István Váradi
2e55702258 Merge branch 'master' into icon-name-fix 2018-08-30 07:54:49 +02:00
Oskar Kruschitz
964470fc11 Merge branch 'master' into windows-large-app-icon 2018-08-30 07:42:34 +02:00
Nextcloud bot
c4d01b6aea [tx-robot] updated from transifex 2018-08-30 00:46:36 +00:00
Óscar Nájera
0f80ecbb39 Drop the ToolTipRole from the activity list
Fix #515
2018-08-30 00:37:59 +02:00
Oskar Kruschitz
bf35821bc0 Merge branch 'master' into windows-large-app-icon 2018-08-29 20:39:17 +02:00
Óscar Nájera
d896edeee8 Rename Unpause to Resume
Fix #192
2018-08-29 17:03:07 +02:00
István Váradi
328f82297a Create symlinks for the small-letter application icon file names 2018-08-29 16:36:56 +02:00
Camila Ayres
cafdcf77cb Merge pull request #597 from Titan-C/readmes
Improves README documentation.
2018-08-29 16:08:01 +02:00
Óscar Nájera
ed705ba98c Improving documentation
Fix #584
Fix #585
2018-08-29 15:47:44 +02:00
Christian Kamm
2844c925eb Show a tray message when a folder watcher becomes unreliable #6119 2018-08-28 17:04:25 +02:00
Oskar Kruschitz
ea8676ad2c Larger Windows App Icon
Newer Windows versions are also displaying a 256x256 icon. If this icon size is not present, the 48x48 icon is used, but not resized. This means there is a possibly large empty area around the icon.
2018-08-28 10:06:28 +02:00
Nextcloud bot
028da61824 [tx-robot] updated from transifex 2018-08-28 00:47:44 +00:00
Nextcloud bot
16337bf656 [tx-robot] updated from transifex 2018-08-27 00:48:31 +00:00
Camila Ayres
d8bf20310b Adds link on how to create a pull request to the README.
Signed-off-by: Camila San <hello@camila.codes>
2018-08-25 17:49:34 +02:00
Nextcloud bot
cdd84dce6e [tx-robot] updated from transifex 2018-08-25 00:47:18 +00:00
Camila Ayres
647df7bcee Merge pull request #580 from nextcloud/issues/activities
Fixes #538: correctly checks for local sync actitivities.
2018-08-24 14:54:42 +02:00
Camila San
64e21d5083 Fixes #538: correctly checks for local sync actitivities.
- Local sync activities are now listed with the sync icon and included
in the correct list: once a file is synced, activityWidget checks for
its status to know if it is an error or if the file was successfully synced.

Signed-off-by: Camila San <hello@camila.codes>
2018-08-24 09:24:32 +02:00
Nextcloud bot
ea0bdddb2a [tx-robot] updated from transifex 2018-08-24 00:48:54 +00:00
Nextcloud bot
e9b4453814 [tx-robot] updated from transifex 2018-08-23 00:52:06 +00:00
Nextcloud bot
1991d71136 [tx-robot] updated from transifex 2018-08-22 00:48:25 +00:00
Camila Ayres
6a7a08bd01 Merge pull request #567 from nextcloud/issues/share-dialog
Fixes issues in the share dialog
2018-08-21 23:23:04 +02:00
Camila San
d5a0ec7d8b Fixes #534: interactions with expiration date and password.
- Fixes call for slot when date is set - it was the password
slot for that.
- Adds QProgressIndicator and function to toggle animation.
- Fixes: when date was set, the date was not being correctly set and
displayed.
- Fixes: hides and 'deletes' passsword and expire. date widgets when
the user unchecks it in the toolbox menu.

Signed-off-by: Camila San <hello@camila.codes>
2018-08-21 22:48:51 +02:00
Camila San
eecbdb00de Fixes #534: can edit permission were always disabled.
- Properly checks files and folder share permissions when displaying
can edit checkbox - which can also be partially checked - and listing
permissios in the tollbutton menu.
- Fixes click on can edit checkbox - which can also change state of
permissions in the toolbutton menu.

Signed-off-by: Camila San <hello@camila.codes>
2018-08-21 22:48:51 +02:00
Camila San
085de2825a Enhancement #534: hide tool button when there is no share link.
- Only display button when there is a share link.

Signed-off-by: Camila San <hello@camila.codes>
2018-08-21 22:48:51 +02:00
Camila San
cf3ee4b3a4 Fixes share link delete action when clicking on tool button menu.
- Shared point was not handled properly.

Signed-off-by: Camila San <hello@camila.codes>
2018-08-21 22:48:50 +02:00
Camila San
8f7bc8cff9 Changes 'Allow editing' for file sharing to a checkbox instead of a radiobutton.
Signed-off-by: Camila San <hello@camila.codes>
2018-08-21 22:48:42 +02:00
Camila Ayres
ff9177edc3 Merge pull request #571 from nextcloud/issues/mac-build
Fixes mac build.
2018-08-21 22:47:41 +02:00
Camila San
c8d5d9a622 Removes dynamic cast when building navigation apps.
- It checks for the menu title to know where to add the apps menu instead of trying to cast
the menu pointer saved in the sender() property.
- The previous solution was not working reliably - see #523
- Adds TODO.

Signed-off-by: Camila San <hello@camila.codes>
2018-08-21 14:57:12 +02:00
Camila San
fa4328a596 Changes repo for 3rdparty/qtmacgoodies.
- The fork has the functions needed to add separators in the toolbar.

Signed-off-by: Camila San <hello@camila.codes>
2018-08-21 13:02:54 +02:00
Nextcloud bot
985c2ed1ca [tx-robot] updated from transifex 2018-08-21 00:47:36 +00:00
Nextcloud bot
034d5b60aa [tx-robot] updated from transifex 2018-08-20 00:48:31 +00:00
Nextcloud bot
a2f7355d4a [tx-robot] updated from transifex 2018-08-19 00:47:24 +00:00
Nextcloud bot
17d4aeeb78 [tx-robot] updated from transifex 2018-08-18 00:47:40 +00:00
Nextcloud bot
a214ecf788 [tx-robot] updated from transifex 2018-08-17 00:47:10 +00:00
Camila Ayres
0d9de74726 Merge pull request #562 from ivaradi/qaction2
Further QAction constructor fixes
2018-08-15 17:32:43 +02:00
István Váradi
8b996772a4 Further QAction constructor fixes 2018-08-15 17:02:28 +02:00
Camila Ayres
fa5143a66d Merge pull request #556 from ivaradi/qaction
Provide parent to QAction
2018-08-14 21:10:56 +02:00
István Váradi
8cbc757a56 Merge branch 'master' into qaction 2018-08-14 17:13:44 +02:00
Camila Ayres
e9ae10ba6c Merge pull request #559 from nextcloud/issues/517
Fixes #517: changes QPalette for more readability in the activities list.
2018-08-14 17:12:48 +02:00
István Váradi
5bcc4ece77 Merge branch 'master' into qaction 2018-08-14 17:11:00 +02:00
Camila San
135bcaea3e Fixes #517: changes QPalette for more readability in the activities list.
Signed-off-by: Camila San <hello@camila.codes>
2018-08-14 17:00:43 +02:00
Camila Ayres
29c11618b3 Merge pull request #558 from nextcloud/issues/518
Fixes #518: adds more margin for the text in the activity
2018-08-14 16:59:54 +02:00
István Váradi
a15a470ea2 Merge branch 'master' into qaction 2018-08-14 16:53:14 +02:00
Camila San
1d4fc91d79 Fixes #518: adds more margin for the text in the activity (only for Windows).
Signed-off-by: Camila San <hello@camila.codes>
2018-08-14 16:32:48 +02:00
Camila Ayres
ef9c302b5e Merge pull request #550 from nextcloud/issues/533
Fixes #533: Removes the copy activities/notifications button
2018-08-14 16:31:14 +02:00
Camila San
c1c5e5da5f Fixes #533: Removes the copy activities/notifications button
- Also removes the signal/slot associated with it.
- Minor changes: removes white background and changes frame style to the
same used in the accountsettings for consistency.

Signed-off-by: Camila San <hello@camila.codes>
2018-08-14 13:53:14 +02:00
István Váradi
14615855d0 Provide parent to QAction 2018-08-14 11:54:08 +02:00
Roeland Jago Douma
f0ef2c27a3 Merge pull request #553 from ivaradi/libssl
LibSSL versions
2018-08-13 21:47:53 +02:00
Camila Ayres
b50db09b01 Merge pull request #554 from nextcloud/feature/noid/enable_providers_by_default
Enable providers by default
2018-08-13 20:24:27 +02:00
Roeland Jago Douma
86991b9996 Enable providers by default
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
2018-08-13 19:59:34 +02:00
István Váradi
c27943b46d Merge branch 'master' into libssl 2018-08-13 19:15:57 +02:00
Camila Ayres
ef71e6b0f7 Merge pull request #551 from nextcloud/issues/494
Issue #494: removes close button from the settings.
2018-08-13 18:25:20 +02:00
Camila Ayres
8e8a619ee1 Merge branch 'master' into issues/494 2018-08-13 17:42:53 +02:00
Camila Ayres
27076c0f28 Merge pull request #552 from nextcloud/removes-notificationwidget
Removes unused NotificationWidget class.
2018-08-13 17:42:38 +02:00
István Váradi
fc6e6149e5 Require libssl 1.1 on distributions other than Xenial 2018-08-13 16:24:44 +02:00
István Váradi
13e2bb099b Require libssl 1.0 on Xenial 2018-08-13 16:24:18 +02:00
Camila San
8fd0ca4587 Removes unused NotificationWidget class.
Since the new activities/notifications list UI this class is not used
anymore.

Signed-off-by: Camila San <hello@camila.codes>
2018-08-13 15:17:40 +02:00
Camila San
2aa942e4b8 Issue #494: removes close button from the settings.
Signed-off-by: Camila San <hello@camila.codes>
2018-08-13 14:24:10 +02:00
Camila Ayres
92aaa09643 Merge pull request #541 from nextcloud/bugfix/noid/wizard-external-links
Make links open in an external browser
2018-08-13 12:03:31 +02:00
Roeland Jago Douma
0e2cd30ea1 Merge branch 'master' into bugfix/noid/wizard-external-links 2018-08-13 11:43:42 +02:00
Roeland Jago Douma
bc44c62471 Merge pull request #524 from ivaradi/ubuntu-compat
Some Ubuntu compilation fixes
2018-08-13 11:43:26 +02:00
Roeland Jago Douma
2434523f33 Merge pull request #532 from ShinjiLE/master
rearange CMake find_package OpenSSL
2018-08-13 11:42:35 +02:00
Camila Ayres
534a92b709 Merge branch 'master' into bugfix/noid/wizard-external-links 2018-08-13 11:40:45 +02:00
Roeland Jago Douma
233e10ecb1 Merge branch 'master' into master 2018-08-13 11:21:05 +02:00
Roeland Jago Douma
cefc6b531c Merge pull request #549 from nextcloud/ci/noid/bump_imagesx
Bump ci images
2018-08-13 11:20:50 +02:00
Roeland Jago Douma
5c7c92157f Bump images
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
2018-08-13 10:56:18 +02:00
Camila Ayres
176a2e6f84 Merge branch 'master' into ubuntu-compat 2018-08-13 09:03:26 +02:00
Camila Ayres
647d16c792 Merge branch 'master' into bugfix/noid/wizard-external-links 2018-08-13 09:02:21 +02:00
Camila Ayres
3ad33a368a Merge branch 'master' into master 2018-08-13 08:58:26 +02:00
Nextcloud bot
951096f569 [tx-robot] updated from transifex 2018-08-13 00:49:31 +00:00
Nextcloud bot
489c0529c4 [tx-robot] updated from transifex 2018-08-12 00:48:32 +00:00
Julius Härtl
3576fbb2a5 Remove unused subclass of QWebEngineView
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-08-11 17:47:40 +02:00
Julius Härtl
8dedb9084e Make links open in an external browser
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-08-11 17:38:08 +02:00
Nextcloud bot
f6ef11a5c9 [tx-robot] updated from transifex 2018-08-11 00:47:25 +00:00
Nextcloud bot
1d868eb809 [tx-robot] updated from transifex 2018-08-09 00:48:49 +00:00
Julius Härtl
c3aafa722a Merge pull request #536 from nextcloud/3rdpart/remove_uneeded
Remove nlohmann/json.hpp
2018-08-08 21:34:48 +02:00
Roeland Jago Douma
b85bad0566 Remove nlohmann/json.hpp
Not used so no need to have it lying around

Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
2018-08-08 20:03:04 +02:00
Nextcloud bot
a4507db31a [tx-robot] updated from transifex 2018-08-08 00:50:18 +00:00
Nextcloud bot
e551b89ba7 [tx-robot] updated from transifex 2018-08-07 00:46:53 +00:00
Ronny
7cbca28eb7 Merge branch 'master' into master 2018-08-05 11:35:53 +02:00
Nextcloud bot
a1967d551d [tx-robot] updated from transifex 2018-08-05 00:49:39 +00:00
Ronny Kunze
2b825a1748 rearange CMake find_package OpenSSL
the command seems to be malformed . The keyword VERSION is not valid .
And the version should follow direct after the packagename.
2018-08-04 16:53:06 +02:00
Nextcloud bot
5110f9618a [tx-robot] updated from transifex 2018-08-04 00:47:26 +00:00
István Váradi
d30f8b9094 Merge branch 'master' into ubuntu-compat 2018-08-03 17:16:20 +02:00
István Váradi
758c2ad9ac Merge branch 'master' into ubuntu-compat 2018-08-02 21:08:54 +02:00
István Váradi
c919b7e069 Merge branch 'master' into ubuntu-compat 2018-08-01 16:28:48 +02:00
István Váradi
be3640dc51 Depend on libqt5svg5-dev 2018-07-31 16:24:16 +02:00
István Váradi
343402740f Make the Bionic control file the default one 2018-07-31 16:22:02 +02:00
István Váradi
1364755141 Use libkf5kio-dev directly on Bionic and Cosmic 2018-07-31 16:21:03 +02:00
Christian Kamm
09f83f4fa9 SyncJournal: Clear etag filter before sync
Before, we only cleared the _avoidReadFromDbOnNextSyncFilter *after* a
sync which meant that we had to sync twice after selective sync setup.

Now, we clear the filter *before* a sync as well which allows the actual
next sync to write the correct etags to the db again - instead of only
the sync after that one.

Also expand on comments and rename _avoidReadFromDbOnNextSyncFilter to
_etagStorageFilter.
2018-06-05 12:00:20 +02:00
235 changed files with 18773 additions and 34890 deletions

View File

@@ -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
View 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
View File

@@ -164,3 +164,10 @@ UpgradeLog*.htm
# Microsoft Fakes
FakesAssemblies/
#cmake temporary stuff
CMakeCache.txt
CMakeFiles/
CPackConfig.cmake
CPackOptions.cmake
CPackSourceConfig.cmake

2
.gitmodules vendored
View File

@@ -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

View 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ó

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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]=סנכרון תיקיות

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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]=フォルダーを同期する

View 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

View 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

View 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

View 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

View 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

View File

@@ -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

View 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

View File

@@ -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]=Синхронизация папок

View 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

View 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

View File

@@ -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]=Синхронизација фасцикли

View File

@@ -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

View 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]=文件夹同步

View File

@@ -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]=資料夾同步

View File

@@ -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()

Binary file not shown.

View File

@@ -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.

View File

@@ -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.

View File

@@ -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,

View File

@@ -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

View 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)

View File

@@ -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

View File

@@ -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)

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -1 +0,0 @@
APPLaplt

View File

@@ -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.";

View File

@@ -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.";

View File

@@ -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}
}

View File

@@ -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 "/"
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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 ))
}

View File

@@ -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.

Before

Width:  |  Height:  |  Size: 362 B

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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

View File

@@ -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)

View File

@@ -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
-----------------------------------

View File

@@ -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.

View File

@@ -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.

File diff suppressed because it is too large Load Diff

View File

@@ -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_

View File

@@ -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@

View File

@@ -22,11 +22,8 @@
SyncClientProxy *_syncClientProxy;
NSMutableSet *_registeredDirectories;
NSString *_shareMenuTitle;
NSString *_mirror_path;
NSString *_fs_path;
NSMutableDictionary *_strings;
NSMutableArray *_menuItems;
Boolean shouldBeChecked;
}
@end

View File

@@ -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

View File

@@ -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;

View File

@@ -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];

View File

@@ -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()

View File

@@ -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"";
}

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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()) {

View File

@@ -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;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -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 &#91;...&#93;. 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

View File

@@ -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;

View File

@@ -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

View File

@@ -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